/* Copyright (C) 1991, Marcus J. Ranum. All rights reserved. */ /* code to interface client MUDs with rwho server. this is a standalone library. */ #include <stdio.h> #include <ctype.h> #include <fcntl.h> #include <sys/file.h> #include <sys/time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include "interface.h" #include "params.h" #include "externs.h" #define DGRAMPORT 6888 #ifndef NO_HUGE_RESOLVER_CODE extern struct hostent *gethostbyname(); #endif static int dgramfd = -1; static char server[BUFSIZ]; static char password[BUFSIZ]; char localnam[BUFSIZ]; static char lcomment[BUFSIZ]; static struct sockaddr_in addr; time_t senttime; /* enable RWHO and send the server a "we are up" message */ int rwhocli_setup() { char pbuf[512], *p; struct hostent *hp; unsigned long f; strcpy(localnam, ""); if (!(find_property((dbref) 0, RWHO_SERVER, ACCESS_WI) && find_property((dbref) 0, RWHO_PASS, ACCESS_WI) && find_property((dbref) 0, RWHO_NAME, ACCESS_WI) && find_property((dbref) 0, RWHO_COMMENT, ACCESS_WI))) return 1; strcpy(server, get_property_data((dbref) 0, RWHO_SERVER, ACCESS_WI)); strcpy(password, get_property_data((dbref) 0, RWHO_PASS, ACCESS_WI)); strcpy(localnam, get_property_data((dbref) 0, RWHO_NAME, ACCESS_WI)); strcpy(lcomment, get_property_data((dbref) 0, RWHO_COMMENT, ACCESS_WI)); if(dgramfd != -1) return(1); /* already configured...you goofed! */ p = server; while(*p != '\0' && (*p == '.' || isdigit(*p))) p++; if(*p != '\0') { #ifndef NO_HUGE_RESOLVER_CODE if((hp = gethostbyname(server)) == (struct hostent *)NULL)return(1); strncpy((char *) &addr.sin_addr, (char *) hp->h_addr, hp->h_length); #else return(1); #endif } else { if((f = inet_addr(server)) == -1L) return(1); strncpy((char *) &addr.sin_addr, (char *) &f, sizeof(f)); } addr.sin_port = htons(DGRAMPORT); addr.sin_family = AF_INET; if((dgramfd = socket(AF_INET,SOCK_DGRAM,0)) < 0) return(1); time(&senttime); sprintf(pbuf, "U\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s", localnam, password, localnam, senttime, lcomment); sendto(dgramfd, pbuf, strlen(pbuf), 0, &addr, sizeof(addr)); return(0); } int rwhocli_shutdown() /* disable RWHO */ { char pbuf[512]; if(dgramfd != -1) { sprintf(pbuf,"D\t%.20s\t%.20s\t%.20s", localnam, password, localnam); sendto(dgramfd,pbuf,strlen(pbuf),0,&addr,sizeof(addr)); close(dgramfd); dgramfd = -1; } return(0); } int rwhocli_pingalive() /* send an update ping that we're alive */ { char pbuf[512]; if(dgramfd != -1) { sprintf(pbuf,"M\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s", localnam,password,localnam,senttime,lcomment); sendto(dgramfd,pbuf,strlen(pbuf),0,&addr,sizeof(addr)); } return(0); } /* send a "so-and-so-logged in" message */ int rwhocli_userlogin(char *uid, char *name, time_t tim) { char pbuf[512]; if(dgramfd != -1) { sprintf(pbuf,"A\t%.20s\t%.20s\t%.20s\t%.20s@%.20s\t%.10d\t0\t%.20s", localnam, password, localnam, uid, localnam, tim, name); sendto(dgramfd,pbuf,strlen(pbuf),0, &addr, sizeof(addr)); } return(0); } int rwhocli_userlogout(uid) /* send a "so-and-so-logged out" message */ char *uid; { char pbuf[512]; if(dgramfd != -1) { sprintf(pbuf,"Z\t%.20s\t%.20s\t%.20s\t%.20s@%.20s", localnam,password,localnam,uid,localnam); sendto(dgramfd,pbuf,strlen(pbuf),0,&addr,sizeof(addr)); } return(0); }