📄 00000008.htm
字号:
void <BR>outfile(filename, linenum) <BR>char *filename; <BR>int linenum; <BR>{ <BR> FILE *fp; <BR> char linebuf[ 256 ]; <BR> <BR> if (linenum && (fp = fopen(filename,"r")) != NULL) { <BR> while ( fgets( linebuf, 256, fp )!=NULL && linenum > 0) { <BR> linebuf[ strlen(linebuf)-1 ] = '\0'; <BR> if (strcmp( linebuf, ".")==0) outs(".."); <BR> else outs(linebuf); <BR> linenum--; <BR> } <BR> fclose(fp); <BR> } <BR> outs("."); <BR>} <BR> <BR> <BR>/* timeout - handle timeouts */ <BR>static void timeout(sig) <BR>int sig; <BR>{ <BR> longjmp(timebuf, sig); <BR>} <BR> <BR> <BR>void rfc931(rmt_sin, our_sin, dest) <BR>struct sockaddr_in *rmt_sin; <BR>struct sockaddr_in *our_sin; <BR>char *dest; <BR>{ <BR> unsigned rmt_port; <BR> unsigned our_port; <BR> struct sockaddr_in rmt_query_sin; <BR> struct sockaddr_in our_query_sin; <BR> char user[256]; <BR> char buffer[512]; <BR> char *cp; <BR> FILE *fp; <BR> char *result = "unknown"; <BR> struct hostent *hp; <BR> <BR> /* <BR> * Use one unbuffered stdio stream for writing to and for reading from <BR> * the RFC931 etc. server. This is done because of a bug in the SunOS <BR> * 4.1.x stdio library. The bug may live in other stdio implementations, <BR> * too. When we use a single, buffered, bidirectional stdio stream ("r+" <BR> * or "w+" mode) we read our own output. Such behaviour would make sense <BR> * with resources that support random-access operations, but not with <BR> * sockets. <BR> */ <BR> if ((fp = fsocket(AF_INET, SOCK_STREAM, 0)) != 0) { <BR> setbuf(fp, (char *) 0); <BR> <BR> /* <BR> * Set up a timer so we won't get stuck while waiting for the server. <BR> */ <BR> <BR> if (setjmp(timebuf) == 0) { <BR> signal(SIGALRM, timeout); <BR> alarm(RFC931_TIMEOUT); <BR> <BR> /* <BR> * Bind the local and remote ends of the query socket to the same <BR> * IP addresses as the connection under investigation. We go <BR> * through all this trouble because the local or remote system <BR> * might have more than one network address. The RFC931 etc. <BR> * client sends only port numbers; the server takes the IP <BR> * addresses from the query socket. <BR> */ <BR> <BR> our_query_sin = *our_sin; <BR> our_query_sin.sin_port = htons(ANY_PORT); <BR> rmt_query_sin = *rmt_sin; <BR> rmt_query_sin.sin_port = htons(RFC931_PORT); <BR> <BR> if (bind(fileno(fp), (struct sockaddr *) & our_query_sin, <BR> sizeof(our_query_sin)) >= 0 && <BR> connect(fileno(fp), (struct sockaddr *) & rmt_query_sin, <BR> sizeof(rmt_query_sin)) >= 0) { <BR> <BR> /* <BR> * Send query to server. Neglect the risk that a 13-byte <BR> * write would have to be fragmented by the local system and <BR> * cause trouble with buggy System V stdio libraries. <BR> */ <BR> <BR> fprintf(fp, "%u,%u\r\n", <BR> ntohs(rmt_sin->sin_port), <BR> ntohs(our_sin->sin_port)); <BR> fflush(fp); <BR> <BR> /* <BR> * Read response from server. Use fgets()/sscanf() so we can <BR> * work around System V stdio libraries that incorrectly <BR> * assume EOF when a read from a socket returns less than <BR> * requested. <BR> */ <BR> <BR> if (fgets(buffer, sizeof(buffer), fp) != 0 <BR> && ferror(fp) == 0 && feof(fp) == 0 <BR> && sscanf(buffer, "%u , %u : USERID :%*[^:]:%255s", <BR> &rmt_port, &our_port, user) == 3 <BR> && ntohs(rmt_sin->sin_port) == rmt_port <BR> && ntohs(our_sin->sin_port) == our_port) { <BR> <BR> /* <BR> * Strip trailing carriage return. It is part of the <BR> * protocol, not part of the data. <BR> */ <BR> <BR> if (cp = strchr(user, '\r')) <BR> *cp = 0; <BR> result = user; <BR> } <BR> } <BR> alarm(0); <BR> } <BR> fclose(fp); <BR> } <BR> STRN_CPY(dest, result, 60); <BR> <BR> if (strcmp(dest,"unknown")==0) strcpy(dest,""); <BR> else strcat( dest, "@" ); <BR> <BR> hp = gethostbyaddr((char *) &rmt_sin->sin_addr, sizeof (struct in_addr), <BR> rmt_sin->sin_family); <BR> if (hp) <BR> strcat(dest, hp->h_name); <BR> else <BR> strcat(dest, (char *)inet_ntoa(rmt_sin->sin_addr)); <BR> <BR>} <BR> <BR>int <BR>Isspace(ch) <BR>char ch; <BR>{ <BR> return (ch == ' ' || ch =='\t' || ch == 10 || ch == 13); <BR>} <BR> <BR>char * <BR>nextwordlower(str) <BR>char **str; <BR>{ <BR> char *p; <BR> <BR> while (Isspace(**str)) <BR> (*str)++; <BR> p = (*str); <BR> <BR> while (**str && !Isspace(**str)) { <BR> **str = tolower(**str); <BR> (*str)++; <BR> } <BR> <BR> if (**str) { <BR> **str = '\0'; <BR> (*str)++; <BR> } <BR> return p; <BR>} <BR> <BR>char * <BR>nextword(str) <BR>char **str; <BR>{ <BR> char *p; <BR> <BR> while (Isspace(**str)) <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -