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