home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / security / socks / rfinger / finger.c next >
Encoding:
C/C++ Source or Header  |  1992-02-21  |  2.3 KB  |  126 lines

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <netdb.h>
  5. #include <stdio.h>
  6. #include <sys/file.h>
  7. #include <errno.h>
  8.  
  9. extern int    errno;
  10. extern char    *rindex();
  11. char        *Progname;
  12.  
  13. main(argc, argv)
  14. int    argc;
  15. char    **argv;
  16. {
  17.     char            buf[1024];
  18.     unsigned long        l;
  19.     struct sockaddr_in    sin;
  20.     struct hostent        *hp;
  21.     struct servent        *sp;
  22.     extern int        optind;
  23.     extern char        *optarg;
  24.     int            c, v, n, i;
  25.     int            s;
  26.     extern int        optind;
  27.     FILE            *in;
  28.     char            *cp;
  29. #ifdef WHOIS
  30.     char            *service = "whois", *host = "nic.ddn.mil";
  31. #else
  32.     char            *service = "finger", *host = "localhost";
  33. #endif
  34.  
  35.     if ((Progname = rindex(argv[0], '/')) == NULL)
  36.         Progname = argv[0];
  37.     else
  38.         Progname++;
  39.  
  40. #ifdef WHOIS
  41.     while ((i = getopt(argc,argv,"h:")) != EOF) {
  42.         switch (i) {
  43.         case 'h':
  44.             host = optarg;
  45.             break;
  46.         default:
  47.             fprintf(stderr,"Usage: %s [-h host] name\n", Progname);
  48.             exit(1);
  49.         }
  50.     }
  51. #endif
  52.  
  53.     buf[0] = '\0';
  54.     for (i = optind; i < argc; i++) 
  55.         strcat(buf, argv[i]);
  56.     
  57. #ifndef WHOIS
  58.     if ((cp = rindex(buf, '@')) != NULL) {
  59.         *cp = '\0';
  60.         host = cp + 1;
  61.     } else {
  62.         execvp("finger", argv);
  63.         fprintf(stderr, "Unable to run finger\n");
  64.         exit(1);
  65.     }
  66. #endif
  67.  
  68.     sin.sin_family = AF_INET;
  69.  
  70.     SOCKSinit();
  71.  
  72.     if ((sp = getservbyname(service, "tcp")) == NULL) {
  73.         if ((v = atoi(service)) == 0) {
  74.             fprintf(stderr, "%s: unknown service '%s'\n",
  75.                 Progname, service);
  76.             exit(1);
  77.         }
  78.         sin.sin_port = htons((short) v);
  79.     } else {
  80.         sin.sin_port = htons(sp->s_port);
  81.     }
  82.  
  83.     if ((hp = gethostbyname(host)) == NULL) {
  84.         if ((l = inet_addr(host)) == -1) {
  85.             fprintf(stderr, "%s: unknown host '%s'\n",
  86.                 Progname, host);
  87.             exit(1);
  88.         }
  89.         sin.sin_addr.s_addr = htonl(l);
  90.     } else {
  91.         bcopy(*hp->h_addr_list, &sin.sin_addr, hp->h_length);
  92.         hp->h_addr_list++;
  93.     }
  94.  
  95.     if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  96.         fprintf(stderr, "%s: ", Progname);
  97.         perror("socket");
  98.         exit(1);
  99.     }
  100.  
  101.     while (Rconnect(s, &sin, sizeof(sin)) < 0) {
  102.         if ((errno == ETIMEDOUT) && (hp != NULL) && 
  103.             (hp->h_addr != NULL)) {
  104.             bcopy(*hp->h_addr_list, &sin.sin_addr, hp->h_length);
  105.             hp->h_addr_list++;
  106.             continue;
  107.         }
  108.         fprintf(stderr, "%s: ", Progname);
  109.         perror("connect");
  110.         exit(1);
  111.     }
  112.  
  113.     strcat(buf, "\r\n");
  114.  
  115.     if (write(s,buf,strlen(buf)) < 0) {
  116.         fprintf(stderr, "%s: ", Progname);
  117.         perror("write");
  118.     }
  119.  
  120.     while ((n = read(s, buf, sizeof(buf) - 1)) > 0) {
  121.         write(1, buf, n);
  122.     }
  123.  
  124.     close(s);
  125. }
  126.