slugnet - Multiple user conferencing system: Part 5 of 6

James R. Purdon III purdon at athena.mit.edu
Fri Dec 21 03:49:00 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 ./chgusr.c`
then
echo "writing ./chgusr.c"
cat > ./chgusr.c << '\End\Of\Shar\'
/* @(#)chgusr.c	1.7 */
#include "slugnet.h"

int chgusr(name,un,jsn,confer,rcvfil,usrfil,exitit,host,pid,mode)

/* changes directory entry */

char name[NAMLEN],un[UNLEN],jsn[JSNLEN],confer[CFRLEN],rcvfil[FLNMLN],usrfil[FLNMLN],host[HOSTLEN],pid[PIDLEN],mode[MODELN];
int exitit; /* if exit is ON, jsn is replaced by blanks */
{

        struct slugdir inpstr, outstr;
        int found,i,numbyt,reclen,usr;

        long fpos,lseek();

        /* initialize variables */

        found=OFF;
        reclen=sizeof( struct slugdir );
        strncpy(inpstr.jsn,"    ",JSNLEN-1);
        strcpy(outstr.name,name);
        strcpy(outstr.un,un);
        strcpy(outstr.jsn,jsn);
        strcpy(outstr.confer,confer);
        strcpy(outstr.rcvfil,rcvfil);
        strcpy(outstr.host,host);
        strcpy(outstr.pid,pid);
        strcpy(outstr.mode,mode);

        /* open the user directory file */

	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
        if(usr<NULL)
        {
#ifdef SYSV2
                usr=creat(usrfil,S_IREAD|S_IWRITE|O_SYNC);
#endif SYSV2
#ifdef SYSV3
                usr=creat(usrfil,S_IREAD|S_IWRITE|O_SYNC);
#endif SYSV3
#ifdef BSD4
                usr=creat(usrfil,S_IREAD|S_IWRITE|O_FSYNC);
#endif BSD4
#ifdef ULTRIX
                usr=creat(usrfil,S_IREAD|S_IWRITE|O_FSYNC);
#endif ULTRIX
                i=close(usr);
#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
                if(usr<NULL) 
		{
			unlock(usrfil);
			return(-1);
		}
        }

        /* make sure user isn't already there */

#ifndef SYSV2
        fpos=lseek(usr,(long)NULL,SEEK_SET);
#endif SYSV2
#ifdef SYSV2
        fpos=lseek(usr,(long)NULL,BEGINNING);
#endif SYSV2
        if(fpos<(long)NULL) 
	{
		unlock(usrfil);
		return(-3);
	}
        for(;;)
        {
#ifdef SYSV2
                numbyt=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
                numbyt=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
                numbyt=read(usr,&inpstr,reclen);
#endif BSD4
#ifdef ULTRIX
                numbyt=read(usr,&inpstr,reclen);
#endif ULTRIX
		if(numbyt == NULL )
			break;
                else if(numbyt!=reclen) 
		{
			unlock(usrfil);
			return(-4);
		}
                if(strncmp(inpstr.jsn,jsn,JSNLEN-1)==NULL 
		&&strncmp(inpstr.host,host,HOSTLEN-1)==NULL ){
#ifndef SYSV2
                        fpos=lseek(usr,-(long)reclen,SEEK_CUR);
#endif SYSV2
#ifdef SYSV2
                        fpos=lseek(usr,-(long)reclen,CURRENT);
#endif SYSV2
                        if(fpos<(long)NULL) 
			{
				unlock(usrfil);
				return(-5);
			}

			/* make sure we don't replace a real rcvfil
			   with a "*" (this happens if an internodal
			   client is hooked to an internodal server
			   on the same host */

			if( strcmp( outstr.rcvfil, "*" ) == NULL
			 && strcmp( inpstr.rcvfil, "*" ) != NULL )
				strcpy( outstr.rcvfil, inpstr.rcvfil );

			/* user is logging out */
                        if(exitit==ON) strcpy(outstr.jsn,"    ");

#ifdef SYSV2
                        numbyt=write(usr,&outstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
                        numbyt=write(usr,&outstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
                        numbyt=write(usr,&outstr,reclen);
#endif BSD4
#ifdef ULTRIX
                        numbyt=write(usr,&outstr,reclen);
#endif ULTRIX
                        if(numbyt!=reclen) 
			{
				unlock(usrfil);
				return(-6);
			}
                        found=ON;
			break;
                }
        }

        /* add new user */

        if(found==OFF)
        {
#ifndef SYSV2
                fpos=lseek(usr,(long)NULL,SEEK_SET);
#endif SYSV2
#ifdef SYSV2
                fpos=lseek(usr,(long)NULL,BEGINNING);
#endif SYSV2
                if(fpos<(long)NULL) 
	        {
			unlock(usrfil);
			return(-7);
		}
                for(;;)
                {
#ifdef SYSV2
                        numbyt=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
                        numbyt=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
                        numbyt=read(usr,&inpstr,reclen);
#endif BSD4
#ifdef ULTRIX
                        numbyt=read(usr,&inpstr,reclen);
#endif ULTRIX
			if(numbyt == NULL )
				break;
                        else if(numbyt!=reclen) 
			{
				unlock(usrfil);
				return(-8);
			}
                        if(strncmp(inpstr.jsn,"    ",JSNLEN-1)==NULL)
                        {
#ifndef SYSV2
                                fpos=lseek(usr,-(long)reclen,SEEK_CUR);
#endif SYSV2
#ifdef SYSV2
                                fpos=lseek(usr,-(long)reclen,CURRENT);
#endif SYSV2
                                if(fpos<(long)NULL) 
				{
					unlock(usrfil);
					return(-9);
				}
#ifdef SYSV2
                                numbyt=write(usr,&outstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
                                numbyt=write(usr,&outstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
                                numbyt=write(usr,&outstr,reclen);
#endif BSD4
#ifdef ULTRIX
                                numbyt=write(usr,&outstr,reclen);
#endif ULTRIX
                                if(numbyt!=reclen) 
				{
					unlock(usrfil);
					return(-10);
				}
                                found=ON;
				break;
                        }
                }

		/* we must be at eof! */

		if( found != ON ) {
#ifndef SYSV2
	                fpos=lseek(usr,(long)NULL,SEEK_END);
#endif SYSV2
#ifdef SYSV2
       		        fpos=lseek(usr,(long)NULL,END);
#endif SYSV2
                        if(fpos<(long)NULL) 
			{
				unlock(usrfil);
				return(-11);
			}
#ifdef SYSV2
                        numbyt=write(usr,&outstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
                        numbyt=write(usr,&outstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
                        numbyt=write(usr,&outstr,reclen);
#endif BSD4
#ifdef ULTRIX
                        numbyt=write(usr,&outstr,reclen);
#endif ULTRIX
                        if(numbyt!=reclen) 
			{
				unlock(usrfil);
				return(-12);
			}
                        found=ON;
		}
        }

        /* make sure he got in */

        if(found==OFF) 
	{
		unlock(usrfil);
		return(-13);
	}

        /* close it */

        i=close(usr);
	unlock(usrfil);
        if(i!=NULL) return(-14);
        return(NULL);
}
\End\Of\Shar\
else
  echo "will not over write ./chgusr.c"
fi
chmod 400 ./chgusr.c
if [ `wc -c ./chgusr.c | awk '{printf $1}'` -ne 6808 ]
then
echo `wc -c ./chgusr.c | awk '{print "Got " $1 ", Expected " 6808}'`
fi
if `test ! -s ./cleanup.c`
then
echo "writing ./cleanup.c"
cat > ./cleanup.c << '\End\Of\Shar\'
/* @(#)cleanup.c	1.4 */
#ifdef NETWORK
#include "net.h"

/* as children die we should get catch their returns or else we get
   zombies, A Bad Thing.  cleanup() catches falling children.
*/

void cleanup()
{
	int i;
#ifdef BDS4
	union wait wstatus;
#endif BSD4
#ifdef ULTRIX
	union wait wstatus;
#endif ULTRIX

#ifdef BDS4
	while(( i = wait3(&wstatus,WNOHANG,NULL)) > 0); 
#endif BSD4
#ifdef ULTRIX
	while(( i = wait3(&wstatus,WNOHANG,NULL)) > 0); 
#endif ULTRIX
}
#endif NETWORK
\End\Of\Shar\
else
  echo "will not over write ./cleanup.c"
fi
chmod 400 ./cleanup.c
if [ `wc -c ./cleanup.c | awk '{printf $1}'` -ne 480 ]
then
echo `wc -c ./cleanup.c | awk '{print "Got " $1 ", Expected " 480}'`
fi
if `test ! -s ./clnusr.c`
then
echo "writing ./clnusr.c"
cat > ./clnusr.c << '\End\Of\Shar\'
/* @(#)clnusr.c	1.6 */
#include "slugnet.h"

int clnusr(name,un,jsn,confer,rcvfil,usrfil,host,pid,mode)

/* cleans up zombie user directory entries */

char name[NAMLEN],un[UNLEN],jsn[JSNLEN],confer[CFRLEN],rcvfil[FLNMLN],usrfil[FLNMLN],host[HOSTLEN],pid[PIDLEN],mode[MODELN];
{
        struct slugdir inpstr, outstr;

	char zmbfil[ FLNMLN + 1 ];

        int i, ipid, numbyt,reclen,usr;

        long fpos,lseek();

        /* initialize variables */
	
        reclen=sizeof( struct slugdir );
        strncpy(inpstr.jsn,"    ",JSNLEN-1);
        strcpy(outstr.name,name);
        strcpy(outstr.un,un);
        strcpy(outstr.jsn,jsn);
        strcpy(outstr.confer,confer);
        strcpy(outstr.rcvfil,rcvfil);
        strcpy(outstr.host,host);
        strcpy(outstr.pid,pid);
        strcpy(outstr.mode,mode);

        /* open the user directory file */

	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
        if(usr<NULL)
        {
#ifdef SYSV2
                usr=creat(usrfil,S_IREAD|S_IWRITE|O_SYNC);
#endif SYSV2
#ifdef SYSV3
                usr=creat(usrfil,S_IREAD|S_IWRITE|O_SYNC);
#endif SYSV3
#ifdef BSD4
                usr=creat(usrfil,S_IREAD|S_IWRITE|O_FSYNC);
#endif BSD4
#ifdef ULTRIX
                usr=creat(usrfil,S_IREAD|S_IWRITE|O_FSYNC);
#endif ULTRIX
                i=close(usr);
                usr=open(usrfil,O_RDWR);
                if(usr<NULL) 
		{
			unlock(usrfil);
			return(-1);
		}
        }

        /* Look for zombies */

#ifndef SYSV2
        fpos=lseek(usr,(long)NULL,SEEK_SET);
#endif SYSV2
#ifdef SYSV2
        fpos=lseek(usr,(long)NULL,BEGINNING);
#endif SYSV2
        if(fpos<(long)NULL) 
	{
		unlock(usrfil);
		return(-3);
	}
        for(;;)
        {
#ifdef SYSV2
                numbyt=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
                numbyt=read(usr,&inpstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
                numbyt=read(usr,&inpstr,reclen);
#endif BSD4
#ifdef ULTRIX
                numbyt=read(usr,&inpstr,reclen);
#endif ULTRIX
		if(numbyt== NULL )
			break;
                else if(numbyt!=reclen) 
		{
			close( usr );
			unlock(usrfil);
			return(NULL);
		}
                if(strncmp(inpstr.jsn,"    ",JSNLEN-1)!=NULL)
                {
#ifndef SYSV2
                        fpos=lseek(usr,-(long)reclen,SEEK_CUR);
#endif SYSV2
#ifdef SYSV2
                        fpos=lseek(usr,-(long)reclen,CURRENT);
#endif SYSV2
                        if(fpos<(long)NULL) 
			{
				unlock(usrfil);
				return(-5);
			}
			
			/* see if its a zombie */
        
			sscanf( inpstr.pid, "%d", &ipid );
                        if(kill(ipid,NULL)<NULL) {
				strcpy(outstr.jsn,"    ");
#ifdef SYSV2
                        	numbyt=write(usr,&outstr,(unsigned)reclen);
#endif SYSV2
#ifdef SYSV3
                        	numbyt=write(usr,&outstr,(unsigned)reclen);
#endif SYSV3
#ifdef BSD4
                       	 	numbyt=write(usr,&outstr,reclen);
#endif BSD4
#ifdef ULTRIX
                        	numbyt=write(usr,&outstr,reclen);
#endif ULTRIX
                        	if(numbyt!=reclen) 
				{
					unlock(usrfil);
					return(-6);
				}

				strncpy( zmbfil, inpstr.rcvfil, FLNMLN );
				i = unlink( zmbfil );
			} else {
#ifndef SYSV2
	                        fpos=lseek(usr,(long)reclen,SEEK_CUR);
#endif SYSV2
#ifdef SYSV2
       	                        fpos=lseek(usr,(long)reclen,CURRENT);
#endif SYSV2
			}
                }
        }

        /* close it */

        i=close(usr);
	unlock(usrfil);
        if(i!=NULL) return(-12);
        return(NULL);
}
\End\Of\Shar\
else
  echo "will not over write ./clnusr.c"
fi
chmod 400 ./clnusr.c
if [ `wc -c ./clnusr.c | awk '{printf $1}'` -ne 3782 ]
then
echo `wc -c ./clnusr.c | awk '{print "Got " $1 ", Expected " 3782}'`
fi
if `test ! -s ./copyright.h`
then
echo "writing ./copyright.h"
cat > ./copyright.h << '\End\Of\Shar\'
/* @(#)copyright.h	1.3 */
 static char copyright[] = "Slugnet COPYRIGHT 1988 James R. Purdon III";

/*
                                Slugnet

                    COPYRIGHT 1988 James R. Purdon III

                           All rights reserved.

This program may be used with the following conditions:

1.  This program may be installed on any system.

2.  If installed on a particular system, the author must be notified 
    within 30 days of installation via postal sevice or electronic mail.
    Such notification should include the following information:

    A.  Postal service address.

    B.  Electronic mail address, if available.

    C.  OS and hardware types.

    D.  Contact name and phone number.

    This information will be kept strictly confidential.

3.  Changes may be free made to the code with the following exceptions:

    A.  Copyright notices must be left unchanged.

    B.  The file copyright.h must be left unchanged.

4.  Copies of this code may be freely distributed with the following provisions:

    A.  Copies must include all files originally  provided.

    B.  No charge may be made, except for the cost of media and postage.

5.  This code is used at your own risk.  The author assumes no liability for any
    and all damages which may result from the use of this  program.

6.  The conditions described above may be changed at any time by the author,
    without notification.

Contact:

The author may be contacted at the following addresses:

1.  INTERNET: purdon at cons1.mit.edu

2.  Phone:    617-253-7954
	
3.  Address:  James R. Purdon III
              M.I.T.
	      Building 11-124A
              Cambridge, MA 02178
*/
\End\Of\Shar\
else
  echo "will not over write ./copyright.h"
fi
chmod 400 ./copyright.h
if [ `wc -c ./copyright.h | awk '{printf $1}'` -ne 1672 ]
then
echo `wc -c ./copyright.h | awk '{print "Got " $1 ", Expected " 1672}'`
fi
if `test ! -s ./establish.c`
then
echo "writing ./establish.c"
cat > ./establish.c << '\End\Of\Shar\'
/* @(#)establish.c	1.3 */
#ifdef NETWORK
#include "net.h"

/* code to establish a socket  */

int establish( portnum )
u_short portnum;
{
	char myname[ MAXHOSTNAMELEN + 1 ];
	int on = 1;
	int s;
	struct sockaddr_in sa;
	struct hostent *hp;

	bzero(&sa,sizeof(struct sockaddr_in));      /* clear our address */
	gethostname(myname,MAXHOSTNAMELEN);            /* who are we? */
	hp= gethostbyname(myname);                  /* get our address info */
	if (hp == NULL)                             /* we don't exist !? */
	  return(-1);
	sa.sin_family= hp->h_addrtype;              /* this is our host address */
	sa.sin_port= htons(portnum);                /* this is our port number */
	if ((s= socket(AF_INET,SOCK_STREAM,0)) < 0) /* create socket */
	  return(-1);
	setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on));
	if (bind(s,&sa,sizeof sa,0) < 0)
	  return(-1);                               /* bind address to socket */
	listen(s, 3);                               /* max # of queued connects */
	return(s);
}
#endif NETWORK
\End\Of\Shar\
else
  echo "will not over write ./establish.c"
fi
chmod 400 ./establish.c
if [ `wc -c ./establish.c | awk '{printf $1}'` -ne 1035 ]
then
echo `wc -c ./establish.c | awk '{print "Got " $1 ", Expected " 1035}'`
fi
if `test ! -s ./find.c`
then
echo "writing ./find.c"
cat > ./find.c << '\End\Of\Shar\'
/* @(#)find.c	1.2 */
#include "slugnet.h"

int find(string,c,line)

/* returns position of c in string as integer */

char string[],c;
int line;
{
        int i;
        i=0;
        while(string[i]!=(char)NULL&&i<line)
        {
                if(string[i]==c) return(i);
                ++i;
        }
        return(-1);
}
\End\Of\Shar\
else
  echo "will not over write ./find.c"
fi
chmod 400 ./find.c
if [ `wc -c ./find.c | awk '{printf $1}'` -ne 327 ]
then
echo `wc -c ./find.c | awk '{print "Got " $1 ", Expected " 327}'`
fi
if `test ! -s ./get_connect.c`
then
echo "writing ./get_connect.c"
cat > ./get_connect.c << '\End\Of\Shar\'
/* @(#)get_connect.c	1.2 */
#ifdef NETWORK
#include "net.h"

int get_connection(s)
int s;                    /* socket created with establish() */
{
	struct sockaddr_in isa; /* address of socket */
	int i;                  /* size of address */
	int t;                  /* socket of connection */

	i = sizeof(isa);                   /* find socket's address */
	getsockname(s,&isa,&i);            /* for accept() */

	if ((t = accept(s,&isa,&i)) < 0)   /* accept connection if there is one */
	  return(-1);
	return(t);
}
#endif NETWORK
\End\Of\Shar\
else
  echo "will not over write ./get_connect.c"
fi
chmod 400 ./get_connect.c
if [ `wc -c ./get_connect.c | awk '{printf $1}'` -ne 538 ]
then
echo `wc -c ./get_connect.c | awk '{print "Got " $1 ", Expected " 538}'`
fi
if `test ! -s ./getcfg.c`
then
echo "writing ./getcfg.c"
cat > ./getcfg.c << '\End\Of\Shar\'
/* @(#)getcfg.c	1.4 */
#include "slugnet.h"

int getcfg(sysfil,access,actfil,bgnfil,billing,bilfil,deffil,dirfil,hlpfil,jsnfil,logset,modem,newfil,portstr,privs,profil,usrfil,valfil)

/* gets system configuration from sysfil */

char sysfil[FLNMLN]; /* system configuration file */
char access[FLNMLN]; /* access mode for new users */
char actfil[FLNMLN]; /* system accounting file name */
char bgnfil[FLNMLN]; /* prelogin file name */
char billing[4];     /* billing option flag */
char bilfil[FLNMLN]; /* billing options file name */
char deffil[FLNMLN]; /* user definition file name */
char dirfil[FLNMLN]; /* user directory file name */
char hlpfil[FLNMLN]; /* help file name */
char jsnfil[FLNMLN]; /* jsn file name */
char logset[4];      /* login flag */
char modem[LINLEN];  /* modem initialization string */
char newfil[FLNMLN]; /* news file name */
char portstr[4];     /* port number in string form */
char privs[FLNMLN];  /* default privileges */
char profil[FLNMLN]; /* user prologue file name */
char usrfil[FLNMLN]; /* user directory file name */
char valfil[FLNMLN]; /* validated user list file name */

{

        char line[LINLEN];

  	FILE *sys;
#ifdef SYSV2
	FILE *fopen();
#endif SYSV2  

        int acc,act,bgn,bil,blf,def,dir,hlp,i,jsn,log,mod,new,por,pri,pro,usr,val;

        /* set flags */

        acc=OFF;
        act=OFF;
        bgn=OFF;
        bil=OFF;
        blf=OFF;
        def=OFF;
        dir=OFF;
        hlp=OFF;
        jsn=OFF;
        log=OFF;
        mod=OFF;
        new=OFF;
        por=OFF;
        pri=OFF;
        pro=OFF;
        usr=OFF;
        val=OFF;

        /* check sysfil and set file names */

        sys=fopen(sysfil,"r");
        if(sys!=NULL)
        {
                while(feof(sys)==NULL)
                {
                        fscanf(sys,"%79s",line);

                        /* default access mode */

                        if(strncmp(line,"acc=",4)==NULL)
                        {
                                strncpy(access,line+4,FLNMLN-1);
                                access[FLNMLN-1]=(char)NULL;
                                acc=ON;
                        }

                        /* accounting file name */

                        else if(strncmp(line,"act=",4)==NULL)
                        {
                                strncpy(actfil,line+4,FLNMLN-1);
                                actfil[FLNMLN-1]=(char)NULL;
                                act=ON;
                        }

                        /* prelogin file name */

                        else if(strncmp(line,"bgn=",4)==NULL)
                        {
                                strncpy(bgnfil,line+4,FLNMLN-1);
                                bgnfil[FLNMLN-1]=(char)NULL;
                                bgn=ON;
                        }

                        /* billing option flag */

                        else if(strncmp(line,"bil=",4)==NULL)
                        {
                                strncpy(billing,line+4,3);
                                billing[4]=(char)NULL;
                                bil=ON;
                        }

                        /* billing options file name */

                        else if(strncmp(line,"blf=",4)==NULL)
                        {
                                strncpy(bilfil,line+4,FLNMLN-1);
                                bilfil[FLNMLN-1]=(char)NULL;
                                blf=ON;
                        }


                        /* default user definition file name */

                        else if(strncmp(line,"def=",4)==NULL)
                        {
                                strncpy(deffil,line+4,FLNMLN-1);
                                deffil[FLNMLN-1]=(char)NULL;
                                def=ON;
                        }

                        /* directory file name */

                        else if(strncmp(line,"dir=",4)==NULL)
                        {
                                strncpy(dirfil,line+4,FLNMLN-1);
                                dirfil[FLNMLN-1]=(char)NULL;
                                dir=ON;
                        }

                        /* help file name */

                        else if(strncmp(line,"hlp=",4)==NULL)
                        {
                                strncpy(hlpfil,line+4,FLNMLN-1);
                                hlpfil[FLNMLN-1]=(char)NULL;
                                hlp=ON;
                        }

                        /* jsn file name */

                        else if(strncmp(line,"jsn=",4)==NULL)
                        {
                                strncpy(jsnfil,line+4,FLNMLN-1);
                                jsnfil[FLNMLN-1]=(char)NULL;
                                jsn=ON;
                        }

                        /* login flag */

                        else if(strncmp(line,"log=",4)==NULL)
                        {
                                strncpy(logset,line+4,3);
                                logset[4]=(char)NULL;
                                log=ON;
                        }

                        /* modem initialization string */

                        else if(strncmp(line,"mod=",4)==NULL)
                        {
                                strncpy(modem,line+4,LINLEN-1);
                                modem[LINLEN-1]=(char)NULL;
                                repchar(modem,'_',' ');
                                mod=ON;
                        }

                        /* news file name */

                        else if(strncmp(line,"new=",4)==NULL)
                        {
                                strncpy(newfil,line+4,FLNMLN-1);
                                newfil[FLNMLN-1]=(char)NULL;
                                new=ON;
                        }

                        /* port number */

                        else if( strncmp(line,"por=",4)==NULL)
                        {
                                strncpy(portstr,line+4,3);
                                portstr[3]=(char)NULL;
                                por=ON;
                                if(sscanf(portstr,"%u",&i)==NULL)
                                        por=OFF;
                        }

                        /* default privileges */
#ifndef NETWORK
			else if(strncmp(line,"net=",4)==NULL)
			{
				pri=pri;
			}
                        else if(strncmp(line,"pri=",4)==NULL)
                        {
                                strncpy(privs,line+4,FLNMLN-1);
                                privs[FLNMLN-1]=(char)NULL;
                                pri=ON;
                        }
#else
			else if(strncmp(line,"pri=",4)==NULL)
			{
				pri=pri;
			}
                        else if(strncmp(line,"net=",4)==NULL)
                        {
                                strncpy(privs,line+4,FLNMLN-1);
                                privs[FLNMLN-1]=(char)NULL;
                                pri=ON;
                        }
#endif
                        /* default user prologue file name */

                        else if(strncmp(line,"pro=",4)==NULL)
                        {
                                strncpy(profil,line+4,FLNMLN-1);
                                profil[FLNMLN-1]=(char)NULL;
                                pro=ON;
                        }

                        /* default user directory file name */

                        else if(strncmp(line,"usr=",4)==NULL)
                        {
                                strncpy(usrfil,line+4,FLNMLN-1);
                                usrfil[FLNMLN-1]=(char)NULL;
                                usr=ON;
                        }

                        /* user validation list file name */

                        else if(strncmp(line,"val=",4)==NULL)
                        {
                                strncpy(valfil,line+4,FLNMLN-1);
                                valfil[FLNMLN-1]=(char)NULL;
                                val=ON;
                        }
                        else
                        {
                                printf("%s\n",line);
                                return(-1);
                        }
                }
        }
        if(sys!=NULL) fclose(sys);

        /* if flag is not set, set default */

        if(acc==OFF)strcpy(access,"immediate");
        if(act==OFF)strcpy(actfil,"slugact.dat");
        if(bgn==OFF)strcpy(bgnfil,"slugbgn.dat");
        if(bil==OFF)strcpy(billing,"off");
        if(blf==OFF)strcpy(bilfil,"slugbil.dat");
        if(def==OFF)strcpy(deffil,"slugdef.dat");
        if(dir==OFF)strcpy(dirfil,"slugdir.dat");
        if(hlp==OFF)strcpy(hlpfil,"slughlp.dat");
        if(jsn==OFF)strcpy(jsnfil,"slugjsn.dat");
        if(log==OFF)strcpy(logset,"off");
        if(mod==OFF)strcpy(modem,"ATZ S0=1 X1 E0 V0 S2=128");
        if(new==OFF)strcpy(newfil,"slugnew.dat");
#ifdef SYSV2
        if(pri==OFF)strcpy(privs,PRIVS);
#endif SYSV2
#ifdef SYSV3
        if(pri==OFF)strcpy(privs,PRIVS);
#endif SYSV3
#ifdef BSD4
        if(pri==OFF)strcpy(privs,PRIVS);
#endif BSD4
#ifdef ULTRIX
        if(pri==OFF)strcpy(privs,PRIVS);
#endif ULTRIX
        if(pro==OFF)strcpy(profil,"slugpro.dat");
        if(usr==OFF)strcpy(usrfil,"slugusr.dat");
        if(val==OFF)strcpy(valfil,"slugval.dat");

        return(NULL);

}
\End\Of\Shar\
else
  echo "will not over write ./getcfg.c"
fi
chmod 400 ./getcfg.c
if [ `wc -c ./getcfg.c | awk '{printf $1}'` -ne 9386 ]
then
echo `wc -c ./getcfg.c | awk '{print "Got " $1 ", Expected " 9386}'`
fi
if `test ! -s ./getjsn.c`
then
echo "writing ./getjsn.c"
cat > ./getjsn.c << '\End\Of\Shar\'
/* @(#)getjsn.c	1.2 */
#include "slugnet.h"

int getjsn(jsn,jsnfil,rcvfil)

/* creates  the user's jsn and receiver file according to info found in sysfil */

char jsn[JSNLEN],jsnfil[FLNMLN],rcvfil[FLNMLN];
{
        FILE *djsn,*rcv;
#ifdef SYSV2
	FILE *fopen();
#endif SYSV2
        int i;


        /* read jsn from jsn file */

        lock(jsnfil);
	djsn=fopen(jsnfil,"r");
        if(djsn==NULL)
                strcpy(jsn,"aaaa");
        else
        {
                fscanf(djsn,"%4s",jsn);
                fclose(djsn);
                i=3;
                while(i>=0)
                {
                        if(jsn[i]=='z')
                        {
                                jsn[i]='a';
                                --i;
                        }
                        else
                        {
                                jsn[i]=(char)((int)jsn[i]+1);
                                i= -1;
                        }
                }
        }

        /* printf("%s\n",jsnfil); */

        djsn=fopen(jsnfil,"w");
        if(djsn==NULL)
        {
		unlock(jsnfil);
                return(-1);
        }
        else
        {
                chmod(jsnfil,00600);
                fprintf(djsn,"%4s",jsn);
                fclose(djsn);
		unlock(jsnfil);
        }

        /* create receive file */

        strcpy(rcvfil,jsn);
        strcat(rcvfil,"rcv.dat");

        /* printf("%s\n",rcvfil); */

	lock(rcvfil);
	/* mknod( rcvfil, 0010000 | 0000400 | 0000200, NULL ); */
        rcv=fopen(rcvfil,"w");
        if(rcv==NULL)
        {
		unlock(rcvfil);
                return(-2);
        }
        chmod(rcvfil,00600);
        fclose(rcv);
	unlock(rcvfil);
        return(NULL);

}
\End\Of\Shar\
else
  echo "will not over write ./getjsn.c"
fi
chmod 400 ./getjsn.c
if [ `wc -c ./getjsn.c | awk '{printf $1}'` -ne 1721 ]
then
echo `wc -c ./getjsn.c | awk '{print "Got " $1 ", Expected " 1721}'`
fi
if `test ! -s ./lock.c`
then
echo "writing ./lock.c"
cat > ./lock.c << '\End\Of\Shar\'
/* @(#)lock.c	1.2 */
#include "slugnet.h" 

lock( string )

/* psuedo file locking */

char string[];
{
	char lstring[FLNMLN+FLNMLN];
	int i,j;
#ifdef SYSV2
	unsigned sleep(),u;
#endif SYSV2
#ifdef SYSV3
	unsigned sleep(),u;
#endif SYSV3
#ifdef ULTRIX
	void sleep();
#endif ULTRIX

	strcpy(lstring,"LCK_");
	strcat(lstring,string);
	i = (int)NULL;
	j = (int)NULL;
	while( i <= (int)NULL )
	{
		i = creat( lstring, O_CREAT | O_EXCL );
		if( i <= (int)NULL )
		{
#ifdef SYSV2
			sleep((unsigned)1);
#endif SYSV2
#ifdef SYSV3
			u=sleep((unsigned)1);
#endif SYSV3
#ifdef BSD4
		 	sleep((unsigned)1);
#endif BSD4
#ifdef ULTRIX
		 	sleep((unsigned)1);
#endif ULTRIX
			++j;
			/* if wait is longer than timeout, stop */
			if(j > TIMEOUT)
				goto quit;
		}
	}
        chmod(lstring,00600);
	close(i);
	quit:;
}
\End\Of\Shar\
else
  echo "will not over write ./lock.c"
fi
chmod 400 ./lock.c
if [ `wc -c ./lock.c | awk '{printf $1}'` -ne 807 ]
then
echo `wc -c ./lock.c | awk '{print "Got " $1 ", Expected " 807}'`
fi
if `test ! -s ./lower.c`
then
echo "writing ./lower.c"
cat > ./lower.c << '\End\Of\Shar\'
/* @(#)lower.c	1.2 */
#include "slugnet.h"

int lower(string)

/* converts lower case to upper case */

char string[];
{
        static char low[27]="abcdefghijklmnopqrstuvwxyz";
        static char high[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int i,j;
        j=0;
        for(i=0;i<26;i++) j=j+repchar(string,high[i],low[i]);
        return(j);
}
\End\Of\Shar\
else
  echo "will not over write ./lower.c"
fi
chmod 400 ./lower.c
if [ `wc -c ./lower.c | awk '{printf $1}'` -ne 351 ]
then
echo `wc -c ./lower.c | awk '{print "Got " $1 ", Expected " 351}'`
fi
if `test ! -s ./main.c`
then
echo "writing ./main.c"
cat > ./main.c << '\End\Of\Shar\'
/* @(#)main.c	1.6 */
#ifdef NETWORK
#ifdef INTERLAN
#include <signal.h>
#define SIGCHLD SIGCLD
#define SIGURG SIGUSR2
#endif INTERLAN

#include "net.h"

void cleanup(), task();

main( argc, argv )
int argc;
char *argv[];
{
	char *rhost;
	extern int optind;
	extern char *optarg;
	int a, i, n, s, t;

	a = 0; n= 0; rhost = (char *)NULL;
	
	while(( i = getopt( argc, argv, "a:n:" )) != EOF ){
		switch( i ) {
		
		/* address */

		case 'a':
			a = 1; n = 0; rhost = optarg; break;

		case 'n':
			a = 0; n = 1; rhost = optarg; break;
		}
	}

	if( rhost != (char *)NULL ){
		for(;;){
			s = 0;
			while( s == 0 ){
				if( a )
					s = callbyaddr( rhost, PORTNUM );
				if( n ) 
					s = callbyhost( rhost, PORTNUM );
			}
			i = slugnet( s, rhost );
			close( s );
			fprintf( stderr, "slugnet: Error %d\n", i );
			exit(1);
		}
	}

			

	if ((s= establish(PORTNUM)) < 0) {  /* plug in the phone */
		perror("establish");
		exit(1);
	}

	signal(SIGCHLD, cleanup); /* this eliminates zombies */

	/* loop for phone calls */

	for (;;) {                         

		/* get a connection */

		if ((t= get_connection(s)) < 0) {

			/* EINTR might happen on accept(), */

			if (errno == EINTR)             

				/* try again */

				continue;   
			
			/* bad */                  

			perror("accept");               
			exit(1);
		}

		/* try to handle connection */

		switch(fork()) {                 

		/* bad news.  scream and die */

		case -1 :                         
			perror("fork");
			close(s);
			exit(1);

		/* we're the child, do something */

		case 0 :                          
			task(t);
			exit(0);

		/* we're the parent so look for another connection */
                      
		default :                         
			close( t );
			continue; 
		}
	}
}
#endif NETWORK
\End\Of\Shar\
else
  echo "will not over write ./main.c"
fi
chmod 400 ./main.c
if [ `wc -c ./main.c | awk '{printf $1}'` -ne 1786 ]
then
echo `wc -c ./main.c | awk '{print "Got " $1 ", Expected " 1786}'`
fi
if `test ! -s ./net.h`
then
echo "writing ./net.h"
cat > ./net.h << '\End\Of\Shar\'
/* @(#)net.h	1.5 */
/* net include file */

#include <sys/param.h>
#include <errno.h>

#ifdef INTERLAN
#include <interlan/il_errno.h>
#endif

#include <signal.h>
#include <stdio.h>

#ifdef SYSV2
#include <sys/types.h>
#endif SYSV2

#ifdef SYSV3
#ifdef INTERLAN
#include <interlan/il_types.h>
#else
#include <sys/types.h>
#endif
#endif SYSV3

#ifdef INTERLAN
#include <interlan/socket.h>
#else
#include <sys/socket.h>
#endif

#ifdef BSD4
#include <sys/wait.h>
#endif BSD4

#ifdef ULTRIX
#include <sys/wait.h>
#endif ULTRIX

#ifdef INTERLAN
#include <interlan/in.h>
#include <interlan/netdb.h>
#define MAXHOSTNAMELEN 64
#else
#include <netinet/in.h>
#include <netdb.h>
#endif

#define PORTNUM 2727 /* use chat port number */

\End\Of\Shar\
else
  echo "will not over write ./net.h"
fi
chmod 400 ./net.h
if [ `wc -c ./net.h | awk '{printf $1}'` -ne 724 ]
then
echo `wc -c ./net.h | awk '{print "Got " $1 ", Expected " 724}'`
fi
if `test ! -s ./rdline.c`
then
echo "writing ./rdline.c"
cat > ./rdline.c << '\End\Of\Shar\'
/* @(#)rdline.c	1.2 */
#include "slugnet.h"

int rdline( fp, string, strln )

/* reads a file a line at a time */

FILE *fp;
char string[];
int strln;
{
        int c,i;

	for( i = 0; i < strln; ++i )
		string[ i ] = (char)NULL;
        c=0;
        i=0;
        strln=strln-1;
	for(i = 0; i < strln; ++i ){ 
                c=fgetc(fp);
		if( c == CR || c == LF ) {
        		string[i]=(char)NULL;
			break; 
		} else if( feof(fp)==NULL )
                	string[i]=(char)c;
		else {
        		string[i]=(char)NULL;
			break;
		}
        }
        string[i]=(char)NULL;
	
        return(i);
}
\End\Of\Shar\
else
  echo "will not over write ./rdline.c"
fi
chmod 400 ./rdline.c
if [ `wc -c ./rdline.c | awk '{printf $1}'` -ne 594 ]
then
echo `wc -c ./rdline.c | awk '{print "Got " $1 ", Expected " 594}'`
fi
if `test ! -s ./receive.c`
then
echo "writing ./receive.c"
cat > ./receive.c << '\End\Of\Shar\'
/* @(#)receive.c	1.5 */
#include "slugnet.h"

#define VLDLEN 129

int receive( socket, string, maxlen, echoplex )

/* reads until a return is encountered, or maxlen-1 characters entered */

int socket;
char string[];
int maxlen,echoplex;
{
                                /* 12345678911234567892123456789312345678941234567895123456789612345678971 23 456 78 9812345678991234 5 6 7 8 */
        static char valid[VLDLEN]=" 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,./;'[]\`-=\\<>\?:\"{}~!@#$%^&*()+|_";
        char buffer[2];
        int c,err,i,tlen;
        tlen=0;
        for( i=0;i < maxlen; i++ ) string[i] = (char)NULL;
        --maxlen;
        i = 1;
        while( buffer[ 0 ] != '\n'  ){
		i = read( socket, buffer, 1 );
		if( i > 0 ){
			if(echoplex==ON){
#ifdef SYSV2
				 err = write( socket, buffer, i );
#endif SYSV2
#ifdef SYSV3
				 err = write( socket, buffer, i );
#endif SYSV3
#ifdef BSD4
				 err = write( socket, buffer, i );
#endif BSD4
#ifdef ULTRIX
				 err = write( socket, buffer, i );
#endif ULTRIX
			}

			if( find(valid,buffer[0],strlen(valid)) != -1 ){
				string[tlen] = buffer[ 0 ];
				++tlen;
			}
			if( tlen == maxlen )
				buffer[ 0 ] = '\n';
		
		} else if( i == 0 ){
			strcpy( string, "exit" );
			tlen = 5;
			break;
		} else {
			string[ 0 ] = ( char )NULL;
			tlen = 0;
			break;
		}
	}
        return(tlen);
}

#undef VLDLEN
\End\Of\Shar\
else
  echo "will not over write ./receive.c"
fi
chmod 400 ./receive.c
if [ `wc -c ./receive.c | awk '{printf $1}'` -ne 1392 ]
then
echo `wc -c ./receive.c | awk '{print "Got " $1 ", Expected " 1392}'`
fi
if `test ! -s ./repchar.c`
then
echo "writing ./repchar.c"
cat > ./repchar.c << '\End\Of\Shar\'
/* @(#)repchar.c	1.2 */
#include "slugnet.h"

int repchar(string,old,new)

/* replaces old character in a string with the new character */

char string[],old,new;
{
        int c,i;
        c=0;
        i=0;
        while(string[i]!=(char)NULL)
        {
                if(string[i]==old)
                {
                        string[i]=new;
                        ++c;
                }
                ++i;
        }
        return(c);
}
\End\Of\Shar\
else
  echo "will not over write ./repchar.c"
fi
chmod 400 ./repchar.c
if [ `wc -c ./repchar.c | awk '{printf $1}'` -ne 446 ]
then
echo `wc -c ./repchar.c | awk '{print "Got " $1 ", Expected " 446}'`
fi
if `test ! -s ./send_file.c`
then
echo "writing ./send_file.c"
cat > ./send_file.c << '\End\Of\Shar\'
/* @(#)send_file.c	1.2 */
#include "slugnet.h"

int send_file(socket,filnam)

/* transmits a file as an ascii stream */

int socket;
char filnam[];
{
        static char line[32]="\0";
        FILE *d_file;
#ifdef SYSV2
	FILE *fopen();
#endif SYSV2
        int c,len;

        len=0;
        d_file=fopen(filnam,"r");
        if(d_file!=NULL)
        {
                c=NULL;
                while(c!=EOF)
                {
                        c=fgetc(d_file);
                        sprintf(line,"%c",(char)c);
                        len=len+transmit(socket,line,NOCRLF);
                }
                fclose(d_file);
        }
        len=len+transmit(socket," ",CRLF);
        return(len);
}
\End\Of\Shar\
else
  echo "will not over write ./send_file.c"
fi
chmod 400 ./send_file.c
if [ `wc -c ./send_file.c | awk '{printf $1}'` -ne 706 ]
then
echo `wc -c ./send_file.c | awk '{print "Got " $1 ", Expected " 706}'`
fi
if `test ! -s ./setjsn.c`
then
echo "writing ./setjsn.c"
cat > ./setjsn.c << '\End\Of\Shar\'
/* @(#)setjsn.c	1.2 */
#include "slugnet.h"

int setjsn(jsn,jsnfil)

/* updates the local jsn to jsn, if conditions are met */

char jsn[JSNLEN],jsnfil[FLNMLN];
{
	char ojsn[ JSNLEN ];
        FILE *djsn;
#ifdef SYSV2
	FILE *fopen();
#endif SYSV2
        int i;


        /* read jsn from jsn file */

        lock(jsnfil);
	djsn=fopen(jsnfil,"r");
        if(djsn==NULL)
                strcpy(ojsn,"zzzz");
        else
        {
                fscanf(djsn,"%4s",ojsn);
                fclose(djsn);
	}

	/* decide whether to update jsn or not */

	for( i = 0; i < JSNLEN; ++i ){
	
		if( i == 0 ){
			if( jsn[ i ] == 'z' ){
				if( ojsn[ i ] == 'a' )
					break;
			} else if( jsn[ i ] > ojsn [ i ] ){
				strcpy( ojsn, jsn );
				break;
			}
		} else if( jsn[ i ] > ojsn [ i ] ){
			strcpy( ojsn, jsn );
			break;
		}
        }

        djsn=fopen(jsnfil,"w");
        if(djsn==NULL)
        {
		unlock(jsnfil);
                return(-1);
        }
        else
        {
                chmod(jsnfil,00600);
                fprintf(djsn,"%4s",ojsn);
                fclose(djsn);
		unlock(jsnfil);
        }

        return(NULL);

}
\End\Of\Shar\
else
  echo "will not over write ./setjsn.c"
fi
chmod 400 ./setjsn.c
if [ `wc -c ./setjsn.c | awk '{printf $1}'` -ne 1140 ]
then
echo `wc -c ./setjsn.c | awk '{print "Got " $1 ", Expected " 1140}'`
fi
if `test ! -s ./sighang.c`
then
echo "writing ./sighang.c"
cat > ./sighang.c << '\End\Of\Shar\'
/* @(#)sighang.c	1.2 */
#include "slugnet.h"

#ifdef SYSV2
void sighang()
#endif SYSV2
#ifdef SYSV3
void sighang()
#endif SYSV3
#ifdef BSD4
sighang()
#endif BSD4
#ifdef ULTRIX
sighang()
#endif ULTRIX
{
	signal(SIGHUP, sighang);
	if(hungup==OFF)
		hungup=ON;
}
\End\Of\Shar\
else
  echo "will not over write ./sighang.c"
fi
chmod 400 ./sighang.c
if [ `wc -c ./sighang.c | awk '{printf $1}'` -ne 260 ]
then
echo `wc -c ./sighang.c | awk '{print "Got " $1 ", Expected " 260}'`
fi
if `test ! -s ./sigquit.c`
then
echo "writing ./sigquit.c"
cat > ./sigquit.c << '\End\Of\Shar\'
/* @(#)sigquit.c	1.2 */
#include "slugnet.h"

#ifdef SYSV2
void sigquit()
#endif SYSV2
#ifdef SYSV3
void sigquit()
#endif SYSV3
#ifdef BSD4
sigquit()
#endif BSD4
#ifdef ULTRIX
sigquit()
#endif ULTRIX
{
	signal(SIGQUIT,sigquit);
	if( hungup==OFF)
		hungup=ON;
}
\End\Of\Shar\
else
  echo "will not over write ./sigquit.c"
fi
chmod 400 ./sigquit.c
if [ `wc -c ./sigquit.c | awk '{printf $1}'` -ne 261 ]
then
echo `wc -c ./sigquit.c | awk '{print "Got " $1 ", Expected " 261}'`
fi
if `test ! -s ./sigstop.c`
then
echo "writing ./sigstop.c"
cat > ./sigstop.c << '\End\Of\Shar\'
/* @(#)sigstop.c	1.2 */
#include "slugnet.h"

#ifdef SYSV2
void sigstop()
#endif SYSV2
#ifdef SYSV3
void sigstop()
#endif SYSV3
#ifdef BSD4
sigstop()
#endif BSD4
#ifdef ULTRIX
sigstop()
#endif ULTRIX
{
        signal(SIGINT , sigstop);
	if( stopscroll==OFF)
		stopscroll=ON;
}
\End\Of\Shar\
else
  echo "will not over write ./sigstop.c"
fi
chmod 400 ./sigstop.c
if [ `wc -c ./sigstop.c | awk '{printf $1}'` -ne 277 ]
then
echo `wc -c ./sigstop.c | awk '{print "Got " $1 ", Expected " 277}'`
fi
if `test ! -s ./sigterm.c`
then
echo "writing ./sigterm.c"
cat > ./sigterm.c << '\End\Of\Shar\'
/* @(#)sigterm.c	1.2 */
#include "slugnet.h"

#ifdef SYSV2
void sigterm()
#endif SYSV2
#ifdef SYSV3
void sigterm()
#endif SYSV3
#ifdef BSD4
sigterm()
#endif BSD4
#ifdef ULTRIX
sigterm()
#endif ULTRIX
{
	signal(SIGTERM,sigterm);
}
\End\Of\Shar\
else
  echo "will not over write ./sigterm.c"
fi
chmod 400 ./sigterm.c
if [ `wc -c ./sigterm.c | awk '{printf $1}'` -ne 230 ]
then
echo `wc -c ./sigterm.c | awk '{print "Got " $1 ", Expected " 230}'`
fi
if `test ! -s ./sigtstp.c`
then
echo "writing ./sigtstp.c"
cat > ./sigtstp.c << '\End\Of\Shar\'
/* @(#)sigtstp.c	1.2 */
#include "slugnet.h"

#ifdef SYSV2
void sigtstp()
#endif SYSV2
#ifdef SYSV3
void sigtstp()
#endif SYSV3
#ifdef BSD4
sigtstp()
#endif BSD4
#ifdef ULTRIX
sigtstp()
#endif ULTRIX
{
#ifdef ULTRIX
        signal(SIGTSTP , sigtstp);
#endif ULTRIX
#ifdef BSD4
        signal(SIGTSTP , sigtstp);
#endif BSD4
	if( stopscroll==OFF)
		stopscroll=ON;
}
\End\Of\Shar\
else
  echo "will not over write ./sigtstp.c"
fi
chmod 400 ./sigtstp.c
if [ `wc -c ./sigtstp.c | awk '{printf $1}'` -ne 365 ]
then
echo `wc -c ./sigtstp.c | awk '{print "Got " $1 ", Expected " 365}'`
fi
if `test ! -s ./sigurg.c`
then
echo "writing ./sigurg.c"
cat > ./sigurg.c << '\End\Of\Shar\'
/* @(#)sigurg.c	1.2 */
#ifdef NETWORK
#include "slugnet.h"

#ifdef SYSV2
void sigurg()
#endif SYSV2
#ifdef SYSV3
void sigurg()
#endif SYSV3
#ifdef BSD4
sigurg()
#endif BSD4
#ifdef ULTRIX
sigurg()
#endif ULTRIX
{
	signal(SIGURG,sigurg);
	if( hungup==OFF)
		hungup=ON;
}
#endif NETWORK
\End\Of\Shar\
else
  echo "will not over write ./sigurg.c"
fi
chmod 400 ./sigurg.c
if [ `wc -c ./sigurg.c | awk '{printf $1}'` -ne 284 ]
then
echo `wc -c ./sigurg.c | awk '{print "Got " $1 ", Expected " 284}'`
fi
if `test ! -s ./slughlp.dat`
then
echo "writing ./slughlp.dat"
cat > ./slughlp.dat << '\End\Of\Shar\'
*BELL: 
       Bell                Send a control-G to the user's terminal.
  
*BROADCAST: 
       Broadcast           Sends a message to all conferences.
  
*BYE: 
       Bye                 Log off Slugnet ( and system ).
  
*CLEAR:
       Clear               Clears the user's message buffer.

*COPYRIGHT:
                            Slugnet

              COPYRIGHT 1988 James R. Purdon III

                      All rights reserved.

*DELAY: 
       Delay               Rolls out the terminal for a period of
                           time ( default is 15 seconds ).  This
                           time can be changed using the 'Set delay'
                           command.
  
*EXIT: 
       Exit                Exit Slugnet.
  
*HELP: 
       Help n              Displays help for n, where n is a Slugnet
                           command or topic. A list of topics can be
                           obtained by typing 'help' with no arguments.
  
*JOIN: 
       Join n              Leave current conference and join or
                           create n, where n is a conference name.
                           Join will create new conferences.  If a
                           conference name begins with '-', it will
                           not be displayed by a "Show conferences"
                           command. If no conference name is given,
                           the conference "Root" is joined.
  
*REWIND: 
       Rewind              Rewinds the input stream.
  
*RING: 
       Ring n              Sends a control-G sequence to n, where
                           n is the JSN.
*SCROLL:
       Scroll              Enter scroll mode.  In scroll mode, the
                           user's receive buffer is scanned without
                           pausing for input.  When using a local 
                           copy of slugnet, scroll mode may be 
                           cancelled by entering the INTR control 
                           character.  When using a remote copy the 
                           RETURN character should be used.
 
*SEND: 
       Send n              Send a private message to n, where n is a
                           JSN.  If n is blank, message will be
                           broadcast to all conference members.

*SET CONFIGURATION:
       Set configuration   Saves the user's configuration in a file
                           called "slugcon.dat" in the current working
                           directory.  Slugnet will use this file to
                           restore the user's configuration whenever
                           it is invoked.

*SET CONTINUOUS:
       Set continuous n    Sets continuous mode to n, where n is ON
                           or OFF.  When continuous mode is ON, new
                           messages are displayed automatically, and
                           the prompt is not displayed (unless the
                           user issues a "set prompt on" after entering
                           continuous mode - this is NOT recommended).
                           Setting continuous mode OFF will also set
                           prompt mode on.  The time between checks
                           for new messages is specified by the
                           SET DELAY command.

*SET DEFINITION:
       Set definition n    Sets the user definition file name
                           to n.  The default name is SLUGDEF.DAT.
                           The user definition file should already
                           exist and be a permanent file ( see the
                           help entry for a description of the user
                           definition file ).

*SET DELAY: 
       Set delay n         Set the delay time to n seconds, where n
                           is an integer between 0 and 9999>  The
                           delay time is used by scroll mode, the
                           delay command, and continuous mode.
  
*SET ECHO: 
       Set echo n          Set echo mode to n, where n is ON or OFF.
                           If echo mode is set to OFF, messages sent
                           by the user and lines from a redirected
                           input file are not echoed.
 
*SET LOGIN:
       Set login n         Set the user's login name to n, where n is
                           a text string.  This option is only available
                           when Slugnet is operating as a network server.
                           If no login is specified, or Slugnet is unable
                           to verify the specified login, the login will
                           be set to 'unknown'.

*SET NAME: 
       Set name n          Set the user's name to n, where n is a
                           text string.  If no name is specified,
                           the name will be set to 'Anonymous'.
  
*SET NOVICE: 
       Set novice n        Set novice mode to n, where n is ON or
                           OFF.  When novice mode is OFF, it is no
                           longer necessary to precede message text
                           with a blank.
  
*SET PROMPT: 
       Set prompt n        Set prompt mode to n, where n is ON or
                           OFF.  When prompt mode is OFF, the name
                           of the current conference is no longer
                           printed on an input request.
  
*SET RING: 
       Set ring n          Set ring mode to n, where n is ON or OFF.
                           When ring mode is OFF, the user's terminal
                           will not respond to 'Ring' commands given
                           by other users.
  
*SET TIMER: 
       Set timer n         Sets timer mode to n, where n is ON or OFF.
                           When timer mode is ON, a time stamp is sent
                           to the output stream while in scroll and wait
                           wait modes.
  
*SET WAIT: 
       Set wait n          Sets the string used by the 'wait' command
                           to n.  The default string is "From".
  
*SHOW BUFFER
       Show buffer         Displays the user's message buffer.

*SHOW CONFERENCES: 
       Show conferences    Displays active conferences ( except
                           for conferences whose name begins
                           with '-' ).
  
*SHOW CONFIGURATION:
       Show configuration  Displays the user's current configuration.

*SHOW HOSTS:
       Show hosts          Displays the host names of the members of the
                           current conference.

*SHOW LOGINS:
       Show logins         Displays the login names of the members of the
                           current conference.  This information may not
                           be completely accurate.

*SHOW MEMBERS: 
       Show members        Displays the JSN, login, host name, and name of 
                           all members of your current conference.  The
                           login name and host name may be truncated to
                           fit on a line.
  
*WAIT: 
       Wait                Enters scroll mode until a specified
                           text string is received.  The default
                           text string is "From".  The string
                           can be set with the 'Set wait' command.
                           When using a local copy of slugnet, wait 
                           mode may be cancelled by entering the INTR 
                           control character.  When using a remote 
                           copy the RETURN character should be used.
  
*WRITE:
       Write n             Writes the user's message buffer to the
                           file n.

*OS COMMANDS:
       !n                  Pass n to the OS for processing, where n
                           is a OS command ( n should be followed
                           by a period ).  After the command has
                           been processed, Slugnet will resume.
  
*ENTERING COMMANDS AND TEXT: 
  
                  Entering Commands and Message Text
  
       All input starting in column 1 will be interpreted as
       Slugnet commands.  Input intended as message text should
       begin in column 2.  A blank line or a "Send" command will
       flush the message buffer and send the text.
  
       If novice mode is set to OFF, message text does not have
       to begin in column 2.  However, if the text contains an
       embedded command string starting in column 1, Slugnet will
       attempt to process the command.
  
*RESERVED CHARACTERS: 
  
                        Reserved Characters
  
       Slugnet reserves the characters '<', '>', '*', and '!'
       in column 1 for input redirection, output redirection,
       comments, and OS command flag.
  
*FILE REDIRECTION: 
  
                             File Redirection
  
       Slugnet allows redirection of the input and output streams,
       using <n or >n, where n is a valid name of a local Nos file
       ( >n will create the file ).  The output stream is restored
       to the terminal by entering '>output' or '>'.  The input
       stream is restored to the terminal when a file partition,
       '<input', or '<' is encountered in an input stream.
  
*USER DEFINITION FILE:
  
                     The User Definition File
  
       Slugnet allows the user to define his or her own command
       phrases by means of a definition file.  When Slugnet
       encounters a command it does not understand, it attempts
       to open a definition file "slugdef.dat" ( SLUGnet DEFinition
       file ). If successful, it scans the contents of the file
       for a match with the user's command, and replaces the
       user's command with the definition.
  
       This allows for a great deal of freedom on the part of
       the user.  For example, a user who was used to the "/"
       command signal of many conference programs might make the
       following definition file:
  
       *
       * "/" definition file for users who love "/" commands
       * commands
       *
       /who=show members;
       /w=show members;
       *
       /name=set name;
       /n=set name;
       *
       /h=help;
       *
       /s=send;
       *
       /b=bye;
  
       With this file, the user would be able use /b, /h, /n, /s,
       and /w as commands. If several different users share the
       same login, they can create definition files with names
       other than "slugdef.dat" and use the 'Set definition'
       command to set the definition file name.
  
       Definitions should start in column 1 of the definition
       file and terminate with a semicolon ( ';' ).  The user's
       command should be separated from the definition by an
       equal sign ( '=' ).  Neither the user's command or the
       definition should contain equal signs or semicolons, other
       than the separator and terminator.  The definition does
       not have to be a Slugnet command, but may be any text
       string ( it will be interpreted just the same as if the
       user entered it directly ).
  
*ADDITIONAL NOTES: 
  
                          Additional Notes
  
       1. Slugnet Server messages may be recognized because they
          have the Server's user number in the "From" message.
  
       2. Slugnet allows the installer to set various options,
          such as permissions to access certain commands.  You
          may not be able to execute all of the commands for
          this reason.

*USER PROLOGUE FILE: 
  
                          The User Prologue File
  
          A user prologue file is file of Slugnet commands that
          the user wants executed when Slugnet is started.  By
          default, Slugnet looks for a file called "slugpro.dat",
          but the user may specify his own file name by using the
          "set prologue" command, followed by a "set configuration"
          command.
  
*EOF: 
 Help is available for the following commands and topics: 
  
 Additional notes    Bell      Broadcast           Bye       Clear
 Copyright           Delay     Entering commands and text    Exit
 File redirection    Help      Join      OS commands
 Reserved characters           Rewind    Ring      Scroll    Send
 Set configuration   Set continuous      Set definition      Set delay
 Set echo            Set login           Set name            Set novice
 Set prologue        Set prompt          Set ring            Set timer
 Set wait            Show buffer         Show conferences    
 Show configuration  Show hosts          Show logins         Show members
 User definition file          User prologue file            Wait      Write
  
 To view the help for a particular topic, type 'help n', where n is
 the topic.

\End\Of\Shar\
else
  echo "will not over write ./slughlp.dat"
fi
chmod 400 ./slughlp.dat
if [ `wc -c ./slughlp.dat | awk '{printf $1}'` -ne 12822 ]
then
echo `wc -c ./slughlp.dat | awk '{print "Got " $1 ", Expected " 12822}'`
fi
if `test ! -s ./slugnet.1`
then
echo "writing ./slugnet.1"
cat > ./slugnet.1 << '\End\Of\Shar\'
.\" @(#)slugnet.1	1.1
.TH slugnet 1
.SH NAME
slugnet \- use slugnet, a multiple\-user, interactive conferencing system
.SH SYNTAX
.B slugnet
.SH DESCRIPTION
.NXR "slugnet"
.NXA "multiple\-user" "interactive" "conferencing" "system"
.NXA "local" "slugnet program"
.NXR "message" "interactive"
The
.PN slugnet
is a multiple\-user conferencing system which allows users to
simultaneously carry on conversations with several users at once, in much
the same way that the write(1) or talk(1) commands allow a single user
to communicate with just one other user.
.PP 
Users limit the number of other users they are communicating with by
joining conferences.  Conferences are arbitrarily named groups of users.
Messages from a user in a conference are by default only sent to other
users in the same conference, although it is possible to send messages
to a single user or all the users.
.PP
.PN slugnet
has many installation\-dependent features.  The program has its own help
files which may be accessed by the
.PN slugnet
command "help".
.SH RESTRICTIONS
Access to some of commands described in the internal help may be
installation\-dependent.
.PP
.SH "SEE ALSO"
slugnetd(1)
\End\Of\Shar\
else
  echo "will not over write ./slugnet.1"
fi
chmod 400 ./slugnet.1
if [ `wc -c ./slugnet.1 | awk '{printf $1}'` -ne 1170 ]
then
echo `wc -c ./slugnet.1 | awk '{print "Got " $1 ", Expected " 1170}'`
fi
echo "Finished archive 5 of 6"
exit



More information about the Alt.sources mailing list