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

MySQL数据库

开发平台:

Visual C++

  1. /* ==== finger.c ============================================================
  2.  * Copyright (c) 1993 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 Chris Provenzano,
  21.  * the University of California, Berkeley and its contributors.
  22.  * 4. Neither the name of Chris Provenzano, the University nor the names of
  23.  *   its contributors may be used to endorse or promote products derived
  24.  *    from this software without specific prior written permission.
  25.  *
  26.  * THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO, THE REGENTS AND CONTRIBUTORS
  27.  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
  28.  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  29.  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
  30.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  31.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  32.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  33.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  34.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  35.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  36.  * POSSIBILITY OF SUCH DAMAGE.
  37.  *
  38.  *  1.00 93/08/26 proven
  39.  *      -Pthread redesign of this file.
  40.  *
  41.  * 1.10 95/02/11 proven
  42.  * -Now that gethostbyname works ....
  43.  */
  44. #ifndef lint
  45. char copyright[] =
  46. "@(#) Copyright (c) 1989 The Regents of the University of California.n
  47.  @(#) Copyright (c) 1993, 1995 Chris Provenzano.n
  48.  @(#) Copyright (c) 1995 Greg Stark.n
  49.  All rights reserved.n";
  50. #endif /* not lint */
  51. #include <pthreadutil.h>
  52. #include <sys/param.h>
  53. #include <signal.h>
  54. #include <stdlib.h>
  55. #include <string.h>
  56. #include <stdio.h>
  57. void *netfinger();
  58. void usage(int eval)
  59. {
  60. fprintf(stderr,
  61.   "usage: finger [-lps] [-c <net_count>] [-t|T <timeout>] [-f <filename>] [login ...]n");
  62. exit(eval);
  63. }
  64. /*
  65.  * These globals are set initialy and then are only read. 
  66.  * They do not need mutexes.
  67.  */
  68. int thread_time = 0, program_timeout = 0, lflag = 0;
  69. pthread_tad_t parse_file_tad;
  70. pthread_tad_t netfinger_tad;
  71. void * timeout_thread(void * arg)
  72. {
  73. sleep(program_timeout);
  74. exit(0);
  75. }
  76. void * signal_thread(void * arg)
  77. {
  78. int sig;
  79. sigset_t  program_signals;
  80. sigemptyset(&program_signals);
  81. sigaddset(&program_signals, SIGINT);
  82. sigwait(&program_signals, &sig);
  83. exit(0);
  84. }
  85. #ifndef MAXHOSTNAMELEN
  86. #define MAXHOSTNAMELEN 64
  87. #endif
  88. void * parse_file(void * arg) 
  89. {
  90. char hostname[MAXHOSTNAMELEN];
  91. char * filename = arg;
  92. pthread_atexit_t atexit_id;
  93. pthread_attr_t attr;
  94. pthread_t thread_id;
  95.     char * thread_arg;
  96. FILE * fp;
  97. int len;
  98. netsetupwait();
  99. /* Parse the file and create a thread per connection */
  100. if ((fp = fopen(filename, "r")) == NULL) {
  101. fprintf(stderr, "Can't open file %sn", filename);
  102. pthread_exit(NULL);
  103. }
  104. pthread_atexit_add(&atexit_id, fclose_nrv, fp);
  105. if (pthread_attr_init(&attr)) {
  106. fprintf(stderr, "Error: Can't initialize thread attributesn");
  107. exit(2);
  108. }
  109. pthread_atexit_add(&atexit_id, pthread_attr_destroy_nrv, &attr);
  110. while (fgets(hostname, MAXHOSTNAMELEN, fp)) {
  111. if ((thread_arg = (char *)malloc(len = strlen(hostname))) == NULL) {
  112. fprintf(stderr, "Error: out of memoryn");
  113. exit(2);
  114. }
  115. hostname[len - 1] = '';
  116. strcpy(thread_arg, hostname);
  117. pthread_attr_setcleanup(&attr, free, thread_arg);
  118. if (pthread_tad_create(&netfinger_tad, &thread_id, NULL, 
  119.    netfinger, thread_arg)) {
  120. fprintf(stderr, "Error: pthread_tad_create() netfinger_tad.n");
  121. exit(2);
  122. }
  123. }
  124. pthread_exit(NULL);
  125. }
  126. main(int argc, char **argv)
  127. {
  128. pthread_atexit_t atexit_id;
  129. pthread_t thread_id;
  130.     int max_count = 0;
  131. char ch;
  132. /* getopt variables */
  133. extern char *optarg;
  134. extern int optind;
  135. /* Setup tad for parse_file() threads */
  136. if (pthread_tad_init(&parse_file_tad, max_count)) {
  137. fprintf(stderr,"Error: couldn't create parse_file() TAD.n");
  138. exit(1);
  139. }
  140. while ((ch = getopt(argc, argv, "c:f:t:T:ls")) != (char)EOF)
  141. switch(ch) {
  142. case 't': /* Time to let each thread run */
  143. if ((thread_time = atoi(optarg)) <= 0) {
  144. usage(1);
  145. }
  146. break;
  147. case 'T': /* Time to let entire program run */
  148. if ((program_timeout = atoi(optarg)) <= 0) {
  149. usage(1);
  150. }
  151. break;
  152. case 'f':  /* Parse file for list of places to finger */
  153. if (pthread_tad_create(&parse_file_tad, &thread_id, NULL, 
  154.    parse_file, optarg)) {
  155. fprintf(stderr,"Error: pthread_tad_create() parse_file_tad.n");
  156. exit(1);
  157. }
  158. break;
  159. case 'c':
  160. max_count = atoi(optarg);
  161. break;
  162. case 'l':  /* long format */
  163. lflag = 1;
  164. break;
  165. case 's':  /* short format */
  166. lflag = 0;
  167. break;
  168. case '?':
  169. usage(0);
  170. default:
  171. usage(1);
  172. }
  173. /* The rest of the argumants are hosts */
  174. argc -= optind;
  175. argv += optind;
  176. /* Setup timeout thread, if there is one */
  177. if (program_timeout) {
  178. if (pthread_create(&thread_id, NULL, timeout_thread, NULL)) {
  179. fprintf(stderr,"Error: couldn't create program_timeout() threadn");
  180. exit(1);
  181. }
  182. }
  183. /* Setup cleanup thread for signals */
  184. if (pthread_create(&thread_id, NULL, signal_thread, NULL)) {
  185. fprintf(stderr,"Error: couldn't create signal_timeout() threadn");
  186. exit(1);
  187. }
  188. /* Setup tad for netfinger() threads */
  189. if (pthread_tad_init(&netfinger_tad, max_count)) {
  190. fprintf(stderr,"Error: couldn't create netfinger() TAD.n");
  191. exit(1);
  192. }
  193. /* Setup the net and let everyone run */
  194. netsetup();
  195. while (*argv) {
  196. if (pthread_tad_create(&netfinger_tad, &thread_id, NULL, 
  197.    netfinger, *argv)) {
  198. fprintf(stderr, "Error: pthread_tad_create() netfinger_tad.n");
  199. exit(2);
  200. }
  201. argv++;
  202. }
  203. pthread_tad_wait(&parse_file_tad, 0);
  204. pthread_tad_wait(&netfinger_tad, 0);
  205. exit(0);
  206. }