rsalz@uunet.uu.net (Rich Salz) (09/13/88)
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@elgar.UUCP" #define ALTPATH "ag@portnoy.UUCP" #define THANKS1 "ford@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@uunet.uu.net.