home *** CD-ROM | disk | FTP | other *** search
- # include "nrs.h"
-
- # ifndef lint
- static char RCSid[]="@(#)$Header: config.c,v 3.6 88/09/08 17:38:31 pb Exp $";
- # endif
-
- /***********************************************************************\
- * *
- * The routines to read the config file, set up the tables, and keep *
- * everybody happy (some hope) *
- * *
- * Copyright 1986, Piete Brooks, Julian Onions & Adrian Pell *
- * pb@cl.cam.ac.uk, jpo@hcig.nott.ac.uk, Adrian.R.Pell@reading.ac.uk *
- * *
- * This program may be copied as long as you don't remove this notice, *
- * try to make any money off of it, or pretend that you wrote it. *
- * *
- \***********************************************************************/
-
- # define C_VERBOSE 1
- # define C_FILE 2
- # define C_OUTPUT 3
- # define C_M2 4
- # define C_M3 5
- # define C_M4 6
- # define C_FILEDMN 7
- # define C_FILECHAN 8
- # define C_GATEWAY 9
- # define C_DIRECTORY 10
- # define C_RELAYHOST 12
- # define C_COMMENT 13
- # define C_HOSTNAME 14
- # define C_DERFIL 15
- # define C_CONTEXT 16
- # define C_DOMAIN 17
- # define C_LEVEL 18
-
- Lookup conftab[] = { /* table of config strings */
- "verbose", C_VERBOSE,
- "file", C_FILE,
- "output", C_OUTPUT,
- "module2", C_M2,
- "module3", C_M3,
- "module4", C_M4,
- #ifdef MULT_OUTPUT_FILES
- "filedmn", C_FILEDMN,
- "filechan", C_FILECHAN,
- #endif MULT_OUTPUT_FILES
- "gateway", C_GATEWAY,
- "directory", C_DIRECTORY,
- #ifdef MULT_OUTPUT_FILES
- "relay_host", C_RELAYHOST,
- #endif MULT_OUTPUT_FILES
- "comment", C_COMMENT,
- "hostname", C_HOSTNAME,
- "derfil", C_DERFIL,
- "context", C_CONTEXT,
- "domains", C_DOMAIN,
- "level", C_LEVEL,
- 0, 0,
- };
-
- /* defines for output types */
- # define YORK 1
- # define X25HOSTS 2
- # define MMDF 3
- # define TEXT 4
- # define SMAIL 5
- # define VMS5 6
- # define SENDMAIL 7
- # define YORK21 8
- # define DBM1 9
- # define PRIME 10
- # define EDTEXT 11
- # define VME 12
- # define VMS4 13
- # define PP 14
-
- /* Define the current type */
- # define M_YORK (1 << YORK)
- # define M_X25HOSTS (1 << X25HOSTS)
- # define M_MMDF (1 << MMDF)
- # define M_TEXT (1 << TEXT)
- # define M_SMAIL (1 << SMAIL)
- # define M_VMS5 (1 << VMS5)
- # define M_SENDMAIL (1 << SENDMAIL)
- # define M_YORK21 (1 << YORK21)
- # define M_DBM1 (1 << DBM1)
- # define M_PRIME (1 << PRIME)
- # define M_EDTEXT (1 << EDTEXT)
- # define M_VME (1 << VME)
- # define M_VMS4 (1 << VMS4)
- # define M_PP (1 << PP)
-
- Lookup outputs[] = { /* config to internal map */
- "york", YORK,
- "x25hosts", X25HOSTS,
- "mmdf", MMDF,
- "text", TEXT,
- "smail", SMAIL,
- "vms", VMS5,
- "sendmail", SENDMAIL,
- "york2.1", YORK21,
- "dbm1", DBM1,
- "york2.2", YORK,
- "ucl", DBM1,
- "prime", PRIME,
- "edtext", EDTEXT,
- "vme", VME,
- "vms5", VMS5,
- "vms4", VMS4,
- "pp", PP,
- 0, 0,
- };
-
- # define G_PSS 1
- # define G_JANET 2
-
- Lookup gateways[] = {
- "janet", G_JANET,
- "pss", G_PSS,
- 0, 0,
- };
-
- Lookup outputkeys[] = { /* table of keys for output strings */
- "long", LONG,
- "standard", LONG,
- "short", SHORT,
- "abbreviated", SHORT,
- "forward", FORWARD,
- "reverse", REVERSE,
- "mixed", MIXED,
- "lower", LOWER,
- "ignorerelay", IGNORERELAY,
- 0, 0,
- };
-
- int format_mask;
-
- static_f int split();
- static_f void doconfig();
- static_f void enablefile();
- static_f void enablecontext();
- static_f void setoutput();
- static_f void file_dmn();
- static_f void file_chan();
- static_f void setgateway();
- static_f void config_check();
-
- void
- config(av, n) /* process cfile and extract config info */
- char **av;
- int n;
- {
- register char *cp1, *cp2;
- FILE *fp;
- char buffer[BUFSIZ];
- int i;
-
- if((fp = fopen(*av, "r")) != NULL)
- {
- while(fgets(buffer, sizeof buffer, fp) != NULL)
- doconfig(buffer);
- VOID fclose(fp); /* we're desparately short on fd's */
- av ++; n --;
- }
- for( i = 0; i < n; i++)
- {
- cp2 = *av;
- while(*cp2)
- {
- for( cp1 = buffer; *cp2 && *cp2 != '\n'; cp2++)
- *cp1 ++ = *cp2;
- if( *cp2 == '\n')
- cp2 ++;
- *cp1 = '\0';
- doconfig(buffer);
- }
- av ++;
- }
- config_check();
- }
-
- static_f void
- doconfig(line)
- char *line;
- {
- char *argv[100], **av;
- int argc;
- int getout;
-
- if( line[0] == '\n' || line[0] == '#' || line[0] == '\0')
- return;
- argc = split(line, argv, sizeof argv / sizeof argv[0]);
- av = argv;
- switch( slookup(*av, conftab) )
- {
- case C_FILE: /* an atomic file */
- enablefile(++av, argc-1);
- usederfil = 0;
- break;
- case C_CONTEXT: /* a required context */
- enablecontext(++av, argc-1);
- usederfil = 1;
- break;
- case C_OUTPUT: /* output format */
- getout = 0;
- for (; !getout && argc > 1; argc--)
- switch (slookup(*++av, outputkeys))
- {
- case LONG: longshort = LONG; break;
- case SHORT: longshort = SHORT; break;
- case REVERSE: forwrev = REVERSE; break;
- case FORWARD: forwrev = FORWARD; break;
- case MIXED: mixlow = MIXED; break;
- case LOWER: mixlow = LOWER; break;
- case IGNORERELAY: ignore_relay++; break;
-
- default: argc++; getout=1; break;
- }
- if (argc > 1) setoutput(av, argc-1);
- break;
- case C_VERBOSE: /* set verbose */
- if( argc > 1 )
- verbose = atoi(*++av);
- else verbose = 1;
- break;
- case C_LEVEL: /* set verbose */
- if( argc > 1 )
- max_warns = atoi(*++av);
- else max_warns = 1;
- break;
- case C_M2: /* module 2 file name */
- if( M2file )
- free(M2file);
- M2file = getfpath(*++av);
- usederfil = 0;
- break;
- case C_M3:
- if( M3file )
- free(M3file);
- M3file = getfpath(*++av);
- usederfil = 0;
- break;
- case C_M4: /* module 4 file name */
- if( M4file )
- free(M4file);
- M4file = getfpath(*++av);
- usederfil = 0;
- break;
- case C_DOMAIN: /* domains file name */
- if( DOMfile )
- free(DOMfile);
- /* hmmm may be a real file name or missing ... */
- DOMfile = getfpath((argc > 1) ? *++av : "/junk-domain");
- break;
- case C_DERFIL: /* derived file name */
- if( Derfile )
- free(Derfile);
- Derfile = getfpath(*++av);
- usederfil = 1;
- break;
- # ifdef MULT_OUTPUT_FILES
- case C_FILEDMN: /* info on domains */
- file_dmn(++av, argc - 1);
- break;
- case C_FILECHAN: /* info on chans */
- file_chan(++av, argc - 1);
- break;
-
- case C_RELAYHOST:
- if( argc < 2)
- warn0(1, "No relay host given");
- else
- {
- if( relay_host )
- free( relay_host);
- relay_host = strdup(*++av);
- }
- break;
- # endif MULT_OUTPUT_FILES
- case C_GATEWAY:
- setgateway(++av, argc -1);
- break;
- case C_DIRECTORY:
- if( argc < 2)
- warn0(1, "directory needs an argument");
- else
- {
- if( directory )
- free( directory);
- directory = strdup(*++av);
- }
- break;
-
- case C_HOSTNAME:
- if( argc < 2)
- warn0(1, "No hostname value given");
- else
- {
- if( hostname)
- free(hostname);
- hostname = strdup(*++av);
- }
- break;
-
- case C_COMMENT:
- if( argc < 2)
- warn0(1, "No comment file");
- else
- {
- if( commentfile)
- free(commentfile);
- commentfile = strdup(*++av);
- }
- break;
- default:
- warn1(1, "Unknown option %s", *av);
- break;
- }
- }
-
- static_f void
- enablefile(av, n) /* set up file name and context/network info */
- char **av;
- int n;
- {
- Table *tp;
-
- if( n < 3)
- {
- warn1(1, "file %s - line badly formed", *av);
- return;
- }
- /* find next empty slot ... */
- for( tp = tablist; tp->T_name != NULL; tp++)
- ;
- if( tp - tablist > MAXTABLES)
- fatal1("Too many files on %s", *av);
- tp->T_name = getfpath(*av); /* ... and store it */
- if((tp->T_context = slookup(*++av, contexts)) == -1)
- fatal1("context %s not found", *av);
- if((tp->T_network = slookup(*++av, netnames)) == -1)
- fatal1("network %s not found", *av);
- if (n > 3)
- { if((tp->T_direction = slookup(*++av, directions)) == -1)
- fatal1("direction %s not found", *av);
- }
- else tp->T_direction = DIR_FORWARDS;
- }
-
- static_f void
- enablecontext(av, n) /* set up context/network info */
- char **av;
- int n;
- {
- Table *tp;
-
- if( n < 2)
- {
- warn1(1, "context %s - line badly formed", *av);
- return;
- }
- /* find next empty slot ... */
- for( tp = tablist; tp->T_name != NULL; tp++)
- ;
- if( tp - tablist > MAXTABLES)
- fatal0("Too many files");
- tp->T_name = ""; /* ... and store it */
- if((tp->T_context = slookup(*av, contexts)) == -1)
- fatal1("context %s not found", *av);
- if((tp->T_network = slookup(*++av, netnames)) == -1)
- fatal1("network %s not found", *av);
- if (n > 2)
- { if((tp->T_direction = slookup(*++av, directions)) == -1)
- fatal1("direction %s not found", *av);
- }
- else tp->T_direction = DIR_FORWARDS;
- }
-
- static_f void
- setoutput(av, n) /* how do we want to see the results? */
- char **av;
- int n;
- {
- switch(slookup(*av, outputs))
- {
- # ifdef F_YORK
- case YORK:
- format_mask = M_YORK;
- outputformat = yorkformat;
- break;
- # endif F_YORK
- # ifdef F_SMAIL
- case SMAIL:
- format_mask = M_SMAIL;
- outputformat = smailformat;
- break;
- # endif F_SMAIL
- # ifdef F_X25HOSTS
- case X25HOSTS:
- format_mask = M_X25HOSTS;
- outputformat = x25hostsformat;
- if( --n > 0)
- {
- if( stripoff)
- free(stripoff);
- stripoff = strdup(*++av);
- }
- break;
- # endif F_X25HOSTS
- # ifdef F_MMDF
- case MMDF:
- format_mask = M_MMDF;
- outputformat = mmdfformat;
- outputdomain = mmdfdomain;
- break;
- # endif F_MMDF
- # ifdef F_TEXT
- case TEXT:
- format_mask = M_TEXT;
- outputformat = textformat;
- /* Default to mixed case ! */
- if (mixlow == UNSET) mixlow = MIXED;
- break;
- # endif F_TEXT
- # ifdef F_VMS5
- case VMS5:
- format_mask = M_VMS5;
- outputm4rec = vms5m4rec;
- /* Default to mixed case ! */
- if (mixlow == UNSET) mixlow = MIXED;
- break;
- # endif F_VMS5
- # ifdef F_VMS4
- case VMS4:
- format_mask = M_VMS4;
- outputm4rec = vms4m4rec;
- /* Default to mixed case ! */
- if (mixlow == UNSET) mixlow = MIXED;
- break;
- # endif F_VMS4
- # ifdef F_SENDMAIL
- case SENDMAIL:
- format_mask = M_SENDMAIL;
- outputformat = sendmailformat;
- outputdomain = sendmaildomain; break;
- # endif F_SENDMAIL
- # ifdef F_YORK21
- case YORK21:
- format_mask = M_YORK21;
- outputm4rec = york21m4rec;
- if( --n > 0)
- {
- if( stripoff )
- free(stripoff);
- stripoff = strdup(*++av);
- }
- break;
- # endif F_YORK21
- # ifdef F_DBM1
- case DBM1:
- format_mask = M_DBM1;
- outputm4rec = dbm1m4rec;
- outputformat = dbm1format;
- outputdomain = dbm1domain;
- break;
- # endif F_DBM1
- # ifdef F_PRIME
- case PRIME:
- format_mask = M_PRIME;
- outputformat = primeformat;
- outputdomain = primedomain;
- break;
- # endif F_PRIME
- # ifdef F_EDTEXT
- case EDTEXT:
- format_mask = M_EDTEXT;
- outputm4rec = edtextm4rec;
- outputdomain = edtextdomain;
- if (mixlow == UNSET) mixlow = MIXED;
- if (options & O_ED_MASK)
- { warn0(1, "Old type being ignored");
- options &= ~O_ED_MASK;
- }
- while ( --n > 0)
- {
- if (!strcmp("simple", *++av))
- options |= O_ED_SIMPLE;
- else if (!strcmp("short", *av))
- options |= O_ED_SHORT;
- else if (!strcmp("long", *av))
- options |= O_ED_LONG;
- else if (!strcmp("standard", *av))
- options |= O_ED_LONG;
- else
- warn1(1, "Expecting edtext option \"simple\", \"short\" or \"long\", but found \"%s\"", *av);
- }
- if (!(options & O_ED_MASK)) options = O_ED_DEFAULT;
- if ((options & O_ED_SIMPLE) &&
- (options & (O_ED_SHORT | O_ED_LONG)))
- { warn0(1, "\"simple\" is mutually exclusive to \"short\" and \"long\" -- simple ignored");
- options &= ~O_ED_SIMPLE;
- }
-
- break;
- # endif F_EDTEXT
-
- # ifdef F_VME
- case VME:
- format_mask = M_VME;
- outputm4rec = vmem4rec;
- outputdomain = vmedomain;
- break;
- # endif F_VME
-
- # ifdef F_PP
- case PP:
- format_mask = M_PP;
- outputm4rec = ppm4rec;
- /* outputformat = ppformat; */
- outputdomain = ppdomain;
- break;
- # endif F_PP
- default:
- warn1(1, "%s not recognised", *av);
- break;
- }
-
- }
-
- static_f int
- split(buffer, argv, nargs) /* split up into argv vector (inplace) */
- char *buffer;
- char **argv;
- int nargs;
- {
- register char *src;
- register int ind = 0;
-
- for(argv[ind++] = src = buffer; *src && ind < nargs; src ++)
- {
- if( isspace(*src) )
- {
- *src++ = '\0';
- while( isspace(*src))
- src++;
- if( *src && *src != '#')
- argv[ind++] = src;
- else break;
- }
- }
- return ind;
- }
-
- # ifdef MULT_OUTPUT_FILES
-
- /*
- * Line is of the format
- *
- * filename abbreviated standard [local|?]
- */
- static_f void
- file_dmn(av, n) /* set up domain->file mapping etc. */
- char **av;
- int n;
- {
- File_list *filep;
-
- if( n < 1 )
- {
- fatal0("botch on multiple domain files, no arguments");
- return;
- }
- for(filep = fil_list; filep->fname != 0; filep++)
- ;
- if( filep - fil_list > MAXDOMAINS)
- fatal1("too many channels/domains at %s !", *av);
- filep->fname = strdup(*av);
- n --; av++;
- if( n < 1)
- filep->dname = "";
- else filep->dname = strdup(*av);
- n --; av++;
- if( n < 1)
- filep->ldname = filep->dname;
- else filep->ldname = strdup(*av);
- filep->net = 0;
- n --; av ++;
- if( n < 1 || ! lexequ("local", *av, 5) )
- filep->flags &= ~LOCAL;
- else filep->flags |= LOCAL;
- }
-
- /*
- * Line is of the format
- *
- * filename network to.be.stripped
- */
- static_f void
- file_chan(av, n)
- char **av;
- int n;
- {
- File_list *filep;
-
- if( n < 2 )
- {
- fatal0("botch on multiple channel file, no arguments");
- return;
- }
- for(filep = fil_list; filep->fname != 0; filep++)
- ;
- if( filep - fil_list > MAXDOMAINS)
- fatal1("too many channels/domains at %s !", *av);
- filep->fname = strdup(*av);
- filep->dname = filep->ldname = "";
- n --; av++;
- if( (filep->net = slookup(*av, netnames)) == -1)
- fatal1("Unknown network %s", *av);
- n --; av++;
- if ( n > 0)
- filep->dname = strdup(*av);
- }
- # endif MULT_OUTPUT_FILES
- void
- static_f setgateway(av, n)
- char **av;
- int n;
- {
- if( n < 2)
- {
- warn1(1, "Ill formed gateway config %s", *av);
- return;
- }
-
- switch(slookup(*av, gateways))
- {
- case G_PSS:
- if( pssgateway )
- free(pssgateway);
- pssgateway = strdup(*++av);
- break;
- case G_JANET:
- if( janetgateway )
- free(janetgateway);
- janetgateway = strdup(*++av);
- break;
- default:
- warn1(1, "Unknown gateway %s", *av);
- break;
- }
- }
-
- static_f void
- config_check()
- {
- if ((longshort == LONG || longshort == SHORT) && format_mask &
- (M_YORK|M_X25HOSTS|M_SMAIL|M_VMS4|M_VMS5|M_YORK21|M_PRIME|M_EDTEXT|M_VME))
- warn0(1, "long/short should not be set");
- if ((forwrev == REVERSE || forwrev == FORWARD) && format_mask &
- (M_X25HOSTS|M_MMDF|M_SENDMAIL|M_VMS4|M_VMS5|M_EDTEXT))
- warn0(1, "forward/reverse should not be set");
- if ((mixlow == MIXED || mixlow == LOWER) && format_mask &
- (M_PRIME|M_YORK|M_X25HOSTS|M_MMDF|M_SMAIL|M_YORK21|M_DBM1|M_VME))
- warn0(1, "mixed/lower should not be set");
- if ((ignore_relay) && format_mask &
- (M_YORK|M_X25HOSTS|M_MMDF|M_TEXT|M_SMAIL|M_SENDMAIL|M_YORK21|M_DBM1|M_PRIME|M_EDTEXT|M_VME))
- warn0(1, "ignore_relay should not be set");
- if ((DOMfile) && format_mask &
- (M_YORK|M_X25HOSTS|M_TEXT|M_SMAIL|M_VMS4|M_VMS5|M_YORK21|M_PRIME))
- warn0(1, "domain file should not be set");
- #ifdef MULT_OUTPUT_FILES
- if ((relay_host) && format_mask &
- (M_YORK|M_X25HOSTS|M_TEXT|M_SMAIL|M_SENDMAIL|M_VMS4|M_VMS5|M_YORK21|M_DBM1|M_PRIME|M_EDTEXT|M_VME))
- warn0(1, "relay host should not be set");
- #endif MULT_OUTPUT_FILES
- if (hostname && format_mask &
- (M_TEXT|M_SMAIL|M_SENDMAIL|M_DBM1|M_PRIME))
- warn0(1, "hostname should not be set");
- if (commentfile && format_mask &
- (M_TEXT|M_SMAIL|M_SENDMAIL|M_DBM1|M_PRIME))
- warn0(1, "commentfile should not be set");
- #ifdef MULT_OUTPUT_FILES
- if ((fil_list[0].fname) && format_mask &
- (M_YORK|M_X25HOSTS|M_TEXT|M_SMAIL|M_VMS4|M_VMS5|M_YORK21|M_DBM1|M_PRIME|M_EDTEXT|M_VME))
- warn0(1, "domain/channel file should not be set");
- #endif MULT_OUTPUT_FILES
- if ((pssgateway || janetgateway) && format_mask &
- (M_X25HOSTS|M_MMDF|M_SENDMAIL|M_TEXT|M_VMS4|M_VMS5|M_DBM1|M_PRIME|M_EDTEXT|M_VME))
- warn0(1, "pss/janet gateway should not be set");
- if (format_mask &
- (M_PRIME|M_VME))
- mixlow = MIXED;
- }
-