Annotation of coherent/g/usr/lib/uucp/tay104/uuconf/tinit.c, revision 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.