/
util/
util/fing/
util/italk/
util/lev-reset/
util/lib/
util/list/
util/msg/
util/tdel/
util/vote/
util/wtfix/
/*
 * 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);
	}
}