/*
Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
Mod history:
ANSIfied function headers, 9/91, glenn@ces.cwru.edu
STREAMS/TLIified, 7/93, vasoll@a.cs.okstate.edu
*/
/*
code to interface client MUDs with rwho server
This is a standalone library.
*/
#include "autoconf.h"
#include "copyright.h"
#ifndef lint
static char *RCSid = "$Id: rwho_clilib.c,v 1.7 1995/03/17 05:28:07 ambar Exp $";
USE(RCSid);
#endif
#include "mudconf.h"
#include "config.h"
#include "externs.h"
#ifndef __bsdi__
#include <netinet/in.h>
#endif
#include <netdb.h>
#ifdef TLI
#include <sys/stream.h>
#include <sys/tiuser.h>
#include <sys/tihdr.h>
#include <netinet/netinet.h>
#else
#include <arpa/inet.h>
#endif
static int dgramfd = -1;
static char *password;
static char *localnam;
static char *lcomment;
static struct sockaddr_in addr;
#ifdef TLI
static struct t_unitdata *pbuf;
#endif
/* enable RWHO and send the server a "we are up" message */
int
rwhocli_setup(server, dgramport, serverpw, myname, comment)
char *server, *serverpw, *myname, *comment;
int dgramport;
{
struct hostent *hp;
#ifndef TLI
char pbuf[512];
#endif
char *p;
if (dgramfd != -1)
return 1;
password = strsave(serverpw);
localnam = strsave(myname);
lcomment = strsave(comment);
if (password == (char *) NULL || localnam == (char *) NULL ||
lcomment == (char *) NULL)
return 1;
#ifdef TLI
#endif
p = server;
while (*p != '\0' && (*p == '.' || isdigit(*p)))
p++;
if (*p != '\0') {
if ((hp = gethostbyname(server)) == (struct hostent *) NULL)
return 1;
(void) bcopy(hp->h_addr, (char *) &addr.sin_addr, hp->h_length);
} 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;
#ifdef TLI
if ((dgramfd = t_open(TLI_UDP, O_RDWR, NULL)) < 0)
return 1;
if (t_bind(dgramfd, NULL, NULL) < 0) {
t_close(dgramfd);
dgramfd = -1;
return 1;
}
pbuf = (struct t_unitdata *) t_alloc(dgramfd, T_UNITDATA, T_ALL);
if (pbuf == NULL) {
t_close(dgramfd);
dgramfd = -1;
return 1;
}
bcopy(&addr, pbuf->addr.buf, sizeof(struct sockaddr_in));
pbuf->addr.len = sizeof(struct sockaddr_in);
sprintf(pbuf->udata.buf, "U\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s",
localnam, password, localnam, (int)mudstate.now, comment);
pbuf->udata.len = strlen(pbuf->udata.buf);
t_sndudata(dgramfd, pbuf);
#else
if ((dgramfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
return 1;
sprintf(pbuf, "U\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s",
localnam, password, localnam, (int)mudstate.now, comment);
sendto(dgramfd, pbuf, strlen(pbuf), 0, (void *) &addr, sizeof(addr));
#endif
return 0;
}
/* disable RWHO */
int
NDECL(rwhocli_shutdown)
{
#ifndef TLI
char pbuf[512];
#endif
if (dgramfd != -1) {
#ifdef TLI
sprintf(pbuf->udata.buf, "D\t%.20s\t%.20s\t%.20s",
localnam, password, localnam);
pbuf->udata.len = strlen(pbuf->udata.buf);
t_sndudata(dgramfd, pbuf);
t_close(dgramfd);
#else
sprintf(pbuf, "D\t%.20s\t%.20s\t%.20s",
localnam, password, localnam);
sendto(dgramfd, pbuf, strlen(pbuf), 0, (void *) &addr, sizeof(addr));
close(dgramfd);
#endif
dgramfd = -1;
free(password);
free(localnam);
}
return 0;
}
/* send an update ping that we're alive */
int
NDECL(rwhocli_pingalive)
{
#ifndef TLI
char pbuf[512];
#endif
if (dgramfd != -1) {
#ifdef TLI
sprintf(pbuf->udata.buf, "M\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s",
localnam, password, localnam, (int)mudstate.now, lcomment);
pbuf->udata.len = strlen(pbuf->udata.buf);
t_sndudata(dgramfd, pbuf);
#else
sprintf(pbuf, "M\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.25s",
localnam, password, localnam, (int)mudstate.now, lcomment);
sendto(dgramfd, pbuf, strlen(pbuf), 0, (void *) &addr, sizeof(addr));
#endif
}
return 0;
}
/* send a "so-and-so-logged in" message */
int
rwhocli_userlogin(uid, name, tim)
char *uid, *name;
time_t tim;
{
#ifndef TLI
char pbuf[512];
#endif
if (dgramfd != -1) {
#ifdef TLI
sprintf(pbuf->udata.buf, "A\t%.20s\t%.20s\t%.20s\t%.20s\t%.10d\t0\t%.20s",
localnam, password, localnam, uid, (int)tim, name);
pbuf->udata.len = strlen(pbuf->udata.buf);
t_sndudata(dgramfd, pbuf);
#else
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, (void *) &addr, sizeof(addr));
#endif
}
return 0;
}
/* send a "so-and-so-logged out" message */
int
rwhocli_userlogout(uid)
char *uid;
{
#ifndef TLI
char pbuf[512];
#endif
if (dgramfd != -1) {
#ifdef TLI
sprintf(pbuf->udata.buf, "Z\t%.20s\t%.20s\t%.20s\t%.20s",
localnam, password, localnam, uid);
pbuf->udata.len = strlen(pbuf->udata.buf);
t_sndudata(dgramfd, pbuf);
#else
sprintf(pbuf, "Z\t%.20s\t%.20s\t%.20s\t%.20s",
localnam, password, localnam, uid);
sendto(dgramfd, pbuf, strlen(pbuf), 0, (void *) &addr, sizeof(addr));
#endif
}
return 0;
}