/* * Copyright (C) 1991, Marcus J. Ranum. All rights reserved. */ #ifndef lint static char RCSid[] = "$Header: /home/mjr/hacks/umud/RWHO/RCS/clilib.c,v 1.4 91/10/28 21:35:07 mjr Exp $"; #endif #include "config.h" #ifdef SUPPORT_RWHO /* * code to interface client MUDs with rwho server * * this is a standalone library. */ #include <stdio.h> #include <ctype.h> #ifdef VMS #include "tintop_dec:[amolitor.foo]types.h" #include "tintop_dec:[amolitor.foo]socket.h" #include "tintop_dec:[amolitor.foo]in.h" #include "tintop_dec:[amolitor.foo]netdb.h" #else #include <fcntl.h> #include <sys/file.h> #include <sys/time.h> #include <sys/types.h> #include <sys/socket.h> /* #include <sys/in.h> */ #include <netinet/in.h> #include <netdb.h> #endif /* VMS */ #define DGRAMPORT 6888 #ifndef NO_HUGE_RESOLVER_CODE extern struct hostent *gethostbyname(); #endif static int dgramfd = -1; static char *password; static char *localnam; static char *lcomment; static struct sockaddr_in addr; time_t senttime; extern char *ty_malloc(); extern void ty_free(); /* enable RWHO and send the server a "we are up" message */ rwhocli_setup(server, serverpw, myname, comment) char *server; char *serverpw; char *myname; char *comment; { #ifndef NO_HUGE_RESOLVER_CODE struct hostent *hp; #endif char pbuf[512]; char *p; if (dgramfd != -1) return (1); password = ty_malloc(strlen(serverpw) + 1); localnam = ty_malloc(strlen(myname) + 1); lcomment = ty_malloc(strlen(comment) + 1); if (password == (char *) 0 || localnam == (char *) 0 || lcomment == (char *) 0) return (1); strcpy(password, serverpw); strcpy(localnam, myname); strcpy(lcomment, comment); p = server; while (*p != '\0' && (*p == '.' || isdigit(*p))) p++; if (*p != '\0') { #ifndef NO_HUGE_RESOLVER_CODE if ((hp = gethostbyname(server)) == (struct hostent *) 0) return (1); (void) bcopy(hp->h_addr, (char *) &addr.sin_addr, hp->h_length); #else return (1); #endif } else { unsigned long f; if ((f = inet_addr(server)) == -1L) return (1); (void) bcopy((char *) &f, (char *) &addr.sin_addr, 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, comment); sendto(dgramfd, pbuf, strlen(pbuf), 0, &addr, sizeof(addr)); return (0); } /* disable RWHO */ rwhocli_shutdown() { 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; ty_free(password); ty_free(localnam); } return (0); } /* send an update ping that we're alive */ rwhocli_pingalive() { 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 */ rwhocli_userlogin(uid, name, tim) char *uid; char *name; time_t tim; { char pbuf[512]; if (dgramfd != -1) { sprintf(pbuf, "A\t%.20s\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.20s", localnam, password, localnam, uid, tim, name); sendto(dgramfd, pbuf, strlen(pbuf), 0, &addr, sizeof(addr)); } return (0); } /* send a "so-and-so-logged out" message */ rwhocli_userlogout(uid) char *uid; { char pbuf[512]; if (dgramfd != -1) { sprintf(pbuf, "Z\t%.20s\t%.20s\t%.20s\t%.20s", localnam, password, localnam, uid); sendto(dgramfd, pbuf, strlen(pbuf), 0, &addr, sizeof(addr)); } return (0); } #endif