/*
Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/
#ifndef lint
static char RCSid[] = "$Header: /usr/users/mjr/hacks/umud/RWHO/RCS/mudwho.c,v 1.5 91/05/28 22:39:32 mjr Exp $";
#endif
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
extern int errno;
#include <ctype.h>
#include <fcntl.h>
#include <sys/file.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define STREAMPORT 6889
#define ENVHOST "MUDWHOSERVER"
#define ENVPORT "MUDWHOPORT"
#ifndef NO_HUGE_RESOLVER_CODE
extern struct hostent *gethostbyname();
#endif
extern char *getenv();
main(ac,av)
int ac;
char *av[];
{
struct sockaddr_in addr;
struct hostent *hp;
int fd;
char *p;
int red;
char rbuf[1024];
char *srv = (char *)0;
int portnum = STREAMPORT;
/* setup host address */
if(ac > 1)
srv = av[1];
else
srv = getenv(ENVHOST);
/* setup port # if we can */
if(ac > 2) {
portnum = atoi(av[2]);
} else {
if((p = getenv(ENVPORT)) != (char *)0)
portnum = atoi(p);
}
if(srv == (char *)0) {
fprintf(stderr,"usage: hostname [or envir %s]\n",ENVHOST);
exit(1);
}
p = srv;
while(*p != '\0' && (*p == '.' || isdigit(*p)))
p++;
/* not all digits or dots */
if(*p != '\0') {
#ifndef NO_HUGE_RESOLVER_CODE
if((hp = gethostbyname(srv)) == (struct hostent *)0) {
fprintf(stderr,"unknown host %s\n",srv);
exit(1);
}
(void)bcopy(hp->h_addr,(char *)&addr.sin_addr,hp->h_length);
#else
fprintf(stderr,"must use numerical notation for host name\n");
exit(1);
#endif
} else {
unsigned long f;
if((f = inet_addr(srv)) == -1L) {
fprintf(stderr,"unknown host %s\n",srv);
exit(1);
}
(void)bcopy((char *)&f,(char *)&addr.sin_addr,sizeof(f));
}
addr.sin_port = htons(portnum);
addr.sin_family = AF_INET;
if((fd = socket(AF_INET,SOCK_STREAM,0)) < 0) {
perror("socket");
exit(1);
}
if(connect(fd,&addr,sizeof(addr)) < 0) {
perror("connect");
exit(1);
}
while((red = read(fd,rbuf,sizeof(rbuf))) > 0)
write(1,rbuf,red);
exit(0);
}