|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.