v16i002: Multi-user conference system, Part02/05

Rich Salz rsalz at uunet.uu.net
Tue Sep 13 06:07:29 AEST 1988


Submitted-by: Keith Gabryelski <ucsd!elgar!ag>
Posting-number: Volume 16, Issue 2
Archive-name: conf2/part02

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	conf.h
#	confalloc.c
#	config.h
#	confopts.c
export PATH; PATH=/bin:$PATH
if test -f 'conf.h'
then
	echo shar: will not over-write existing file "'conf.h'"
else
cat << \SHAR_EOF > 'conf.h'
#include "config.h"
#include <stdio.h>
#include <sys/types.h>
#include <ctype.h>
#include <signal.h>
#include <sys/stat.h>
#include <pwd.h>
#include <setjmp.h>
#include <errno.h>

#ifdef	SYSV
#include <unistd.h>
#include <termio.h>
#include <fcntl.h>
#endif	SYSV

#ifdef	BSD
#include <sgtty.h>
#include <sys/ioctl.h>
#include <sys/file.h>

#define	index	strchr
#define	rindex	strrchr
#endif	BSD


#include "structs.h"
#include "extern.h"

/*
 * some ASCII values
 *
 */

#ifdef	CTRL
#undef	CTRL
#endif	CTRL
#define	CTRL(c)		(c&0x1F)
#define	BELL		0x07
#define	BS		0x08
#define	TAB		0x09
#define	LF		0x0A
#define	CR		0x0D
#define	DEL		0x7F

/*
 * some bools
 *
 */

#ifdef	TRUE
#undef	TRUE
#endif	TRUE
#define	TRUE	1

#ifdef	FALSE
#undef	FALSE
#endif	FALSE
#define	FALSE	0

#define	NEXTWORD	1
#define	THEREST		2

#define	NOVIS		0
#define	VIS		1

#define	forever		for ever
#define	ever		(;;)
SHAR_EOF
fi # end of overwriting check
if test -f 'confalloc.c'
then
	echo shar: will not over-write existing file "'confalloc.c'"
else
cat << \SHAR_EOF > 'confalloc.c'
#include "conf.h"

/*
 *	memory managment stuff.
 */

char *
mymalloc(size)
unsigned size;
{
    char *p;

    if ((p = malloc(size)) == NULL)
    {
	(void) fprintf(stderr, "%s: Out of memory.\n", progname);
	nice_exit(-1);
    }

    return p;
}

char *
myrealloc(p, size)
char *p;
unsigned size;
{
    if (p == NULL)
    {
	if ((p = malloc(size)) == NULL)
	{
	    (void) fprintf(stderr, "%s: Out of memory.\n", progname);
	    nice_exit(-1);
	}
    }
    else if ((p = realloc(p, size)) == NULL)
    {
	(void) fprintf(stderr, "%s: Out of memory.\n", progname);
	nice_exit(-1);
    }

    return p;
}
SHAR_EOF
fi # end of overwriting check
if test -f 'config.h'
then
	echo shar: will not over-write existing file "'config.h'"
else
cat << \SHAR_EOF > 'config.h'
/*
 * System type.  Define only the *ONE* system that applies to you
 * the most.
 */

#define SYSV		        /* System V and Xenix.  SCO Xenix */
/*#define BSD		        /* Any of the Berkeley clan */

/*
 * Define SENDER as the local command to use to SEND a message.
 * :rings will popen() this command giving it one user on the
 * command line and its message through standard input.
 *
 * If you do not have a local SEND program then define this as
 * "write".
 */

#define SENDER	"write"		/* the local send program */

/*
 * The default pager
 *	maybe "more", "less", or "cat"
 */

#define	DEF_PAGER	"less"		/* local pager */
#define	DEF_SHELL	"csh"		/* default shell*/

/*
 * User settable files.
 *	Someday these files will be definable at any time during conf
 */

