net.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* ==== net.c ============================================================
  2.  * Copyright (c) 1993, 1995 by Chris Provenzano, proven@athena.mit.edu
  3.  *
  4.  * Copyright (c) 1989 The Regents of the University of California.
  5.  * All rights reserved.
  6.  *
  7.  * This code is derived from software contributed to Berkeley by
  8.  * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
  9.  *
  10.  * Redistribution and use in source and binary forms, with or without
  11.  * modification, are permitted provided that the following conditions
  12.  * are met:
  13.  * 1. Redistributions of source code must retain the above copyright
  14.  *    notice, this list of conditions and the following disclaimer.
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in the
  17.  *    documentation and/or other materials provided with the distribution.
  18.  * 3. All advertising materials mentioning features or use of this software
  19.  *    must display the following acknowledgement:
  20.  * This product includes software developed by the University of
  21.  * California, Berkeley and its contributors.
  22.  * 4. Neither the name of the University nor the names of its contributors
  23.  *    may be used to endorse or promote products derived from this software
  24.  *    without specific prior written permission.
  25.  *
  26.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  27.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  30.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  32.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  33.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  34.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  35.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  36.  * SUCH DAMAGE.
  37.  *
  38.  *  1.00 93/08/26 proven
  39.  *      -Pthread redesign of this file.
  40.  */
  41. #include <pthreadutil.h>
  42. #include <sys/types.h>
  43. #include <sys/socket.h>
  44. #include <sys/param.h>
  45. #include <netinet/in.h>
  46. #include <stdlib.h>
  47. #include <string.h>
  48. #include <netdb.h>
  49. #include <stdio.h>
  50. #include <ctype.h>
  51. #ifndef MAXHOSTNAMELEN
  52. #define MAXHOSTNAMELEN 64
  53. #endif
  54. /*
  55.  * These globals are set initialy and then are only read.
  56.  * They do not need mutexes.
  57.  */
  58. extern int lflag;
  59. char myhostname[MAXHOSTNAMELEN];
  60. /* 
  61.  * These globals change and therefor do need mutexes
  62.  */
  63. pthread_mutex_t spmutex = PTHREAD_MUTEX_INITIALIZER;
  64. pthread_cond_t spcond = PTHREAD_COND_INITIALIZER;
  65. struct servent *sp = NULL;
  66. void netsetup(void)
  67. {
  68. pthread_mutex_lock(&spmutex); 
  69. if (sp) {
  70. fprintf(stderr, "finger: service pointer already initialized.n");
  71. exit(2);
  72. }
  73. if ((sp = (struct servent *)malloc(sizeof(struct servent) + 4096)) == NULL){
  74. fprintf(stderr, "finger: Couldn't allocate service pointer.n");
  75. exit(2);
  76. }
  77. if (getservbyname_r("finger", "tcp", sp, (char *)sp + sizeof(struct servent), 4096) == NULL) {
  78. fprintf(stderr, "finger: tcp/finger: unknown servicen");
  79. exit(2);
  80. }
  81. if (gethostname(myhostname, MAXHOSTNAMELEN)) {
  82. fprintf(stderr, "finger: couldn't get my hostname.n");
  83. exit(2);
  84. }
  85. pthread_cond_broadcast(&spcond);
  86. pthread_mutex_unlock(&spmutex); 
  87. }
  88. void netsetupwait(void)
  89. {
  90. pthread_mutex_lock(&spmutex);
  91. while(sp == NULL) {
  92. pthread_cond_wait(&spcond, &spmutex);
  93. }
  94. pthread_mutex_unlock(&spmutex);
  95. }
  96. void *netfinger(char *name)
  97. {
  98. pthread_atexit_t atexit_id;
  99. register int c, lastc;
  100. struct in_addr defaddr;
  101. struct hostent *hp;
  102. struct sockaddr_in sin;
  103. int s, i, readbuflen;
  104. char readbuf[1024];
  105. char *host;
  106. netsetupwait();
  107. pthread_atexit_add(&atexit_id, fflush_nrv, NULL);
  108. if (!(host = strrchr(name, '@'))) {
  109. host = myhostname;
  110. } else {
  111. *host++ = '';
  112. }
  113. if (!(hp = gethostbyname(host))) {
  114. if ((defaddr.s_addr = inet_addr(host)) < 0) {
  115. fprintf(stderr, "[%s] gethostbyname: Unknown hostn", host);
  116. return;
  117. }
  118. }
  119. sin.sin_family = hp->h_addrtype;
  120. memcpy((char *)&sin.sin_addr, hp->h_addr, hp->h_length);
  121. sin.sin_port = sp->s_port;
  122. if ((s = socket(sin.sin_family, SOCK_STREAM, 0)) < 0) {
  123. sprintf(readbuf, "[%s]: socket", hp->h_name);
  124. perror(readbuf);
  125. return;
  126. }
  127. /* have network connection; identify the host connected with */
  128. if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
  129. sprintf(readbuf, "[%s]: connect", hp->h_name);
  130. perror(readbuf);
  131. close(s);
  132. return;
  133. }
  134. /* -l flag for remote fingerd  */
  135. if (lflag)
  136. write(s, "/W ", 3);
  137. /* send the name followed by <CR><LF> */
  138. write(s, name, strlen(name));
  139. write(s, "rn", 2);
  140. /*
  141.  * Read from the remote system; once we're connected, we assume some
  142.  * data.  If none arrives, we hang until the user interrupts, or
  143.  * until the thread timeout expires.
  144.  *
  145.  * If we see a <CR> or a <CR> with the high bit set, treat it as
  146.  * a newline; if followed by a newline character, only output one
  147.  * newline.
  148.  *
  149.  * Otherwise, all high bits are stripped; if it isn't printable and
  150.  * it isn't a space, we can simply set the 7th bit.  Every ASCII
  151.  * character with bit 7 set is printable.
  152.  */ 
  153. for (readbuflen = read(s, readbuf, 1024), flockfile(stdout), lastc = 'n',
  154.   printf("[%s]n", hp->h_name); readbuflen > 0; 
  155.   readbuflen = read(s, readbuf, 1024)) {
  156. for (i = 0; i < readbuflen; i++) {
  157. c = readbuf[i] & 0x7f;
  158. if (c == 0x0d) {
  159. c = 'n';
  160. lastc = 'r';
  161. } else {
  162. if (!isprint(c) && !isspace(c))
  163. c |= 0x40;
  164. if (lastc != 'r' || c != 'n')
  165. lastc = c;
  166. else {
  167. lastc = 'n';
  168. continue;
  169. }
  170. }
  171. putchar_unlocked(c);
  172. }
  173. }
  174. if (lastc != 'n')
  175. putchar_unlocked('n');
  176. funlockfile(stdout);
  177. }