Annotation of coherent/g/usr/lib/uucp/tay104/uuconf/tinit.c, revision 1.1.1.1

1.1       root        1: /* tinit.c
                      2:    Initialize for reading Taylor UUCP configuration files.
                      3: 
                      4:    Copyright (C) 1992 Ian Lance Taylor
                      5: 
                      6:    This file is part of the Taylor UUCP uuconf library.
                      7: 
                      8:    This library is free software; you can redistribute it and/or
                      9:    modify it under the terms of the GNU Library General Public License
                     10:    as published by the Free Software Foundation; either version 2 of
                     11:    the License, or (at your option) any later version.
                     12: 
                     13:    This library is distributed in the hope that it will be useful, but
                     14:    WITHOUT ANY WARRANTY; without even the implied warranty of
                     15:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     16:    Library General Public License for more details.
                     17: 
                     18:    You should have received a copy of the GNU Library General Public
                     19:    License along with this library; if not, write to the Free Software
                     20:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     21: 
                     22:    The author of the program may be contacted at [email protected] or
                     23:    c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
                     24:    */
                     25: 
                     26: #include "uucnfi.h"
                     27: 
                     28: #if USE_RCS_ID
                     29: const char _uuconf_tinit_rcsid[] = "$Id: tinit.c,v 1.1 93/07/30 08:08:00 bin Exp Locker: bin $";
                     30: #endif
                     31: 
                     32: #include <errno.h>
                     33: 
                     34: /* Local functions.  */
                     35: 
                     36: static int itset_default P((struct sglobal *qglobal, char ***ppzvar,
                     37:                            const char *zfile));
                     38: static int itadd P((pointer pglobal, int argc, char **argv, pointer pvar,
                     39:                    pointer pinfo));
                     40: static int itunknown P((pointer pglobal, int argc, char **argv, pointer pvar,
                     41:                        pointer pinfo));
                     42: static int itprogram P((pointer pglobal, int argc, char **argv, pointer pvar,
                     43:                        pointer pinfo));
                     44: 
                     45: static const struct cmdtab_offset asCmds[] =
                     46: {
                     47:   { "nodename", UUCONF_CMDTABTYPE_STRING,
                     48:       offsetof (struct sprocess, zlocalname), NULL },
                     49:   { "hostname", UUCONF_CMDTABTYPE_STRING,
                     50:       offsetof (struct sprocess, zlocalname), NULL },
                     51:   { "uuname", UUCONF_CMDTABTYPE_STRING,
                     52:       offsetof (struct sprocess, zlocalname), NULL },
                     53:   { "spool", UUCONF_CMDTABTYPE_STRING,
                     54:       offsetof (struct sprocess, zspooldir), NULL },
                     55:   { "pubdir", UUCONF_CMDTABTYPE_STRING,
                     56:       offsetof (struct sprocess, zpubdir), NULL },
                     57:   { "lockdir", UUCONF_CMDTABTYPE_STRING,
                     58:       offsetof (struct sprocess, zlockdir), NULL },
                     59:   { "logfile", UUCONF_CMDTABTYPE_STRING,
                     60:       offsetof (struct sprocess, zlogfile), NULL },
                     61:   { "statfile", UUCONF_CMDTABTYPE_STRING,
                     62:       offsetof (struct sprocess, zstatsfile), NULL },
                     63:   { "debugfile", UUCONF_CMDTABTYPE_STRING,
                     64:       offsetof (struct sprocess, zdebugfile), NULL },
                     65:   { "debug", UUCONF_CMDTABTYPE_STRING,
                     66:       offsetof (struct sprocess, zdebug), NULL },
                     67:   { "max-uuxqts", UUCONF_CMDTABTYPE_INT,
                     68:       offsetof (struct sprocess, cmaxuuxqts), NULL },
                     69:   { "sysfile", UUCONF_CMDTABTYPE_FN | 0,
                     70:       offsetof (struct sprocess, pzsysfiles), itadd },
                     71:   { "portfile", UUCONF_CMDTABTYPE_FN | 0,
                     72:       offsetof (struct sprocess, pzportfiles), itadd },
                     73:   { "dialfile", UUCONF_CMDTABTYPE_FN | 0,
                     74:       offsetof (struct sprocess, pzdialfiles), itadd },
                     75:   { "dialcodefile", UUCONF_CMDTABTYPE_FN | 0,
                     76:       offsetof (struct sprocess, pzdialcodefiles), itadd },
                     77:   { "callfile", UUCONF_CMDTABTYPE_FN | 0,
                     78:       offsetof (struct sprocess, pzcallfiles), itadd },
                     79:   { "passwdfile", UUCONF_CMDTABTYPE_FN | 0,
                     80:       offsetof (struct sprocess, pzpwdfiles), itadd },
                     81:   { "unknown", UUCONF_CMDTABTYPE_FN, offsetof (struct sprocess, qunknown),
                     82:       itunknown },
                     83:   { "v2-files", UUCONF_CMDTABTYPE_BOOLEAN,
                     84:       offsetof (struct sprocess, fv2), NULL },
                     85:   { "hdb-files", UUCONF_CMDTABTYPE_BOOLEAN,
                     86:       offsetof (struct sprocess, fhdb), NULL },
                     87:   { "bnu-files", UUCONF_CMDTABTYPE_BOOLEAN,
                     88:       offsetof (struct sprocess, fhdb), NULL },
                     89:   { "timetable", UUCONF_CMDTABTYPE_FN | 3,
                     90:       offsetof (struct sprocess, pztimetables), _uuconf_itimetable },
                     91:   { NULL, 0, 0, NULL }
                     92: };
                     93: 
                     94: #define CCMDS (sizeof asCmds / sizeof asCmds[0])
                     95: 
                     96: /* This structure is used to pass information into the command table
                     97:    functions.  */
                     98: 
                     99: struct sinfo
                    100: {
                    101:   /* The program name.  */
                    102:   const char *zname;
                    103:   /* A pointer to the command table being used, passed to isystem so
                    104:      it can call uuconf_cmd_args.  */
                    105:   struct uuconf_cmdtab *qcmds;
                    106: };
                    107: 
                    108: /* Initialize the routines which read the Taylor UUCP configuration
                    109:    files.  */
                    110: 
                    111: int
                    112: uuconf_taylor_init (ppglobal, zprogram, zname)
                    113:      pointer *ppglobal;
                    114:      const char *zprogram;
                    115:      const char *zname;
                    116: {
                    117:   struct sglobal **pqglobal = (struct sglobal **) ppglobal;
                    118:   int iret;
                    119:   char *zcopy;
                    120:   struct sglobal *qglobal;
                    121:   boolean fdefault;
                    122:   FILE *e;
                    123:   struct sinfo si;
                    124: 
                    125:   if (*pqglobal == NULL)
                    126:     {
                    127:       iret = _uuconf_iinit_global (pqglobal);
                    128:       if (iret != UUCONF_SUCCESS)
                    129:        return iret;
                    130:     }
                    131: 
                    132:   qglobal = *pqglobal;
                    133: 
                    134:   if (zname != NULL)
                    135:     {
                    136:       size_t csize;
                    137: 
                    138:       csize = strlen (zname) + 1;
                    139:       zcopy = uuconf_malloc (qglobal->pblock, csize);
                    140:       if (zcopy == NULL)
                    141:        {
                    142:          qglobal->ierrno = errno;
                    143:          return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
                    144:        }
                    145:       memcpy ((pointer) zcopy, (pointer) zname, csize);
                    146:       fdefault = FALSE;
                    147:     }
                    148:   else
                    149:     {
                    150:       zcopy = uuconf_malloc (qglobal->pblock,
                    151:                             sizeof NEWCONFIGLIB + sizeof CONFIGFILE - 1);
                    152:       if (zcopy == NULL)
                    153:        {
                    154:          qglobal->ierrno = errno;
                    155:          return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
                    156:        }
                    157:       memcpy ((pointer) zcopy, (pointer) NEWCONFIGLIB,
                    158:              sizeof NEWCONFIGLIB - 1);
                    159:       memcpy ((pointer) (zcopy + sizeof NEWCONFIGLIB - 1),
                    160:              (pointer) CONFIGFILE, sizeof CONFIGFILE);
                    161:       fdefault = TRUE;
                    162:     }
                    163: 
                    164:   qglobal->qprocess->zconfigfile = zcopy;
                    165: 
                    166:   e = fopen (zcopy, "r");
                    167:   if (e == NULL)
                    168:     {
                    169:       if (! fdefault)
                    170:        {
                    171:          qglobal->ierrno = errno;
                    172:          qglobal->zfilename = zcopy;
                    173:          return (UUCONF_FOPEN_FAILED
                    174:                  | UUCONF_ERROR_ERRNO
                    175:                  | UUCONF_ERROR_FILENAME);
                    176:        }
                    177: 
                    178:       /* There is no config file, so just use the default values.  */
                    179:     }
                    180:   else
                    181:     {
                    182:       struct uuconf_cmdtab as[CCMDS];
                    183: 
                    184:       _uuconf_ucmdtab_base (asCmds, CCMDS, (char *) qglobal->qprocess,
                    185:                            as);
                    186: 
                    187:       if (zprogram == NULL)
                    188:        zprogram = "uucp";
                    189: 
                    190:       si.zname = zprogram;
                    191:       si.qcmds = as;
                    192:       iret = uuconf_cmd_file (qglobal, e, as, (pointer) &si, itprogram,
                    193:                              UUCONF_CMDTABFLAG_BACKSLASH,
                    194:                              qglobal->pblock);
                    195: 
                    196:       (void) fclose (e);
                    197: 
                    198:       if (iret != UUCONF_SUCCESS)
                    199:        {
                    200:          qglobal->zfilename = zcopy;
                    201:          return iret | UUCONF_ERROR_FILENAME;
                    202:        }
                    203:     }
                    204: 
                    205:   /* Get the defaults for the file names.  */
                    206: 
                    207:   iret = itset_default (qglobal, &qglobal->qprocess->pzsysfiles, SYSFILE);
                    208:   if (iret != UUCONF_SUCCESS)
                    209:     return iret;
                    210:   iret = itset_default (qglobal, &qglobal->qprocess->pzportfiles, PORTFILE);
                    211:   if (iret != UUCONF_SUCCESS)
                    212:     return iret;
                    213:   iret = itset_default (qglobal, &qglobal->qprocess->pzdialfiles, DIALFILE);
                    214:   if (iret != UUCONF_SUCCESS)
                    215:     return iret;
                    216:   iret = itset_default (qglobal, &qglobal->qprocess->pzdialcodefiles,
                    217:                        DIALCODEFILE);
                    218:   if (iret != UUCONF_SUCCESS)
                    219:     return iret;
                    220:   iret = itset_default (qglobal, &qglobal->qprocess->pzpwdfiles, PASSWDFILE);
                    221:   if (iret != UUCONF_SUCCESS)
                    222:     return iret;
                    223:   iret = itset_default (qglobal, &qglobal->qprocess->pzcallfiles, CALLFILE);
                    224:   if (iret != UUCONF_SUCCESS)
                    225:     return iret;
                    226: 
                    227:   return UUCONF_SUCCESS;
                    228: }
                    229: 
                    230: /* Add new strings to a variable.  */
                    231: 
                    232: /*ARGSUSED*/
                    233: static int
                    234: itadd (pglobal, argc, argv, pvar, pinfo)
                    235:      pointer pglobal;
                    236:      int argc;
                    237:      char **argv;
                    238:      pointer pvar;
                    239:      pointer pinfo;
                    240: {
                    241:   struct sglobal *qglobal = (struct sglobal *) pglobal;
                    242:   char ***ppz = (char ***) pvar;
                    243:   int i;
                    244:   int iret;
                    245: 
                    246:   if (argc == 1)
                    247:     {
                    248:       iret = _uuconf_iadd_string (qglobal, NULL, FALSE, FALSE, ppz,
                    249:                                  qglobal->pblock);
                    250:       if (iret != UUCONF_SUCCESS)
                    251:        return iret;
                    252:     }
                    253:   else
                    254:     {
                    255:       for (i = 1; i < argc; i++)
                    256:        {
                    257:          iret = _uuconf_iadd_string (qglobal, argv[i], TRUE, FALSE, ppz,
                    258:                                      qglobal->pblock);
                    259:          if (iret != UUCONF_SUCCESS)
                    260:            return iret;
                    261:        }
                    262:     }
                    263: 
                    264:   return UUCONF_CMDTABRET_CONTINUE;
                    265: }
                    266: 
                    267: /* Handle an "unknown" command.  We accumulate this into a linked
                    268:    list, and only parse them later in uuconf_unknown_system_info.  */
                    269: 
                    270: /*ARGSUSED*/
                    271: static int
                    272: itunknown (pglobal, argc, argv, pvar, pinfo)
                    273:      pointer pglobal;
                    274:      int argc;
                    275:      char **argv;
                    276:      pointer pvar;
                    277:      pointer pinfo;
                    278: {
                    279:   struct sglobal *qglobal = (struct sglobal *) pglobal;
                    280:   struct sunknown **pq = (struct sunknown **) pvar;
                    281:   struct sunknown *q;
                    282: 
                    283:   q = (struct sunknown *) uuconf_malloc (qglobal->pblock,
                    284:                                         sizeof (struct sunknown));
                    285:   if (q == NULL)
                    286:     {
                    287:       qglobal->ierrno = errno;
                    288:       return (UUCONF_MALLOC_FAILED
                    289:              | UUCONF_ERROR_ERRNO
                    290:              | UUCONF_CMDTABRET_EXIT);
                    291:     }
                    292:   q->qnext = NULL;
                    293:   q->ilineno = qglobal->ilineno;
                    294:   q->cargs = argc - 1;
                    295:   q->pzargs = (char **) uuconf_malloc (qglobal->pblock,
                    296:                                       (argc - 1) * sizeof (char *));
                    297:   if (q->pzargs == NULL)
                    298:     {
                    299:       qglobal->ierrno = errno;
                    300:       return (UUCONF_MALLOC_FAILED
                    301:              | UUCONF_ERROR_ERRNO
                    302:              | UUCONF_CMDTABRET_EXIT);
                    303:     }
                    304:   memcpy ((pointer) q->pzargs, (pointer) (argv + 1),
                    305:          (argc - 1) * sizeof (char *));
                    306: 
                    307:   while (*pq != NULL)
                    308:     pq = &(*pq)->qnext;
                    309: 
                    310:   *pq = q;
                    311: 
                    312:   return UUCONF_CMDTABRET_KEEP;
                    313: }
                    314: 
                    315: /* If we encounter an unknown command, see if it is the program with
                    316:    which we were invoked.  If it was, pass the remaining arguments
                    317:    back through the table.  */
                    318: 
                    319: /*ARGSUSED*/
                    320: static int
                    321: itprogram (pglobal, argc, argv, pvar, pinfo)
                    322:      pointer pglobal;
                    323:      int argc;
                    324:      char **argv;
                    325:      pointer pvar;
                    326:      pointer pinfo;
                    327: {
                    328:   struct sglobal *qglobal = (struct sglobal *) pglobal;
                    329:   struct sinfo *qinfo = (struct sinfo *) pinfo;
                    330: 
                    331:   if (argc <= 1
                    332:       || strcasecmp (qinfo->zname, argv[0]) != 0)
                    333:     return UUCONF_CMDTABRET_CONTINUE;
                    334: 
                    335:   return uuconf_cmd_args (pglobal, argc - 1, argv + 1, qinfo->qcmds,
                    336:                          (pointer) NULL, (uuconf_cmdtabfn) NULL, 0,
                    337:                          qglobal->pblock);
                    338: }
                    339: 
                    340: /* If a filename was not set by the configuration file, add in the
                    341:    default value.  */
                    342: 
                    343: static int
                    344: itset_default (qglobal, ppzvar, zfile)
                    345:      struct sglobal *qglobal;
                    346:      char ***ppzvar;
                    347:      const char *zfile;
                    348: {
                    349:   size_t clen;
                    350:   char *zadd;
                    351: 
                    352:   if (*ppzvar != NULL)
                    353:     return UUCONF_SUCCESS;
                    354: 
                    355:   clen = strlen (zfile);
                    356:   zadd = (char *) uuconf_malloc (qglobal->pblock,
                    357:                                 sizeof NEWCONFIGLIB + clen);
                    358:   if (zadd == NULL)
                    359:     {
                    360:       qglobal->ierrno = errno;
                    361:       return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
                    362:     }
                    363: 
                    364:   memcpy ((pointer) zadd, (pointer) NEWCONFIGLIB, sizeof NEWCONFIGLIB - 1);
                    365:   memcpy ((pointer) (zadd + sizeof NEWCONFIGLIB - 1), (pointer) zfile,
                    366:          clen + 1);
                    367: 
                    368:   return _uuconf_iadd_string (qglobal, zadd, FALSE, FALSE, ppzvar,
                    369:                              qglobal->pblock);
                    370: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.