#define	CONFLOG		"/usr/lib/conf/conflog"   /* conversation log */
#define	CONFUSERS	"/usr/lib/conf/confusers" /* user log */
#define	CONFHELP	"/usr/lib/conf/confhelp"  /* help file */
#define	CONFLOCK	"/usr/lib/conf/conf.lock" /* lock file */

#define	DEF_RECFILE	"conf.rec"	 /* default record file */
#define	CONFRC		".confrc"	 /* default rc file */

#define	CONFOPTS	"CONFOPTS"		  /* environment variable */

#define	FILEMASK	0600		 /* filemask for CONF{USERS,LOG} */

/* Some buffer length stuff */
#define	MAXNAMELEN	21
#define	MAXTTYLEN	21
#define	MAXCONFLINES	100     /* number of conference lines */

#define	PAGESIZ		512     /* alloc this amount at a time */

#define TABAGE		2		/* space between columns */

/*
 * Some important influences.
 *
 * Thanks should also go out to Neil Pert for awesome percussion. -MQH
 */

#define SIGNIFICANT_OTHER	"Marla Gabryelski"

#define	MUSICIAN		"Brian_Eno"
#define	SONG			"Third_Uncle"

#define VERNUM			2
#define PATCHLEVEL		0

#define AUTHOR			"Keith M. Gabryelski"
#define ADDRESS			"ag at elgar.UUCP"
#define ALTPATH			"ag at portnoy.UUCP"
#define THANKS1			"ford at kenobi.UUCP (Mike Ditto)"

/*
 * form strings
 *
 *	Meta characters for form string:
 *
 *	%N - Your conference name.
 *	%n - Name of user sending message.
 *	%m - Message users sent.
 *	%T - Your tty.
 *	%t - Tty of user that sent message.
 *	%% - The character '%'
 *
 */

#define	DEF_FORM_NORM	";;; %n (%t) - %m\n"
#define	DEF_FORM_SEND	">>> %n (%t) - %m\n"
#define	DEF_FORM_INFORM	"::: %n (%t) [%m]\n"
#define	DEF_FORM_LINE	"::: %n (%t) - %m\n"
#define	DEF_FORM_SHOUT	"*** %n (%t) - %m\n"

/*
 * You probably don't need to modify anything after this line
 * unless you are debugging.
 */

/*
 * DEBUGx are debugging defines.
 *
 */

/*#define DEBUG0		/* insignificant checks around conf */
/*#define DEBUG1		/* temporary debug messages */

SHAR_EOF
fi # end of overwriting check
if test -f 'confopts.c'
then
	echo shar: will not over-write existing file "'confopts.c'"
else
cat << \SHAR_EOF > 'confopts.c'
#include "conf.h"

int set_name(), set_ptrstr();

gettcap()
{
    char *ptr;
    char buf[1024];

    if (tgetent(buf, getenv("TERM")) == 1)
    {
	columns=tgetnum("co");
	lines=tgetnum("li");
	tcapstr("cl", &cls);
    }
    else
	puts("Unknown terminal type.  I'll wing it.\n");

    if ((ptr = getenv("COLUMNS")) != NULL)
	columns = atoi(ptr);

    if ((ptr = getenv("LINES")) != NULL)
	lines = atoi(ptr);

    if ((ptr = getenv("SHELL")) != NULL)
    {
	shell = myrealloc(shell, strlen(ptr)+1);
	(void) strcpy(shell, ptr);
    }

    if ((ptr = getenv("PG")) != NULL)
    {
	pager = myrealloc(pager, strlen(ptr)+1);
	(void) strcpy(pager, ptr);
    }

    if ((ptr = getenv("PAGER")) != NULL)
    {
	pager = myrealloc(pager, strlen(ptr)+1);
	(void) strcpy(pager, ptr);
    }
}

