finger.c
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:3k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. #include "config.h"
  2. #include "includes.h"
  3. #include "defs.h"
  4. #include "protos.h"
  5. #include "socks.h"
  6. static char *Progname;
  7. int main(int argc, char **argv) {
  8.     struct sockaddr_in sin;
  9.     struct hostent *hp;
  10.     struct servent *sp;
  11.     char *cp, buf[1024], msg[2048];
  12.     int v, n, i, s;
  13.     u_int l;
  14. #ifdef WHOIS_SERVER
  15.     char *service = "whois",  *host = WHOIS_SERVER;
  16. #else
  17.     char *service = "finger", *host = "localhost";
  18. #endif
  19.     struct in_addr dstaddr[21];
  20.     
  21. #ifdef linux
  22.     int optind = 1;
  23. #else
  24.     extern int optind;
  25. #endif
  26.     if ((Progname = strrchr(argv[0], '/')) == NULL) Progname = argv[0];
  27.     else Progname++;
  28. #ifdef SOCKS
  29.     LIBPREFIX2(init)(Progname);
  30. #endif
  31.     
  32. #ifdef WHOIS_SERVER
  33.     while ((i = getopt(argc,argv,"h:")) != EOF) {
  34. extern char *optarg;
  35. switch (i) {
  36.     case 'h':
  37. host = optarg;
  38. break;
  39.     default:
  40. fprintf(stderr,"Usage: %s [-h host] namen", Progname);
  41. exit(1);
  42. }
  43.     }
  44. #endif
  45.     
  46.     *(cp = buf) = '';
  47.     for (i = optind; i < argc; i++) {
  48. if (i == 1 && !strcmp(argv[i], "-l")) {
  49.     strcat(cp, "/W ");
  50.     cp += 3;
  51. } else {
  52.     strcat(cp, argv[i]);
  53.     cp += strlen(argv[i]);
  54. }
  55.     }
  56.     
  57. #ifndef WHOIS_SERVER
  58.     if ((cp = strrchr(buf, '@')) != NULL) {
  59. *cp = '';
  60. host = cp + 1;
  61.     } else {
  62. if ((cp = getenv("ORIG_FINGER")) == NULL) cp = ORIG_FINGER;
  63. execvp(cp, argv);
  64. fprintf(stderr, "Unable to run %sn", cp);
  65. exit(1);
  66.     }
  67. #endif
  68.     sin.sin_family = AF_INET;
  69.     
  70.     if ((sp = getservbyname(service, "tcp")) == NULL) {
  71. if ((v = atoi(service)) == 0) {
  72.     fprintf(stderr, "%s: unknown service '%s'n", Progname, service);
  73.     exit(1);
  74. }
  75. sin.sin_port = htons((short) v);
  76.     } else {
  77. sin.sin_port = sp->s_port;
  78.     }
  79.     
  80.     if ((hp = gethostbyname(host)) == NULL) {
  81. if ((l = inet_addr(host)) == -1) {
  82.     fprintf(stderr, "%s: unknown host '%s'n", Progname, host);
  83.     exit(1);
  84. }
  85. /* you are out of luck if your system doesn't use 2's        */
  86. /* complement in integer representation                      */
  87. sin.sin_addr.s_addr = l ;
  88.     } else {
  89. for (i = 0; (i < 20) && *hp->h_addr_list; i++, hp->h_addr_list++)
  90.     memcpy(&(dstaddr[i].s_addr), *hp->h_addr_list, hp->h_length);
  91. dstaddr[i].s_addr = 0;
  92. i = 0;
  93. sin.sin_addr.s_addr = dstaddr[i++].s_addr;
  94.     }
  95.     
  96.     if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  97. sprintf(msg, "%s: socket", Progname);
  98. perror(msg);
  99. exit(1);
  100.     }
  101.     
  102.     while (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
  103. if ((errno == ETIMEDOUT) && (hp != NULL) && 
  104.     ((sin.sin_addr.s_addr = dstaddr[i++].s_addr) != 0)) {
  105.     continue;
  106. }
  107. sprintf(msg, "%s: connect", Progname);
  108. perror(msg);
  109. exit(1);
  110.     }
  111.     strcat(buf, "rn");
  112.     
  113.     if (write(s,buf,strlen(buf)) < 0) {
  114. sprintf(msg, "%s: write", Progname);
  115. perror(msg);
  116.     }
  117.     
  118.     while ((n = read(s, buf, sizeof(buf) - 1)) > 0) {
  119. write(1, buf, n);
  120.     }
  121.     close(s);
  122.     return 0;
  123. }