slugnet - Multiple user conferencing system: Part 4 of 6
James R. Purdon III
purdon at athena.mit.edu
Fri Dec 21 03:46:46 AEST 1990
The slugnet program is a multiple-user, interactive conferencing
facility. It currently runs under a variety of System V-based and
BSD-based operating systems (although certain functions may not be
possible under some of these operating systems).
Cut here-------------------------------------------------------------------
#!/bin/sh
# to extract, remove the header and type "sh filename"
if `test ! -s ./slugnet.c`
then
echo "writing ./slugnet.c"
cat > ./slugnet.c << '\End\Of\Shar\'
/* @(#)slugnet.c 1.16 */
#include "slugnet.h"
#include <pwd.h>
#ifdef NETWORK
#ifdef INTERLAN
#include <interlan/socket.h>
#include <interlan/netdb.h>
#include <interlan/in.h>
#else
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#endif
#endif NETWORK
#ifdef INTERLAN
#include <interlan/il_ioctl.h>
#else
#include <sys/ioctl.h>
#endif
#ifdef NETWORK
int slugnet( socket, rhost )
int socket;
char *rhost;
#endif NETWORK
#ifdef LOCAL
main()
#endif LOCAL
{
/* pointers */
char *p[LINLEN];
/* strings */
static char access[FLNMLN]="\0";
static char billing[4]="\0";
static char broad[24]=" < broadcast message >";
static char confer[CFRLEN]="\0"; /* conference name */
static char crrct[52]="\nIs the above information correct ( yes or no )? : ";
static char dprivs[FLNMLN]="\0"; /* default privileges */
static char host[HOSTLEN]="\0"; /* host name */
static char idfrmt[28]="\nFrom %s ( %s@%s / %s ):%s";
static char idstr[LINLEN]="\0"; /* user id string */
static char jsn[JSNLEN]="aaaa"; /* user jsn - incremented per job */
static char last[UNLEN]="\0"; /* last valid un */
static char line[LINLEN+80]="\0";
static char logset[4]="\0";
static char mode[MODELN]="U"; /* mode u = user, s = server */
static char modem[LINLEN]="\0";
static char msgbuf[MSGLEN]="\0";
static char name[NAMLEN]="New user";
static char newcfr[CFRLEN]="\0"; /* conference to join */
static char normal[2]=BLANKS;
static char notallow[34]=" Error: Insufficent privileges.\n";
static char offstr[6]="off.\n";
static char onstr[5]="on.\n";
static char offtst[5]=" off";
static char ontst[4]=" on";
static char pid[PIDLEN]="\0"; /* pid in string form */
static char portstr[4]="\0";
static char prompt[PRMLEN]="\0";
static char repeat[32]="Please answer 'yes' or 'no'. : ";
static char scratch[ MSGLEN ]; /* scratch buffer */
static char server[LINLEN]="\0"; /* server string */
static char slugid[UNLEN]="\0";
static char sndbuf[MSGLEN+80]="\0"; /* send buffer */
static char srvnam[8]="Server";
static char srvhst[HOSTLEN]; /* server host name */
static char thost[HOSTLEN]; /* target host name for private messages */
char *thstp; /* pointer for thost */
static char tjsn[JSNLEN]; /* target jsn for private messages */
static char un[UNLEN];
static char uprivs[FLNMLN]="\0"; /* user privileges */
static char usrerr[36];
static char waitstr[LINLEN]; /* string for wait mode */
/* files */
static char actfil[FLNMLN]; /* system accounting file name */
static char bgnfil[FLNMLN]; /* prelogin file name */
static char bilfil[FLNMLN]; /* billing options file */
static char confil[FLNMLN]; /* user configuration file name */
static char deffil[FLNMLN]; /* user definition file name */
static char dirfil[FLNMLN]; /* user directory file name */
static char hlpfil[FLNMLN]; /* help file name */
static char jsnfil[FLNMLN]; /* jsn file name */
static char newfil[FLNMLN]; /* news file name */
static char profil[FLNMLN]; /* user prologue file name */
static char rcvfil[FLNMLN]; /* receiver file name */
static char sysfil[FLNMLN]; /* system configuration file */
static char tmpfil[FLNMLN]; /* user scratch file */
static char usrfil[FLNMLN]; /* user directory file name */
static char valfil[FLNMLN]; /* validated user list file name */
/* slugdir record structure */
struct slugdir inpstr; /* for usrfil */
/* paths */
static char homedir[DIRLEN];
static char slugdir[DIRLEN];
/* char functions */
char *ctime(),*getcwd(),*getlogin();
/* file descriptors */
FILE *act,*con,*def,*hlp,*inp,*rcv,*snd,*tmp;
#ifdef SYSV2
FILE *fopen();
#endif SYSV2
/* ints */
int atend,bci,bco,bill,brdcst,change,count[MSGLEN],cntns_flg,dtime,echo,
echoplex,found,hlpon,hlp_found,i,ipid,j,join,k,l,login,msgpos,
msgflg,novice,nwlnln,prvflg,prmpt_flg,reclen,remote,ringok,
scroll,serial_number,soff,space,stop,timer,usr,wait;
int allon,memon,conon,logon,hoson; /* flags for some show commands */
unsigned int port; /* com port number */
int in,out; /* file / socket descriptor */
int fromlen; /* length of struct sockaddr */
#ifdef NETWORK
struct sockaddr_in from;
struct sockaddr_in *fromp;
#endif NETWORK
/* stuff for ioctl */
int off, on;
struct hostent *hp;
int admin,brods,dirct,files,joinc,names,network,privt,ringr,systm; /* privileges */
#ifndef ULTRIX
int euid, uid;
#endif ULTRIX
long time0,time1,time();
#ifdef ULTRIX
unsigned short uid, euid;
#endif ULTRIX
#ifdef SYSV2
unsigned sleep(),u;
void exit();
#endif SYSV2
#ifdef SYSV3
unsigned sleep(),u;
void exit();
#endif SYSV3
#ifdef ULTRIX
void sleep();
void exit();
#endif ULTRIX
#ifdef SYSV2
void sigquit(),sigstop(),sighang(),sigterm();
#endif SYSV2
#ifdef SYSV3
void sigquit(),sigstop(),sighang(),sigterm();
#endif SYSV3
#ifdef BSD4
int sigurg(),sigtstp(),sigquit(),sigstop(),sighang(),sigterm();
#endif BSD4
#ifdef ULTRIX
int sigurg(),sigtstp(),sigquit(),sigstop(),sighang(),sigterm();
#endif ULTRIX
/* password entry field */
struct passwd *upasswd;
struct passwd *getpwuid();
/* these are used by ioctl */
on = ON;
off = OFF;
/* initialize signal variables */
hungup = OFF;
stopscroll = OFF;
/* get process id and host name */
sprintf( pid, "%d", getpid());
gethostname( host, HOSTLEN );
strcpy( srvhst, host );
#ifdef DBG
fprintf( stderr, "pid: %s at 1\n", pid );
#endif DBG
/* set real and effective uids */
uid = getuid();
euid = geteuid();
/* handle interrupts and hangups */
#ifdef LOCAL
signal(SIGHUP, sighang);
signal(SIGQUIT, sigquit);
#ifdef ULTRIX
signal( SIGINT, sigstop);
signal( SIGTSTP, sigtstp);
#endif ULTRIX
#ifdef BSD4
signal( SIGINT, sigstop);
signal( SIGTSTP, sigtstp);
#endif BSD4
#ifdef SYSV2
signal(SIGINT , sigstop);
#endif SYSV2
#ifdef SYSV3
signal(SIGINT , sigstop);
#endif SYSV3
#endif LOCAL
#ifdef NETWORK
signal(SIGHUP, sighang);
signal(SIGQUIT, sigquit);
#ifdef ULTRIX
signal( SIGURG, sigurg);
signal( SIGINT, sigstop);
signal( SIGTSTP, sigtstp);
#endif ULTRIX
#ifdef BSD4
signal( SIGURG, sigurg);
signal( SIGINT, sigstop);
signal( SIGTSTP, sigtstp);
#endif BSD4
#ifdef SYSV2
signal(SIGINT ,sigstop);
#endif SYSV2
#ifdef SYSV3
signal(SIGINT ,sigstop);
#endif SYSV3
#endif NETWORK
signal(SIGTERM,sigterm);
strcpy(tjsn," \0"); /* target jsn for private messages */
strcpy(un,"\0");
strcpy(usrerr," Error: chgusr return code is %d.\n");
strcpy(waitstr,"\0"); /* string for wait mode */
/* files */
strcpy( actfil,"\0"); /* system accounting file name */
strcpy( bgnfil,"\0"); /* prelogin file name */
strcpy( bilfil,"\0"); /* billing options file */
strcpy( confil,"\0"); /* user configuration file name */
strcpy( deffil,"\0"); /* user definition file name */
strcpy( dirfil,"\0"); /* user directory file name */
strcpy( hlpfil,"\0"); /* help file name */
strcpy( jsnfil,"\0"); /* jsn file name */
strcpy( newfil,"\0"); /* news file name */
strcpy( profil,"\0"); /* user prologue file name */
strcpy( rcvfil,"\0"); /* receiver file name */
strcpy( sysfil,"\0"); /* system configuration file */
strcpy( tmpfil,"\0"); /* user scratch file */
strcpy( usrfil,"\0"); /* user directory file name */
strcpy( valfil,"\0"); /* validated user list file name */
/* directories */
strcpy( slugdir, SLUGDIR );
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
getcwd( homedir, DIRLEN );
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
bci=0;
bco=0;
nwlnln=strlen("\n");
#ifdef NETWORK
in=socket;
out=socket;
if( rhost != (char *)NULL ){
on = ON;
ioctl( in, FIONBIO, (char *)&on );
}
#endif NETWORK
#ifdef LOCAL
in=fileno(stdin);
out=fileno( stdout );
#endif LOCAL
#ifdef DBG
fprintf( stderr, "pid: %s at 2\n", pid );
#endif DBG
reclen = sizeof( struct slugdir );
serial_number=NULL;
/* sprintf(slugid,"SLUGNET%4x0000",serial_number); */
/* get server name */
upasswd = getpwuid( euid );
strcpy(slugid,upasswd->pw_name );
repchar(slugid,' ','0');
strcpy(un,slugid);
strcpy(last,un);
sprintf(server,idfrmt,srvnam,slugid,srvhst,jsn,normal);
/* set directory to slugnet */
i = chdir( slugdir );
if( i != NULL )
{
bco=bco+transmit(out,"\nUnable to change to directory 'slugnet'.",NOCRLF);
return(1);
}
/* set up system configuration */
strcpy(line,"\0");
if(DEBUG==ON && euid==uid)
{
bco=bco+transmit(out,"\nEnter name of system configuration file. : ",NOCRLF);
bci=bci+receive( in,line,FLNMLN,OFF);
}
if(strlen(line)<=12)
sscanf(line,"%s",sysfil);
else
sscanf(line,"%15s",sysfil);
if(strlen(sysfil)==0)
strcpy(sysfil,"slugsys.dat");
if((i=getcfg(sysfil,access,actfil,bgnfil,billing,bilfil,deffil,dirfil,
hlpfil,jsnfil,logset,modem,newfil,portstr,dprivs,profil,usrfil,valfil))!=NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(line," Error: getcfg return code is %d.\n",i);
bco=bco+transmit(out,line,NOCRLF);
return(2);
}
/* set billing flag */
if(strncmp(billing,onstr,2)==NULL)
bill=ON;
else
bill=OFF;
/* set login flag */
if(strncmp(logset,onstr,2)==NULL)
login=ON;
else
login=OFF;
if(DEBUG==ON && euid==uid)
{
sprintf(line,"\nSystem Configuration\n");
sprintf(line," acc: %s",access);
i=transmit(out,line,CRLF);
sprintf(line," act: %s",actfil);
i=transmit(out,line,CRLF);
sprintf(line," bgn: %s",bgnfil);
i=transmit(out,line,CRLF);
sprintf(line," bil: %s",billing);
i=transmit(out,line,CRLF);
sprintf(line," blf: %s",bilfil);
i=transmit(out,line,CRLF);
sprintf(line," def: %s",deffil);
i=transmit(out,line,CRLF);
sprintf(line," dir: %s",dirfil);
i=transmit(out,line,CRLF);
sprintf(line," hlp: %s",hlpfil);
i=transmit(out,line,CRLF);
sprintf(line," jsn: %s",jsnfil);
i=transmit(out,line,CRLF);
sprintf(line," log: %s",logset);
i=transmit(out,line,CRLF);
sprintf(line," mod: %s",modem);
i=transmit(out,line,CRLF);
sprintf(line," new: %s",newfil);
i=transmit(out,line,CRLF);
sscanf(portstr,"%u",&port);
sprintf(line," por: %u",port);
i=transmit(out,line,CRLF);
sprintf(line," pri: %s",dprivs);
i=transmit(out,line,CRLF);
sprintf(line," pro: %s",profil);
i=transmit(out,line,CRLF);
sprintf(line," sys: %s",sysfil);
i=transmit(out,line,CRLF);
sprintf(line," usr: %s",usrfil);
i=transmit(out,line,CRLF);
sprintf(line," val: %s",valfil);
i=transmit(out,line,CRLF);
sprintf(line,"%s",crrct);
i=transmit(out,line,NOCRLF);
yno:
i=receive( in,line,LINLEN,OFF);
if(strncmp(line,"n",1)==NULL) return(3);
if(strncmp(line,"y",1)!=NULL)
{
printf("%s\n",line);
sprintf(line,"%s",repeat);
i=transmit(out,line,NOCRLF);
goto yno;
}
}
/* wait for calls */
wait_for_call:
/* initialize variables */
bci=0;
bco=0;
cntns_flg=OFF;
echo=ON;
echoplex=OFF;
found=OFF;
#ifdef LOCAL
prmpt_flg=ON;
#endif LOCAL
#ifdef NETWORK
if( rhost != (char *)NULL )
prmpt_flg = OFF;
else
prmpt_flg=ON;
#endif NETWORK
strcpy(uprivs,dprivs);
/* see if access allowed */
soff=open("slugnet.off",O_RDONLY);
if( soff >= NULL )
{
bco=bco+transmit(out,"Slugnet is currently unavailable.\n",CRLF );
return(4);
}
j=close(soff);
/* get start time */
time(&time0);
#ifdef LOCAL
/* send prelogin news */
bco=bco+transmit(out,"Slugnet on line.\n",CRLF);
bco=bco+send_file(out,bgnfil);
#endif LOCAL
#ifdef NETWORK
/* if internodal client, send server command */
if( rhost != (char *)NULL ){
strcpy( name, "Server" );
bco = bco + transmit(out,"set server on\n",CRLF);
} else {
/* send prelogin news */
bco=bco+transmit(out,"Slugnet on line.\n",CRLF);
bco=bco+send_file(out,bgnfil);
}
#endif NETWORK
#ifdef DBG
fprintf( stderr, "pid: %s at 3\n", pid );
#endif DBG
#ifdef NETWORK
if( rhost == (char *)NULL ){
fromlen = sizeof( from );
if(getpeername( out, &from, &fromlen ) == 0 ) {
#ifdef DBG
fprintf( stderr, "pid: %s at 4a\n", pid );
#endif DBG
fromp = &from;
fromp->sin_port = ntohs((u_short)fromp->sin_port);
if((hp = gethostbyaddr( &fromp->sin_addr, sizeof( struct in_addr ), fromp->sin_family )) != (struct hostent *)NULL) {
#ifdef DBG
fprintf( stderr, "pid: %s at 5a\n", pid );
#endif DBG
strcpy( host, hp->h_name );
} else {
#ifdef DBG
fprintf( stderr, "pid: %s at 5b\n", pid );
#endif DBG
strcpy( host, inet_ntoa( from.sin_addr ));
}
}
strcpy( un, "unknown" );
} else {
hp = gethostent();
strcpy( host, hp->h_name );
upasswd = getpwuid( uid );
strcpy(un,upasswd->pw_name );
}
#ifdef DBG
fprintf( stderr, "pid: %s at 5c\n", pid );
#endif DBG
#endif NETWORK
#ifdef LOCAL
upasswd = getpwuid( uid );
strcpy(un,upasswd->pw_name );
#endif LOCAL
#ifdef DBG
fprintf( stderr, "pid: %s at 6\n", pid );
#endif DBG
/* initialize session variables */
/* if uid equals euid, set all privileges */
#ifdef LOCAL
if( uid == euid )
strcpy(uprivs,"_abdfjnprs");
#endif LOCAL
/* assign privileges */
if(find(uprivs,'a',15)>NULL)
admin=ON; /* administrator */
else
admin=OFF;
if(find(uprivs,'b',15)>NULL)
brods=ON; /* broadcast allowed */
else
brods=OFF;
if(find(uprivs,'d',15)>NULL)
dirct=ON; /* redirection allowed */
else
dirct=OFF;
if(find(uprivs,'f',15)>NULL)
files=ON; /* access to files allowed */
else
files=OFF;
if(find(uprivs,'j',15)>NULL)
joinc=ON; /* join command allowed */
else
joinc=OFF;
if(find(uprivs,'n',15)>NULL)
names=ON; /* set name command allowed */
else
names=OFF;
if(find(uprivs,'p',15)>NULL)
privt=ON; /* private messages allowed */
else
privt=OFF;
if(find(uprivs,'r',15)>NULL)
ringr=ON; /* ring command allowed */
else
ringr=OFF;
if(find(uprivs,'s',15)>NULL)
systm=ON; /* Shell access allowed */
else
systm=OFF;
#ifdef NETWORK
network = ON;
#endif NETWORK
#ifdef LOCAL
network = OFF;
#endif LOCAL
#ifdef DBG
fprintf( stderr, "pid: %s at 7\n", pid );
#endif DBG
atend=OFF;
brdcst=OFF;
strcpy(confer,"Root");
if(login==OFF)
strcpy(confil,"slugcon.dat");
else
sprintf(confil,"slug%s.dat",un[11]);
dtime=15;
#ifdef NETWORK
in=socket;
#endif NETWORK
#ifdef LOCAL
in = fileno( stdin );
#endif LOCAL
inp=(FILE *)NULL;
join=OFF;
strcpy(mode,"U");
#ifdef NETWORK
if( rhost != (char *)NULL ){
strcpy(mode,"S");
dtime = 1;
}
#endif NETWORK
msgflg=ON;
msgpos=0;
msgbuf[msgpos]=(char)NULL;
#ifdef NETWORK
out=socket;
#endif NETWORK
#ifdef LOCAL
out = fileno( stdout );
novice=ON;
echo=ON;
#endif LOCAL
#ifdef NETWORK
if( rhost != (char *)NULL ){
novice=OFF;
echo=OFF;
} else {
novice=ON;
echo=ON;
}
#endif NETWORK
prvflg=OFF;
remote=OFF;
ringok=ON;
scroll=OFF;
sprintf(server,idfrmt,srvnam,slugid,srvhst,jsn,normal);
stop=OFF;
timer=ON;
wait=OFF;
strcpy(waitstr,"From");
/* read user's configuration file, if it exists */
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
i=chdir(homedir);
con=fopen(confil,"r");
if(con!=NULL)
{
fscanf(con,"%s ",deffil);
i=repchar(deffil,'_',' ');
fscanf(con,"%u ",&dtime);
fscanf(con,"%d ",&echo);
fscanf(con,"%d ",&echoplex);
fscanf(con,"%s ",name);
i=repchar(name,'_',' ');
fscanf(con,"%d ",&novice);
fscanf(con,"%s ",profil);
i=repchar(profil,'_',' ');
fscanf(con,"%d ",&prmpt_flg);
fscanf(con,"%d ",&ringok);
fscanf(con,"%d ",&timer);
fscanf(con,"%s ",waitstr);
i=repchar(waitstr,'_',' ');
j=fclose(con);
}
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
i=chdir(slugdir);
/* setup jsn */
if((i=getjsn(jsn,jsnfil,rcvfil))!=NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(line," Error: getjsn return code is %d.\n",i);
bco=bco+transmit(out,line,NOCRLF);
return(5);
}
/* send postlogin news */
sprintf(server,idfrmt,srvnam,slugid,srvhst,jsn,normal);
#ifdef LOCAL
bco=bco+transmit(out,BLANKS,CRLF);
bco=bco+transmit(out,server,CRLF);
bco=bco+transmit(out," Welcome to Slugnet!",CRLF);
bco=bco+send_file(out,newfil);
#endif LOCAL
#ifdef NETWORK
if( rhost == (char *)NULL ){
bco=bco+transmit(out,BLANKS,CRLF);
bco=bco+transmit(out,server,CRLF);
bco=bco+transmit(out," Welcome to Slugnet!",CRLF);
bco=bco+send_file(out,newfil);
}
#endif NETWORK
/* put user in user directory */
if((i=chgusr(name,un,jsn,confer,rcvfil,usrfil,OFF,host,pid,mode))!=NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(line,usrerr,i);
bco=bco+transmit(out,line,CRLF);
return(6);
}
/* build logon message */
sprintf(sndbuf,"$server:a:%s:%s:%s:%s:%s:%s:\n %s\n %s ( %s@%s / %s ) logged on %s.\n$server:m:%s:\n",name,un,host,jsn,confer,mode,server,name,un,host,jsn,confer,confer);
/* do prologue file, if present */
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
i=chdir(homedir);
inp=fopen(profil,"r");
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
i=chdir(slugdir);
/* main loop */
while(strncmp(line,"exit",4)!=NULL)
{
/* send message */
sndmsg:
if(msgflg==ON||brdcst==ON||prvflg==ON)
{
#ifdef DBGC
if( mode[ 0 ] == 'S' )
fprintf( stderr, "s:%s",sndbuf );
#endif DBGC
lock(usrfil);
#ifdef SYSV2
usr=open(usrfil,O_RDWR|O_SYNC);
#endif SYSV2
#ifdef SYSV3
usr=open(usrfil,O_RDWR|O_SYNC);
#endif SYSV3
#ifdef BSD4
usr=open(usrfil,O_RDWR|O_FSYNC);
#endif BSD4
#ifdef ULTRIX
usr=open(usrfil,O_RDWR|O_FSYNC);
#endif ULTRIX
scratch[ 0 ] = ( char )NULL;
for(;;)
{
#ifdef SYSV2
j=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
j=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
j=read(usr,&inpstr,reclen);
#endif BSD4
#ifdef ULTRIX
j=read(usr,&inpstr,reclen);
#endif ULTRIX
if( j == NULL )
break;
/* see if the jsn is valid */
if(strncmp(inpstr.jsn," ",JSNLEN-1)!=NULL){
/* make sure the process is alive */
sscanf( inpstr.pid, "%d", &ipid );
if(kill(ipid,NULL)<NULL && strcmp( inpstr.confer, confer ) == NULL ) {
sprintf(msgbuf,"\n$server:d:%s:%s:%s:%s:%s:%s:\n %s\n %s ( %s@%s / %s ) disconnected.\n$server:m:%s:\n",inpstr.name,inpstr.un,inpstr.host,inpstr.jsn,inpstr.confer,inpstr.mode,server,inpstr.name,inpstr.un,inpstr.host,inpstr.jsn,inpstr.confer);
strcat( scratch, msgbuf );
msgbuf[ 0 ] = (char)NULL;
strcpy( inpstr.jsn, " " );
#ifndef SYSV2
j=lseek(usr,-(long)reclen,SEEK_CUR);
#endif SYSV2
#ifdef SYSV2
j=lseek(usr,-(long)reclen,CURRENT);
#endif SYSV2
#ifdef SYSV2
j=write(usr,&inpstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
j=write(usr,&inpstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
j=write(usr,&inpstr,reclen);
#endif BSD4
#ifdef ULTRIX
j=write(usr,&inpstr,reclen);
#endif ULTRIX
/* unlink rcvfil */
if( strncmp( inpstr.rcvfil, "*", 1 ) != NULL )
unlink( inpstr.rcvfil );
} else if( strncmp(inpstr.confer,confer,strlen(confer))==NULL
&& strncmp(inpstr.jsn,jsn,JSNLEN-1)!=NULL
&& strncmp(inpstr.rcvfil,"*",1)!=NULL
&& msgflg==ON ){
lock(inpstr.rcvfil);
snd=fopen(inpstr.rcvfil,"a");
fprintf(snd,"%s\n",sndbuf);
j=fclose(snd);
unlock(inpstr.rcvfil);
} else if( strncmp(inpstr.jsn,jsn,JSNLEN-1)!=NULL
&& strncmp(inpstr.rcvfil,"*",1)!=NULL
&& brdcst==ON ){
lock(inpstr.rcvfil);
snd=fopen(inpstr.rcvfil,"a");
fprintf(snd,"%s\n",sndbuf);
j=fclose(snd);
unlock(inpstr.rcvfil);
} else if( strncmp(inpstr.jsn,jsn,JSNLEN-1)!=NULL
&& strncmp(inpstr.rcvfil,"*",1)!=NULL
&& strncmp( inpstr.mode,"S",1)==NULL
&& ( brdcst==ON || msgflg == ON || prvflg == ON )){
lock(inpstr.rcvfil);
snd=fopen(inpstr.rcvfil,"a");
fprintf(snd,"%s\n",sndbuf);
j=fclose(snd);
unlock(inpstr.rcvfil);
} else if( strncmp(inpstr.confer,confer,strlen(confer))==NULL
&& strncmp(inpstr.jsn,tjsn,JSNLEN-1)==NULL
&& strncmp(inpstr.jsn,jsn,JSNLEN-1)!=NULL
&& strncmp(inpstr.rcvfil,"*",1)!=NULL
&& ( thost[ 0 ] == NULL || strnicmp( inpstr.host, thost, strlen( thost )) == NULL )
&& prvflg==ON ){
lock(inpstr.rcvfil);
snd=fopen(inpstr.rcvfil,"a");
fprintf(snd,"%s\n",sndbuf);
j=fclose(snd);
unlock(inpstr.rcvfil);
} else if( strncmp(inpstr.jsn,jsn,JSNLEN-1)==NULL
&& echo==ON && join==OFF ){
lock(inpstr.rcvfil);
snd=fopen(inpstr.rcvfil,"a");
fprintf(snd,"%s\n",sndbuf);
j=fclose(snd);
unlock(inpstr.rcvfil);
}
}
}
j=close(usr);
unlock(usrfil);
/* clean up disconnects */
if( scratch[ 0 ] != (char )NULL ){
strcpy( sndbuf, scratch );
goto sndmsg;
}
/* do join */
if(join==ON)
{
join=OFF;
strcpy(confer,newcfr);
sprintf(sndbuf,"$server:c:%s:%s:%s:%s:%s:%s:\n %s\n %s ( %s@%s / %s ) logged on %s.\n$server:m:%s:\n",name,un,host,jsn,confer,mode,server,name,un,host,jsn,confer,confer);
if((i=chgusr(name,un,jsn,confer,rcvfil,usrfil,OFF,host,pid,mode))!=NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(line,usrerr,i);
bco=bco+transmit(out,line,CRLF);
return(7);
}
goto sndmsg;
}
/* do exit or bye */
if(atend==ON)
{
/* update accounting file */
lock(actfil);
act=fopen(actfil,"a");
chmod(actfil,00600);
time(&time1);
i = (int)(time1 - time0);
fprintf(act,"%s@%s:%s:%d:%d:%d:%d:%d:%s",un,host,jsn,bci,bco,time0,time1,i,(char *)ctime(&time0));
i=fclose(act);
unlock(actfil);
/* remove user from directory */
if((i=chgusr(name,un,jsn,confer,rcvfil,usrfil,ON,host,pid,mode))!=NULL)
{
bco=bco+transmit(out,server,NOCRLF);
sprintf(line,usrerr,i);
bco=bco+transmit(out,line,CRLF);
return(8);
}
goto cleanup;
}
}
/* print and reset user's receive file */
if(remote==OFF)
{
lock(rcvfil);
rcv=fopen(rcvfil,"r");
}
/* bco=bco+send_file(out,rcvfil); */
space = OFF;
while(feof(rcv)==NULL)
{
i=rdline(rcv,line,LINLEN);
#ifdef DBGC
if( mode[ 0 ] == 'S' )
fprintf( stderr, "rf: %s\n", line );
#endif DBGC
if( i > 0 && wait == OFF ) space = ON;
if(mode[0] == 'S' && line[ 0 ] == '$' ){
bco=bco+transmit(out,line,CRLF);
}
else if(line[ 0 ] == '$' && strncmp(line+1,jsn,JSNLEN-1)==NULL ){
for(i=5;i<LINLEN;++i) line[i-5]=line[i];
remote=ON;
unlock(rcvfil);
goto parser;
}
if(line[ 0 ] != '$' && (i = strlen( line )) > 0 )
bco=bco+transmit(out,line,CRLF);
if(wait==ON)
{
j=strlen(waitstr);
for(i=0;(i+j-1)<strlen(line);++i)
{
if(strncmp(line+i,waitstr,j)==NULL){
wait=OFF;
#ifdef NETWORK
off = OFF;
if( ioctl( in, FIONBIO, (char *)&off ) < NULL )
perror( "ioctl2" );
#endif NETWORK
}
}
}
}
if( space == ON && mode[ 0 ] != 'S' ) bco = bco + transmit( out, "\n", NOCRLF );
i=fclose(rcv);
i=unlink(rcvfil);
rcv=fopen(rcvfil,"a");
i=fclose(rcv);
unlock(rcvfil);
/* reset message flags */
brdcst=OFF;
msgflg=OFF;
prvflg=OFF;
remote=OFF;
/* display prompt */
prompter:
/* see if SIGINT has been sent ( stops scroll and wait mode ) */
if(stopscroll==ON)
{
scroll=OFF;
wait=OFF;
stopscroll=OFF;
#ifdef LOCAL
/* reset input */
if( inp != (FILE *)NULL ) {
fclose( inp );
inp = (FILE *)NULL;
in = fileno( stdin );
}
#endif LOCAL
}
/* display prompt */
if(scroll==OFF&&wait==OFF)
{
if(prmpt_flg)
{
sprintf(prompt,"%s> ",confer);
bco=bco+transmit(out,prompt,NOCRLF);
}
if(cntns_flg)
sleep((unsigned)dtime);
}
/* clear line */
for(i=0;i<LINLEN;++i) line[i]=(char)NULL;
/* if scroll or wait mode, skip user input */
if(scroll==ON||wait==ON)
{
#ifdef NETWORK
/* check the socket for activity */
if( read( in, line, LINLEN ) > 0 ) {
stopscroll = ON;
off = OFF;
if( ioctl( in, FIONBIO, (char *)&off ) < NULL )
perror( "ioctl2" );
goto prompter;
}
#endif NETWORK
if(timer==ON)
{
time(&time1);
bco=bco+transmit(out,(char *)ctime(&time1),CRLF);
}
#ifdef SYSV2
sleep((unsigned)dtime);
#endif SYSV2
#ifdef SYSV3
u=sleep((unsigned)dtime);
#endif SYSV3
#ifdef BSD4
sleep((unsigned)dtime);
#endif BSD4
#ifdef ULTRIX
sleep((unsigned)dtime);
#endif ULTRIX
goto parser;
}
/* get input from user */
getinp:
if(inp==(FILE *)NULL) {
/*if( mode[ 0 ] == 'S' )
bco=bco+transmit(out,"\n",NOCRLF);*/
bci=bci+receive( in,line,LINLEN,echoplex);
#ifdef DBGC
if( mode[ 0 ] == 'S' )
fprintf( stderr, "rr: %s", line );
#endif DBGC
if( mode[ 0 ] == 'S' )
sleep(( unsigned )dtime );
/* strcpy( un, hp->h_name ); */
} else {
if(feof(inp)==NULL)
{
bco=bco+transmit(out,"\n",CRLF);
i=rdline(inp,line,LINLEN);
}
else
{
i=fclose(inp);
inp=(FILE *)NULL;
goto getinp;
}
}
/* command parser */
parser:
/* strcpy( un, hp->h_name ); */
/* if user has hung up, do an "exit" command */
if(hungup==ON)
{
strcpy(line,"exit");
}
/* restore effective uid, just in case */
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
/* comments */
if(strncmp(line,"*",1)==NULL)
{
if(echo==ON) bco=bco+transmit(out,line,CRLF);
goto prompter;
}
/* process server commands */
else if(strnicmp(line,"$server:",8)==NULL && mode[ 0 ] == 'S' ){
/* directory change commands */
if( line[ 8 ] == 'a' ||
line[ 8 ] == 'c' ||
line[ 8 ] == 'd' ){
/* replace : with nulls and set pointers */
j = strlen( line );
k = 0;
for( i = 9; i < j; ++i ){
if( line[ i ] == ':' ){
line[ i ] = (char )NULL;
++i;
p[ k ] = line + i;
++k;
}
}
/* issue chgusr command */
if( line[ 8 ] == 'c')
i=chgusr(p[ 0 ],p[ 1 ],p[ 3 ],p[ 4 ],"*",usrfil,OFF,p[ 2 ],pid,p[ 5 ]);
else if( line[ 8 ] == 'a' ){
setjsn( p[ 3 ], jsnfil );
i=chgusr(p[ 0 ],p[ 1 ],p[ 3 ],p[ 4 ],"*",usrfil,OFF,p[ 2 ],pid,p[ 5 ]);
} else if( line[ 8 ] == 'd' )
i=chgusr(p[ 0 ],p[ 1 ],p[ 3 ],p[ 4 ],"*",usrfil,ON,p[ 2 ],pid,p[ 5 ]);
/* send connection report */
} else if( line[ 8 ] == 'r' ){
lock(usrfil);
#ifdef SYSV2
usr=open(usrfil,O_RDWR|O_SYNC);
#endif SYSV2
#ifdef SYSV3
usr=open(usrfil,O_RDWR|O_SYNC);
#endif SYSV3
#ifdef BSD4
usr=open(usrfil,O_RDWR|O_FSYNC);
#endif BSD4
#ifdef ULTRIX
usr=open(usrfil,O_RDWR|O_FSYNC);
#endif ULTRIX
for(;;){
#ifdef SYSV2
j=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
j=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
j=read(usr,&inpstr,reclen);
#endif BSD4
#ifdef ULTRIX
j=read(usr,&inpstr,reclen);
#endif ULTRIX
if( j == NULL )
break;
/* only send registered jsns */
if(strncmp(inpstr.jsn," ",JSNLEN-1)!=NULL && ( strncmp(inpstr.jsn,jsn,JSNLEN-1) != NULL || strnicmp(inpstr.host,host,HOSTLEN-1) != NULL )){
sprintf(sndbuf,"\n$server:a:%s:%s:%s:%s:%s:%s:\n %s\n %s ( %s@%s / %s ) connected.\n$server:m:%s:\n",inpstr.name,inpstr.un,inpstr.host,inpstr.jsn,inpstr.confer,inpstr.mode,server,inpstr.name,inpstr.un,inpstr.host,inpstr.jsn,inpstr.confer);
bco=bco+transmit(out,sndbuf,CRLF);
}
}
j=close(usr);
unlock(usrfil);
/* message commands */
} else if( line[ 8 ] == 'b' ){
strcpy( line, "broadcast" );
goto parser;
} else {
j = strlen( line );
for( i = 10; i < j; ++i ){
if( line[ i ] == ':' ) {
line[ i ] = (char)NULL;
break;
}
}
if( line[ 8 ] == 'm' ){
strcpy( confer, &line[ 10 ]);
strcpy( line, "send" );
goto parser;
}
else if( line[ 8 ] == 'p' ){
strcpy( tjsn, &line[ 10 ]);
sprintf( line, "send %s", tjsn );
goto parser;
}
}
}
/* set commands */
else if(strnicmp(line,"set",3)==NULL)
{
change = OFF;
bco=bco+transmit(out,server,CRLF);
/* set server mode */
if(strnicmp(line+3," server",7)==NULL)
{
#ifdef SERVER
if(strncmp(line+10,ontst,3)==NULL){
echo = OFF;
mode[ 0 ] = 'S';
prmpt_flg = OFF;
strcpy( name, "Server" );
dtime=1;
on = ON;
ioctl( in, FIONBIO, (char *)&on );
} else if(strncmp(line+10,offtst,4)==NULL){
echo = ON;
mode[ 0 ] = 'U';
prmpt_flg = ON;
strcpy( name, "unknown" );
off = OFF;
ioctl( in, FIONBIO, (char *)&off );
}
if((i=chgusr(name,un,jsn,confer,rcvfil,usrfil,OFF,host,pid,mode)) != NULL ){
bco=bco+transmit(out,server,CRLF);
sprintf(line," Error: chgusr return code is %d.\n",i);
bco=bco+transmit(out,line,CRLF);
return(9);
}
#endif SERVER
sprintf(line," Server mode set ");
if(mode[ 0 ] == 'S' ){
strcat(line,onstr);
strcat(line,"\n$server:r:");
} else
strcat(line,offstr);
}
/* set name */
else if(strnicmp(line+3," name",5)==NULL)
{
if(names==ON)
{
if(strncmp(line+8,BLANKS,1)==NULL)
strncpy(name,line+9,32);
if(strlen(name)==0)
strcpy(name,"Anonymous");
/* remove colons */
j = strlen( name );
for( i = 0; i < j; ++i ){
if( name[ i ] == ':' )
name[ i ] = ' ';
}
/* change user directory */
if((i=chgusr(name,un,jsn,confer,rcvfil,usrfil,OFF,host,pid,mode))!=NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(line," Error: chgusr return code is %d.\n",i);
bco=bco+transmit(out,line,CRLF);
return(10);
}
sprintf(line," Name set to %s.\n",name);
change = ON;
}
else
strcpy(line,notallow);
}
/* set definition file name */
else if(strnicmp(line+3," definition",11)==NULL)
{
if(files==ON)
{
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
if(strncmp(line+14,BLANKS,1)==NULL)
strncpy(deffil,line+15,12);
if(strlen(deffil)==0)
strcpy(deffil,"slugdef.dat");
def=fopen(deffil,"r");
if(def!=NULL)
{
sprintf(line," Definition file set to %s.\n",deffil);
i=fclose(def);
}
else
sprintf(line," Definition file name set to %s, which does not exist.\n",deffil);
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
}
else
strcpy(line,notallow);
}
/* set prologue file name */
else if(strnicmp(line+3," prologue",9)==NULL)
{
if(files==ON)
{
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
if(strncmp(line+12,BLANKS,1)==NULL)
strncpy(profil,line+15,12);
if(strlen(profil)==0)
strcpy(deffil,"slugpro.dat");
def=fopen(profil,"r");
if(def!=NULL)
{
sprintf(line," Prologue file set to %s.\n",deffil);
i=fclose(def);
}
else
sprintf(line," Prologue file name set to %s, which does not exist.\n",deffil);
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
}
else
strcpy(line,notallow);
}
/* set wait string */
else if(strnicmp(line+3," wait",5)==NULL)
{
if(strncmp(line+8,BLANKS,1)==NULL)
strcpy(waitstr,line+9);
if(strlen(waitstr)==0)
strcpy(waitstr,"From");
sprintf(line," Wait string set to %s.\n",waitstr);
}
/* set delay time */
else if(strnicmp(line+3," delay",6)==NULL)
{
if(strncmp(line+9,BLANKS,1)==NULL)
sscanf(line+10,"%d",&dtime);
if(dtime<=0)
dtime=15;
sprintf(line," Delay time set to %d.\n",dtime);
}
/* set prompt mode */
else if(strnicmp(line+3," prompt",7)==NULL)
{
if(strncmp(line+10,ontst,3)==NULL)
prmpt_flg=ON;
if(strncmp(line+10,offtst,4)==NULL)
prmpt_flg=OFF;
sprintf(line," Prompt set ");
if(prmpt_flg==ON)
strcat(line,onstr);
else
strcat(line,offstr);
}
/* set continuous mode */
else if(strnicmp(line+3," continuous",11)==NULL)
{
if(strncmp(line+14,ontst,3)==NULL) {
cntns_flg=ON;
prmpt_flg=OFF;
on = ON;
if( ioctl( in, FIONBIO, (char *)&on ) < NULL )
perror( "ioctl" );
}
if(strncmp(line+14,offtst,4)==NULL) {
cntns_flg=OFF;
prmpt_flg=ON;
off = OFF;
if( ioctl( in, FIONBIO, (char *)&off ) < NULL )
perror( "ioctl" );
}
sprintf(line," Continuous mode set ");
if(cntns_flg==ON) {
strcat(line,onstr);
} else {
strcat(line,offstr);
}
}
/* set novice mode */
else if(strnicmp(line+3," novice",7)==NULL)
{
if(strncmp(line+10,ontst,3)==NULL)
novice=ON;
if(strncmp(line+10,offtst,4)==NULL)
novice=OFF;
sprintf(line," Novice mode set ");
if(novice==ON)
strcat(line,onstr);
else
strcat(line,offstr);
}
/* set timer mode */
else if(strnicmp(line+3," timer",6)==NULL)
{
if(strncmp(line+9,ontst,3)==NULL)
timer=ON;
if(strncmp(line+9,offtst,4)==NULL)
timer=OFF;
sprintf(line," Timer mode set ");
if(timer==ON)
strcat(line,onstr);
else
strcat(line,offstr);
}
/* set echo mode */
else if(strnicmp(line+3," echo",5)==NULL)
{
if(strncmp(line+8,ontst,3)==NULL)
echo=ON;
if(strncmp(line+8,offtst,4)==NULL)
echo=OFF;
sprintf(line," Echo mode set ");
if(echo==ON)
strcat(line,onstr);
else
strcat(line,offstr);
}
/* set echoplex */
else if(strnicmp(line+3," echoplex",9)==NULL)
{
if(strncmp(line+12,ontst,3)==NULL)
echoplex=ON;
if(strncmp(line+12,offtst,4)==NULL)
echoplex=OFF;
sprintf(line," Echoplex set ");
if(echoplex==ON)
strcat(line,onstr);
else
strcat(line,offstr);
}
/* set echo mode */
else if(strnicmp(line+3," echo",5)==NULL)
{
if(strncmp(line+8,ontst,3)==NULL)
echo=ON;
if(strncmp(line+8,offtst,4)==NULL)
echo=OFF;
sprintf(line," Echo mode set ");
if(echo==ON)
strcat(line,onstr);
else
strcat(line,offstr);
}
/* set ring mode */
else if(strnicmp(line+3," ring",5)==NULL)
{
if(ringr==ON)
{
if(strncmp(line+8,ontst,3)==NULL)
ringok=ON;
if(strncmp(line+8,offtst,4)==NULL)
ringok=OFF;
sprintf(line," Ring mode set ");
if(ringok==ON)
strcat(line,onstr);
else
strcat(line,offstr);
}
else
sprintf(line,notallow,CRLF,port);
}
/* set configuration */
else if(strnicmp(line+3," config",7)==NULL)
{
if(files==ON)
{
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
i=chdir(homedir);
con=fopen(confil,"w");
chmod(confil,00600);
i=repchar(deffil,' ','_');
fprintf(con,"%s ",deffil);
i=repchar(deffil,'_',' ');
fprintf(con,"%u ",dtime);
fprintf(con,"%d ",echo);
fprintf(con,"%d ",echoplex);
i=repchar(name,' ','_');
fprintf(con,"%s ",name);
i=repchar(name,'_',' ');
fprintf(con,"%d ",novice);
i=repchar(profil,' ','_');
fprintf(con,"%s ",profil);
i=repchar(profil,'_',' ');
fprintf(con,"%d ",prmpt_flg);
fprintf(con,"%d ",ringok);
fprintf(con,"%d ",timer);
i=repchar(waitstr,' ','_');
fprintf(con,"%s ",waitstr);
i=repchar(waitstr,'_',' ');
j=fclose(con);
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
i=chdir(slugdir);
sprintf(line," Current configuration saved.\n");
}
else
strcpy(line,notallow);
}
/* set login name */
else if(strnicmp(line+3," login",6)==NULL)
{
if( network==ON )
{
if(strncmp(line+9,BLANKS,1)==NULL)
{
strncpy(un,line+10,UNLEN);
/* try to verify */
if( !verify( un, host ))
un[ 0 ] = ( char )NULL;
}
if(strlen(un)==0)
strcpy(un,"unknown");
/* remove colons */
j = strlen( un );
for( i = 0; i < j; ++i ){
if( un[ i ] == ':' )
un[ i ] = ' ';
}
/* change user directory */
if((i=chgusr(name,un,jsn,confer,rcvfil,usrfil,OFF,host,pid,mode))!=NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(line," Error: chgusr return code is %d.\n",i);
bco=bco+transmit(out,line,CRLF);
}
sprintf(line," Login set to %s.\n",un);
change = ON;
}
else
strcpy(line,notallow);
}
else
{
sprintf(line," Error: Type \"help set\" for a list of options.\n");
}
bco=bco+transmit(out,line,CRLF);
if( change ){
sprintf(sndbuf,"$server:c:%s:%s:%s:%s:%s:%s:\n",name,un,host,jsn,confer,mode);
brdcst=ON;
goto sndmsg;
}
}
/* show commands */
else if(strnicmp(line,"show",4)==NULL)
{
bco=bco+transmit(out,server,CRLF);
allon=OFF;
conon=OFF;
memon=OFF;
logon=OFF;
hoson=OFF;
if(strnicmp(line+4," all",4)==NULL
&& admin==ON)
{
bco=bco+transmit(out, " JSN Login Hostname PID Mode Conference", CRLF);
allon=ON;
sprintf( scratch, " %%-4.4s %%-8.8s %%-16.16s %%-8.8s %%-1s %%-%ds", CFRLEN );
}
else if(strnicmp(line+4," buffer",7)==NULL)
{
if(strlen(msgbuf)==0)
bco=bco+transmit(out," Error: empty message buffer.\n",CRLF);
else
{
bco=bco+transmit(out," Contents of message buffer:",CRLF);
for(i=0;i<strlen(msgbuf);++i)
{
sprintf(line,"%c",msgbuf[i]);
bco=bco+transmit(out,line,NOCRLF);
if(msgbuf[i]==(char)LF) bco=bco+transmit(out,"\r",NOCRLF);
}
bco=bco+transmit(out,BLANKS,CRLF);
}
}
else if(strnicmp(line+4," confer",7)==NULL)
{
bco=bco+transmit(out," Users Conference name",CRLF);
conon=ON;
l= -1;
}
else if(strnicmp(line+4," config",7)==NULL)
{
bco=bco+transmit(out," Attribute State",CRLF);
sprintf(line," definition file.. %s",deffil);
bco=bco+transmit(out,line,CRLF);
sprintf(line," delay time....... %d",dtime);
bco=bco+transmit(out,line,CRLF);
bco=bco+transmit(out," echo mode........",NOCRLF);
if(echo==ON)
bco=bco+transmit(out,ontst,CRLF);
else
bco=bco+transmit(out,offtst,CRLF);
bco=bco+transmit(out," echoplex.........",NOCRLF);
if(echoplex==ON)
bco=bco+transmit(out,ontst,CRLF);
else
bco=bco+transmit(out,offtst,CRLF);
sprintf(line," name............. %s",name);
bco=bco+transmit(out,line,CRLF);
bco=bco+transmit(out," novice mode......",NOCRLF);
if(novice==ON)
bco=bco+transmit(out,ontst,CRLF);
else
bco=bco+transmit(out,offtst,CRLF);
sprintf(line," prologue file.... %s",profil);
bco=bco+transmit(out,line,CRLF);
bco=bco+transmit(out," prompt mode......",NOCRLF);
if(prmpt_flg==ON)
bco=bco+transmit(out,ontst,CRLF);
else
bco=bco+transmit(out,offtst,CRLF);
bco=bco+transmit(out," ring mode........",NOCRLF);
if(ringok==ON)
bco=bco+transmit(out,ontst,CRLF);
else
bco=bco+transmit(out,offtst,CRLF);
bco=bco+transmit(out," timer mode.......",NOCRLF);
if(timer==ON)
bco=bco+transmit(out,ontst,CRLF);
else
bco=bco+transmit(out,offtst,CRLF);
sprintf(line," wait string...... %s\n",waitstr);
bco=bco+transmit(out,line,CRLF);
}
else if(strnicmp(line+4," members",8)==NULL)
{
bco=bco+transmit(out," JSN Login Hostname Name",CRLF);
memon=ON;
sprintf( scratch, " %%-4.4s %%-8.8s %%-16.16s %%-%ds", NAMLEN );
}
else if(strnicmp(line+4," hosts",6)==NULL)
{
sprintf( scratch, " JSN%%-%ds Hostname%%-%ds", JSNLEN-3, HOSTLEN-8 );
sprintf( line, scratch, BLANKS, BLANKS );
bco=bco+transmit(out,line,CRLF);
hoson=ON;
sprintf( scratch, " %%-%ds %%-%ds", JSNLEN, HOSTLEN );
}
else if(strnicmp(line+4," logins",7)==NULL)
{
sprintf( scratch, " JSN%%-%ds Login%%-%ds", JSNLEN-3, UNLEN-5 );
sprintf( line, scratch, BLANKS, BLANKS );
bco=bco+transmit(out,line,CRLF);
logon=ON;
sprintf( scratch, " %%-%ds %%-%ds", JSNLEN, UNLEN );
}
else
{
sprintf(line," Error: Type \"help show\" for a list of options.\n");
bco=bco+transmit(out,line,CRLF);
}
/* do directory show command */
if(allon==ON||memon==ON||conon==ON||hoson==ON||logon==ON)
{
lock(usrfil);
usr=open(usrfil,O_RDONLY);
for(;;)
{
#ifdef SYSV2
j=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
j=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
j=read(usr,&inpstr,reclen);
#endif BSD4
#ifdef ULTRIX
j=read(usr,&inpstr,reclen);
#endif ULTRIX
if( j == NULL )
break;
if(allon==ON
&& strncmp(inpstr.jsn," ",JSNLEN-1)!=NULL)
{
sprintf(line, scratch,
inpstr.jsn,
inpstr.un,
inpstr.host,
inpstr.pid,
inpstr.mode,
inpstr.confer);
bco=bco+transmit(out,line,CRLF);
}
else if(memon==ON
&& strncmp(inpstr.confer,confer,strlen(confer))==NULL
&& strncmp(inpstr.jsn," ",JSNLEN-1)!=NULL
&& strncmp( inpstr.mode,"S",1)!=NULL)
{
sprintf(line, scratch,
inpstr.jsn,
inpstr.un,
inpstr.host,
inpstr.name);
bco=bco+transmit(out,line,CRLF);
}
else if(hoson==ON
&& strncmp(inpstr.confer,confer,strlen(confer))==NULL
&& strncmp(inpstr.jsn," ",JSNLEN-1)!=NULL
&& strncmp( inpstr.mode,"S",1)!=NULL)
{
sprintf(line, scratch,
inpstr.jsn,
inpstr.host );
bco=bco+transmit(out,line,CRLF);
}
else if(logon==ON
&& strncmp(inpstr.confer,confer,strlen(confer))==NULL
&& strncmp(inpstr.jsn," ",JSNLEN-1)!=NULL
&& strncmp( inpstr.mode,"S",1)!=NULL)
{
sprintf(line, scratch,
inpstr.jsn,
inpstr.un);
bco=bco+transmit(out,line,CRLF);
}
else if(conon==ON
&& strncmp(inpstr.confer,"-",1)!=NULL
&& strncmp(inpstr.jsn," ",JSNLEN-1)!=NULL
&& strncmp( inpstr.mode,"S",1)!=NULL)
{
found=OFF;
if(l<NULL)
{
l=0;
count[l]=1;
strcpy(sndbuf+(l*CFRLEN),
inpstr.confer);
found=ON;
}
else
{
for(k=0;k<=l;++k)
{
if(strncmp(inpstr.confer,
sndbuf+(k*CFRLEN),
strlen(sndbuf+(k*CFRLEN)))==NULL)
{
++count[k];
found=ON;
}
}
}
if(found==OFF)
{
++l;
count[l]=1;
strcpy(sndbuf+(l*CFRLEN),
inpstr.confer);
}
}
}
j=close(usr);
unlock(usrfil);
if(conon==ON)
{
for(i=0;i<=l;++i)
{
sprintf(line," %5d %s",count[i],sndbuf+(i*CFRLEN));
bco=bco+transmit(out,line,CRLF);
}
}
bco=bco+transmit(out,BLANKS,CRLF);
}
}
/* pass through to system */
else if(strncmp(line,"!",1)==NULL)
{
if(systm==ON)
{
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
i=chdir(homedir);
i=system(line+1);
if(i!=NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(line," Error: system return code is %d\n",i);
bco=bco+transmit(out,line,CRLF);
}
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
i=chdir(slugdir);
}
else
{
bco=bco+transmit(out,server,CRLF);
bco=bco+transmit(out,notallow,CRLF);
}
}
/* output redirection */
else if(strncmp(line,">",1)==NULL)
{
if(files==ON && dirct==ON)
{
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
i=chdir(homedir);
bco=bco+transmit(out,server,CRLF);
if(strlen(line+1)==0||strncmp(line+1,"output",6)==NULL)
{
bco=bco+transmit(out," Output redirection terminated.\n",CRLF);
i=close(out);
#ifdef NETWORK
out=socket;
#endif NETWORK
#ifdef LOCAL
out=fileno( stdout );
#endif LOCAL
}
else
{
sprintf(sndbuf," Redirecting output to %s.\n",line+1);
bco=bco+transmit(out,sndbuf,CRLF);
out=open(line+1, O_APPEND | O_CREAT,
00600 );
if(out==NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(sndbuf," Error: Unable to redirect output to %s.\n",
line+1);
bco=bco+transmit(out,sndbuf,CRLF);
}
else
chmod(line+1,00600);
}
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
i=chdir(slugdir);
}
else
{
bco=bco+transmit(out,server,CRLF);
bco=bco+transmit(out,notallow,CRLF);
}
}
/* input redirection */
else if(strncmp(line,"<",1)==NULL)
{
if(dirct==ON && files==ON)
{
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
i=chdir(homedir);
bco=bco+transmit(out,server,CRLF);
if(strlen(line+1)==0||strncmp(line+1,"input",5)==NULL)
{
bco=bco+transmit(out," Input redirection terminated.\n",CRLF);
i=fclose(inp);
inp=NULL;
}
else
{
sprintf(sndbuf," Redirecting input to %s.\n",
line+1);
bco=bco+transmit(out,sndbuf,CRLF);
inp=fopen(line+1,"r");
if(inp==NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(sndbuf," Error: Unable to redirect input to %s.\n",line+1);
bco=bco+transmit(out,sndbuf,CRLF);
}
}
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
i=chdir(slugdir);
}
else
{
bco=bco+transmit(out,server,CRLF);
bco=bco+transmit(out,notallow,CRLF);
}
}
/* add line to message buffer */
else if( strncmp(line,BLANKS,1)==NULL
|| (strncmp(line, "From",4) == NULL && mode[ 0 ] == 'S')
|| (strncmp(line, "\n",1) == NULL && mode[ 0 ] == 'S' )){
i=strlen(line);
if((i+msgpos+nwlnln)<MSGLEN)
{
strcat(msgbuf,line);
if( line[ 0 ] != '\n' )
strcat(msgbuf,"\n");
msgpos=msgpos+i+nwlnln;
}
else
{
bco=bco+transmit(out,server,CRLF);
sprintf(line," Error: Message buffer is full.\n");
bco=bco+transmit(out,line,CRLF);
}
}
/* send private message */
else if(strnicmp(line,"send ",5)==NULL && msgpos>0)
{
if(privt==ON)
{
prvflg=ON;
strncpy(tjsn,line+5,JSNLEN-1);
if(( thstp = strchr( line, '@' )) != (char *)NULL ){
strcpy( thost, ++thstp );
} else
thost[ 0 ] = ( char )NULL;
if( mode[ 0 ] == 'U' ){
sprintf(line," < private message to %s >",tjsn);
sprintf(idstr,idfrmt,name,un,host,jsn,line);
if( thost[ 0 ] != ( char )NULL)
sprintf(sndbuf," %s\n%s\n$server:p:%s@%s:\n",idstr,msgbuf,tjsn,thost);
else
sprintf(sndbuf," %s\n%s\n$server:p:%s:\n",idstr,msgbuf,tjsn);
} else if( mode[ 0 ] == 'S' )
strcpy( sndbuf, msgbuf );
msgpos=0;
msgbuf[msgpos]=(char)NULL;
goto sndmsg;
}
else
bco=bco+transmit(out,notallow,CRLF);
}
/* send public message */
else if((strnicmp(line,"send",4)==NULL||(strlen(line)==0&&mode[ 0 ] != 'S') || line[ 0 ] == '\n' )&&msgpos>0 ){
msgflg=ON;
if( mode[ 0 ] == 'U' ){
sprintf(idstr,idfrmt,name,un,host,jsn,normal);
sprintf(sndbuf," %s\n%s\n$server:m:%s:\n",idstr,msgbuf,confer);
} else if( mode[ 0 ] == 'S' )
strcpy( sndbuf, msgbuf );
msgpos=0;
msgbuf[msgpos]=(char)NULL;
goto sndmsg;
}
/* send broadcast message */
else if(strnicmp(line,"broadcast",9)==NULL && msgpos>0)
{
if(brods==ON)
{
brdcst=ON;
if( mode[ 0 ] == 'U' ){
sprintf(idstr,idfrmt,name,un,host,jsn,broad);
sprintf(sndbuf," %s\n%s\n$server:b:\n",idstr,msgbuf);
} else if( mode[ 0 ] == 'S' )
strcpy( sndbuf, msgbuf );
msgpos=0;
msgbuf[msgpos]=(char)NULL;
goto sndmsg;
}
else
bco=bco+transmit(out,notallow,CRLF);
}
/* check for messages */
else if(( strlen(line)==0 || line[ 0 ] == '\n' ) && mode[ 0 ] == 'U' ) goto sndmsg;
/* join another conference */
else if(strnicmp(line,"join",4)==NULL)
{
if(joinc==ON)
{
sprintf(sndbuf," %s\n %s ( %s@%s / %s ) logged off %s.\n$server:m:%s:\n",server,name,un,host,jsn,confer,confer);
join=ON;
msgflg=ON;
if(strncmp(line+4,"\0",1)==NULL)
strcpy(newcfr,"\0");
else
strncpy(newcfr,line+5,CFRLEN-1);
if(strlen(newcfr)==0) strcpy(newcfr,"Root");
/* remove colons */
j = strlen( newcfr );
for( i = 0; i < j; ++i ){
if( newcfr[ i ] == ':' )
newcfr[ i ] = ' ';
}
bco=bco+transmit(out,server,CRLF);
sprintf(line," Joining conference %s.",newcfr);
bco=bco+transmit(out,line,CRLF);
goto sndmsg;
}
else
bco=bco+transmit(out,notallow,CRLF);
}
/* rewind command */
else if(strnicmp(line,"rewind",6)==NULL)
rewind(inp);
/* exit slugnet */
else if(strnicmp(line,"exit",4)==NULL
|| strnicmp(line,"bye",3)==NULL
|| strnicmp(line,"logoff",6)==NULL
|| strnicmp(line,"quit",4)==NULL
|| (strnicmp(line,"stop",4)==NULL && systm==ON))
{
atend=ON;
msgflg=ON;
sprintf(sndbuf,"$server:d:%s:%s:%s:%s:%s:%s:\n %s\n %s ( %s@%s / %s ) logged off.\n$server:m:%s:\n",name,un,host,jsn,confer,mode,server,name,un,host,jsn,confer);
if(strncmp(line,"stop",4)==NULL) stop=ON;
goto sndmsg;
}
/* bell + jsn: rings bell and transmits jsn */
else if(strnicmp(line,"bell ",5)==NULL)
{
strncpy(tjsn,line+5,JSNLEN-1);
sprintf(line," Jsn %s is ringing you.\007\n",tjsn);
if(strlen(tjsn)>0&&ringok==ON)
{
bco=bco+transmit(out,server,CRLF);
bco=bco+transmit(out,line,CRLF);
}
}
/* bell: sends a control g. */
else if(strnicmp(line,"bell" ,4)==NULL)
{
bco=bco+transmit(out,"\007",NOCRLF);
}
/* ring jsn: rings another jsn */
else if(strnicmp(line,"ring ",5)==NULL)
{
bco=bco+transmit(out,server,CRLF);
if(ringr==ON)
{
strncpy(tjsn,line+5,JSNLEN-1);
if(strncmp(tjsn,jsn,4)!=NULL)
{
sprintf(line," Ringing jsn %s.\n",tjsn);
if(strlen(tjsn)>0)
{
bco=bco+transmit(out,line,CRLF);
sprintf(sndbuf,"$%sbell %s\n",tjsn,jsn);
brdcst=ON;
goto sndmsg;
}
else
bco=bco+transmit(out," Missing or invalid jsn.\n",CRLF);
}
else
bco=bco+transmit(out," You may not ring your own jsn.\n",CRLF);
}
else
bco=bco+transmit(out,notallow,CRLF);
}
/* help command */
else if(strnicmp(line,"help",4)==NULL)
{
bco=bco+transmit(out,server,CRLF);
hlpon=OFF;
hlp_found=OFF;
/* find help topic requested */
sndbuf[0]=(char)NULL;
if(strncmp(line+4,BLANKS,1)==NULL)
sprintf(sndbuf,"*%s",line+5);
i=strlen(sndbuf);
if(i<=1)
{
sprintf(sndbuf,"*EOF");
i=4;
}
/* search help file */
hlp=fopen(hlpfil,"r");
if(hlp!=NULL)
{
while(feof(hlp)==NULL)
{
j=rdline(hlp,line,LINLEN-1);
if(strncmp(line,"*",1)==NULL)
{
k=i;
j=find(line,':',LINLEN-1);
if(j>0&&j<i) k=j;
if(strnicmp(line,sndbuf,k)==NULL&&strncmp(line,"*EOF",4)!=NULL)
{
hlpon=ON;
hlp_found=ON;
}
else if(strncmp(line,"*EOF",4)==NULL&&hlp_found==OFF)
{
hlpon=ON;
hlp_found=ON;
}
else
{
hlpon=OFF;
if( hlp_found==ON) goto quithlp;
}
}
else if(hlpon==ON)
bco=bco+transmit(out,line,CRLF);
}
quithlp:
i=fclose(hlp);
}
else
bco=bco+transmit(out," Error: Help file not present\n",CRLF);
}
/* wait command */
else if(strnicmp(line,"wait",4)==NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(line," Waiting for \"%s\".\n",waitstr);
bco=bco+transmit(out,line,CRLF);
wait=ON;
#ifdef NETWORK
on = ON;
if( ioctl( in, FIONBIO, (char *)&on ) < NULL )
perror( "ioctl1" );
#endif NETWORK
}
/* scroll command */
else if(strnicmp(line,"scroll",6)==NULL)
{
bco=bco+transmit(out,server,CRLF);
bco=bco+transmit(out," Entering scroll mode.\n",CRLF);
scroll=ON;
#ifdef NETWORK
on = ON;
if( ioctl( in, FIONBIO, (char *)&on ) < NULL )
perror( "ioctl1" );
#endif NETWORK
}
/* delay command */
else if(strnicmp(line,"delay",5)==NULL)
{
bco=bco+transmit(out,server,CRLF);
sprintf(line," Delaying for %d seconds.\n",dtime);
bco=bco+transmit(out,line,CRLF);
#ifdef SYSV2
sleep((unsigned)dtime);
#endif SYSV2
#ifdef SYSV3
u=sleep((unsigned)dtime);
#endif SYSV3
#ifdef BSD4
sleep((unsigned)dtime);
#endif BSD4
#ifdef ULTRIX
sleep((unsigned)dtime);
#endif ULTRIX
}
/* clear command - clears message buffer */
else if(strnicmp(line,"clear",5)==NULL)
{
msgpos=NULL;
msgbuf[msgpos]=(char)NULL;
bco=bco+transmit(out,server,CRLF);
bco=bco+transmit(out," Message buffer cleared.\n",CRLF);
}
/* write command - writes message buffer to file */
else if(strnicmp(line,"write ",6)==NULL)
{
bco=bco+transmit(out,server,CRLF);
if(files==OFF)
bco=bco+transmit(out,notallow,CRLF);
else
{
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
i=chdir(homedir);
strcpy(tmpfil,line+6);
if(strlen(tmpfil)==0)
bco=bco+transmit(out," Error: Invalid file name.\n",CRLF);
else if(msgpos<3)
bco=bco+transmit(out," Error: Buffer too short.\n",CRLF);
else
{
tmp=fopen(tmpfil,"r");
if(tmp!=NULL)
{
i=fclose(tmp);
bco=bco+transmit(out," Error: File exists.\n",CRLF);
}
else
{
tmp=fopen(tmpfil,"w");
if(tmp==NULL)
bco=bco+transmit(out," Error: Invalid file name.\n",CRLF);
else
{
chmod(tmpfil,00600);
i=1;
while(i<msgpos)
{
#ifdef SYSV2
fputc((int)((char)msgbuf[i]),tmp);
#endif SYSV2
#ifdef SYSV3
fputc((int)((char)msgbuf[i]),tmp);
#endif SYSV3
#ifdef BSD4
fputc((char)msgbuf[i],tmp);
#endif BSD4
#ifdef ULTRIX
fputc((char)msgbuf[i],tmp);
#endif ULTRIX
if(msgbuf[i]=='\n')
i=i+2;
else
++i;
}
i=fclose(tmp);
sprintf(line,"\n Buffer written to %s.\n",tmpfil);
bco=bco+transmit(out,line,CRLF);
}
}
}
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
i=chdir(slugdir);
}
}
/* see if command is in user's definition file */
else
{
#ifdef SYSV2
i=setuid(uid);
#endif SYSV2
#ifdef SYSV3
i=setuid(uid);
#endif SYSV3
i=chdir(homedir);
def=fopen(deffil,"r");
if(def!=NULL)
{
while(feof(def)==NULL)
{
i=rdline(def,scratch,LINLEN);
if(strncmp(scratch,"*",1)!=NULL)
{
i=find(scratch,'=',LINLEN);
if(i>=0)
{
if(strnicmp(line,scratch,i)==NULL)
{
j=find(scratch,';',LINLEN);
if(j>=0)
{
strncpy(sndbuf,scratch+i+1,j-i-1);
strcpy(sndbuf+j-i-1,line+i);
strncpy(line,sndbuf,LINLEN-1);
i=fclose(def);
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
i=chdir(slugdir);
goto parser;
}
}
}
}
}
i=fclose(def);
}
#ifdef SYSV2
i=setuid(euid);
#endif SYSV2
#ifdef SYSV3
i=setuid(euid);
#endif SYSV3
i=chdir(slugdir);
/* help blurb */
if(novice==ON && mode[ 0 ] == 'U' ){
bco=bco+transmit(out,server,CRLF);
bco=bco+transmit(out," Type \"help\" for instructions.\n",CRLF);
}
else if( mode[ 0 ] == 'U' ){
strcpy(sndbuf,line);
line[0]=' ';
strncpy(line+1,sndbuf,LINLEN-1);
goto parser;
}
}
}
/* destroy receiver file, close input, output redirection files */
cleanup:
lock(rcvfil);
i=unlink(rcvfil);
unlock(rcvfil);
if(inp != NULL)
i=fclose(inp);
#ifdef NETWORK
if(out != socket )
#endif NETWORK
#ifdef LOCAL
if(out != fileno( stdout ))
#endif LOCAL
i=close(out);
inp=(FILE *)NULL;
#ifdef NETWORK
out=socket;
#endif NETWORK
#ifdef LOCAL
out = fileno( stdout );
#endif LOCAL
if(stop==OFF && login==ON) goto wait_for_call;
i=chdir(homedir);
return(11);
}
\End\Of\Shar\
else
echo "will not over write ./slugnet.c"
fi
chmod 600 ./slugnet.c
if [ `wc -c ./slugnet.c | awk '{printf $1}'` -ne 91130 ]
then
echo `wc -c ./slugnet.c | awk '{print "Got " $1 ", Expected " 91130}'`
fi
echo "Finished archive 4 of 6"
exit
More information about the Alt.sources
mailing list