getrc()
{
    char *fname;
    char tmp[100];
    char *bp, *p;
    int c;
    FILE *fp;

    if (homedir == NULL)
    {
	(void) fprintf(stderr, "%s: Can't figure you out!  Not using %s.\n",
		       progname, CONFRC);
	return;
    }

    fname = mymalloc((unsigned)(strlen(homedir) + 1 + strlen(CONFRC) + 1));

    (void) strcpy(fname, homedir);
    (void) strcat(fname, "/");
    (void) strcat(fname, CONFRC);

    if ((fp = fopen(fname, "r")) == (FILE *)NULL)
    {
	if (errno == ENOENT)
	    return;				/* no confrc file...  sigh */
	else
	{
	    (void) fprintf(stderr,
			   "%s: Couldn't open confrc file %s (%s).\n",
			   progname, fname, puterr(errno));
	free(fname);
	exit(-1);
	}
    }

    forever
    {
	p = bp = tmp;

	while (((c = getc(fp)) != EOF) && (c != '\n'))
	    *p++ = c;

	if (c == EOF)
	    break;

	*p = '\0';

	while (isspace(*bp))
	    bp++;

	if ((*bp == '#') || (*bp == ';') || (*bp == '\0'))
	    continue;

	if (*bp == ':')			/* a colon command? */
	{
	    linelen = strlen(bp+1);
	    if (!intpret(bp+1))
	    {
		(void) printf("Invalid confrc line in %s @\"%s\".\n",
			      fname,bp);
		return;
	    }
	}
	else
	{
	    if ((bp = parsestr(bp, p-bp, NEXTWORD)) == NULL)
		continue;

	    do
	    {
		if ((c = setopts(bp)) != FOUNDOPT)
		{
		    if (c == AMBIGUOUS)
			(void)fputs("Ambiguous", stdout);
		    else
			(void)fputs("Invalid", stdout);

		    (void) printf(" confrc file %s @\"%s\"\n", fname, bp);
		    free(fname);
		    return;
		}
	    } while ((bp = parsestr((char *)NULL, 0, NEXTWORD)) != NULL);
	}
    }

    free(fname);
    (void) fclose(fp);
}

getopts()
{
    char *ptr;
    int x;

    if ((ptr = getenv("COLUMNS")) != NULL)
	columns = atoi(ptr);

    if ((ptr = getenv("LINES")) != NULL)
	lines = atoi(ptr);

    if ((ptr = getenv("SHELL")) != NULL)
    {
	shell = myrealloc(shell, strlen(ptr)+1);
	(void) strcpy(shell, ptr);
    }

    if ((ptr = getenv("PG")) != NULL)
    {
	pager = myrealloc(pager, strlen(ptr)+1);
	(void) strcpy(pager, ptr);
    }

    if ((ptr = getenv("PAGER")) != NULL)
    {
	pager = myrealloc(pager, strlen(ptr)+1);
	(void) strcpy(pager, ptr);
    }

    if ((ptr = getenv(CONFOPTS)) != NULL)
    {
	ptr = parsestr(ptr, strlen(ptr), NEXTWORD);

	do
	{
	    if ((x = setopts(ptr)) != FOUNDOPT)
	    {
		if (x == AMBIGUOUS)
		    (void)fputs("Ambiuous", stdout);
		else
		    (void)fputs("Invalid", stdout);

		(void)printf(" %s environment variable @%s\n", CONFOPTS, ptr);
		break;
	    }
	} while ((ptr = parsestr((char *)NULL, 0, NEXTWORD)) != NULL);
    }
}

