/* * FINGER.C: * * Remote finger functions * * Copyright (C) 1992, 1993 Brett J. Vickers * */ #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <errno.h> #include <stdio.h> #define write_fd(a,b) write(a, b, strlen(b)); #define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ #define NBBY 8 /* number of bits in a byte */ #define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) #define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) #define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) #define FD_ZERO(p) bzero((char *)(p), sizeof (*(p))) main(argc, argv) int argc; char *argv[]; { void finger(); int fd; if(argc < 3) exit(0); fd = atoi(argv[1]); if(argc == 4) finger(fd, argv[2], argv[3]); else finger(fd, argv[2], ""); } /************************************************************************/ /* finger */ /************************************************************************/ void finger(fd, address, person) int fd; char *address; char *person; { int new_sock, n, Tablesize; char buf[80]; unsigned long addr; struct sockaddr_in sin; struct hostent *h; fd_set mask; if((addr = inet_addr(address)) != -1) sin.sin_family = AF_INET; else if((h = gethostbyname(address)) != NULL) { sin.sin_family = h->h_addrtype; bcopy(h->h_addr, &addr, h->h_length); } else { write_fd(fd, "\n\rInvalid host address\n\r"); exit(0); } sin.sin_addr.s_addr = addr; sin.sin_port = htons(79); if((new_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { write_fd(fd, "\n\rUnable to connect to finger server.\n\r"); exit(0); } if(connect(new_sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) { write_fd(fd, "\n\rUnable to connect to finger server.\n\r"); exit(0); } write(new_sock, person, strlen(person)); write(new_sock, "\n\r\n\r", 4); FD_ZERO(&mask); Tablesize = getdtablesize(); while(1) { FD_SET(new_sock, &mask); select(Tablesize, &mask, 0, 0, 0); n = read(new_sock, buf, 80); if(n <= 0) { close(new_sock); exit(0); } write(fd, buf, n); } }