|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1989 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Tony Nardo of the Johns Hopkins University/Applied Physics Lab. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted provided ! 9: * that: (1) source distributions retain this entire copyright notice and ! 10: * comment, and (2) distributions including binaries display the following ! 11: * acknowledgement: ``This product includes software developed by the ! 12: * University of California, Berkeley and its contributors'' in the ! 13: * documentation or other materials provided with the distribution and in ! 14: * all advertising materials mentioning features or use of this software. ! 15: * Neither the name of the University nor the names of its contributors may ! 16: * be used to endorse or promote products derived from this software without ! 17: * specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #ifndef lint ! 24: static char sccsid[] = "@(#)net.c 5.5 (Berkeley) 6/1/90"; ! 25: #endif /* not lint */ ! 26: ! 27: #include <sys/types.h> ! 28: #include <sys/socket.h> ! 29: #include <netinet/in.h> ! 30: #include <netdb.h> ! 31: #include <stdio.h> ! 32: #include <ctype.h> ! 33: ! 34: netfinger(name) ! 35: char *name; ! 36: { ! 37: extern int lflag; ! 38: register FILE *fp; ! 39: register int c, lastc; ! 40: struct in_addr defaddr; ! 41: struct hostent *hp, def; ! 42: struct servent *sp; ! 43: struct sockaddr_in sin; ! 44: int s; ! 45: char *alist[1], *host, *rindex(); ! 46: u_long inet_addr(); ! 47: ! 48: if (!(host = rindex(name, '@'))) ! 49: return; ! 50: *host++ = NULL; ! 51: if (!(hp = gethostbyname(host))) { ! 52: defaddr.s_addr = inet_addr(host); ! 53: if (defaddr.s_addr == -1) { ! 54: (void)fprintf(stderr, ! 55: "finger: unknown host: %s\n", host); ! 56: return; ! 57: } ! 58: def.h_name = host; ! 59: def.h_addr_list = alist; ! 60: def.h_addr = (char *)&defaddr; ! 61: def.h_length = sizeof(struct in_addr); ! 62: def.h_addrtype = AF_INET; ! 63: def.h_aliases = 0; ! 64: hp = &def; ! 65: } ! 66: if (!(sp = getservbyname("finger", "tcp"))) { ! 67: (void)fprintf(stderr, "finger: tcp/finger: unknown service\n"); ! 68: return; ! 69: } ! 70: sin.sin_family = hp->h_addrtype; ! 71: bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length); ! 72: sin.sin_port = sp->s_port; ! 73: if ((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) { ! 74: perror("finger: socket"); ! 75: return; ! 76: } ! 77: ! 78: /* have network connection; identify the host connected with */ ! 79: (void)printf("[%s]\n", hp->h_name); ! 80: if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { ! 81: perror("finger: connect"); ! 82: (void)close(s); ! 83: return; ! 84: } ! 85: ! 86: /* -l flag for remote fingerd */ ! 87: if (lflag) ! 88: write(s, "/W ", 3); ! 89: /* send the name followed by <CR><LF> */ ! 90: (void)write(s, name, strlen(name)); ! 91: (void)write(s, "\r\n", 2); ! 92: ! 93: /* ! 94: * Read from the remote system; once we're connected, we assume some ! 95: * data. If none arrives, we hang until the user interrupts. ! 96: * ! 97: * If we see a <CR> or a <CR> with the high bit set, treat it as ! 98: * a newline; if followed by a newline character, only output one ! 99: * newline. ! 100: * ! 101: * Otherwise, all high bits are stripped; if it isn't printable and ! 102: * it isn't a space, we can simply set the 7th bit. Every ASCII ! 103: * character with bit 7 set is printable. ! 104: */ ! 105: if (fp = fdopen(s, "r")) ! 106: while ((c = getc(fp)) != EOF) { ! 107: c &= 0x7f; ! 108: if (c == 0x0d) { ! 109: c = '\n'; ! 110: lastc = '\r'; ! 111: } else { ! 112: if (!isprint(c) && !isspace(c)) ! 113: c |= 0x40; ! 114: if (lastc != '\r' || c != '\n') ! 115: lastc = c; ! 116: else { ! 117: lastc = '\n'; ! 118: continue; ! 119: } ! 120: } ! 121: putchar(c); ! 122: } ! 123: if (lastc != '\n') ! 124: putchar('\n'); ! 125: (void)fclose(fp); ! 126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.