setopts(opt)
char *opt;
{
    int found;

    static struct varopts vartab[] =
    {
	{ "banner", BOOLEAN|DISPLAY, &banner, TRUE, },
	{ "nobanner", BOOLEAN|DISPLAY, &banner, FALSE, },
	{ "!banner", BOOLEAN|NODISPLAY, &banner, FALSE, },
	{ "beep", BOOLEAN|DISPLAY, &beep, TRUE, },
	{ "nobeep", BOOLEAN|DISPLAY, &beep, FALSE, },
	{ "!beep", BOOLEAN|NODISPLAY, &beep, FALSE, },
	{ "expand8bit", BOOLEAN|DISPLAY, &expand8bit, TRUE, },
	{ "noexpand8bit", BOOLEAN|DISPLAY, &expand8bit, FALSE, },
	{ "!expand8bit", BOOLEAN|NODISPLAY, &expand8bit, FALSE, },
	{ "expandctrl", BOOLEAN|DISPLAY, &expandctrl, TRUE, },
	{ "noexpandctrl", BOOLEAN|DISPLAY, &expandctrl, FALSE, },
	{ "!expandctrl", BOOLEAN|NODISPLAY, &expandctrl, FALSE, },
	{ "inform-format", STRING|DISPLAY, (int *)&informform, POINTER, set_ptrstr, },
	{ "line", NUMBER|DISPLAY, &cuser.cu_line, 0, do_to, },
	{ "line-format", STRING|DISPLAY, (int *)&lineform, POINTER, set_ptrstr, },
	{ "name", STRING|DISPLAY, (int *)cuser.cu_cname, ROUTINE, set_name, },
	{ "normal-format", STRING|DISPLAY, (int *)&normform, POINTER, set_ptrstr, },
	{ "pager", STRING|DISPLAY, (int *)&pager, POINTER, set_ptrstr, },
	{ "recfile", STRING|DISPLAY, (int *)&recfile, POINTER, set_ptrstr, },
	{ "seeme", BOOLEAN|DISPLAY, &seeme, TRUE, },
	{ "noseeme", BOOLEAN|DISPLAY, &seeme, FALSE, },
	{ "!seeme", BOOLEAN|NODISPLAY, &seeme, FALSE, },
	{ "seemyinform", BOOLEAN|DISPLAY, &informe, TRUE, },
	{ "noseemyinform", BOOLEAN|DISPLAY, &informe, FALSE, },
	{ "!seemyinform", BOOLEAN|NODISPLAY, &informe, FALSE, },
	{ "send-format", STRING|DISPLAY, (int *)&sendform, POINTER, set_ptrstr, },
	{ "shell", STRING|DISPLAY, (int *)&shell, POINTER, set_ptrstr, },
	{ "shout-format", STRING|DISPLAY, (int *)&shoutform, POINTER, set_ptrstr, },
	{ NULL, }
    }, *varptr, *keepptr;

    if (opt == NULL)
    {
	char *string;
	int tmp;
	int len=0;

	for (varptr = vartab; varptr->name != NULL; varptr++)
	    if ((varptr->type == BOOLEAN) && (*varptr->var == varptr->extra))
		if ((tmp = strlen(varptr->name)) > len)
		    len = tmp;

	len += TABAGE;

	(void)fputs("Boolean flags:\n\n", stdout);

	for (varptr = vartab; varptr->name != NULL; varptr++)
	    if ((varptr->type == BOOLEAN) && (*varptr->var == varptr->extra))
		colprnt(varptr->name, len);

	terpri();

	len = 0;

	for (varptr = vartab; varptr->name != NULL; varptr++)
	    if (varptr->type == NUMBER)
		if ((tmp = strlen(varptr->name)+1+declen(varptr->var)) > len)
		    len = tmp;

	len += TABAGE;

	(void)fputs("\nNumeric options:\n\n", stdout);

	string = mymalloc((unsigned)(len+1));
	for (varptr = vartab; varptr->name != NULL; varptr++)
	    if (varptr->type == NUMBER)
	    {
		(void) sprintf(string, "%s=%d", varptr->name, *varptr->var);
		colprnt(string, len);
	    }

	terpri();

	len = 0;

	for (varptr = vartab; varptr->name != NULL; varptr++)
	    if (varptr->type == STRING)
		if (varptr->extra&POINTER)
		{
		    if ((tmp=strlen(varptr->name) + vislen(*varptr->var)+3) > len)
			len = tmp;
		}
		else
		{
		    if ((tmp= strlen(varptr->name) + vislen(varptr->var)+3) > len)
			len = tmp;
		}

	len += TABAGE;

	(void)fputs("\nString options:\n\n", stdout);

	string = myrealloc(string, (unsigned)(len+1));
	for (varptr = vartab; varptr->name != NULL; varptr++)
	    if (varptr->type == STRING)
	    {
		if (varptr->extra&POINTER)
		    (void) sprintf(string, "%s=\"%s\"", varptr->name,
			    *varptr->var);
		else
		    (void) sprintf(string, "%s=\"%s\"", varptr->name,
			    varptr->var);
		colprnt(string, len);
	    }

	terpri();
	free(string);

	return FOUNDOPT;
    }

    keepptr = (struct varopts *)NULL;
    found = 0;
    for (varptr = vartab; varptr->name != NULL; varptr++)
	if (!strncmp(varptr->name, opt, strlen(opt)))
	{
	    if (!found)
		keepptr = varptr;

	    if (found >= 0)
		++found;

	    if (strlen(varptr->name) == strlen(opt))
	    {
		found = -1;
		keepptr = varptr;
	    }
	}

    if (!found)
	return NOOPT;

    if (found > 1)
	return AMBIGUOUS;

    switch(keepptr->type&VARMASK)
    {
	case BOOLEAN:
	    *keepptr->var = keepptr->extra;
	    break;

	case NUMBER:
	    return (*keepptr->var_func)(keepptr->name, keepptr->var);

	case STRING:
	    return (*keepptr->var_func)(keepptr->name, keepptr->var);

	default:
	    return NOOPT;
    }

    return FOUNDOPT;
}

