/*
Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/
/*
code to interface client MUDs with rwho server
this is a standalone library.
*/
#include "os.h"
#define DGRAMPORT 6888
static SOCKET dgramfd = INVALID_SOCKET;
static char *password;
static char *localnam;
static char *lcomment;
static struct sockaddr_in addr;
time_t senttime;
/* enable RWHO and send the server a "we are up" message */
int rwhocli_setup (char *server, char *serverpw, char *myname, char *comment)
{
#ifndef NO_HUGE_RESOLVER_CODE
struct hostent *hp;
#endif
char pbuf[512];
char *p;
if (dgramfd != INVALID_SOCKET)
return (1);
password = malloc (strlen (serverpw) + 1);
localnam = malloc (strlen (myname) + 1);
lcomment = 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 {
#ifdef WIN32
unsigned long f;
#else
struct in_addr f;
#endif
#ifdef WIN32
if ((f = inet_addr (server)) == INADDR_NONE)
return 1;
#else
if (inet_aton (server, &f) == 0)
return 1;
#endif
(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)) == INVALID_SOCKET)
return (1);
time (&senttime);
sprintf (pbuf, "U\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s",
localnam, password, localnam, (int) senttime, comment);
sendto (dgramfd, pbuf, strlen (pbuf), 0, (struct sockaddr *) &addr,
sizeof (addr));
return (0);
}
/* disable RWHO */
void rwhocli_shutdown (void)
{
char pbuf[512];
if (dgramfd != INVALID_SOCKET) {
sprintf (pbuf, "D\t%.20s\t%.20s\t%.20s", localnam, password, localnam);
sendto (dgramfd, pbuf, strlen (pbuf), 0, (struct sockaddr *) &addr,
sizeof (addr));
closesocket (dgramfd);
dgramfd = INVALID_SOCKET;
free (password);
free (localnam);
}
}
/* send an update ping that we're alive */
void rwhocli_pingalive ()
{
char pbuf[512];
if (dgramfd != INVALID_SOCKET) {
sprintf (pbuf, "M\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s",
localnam, password, localnam, (int) senttime, lcomment);
sendto (dgramfd, pbuf, strlen (pbuf), 0, (struct sockaddr *) &addr,
sizeof (addr));
}
}
/* send a "so-and-so-logged in" message */
void rwhocli_userlogin (char *uid, char *name, time_t tim)
{
char pbuf[512];
if (dgramfd != INVALID_SOCKET) {
sprintf (pbuf, "A\t%.20s\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.20s",
localnam, password, localnam, uid, (int) tim, name);
sendto (dgramfd, pbuf, strlen (pbuf), 0, (struct sockaddr *) &addr,
sizeof (addr));
}
}
/* send a "so-and-so-logged out" message */
void rwhocli_userlogout (char *uid)
{
char pbuf[512];
if (dgramfd != INVALID_SOCKET) {
sprintf (pbuf, "Z\t%.20s\t%.20s\t%.20s\t%.20s",
localnam, password, localnam, uid);
sendto (dgramfd, pbuf, strlen (pbuf), 0, (struct sockaddr *) &addr,
sizeof (addr));
}
}