dmuck0.15-beta/docs/muf/
dmuck0.15-beta/game/
dmuck0.15-beta/game/logs/
dmuck0.15-beta/game/muf/
dmuck0.15-beta/game/muf/text/
/*
  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);
}