set_name()
{
    char *ptr, *ptr2;
    char nbuf[20+MAXNAMELEN];

    if ((ptr = ptr2 = parsestr((char *)NULL, 0, NEXTWORD)) == NULL)
    {
	if (confing)
	{
	    (void) printf("name = \"%s\"\n", cuser.cu_cname);
	    return TRUE;
	}

	return FALSE;
    }

    while(*ptr2 != '\0')
    {
	if ((*ptr2 > ' ') && !strchr(",:/", *ptr2))
	    ptr2++;
	else
	    *ptr2 = '\0';
    }

    if (*ptr == '\0')
    {
	if (confing)
	{
	    (void)puts("Invalid name given.");
	    return TRUE;
	}

	return FALSE;
    }

    (void) sprintf(nbuf, "Changed name from %s", cuser.cu_cname);

    (void) strncpy(cuser.cu_cname, ptr, MAXNAMELEN);
    cuser.cu_cname[MAXNAMELEN-1] = '\0';
    clog.f_usrlen = strlen(cuser.cu_cname) + 1;

    if (confing)
    {
	write_log(INFORM, nbuf, (char *)NULL, 0, (unsigned)strlen(nbuf));
	write_usr();
	(void)printf("Name changed to \"%s\"\n", cuser.cu_cname);
    }

    return TRUE;
}

/*set_integer(name, var)
 *char *name;
 *int *var;
 *{
 *    char *ptr;
 *
 *    if ((ptr = parsestr((char *)NULL, 0, NEXTWORD)) != NULL)
 *	*var = atoi(ptr);
 *
 *    (void) printf("%s = %d\n", name, *var);
 *    return FOUNDOPT;
 *}
 */

set_ptrstr(name, var)
char *name, **var;
{
    char *ptr;

    if ((ptr = parsestr((char *)NULL, 0, NEXTWORD)) != NULL)
    {
	*var = myrealloc(*var, strlen(ptr)+1);
	(void) strcpy(*var, ptr);
    }

    (void) printf("%s = \"", name);
    visprnt(*var, stdout);
    (void) puts("\"");

    return FOUNDOPT;
}

declen(num)
register int num;
{
    register int places = 1;

    while ((num /= 10) >= 1)
	++places;

    return places;
}

tcapstr(string, var)
char *string, **var;
{
    char tcapbuf[1024];
    char *tmp = tcapbuf;

    if (tgetstr(string, &tmp) == NULL)
	*var = NULL;
    else
    {
	*var = myrealloc(*var, tmp-tcapbuf);
	(void) strcpy(*var, tcapbuf);
    }
}
SHAR_EOF
fi # end of overwriting check
#	End of shell archive
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz at uunet.uu.net.



More information about the Comp.sources.unix mailing list