home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / N / TCPIP / NETKIT-B.05 / NETKIT-B / NetKit-B-0.05 / finger / net.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-23  |  4.5 KB  |  142 lines

  1. /*
  2.  * Copyright (c) 1989 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  */
  36.  
  37. #ifndef lint
  38. /*static char sccsid[] = "from: @(#)net.c    5.5 (Berkeley) 6/1/90";*/
  39. static char rcsid[] = "$Id: net.c,v 1.1 1994/05/23 09:03:29 rzsfl Exp rzsfl $";
  40. #endif /* not lint */
  41.  
  42. #include <sys/types.h>
  43. #include <sys/socket.h>
  44. #include <netinet/in.h>
  45. #include <netdb.h>
  46. #include <stdio.h>
  47. #include <ctype.h>
  48.  
  49. netfinger(name)
  50.     char *name;
  51. {
  52.     extern int lflag;
  53.     register FILE *fp;
  54.     register int c, lastc;
  55.     struct in_addr defaddr;
  56.     struct hostent *hp, def;
  57.     struct servent *sp;
  58.     struct sockaddr_in sin;
  59.     int s;
  60.     char *alist[1], *host, *rindex();
  61.     u_long inet_addr();
  62.  
  63.     if (!(host = rindex(name, '@')))
  64.         return;
  65.     *host++ = '\0';
  66.     if (!(hp = gethostbyname(host))) {
  67.         defaddr.s_addr = inet_addr(host);
  68.         if (defaddr.s_addr == -1) {
  69.             (void)fprintf(stderr,
  70.                 "finger: unknown host: %s\n", host);
  71.             return;
  72.         }
  73.         def.h_name = host;
  74.         def.h_addr_list = alist;
  75.         def.h_addr = (char *)&defaddr;
  76.         def.h_length = sizeof(struct in_addr);
  77.         def.h_addrtype = AF_INET;
  78.         def.h_aliases = 0;
  79.         hp = &def;
  80.     }
  81.     if (!(sp = getservbyname("finger", "tcp"))) {
  82.         (void)fprintf(stderr, "finger: tcp/finger: unknown service\n");
  83.         return;
  84.     }
  85.     sin.sin_family = hp->h_addrtype;
  86.     bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
  87.     sin.sin_port = sp->s_port;
  88.     if ((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) {
  89.         perror("finger: socket");
  90.         return;
  91.     }
  92.  
  93.     /* have network connection; identify the host connected with */
  94.     (void)printf("[%s]\n", hp->h_name);
  95.     if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
  96.         perror("finger: connect");
  97.         (void)close(s);
  98.         return;
  99.     }
  100.  
  101.     /* -l flag for remote fingerd  */
  102.     if (lflag)
  103.         write(s, "/W ", 3);
  104.     /* send the name followed by <CR><LF> */
  105.     (void)write(s, name, strlen(name));
  106.     (void)write(s, "\r\n", 2);
  107.  
  108.     /*
  109.      * Read from the remote system; once we're connected, we assume some
  110.      * data.  If none arrives, we hang until the user interrupts.
  111.      *
  112.      * If we see a <CR> or a <CR> with the high bit set, treat it as
  113.      * a newline; if followed by a newline character, only output one
  114.      * newline.
  115.      *
  116.      * Otherwise, all high bits are stripped; if it isn't printable and
  117.      * it isn't a space, we can simply set the 7th bit.  Every ASCII
  118.      * character with bit 7 set is printable.
  119.      */ 
  120.     if (fp = fdopen(s, "r"))
  121.         while ((c = getc(fp)) != EOF) {
  122.             c &= 0x7f;
  123.             if (c == 0x0d) {
  124.                 c = '\n';
  125.                 lastc = '\r';
  126.             } else {
  127.                 if (!isprint(c) && !isspace(c))
  128.                     c |= 0x40;
  129.                 if (lastc != '\r' || c != '\n')
  130.                     lastc = c;
  131.                 else {
  132.                     lastc = '\n';
  133.                     continue;
  134.                 }
  135.             }
  136.             putchar(c);
  137.         }
  138.     if (lastc != '\n')
  139.         putchar('\n');
  140.     (void)fclose(fp);
  141. }
  142.