|
|
1.1 ! root 1: /* hinit.c ! 2: Initialize for reading HDB 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_hinit_rcsid[] = "$Id: hinit.c,v 1.1 93/07/30 08:07:14 bin Exp Locker: bin $"; ! 30: #endif ! 31: ! 32: #include <errno.h> ! 33: #include <ctype.h> ! 34: ! 35: /* Avoid replicating OLDCONFIGLIB several times if not necessary. */ ! 36: static const char abHoldconfiglib[] = OLDCONFIGLIB; ! 37: ! 38: /* Initialize the routines which read HDB configuration files. */ ! 39: ! 40: int ! 41: uuconf_hdb_init (ppglobal, zprogram) ! 42: pointer *ppglobal; ! 43: const char *zprogram; ! 44: { ! 45: struct sglobal **pqglobal = (struct sglobal **) ppglobal; ! 46: int iret; ! 47: struct sglobal *qglobal; ! 48: pointer pblock; ! 49: char abdialcodes[sizeof OLDCONFIGLIB + sizeof HDB_DIALCODES - 1]; ! 50: char *zsys; ! 51: FILE *e; ! 52: ! 53: if (*pqglobal == NULL) ! 54: { ! 55: iret = _uuconf_iinit_global (pqglobal); ! 56: if (iret != UUCONF_SUCCESS) ! 57: return iret; ! 58: } ! 59: ! 60: qglobal = *pqglobal; ! 61: pblock = qglobal->pblock; ! 62: ! 63: if (zprogram == NULL ! 64: || strcmp (zprogram, "uucp") == 0) ! 65: zprogram = "uucico"; ! 66: ! 67: /* Add the Dialcodes file to the global list. */ ! 68: memcpy ((pointer) abdialcodes, (pointer) abHoldconfiglib, ! 69: sizeof OLDCONFIGLIB - 1); ! 70: memcpy ((pointer) (abdialcodes + sizeof OLDCONFIGLIB - 1), ! 71: (pointer) HDB_DIALCODES, sizeof HDB_DIALCODES); ! 72: iret = _uuconf_iadd_string (qglobal, abdialcodes, TRUE, FALSE, ! 73: &qglobal->qprocess->pzdialcodefiles, ! 74: pblock); ! 75: if (iret != UUCONF_SUCCESS) ! 76: return iret; ! 77: ! 78: /* Read the Sysfiles file. We allocate the name on the heap rather ! 79: than the stack so that we can return it in ! 80: qerr->uuconf_zfilename. */ ! 81: ! 82: zsys = uuconf_malloc (pblock, ! 83: sizeof OLDCONFIGLIB + sizeof HDB_SYSFILES - 1); ! 84: if (zsys == NULL) ! 85: { ! 86: qglobal->ierrno = errno; ! 87: return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 88: } ! 89: memcpy ((pointer) zsys, (pointer) abHoldconfiglib, sizeof OLDCONFIGLIB - 1); ! 90: memcpy ((pointer) (zsys + sizeof OLDCONFIGLIB - 1), (pointer) HDB_SYSFILES, ! 91: sizeof HDB_SYSFILES); ! 92: ! 93: iret = UUCONF_SUCCESS; ! 94: ! 95: e = fopen (zsys, "r"); ! 96: if (e == NULL) ! 97: uuconf_free (pblock, zsys); ! 98: else ! 99: { ! 100: char *zline; ! 101: size_t cline; ! 102: char **pzargs; ! 103: size_t cargs; ! 104: char **pzcolon; ! 105: size_t ccolon; ! 106: int cchars; ! 107: ! 108: zline = NULL; ! 109: cline = 0; ! 110: pzargs = NULL; ! 111: cargs = 0; ! 112: pzcolon = NULL; ! 113: ccolon = 0; ! 114: ! 115: qglobal->ilineno = 0; ! 116: ! 117: while (iret == UUCONF_SUCCESS ! 118: && (cchars = _uuconf_getline (qglobal, &zline, &cline, e)) > 0) ! 119: { ! 120: int ctypes, cnames; ! 121: int i; ! 122: ! 123: ++qglobal->ilineno; ! 124: ! 125: --cchars; ! 126: if (zline[cchars] == '\n') ! 127: zline[cchars] = '\0'; ! 128: if (isspace (BUCHAR (zline[0])) || zline[0] == '#') ! 129: continue; ! 130: ! 131: ctypes = _uuconf_istrsplit (zline, '\0', &pzargs, &cargs); ! 132: if (ctypes < 0) ! 133: { ! 134: qglobal->ierrno = errno; ! 135: iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 136: break; ! 137: } ! 138: ! 139: if (ctypes == 0) ! 140: continue; ! 141: ! 142: if (strncmp (pzargs[0], "service=", sizeof "service=" - 1) != 0) ! 143: { ! 144: iret = UUCONF_SYNTAX_ERROR; ! 145: break; ! 146: } ! 147: pzargs[0] += sizeof "service=" - 1; ! 148: ! 149: cnames = _uuconf_istrsplit (pzargs[0], ':', &pzcolon, &ccolon); ! 150: if (cnames < 0) ! 151: { ! 152: qglobal->ierrno = errno; ! 153: iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 154: break; ! 155: } ! 156: ! 157: for (i = 0; i < cnames; i++) ! 158: if (strcmp (zprogram, pzcolon[i]) == 0) ! 159: break; ! 160: ! 161: if (i >= cnames) ! 162: continue; ! 163: ! 164: for (i = 1; i < ctypes && iret == UUCONF_SUCCESS; i++) ! 165: { ! 166: char ***ppz; ! 167: int cfiles, ifile; ! 168: ! 169: if (strncmp (pzargs[i], "systems=", sizeof "systems=" - 1) ! 170: == 0) ! 171: { ! 172: ppz = &qglobal->qprocess->pzhdb_systems; ! 173: pzargs[i] += sizeof "systems=" - 1; ! 174: } ! 175: else if (strncmp (pzargs[i], "devices=", sizeof "devices=" - 1) ! 176: == 0) ! 177: { ! 178: ppz = &qglobal->qprocess->pzhdb_devices; ! 179: pzargs[i] += sizeof "devices=" - 1; ! 180: } ! 181: else if (strncmp (pzargs[i], "dialers=", sizeof "dialers=" - 1) ! 182: == 0) ! 183: { ! 184: ppz = &qglobal->qprocess->pzhdb_dialers; ! 185: pzargs[i] += sizeof "dialers=" - 1; ! 186: } ! 187: else ! 188: { ! 189: iret = UUCONF_SYNTAX_ERROR; ! 190: break; ! 191: } ! 192: ! 193: cfiles = _uuconf_istrsplit (pzargs[i], ':', &pzcolon, &ccolon); ! 194: if (cfiles < 0) ! 195: { ! 196: qglobal->ierrno = errno; ! 197: iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 198: break; ! 199: } ! 200: ! 201: for (ifile = 0; ! 202: ifile < cfiles && iret == UUCONF_SUCCESS; ! 203: ifile++) ! 204: { ! 205: /* Looking for a leading '/' is Unix dependent, and ! 206: should probably be changed. */ ! 207: if (pzcolon[ifile][0] == '/') ! 208: iret = _uuconf_iadd_string (qglobal, pzcolon[ifile], TRUE, ! 209: FALSE, ppz, pblock); ! 210: else ! 211: { ! 212: char *zdir; ! 213: size_t clen; ! 214: ! 215: clen = strlen (pzcolon[ifile]); ! 216: zdir = (char *) uuconf_malloc (pblock, ! 217: (sizeof OLDCONFIGLIB ! 218: + sizeof HDB_SEPARATOR ! 219: + clen ! 220: - 1)); ! 221: if (zdir == NULL) ! 222: { ! 223: qglobal->ierrno = errno; ! 224: iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO; ! 225: break; ! 226: } ! 227: memcpy ((pointer) zdir, (pointer) abHoldconfiglib, ! 228: sizeof OLDCONFIGLIB - 1); ! 229: memcpy ((pointer) (zdir + sizeof OLDCONFIGLIB - 1), ! 230: HDB_SEPARATOR, sizeof HDB_SEPARATOR - 1); ! 231: memcpy ((pointer) (zdir ! 232: + sizeof OLDCONFIGLIB - 1 ! 233: + sizeof HDB_SEPARATOR - 1), ! 234: (pointer) pzcolon[ifile], clen + 1); ! 235: iret = _uuconf_iadd_string (qglobal, zdir, FALSE, FALSE, ! 236: ppz, pblock); ! 237: } ! 238: } ! 239: } ! 240: } ! 241: ! 242: (void) fclose (e); ! 243: if (zline != NULL) ! 244: free ((pointer) zline); ! 245: if (pzargs != NULL) ! 246: free ((pointer) pzargs); ! 247: if (pzcolon != NULL) ! 248: free ((pointer) pzcolon); ! 249: ! 250: if (iret != UUCONF_SUCCESS) ! 251: { ! 252: qglobal->zfilename = zsys; ! 253: return iret | UUCONF_ERROR_FILENAME | UUCONF_ERROR_LINENO; ! 254: } ! 255: } ! 256: ! 257: if (qglobal->qprocess->pzhdb_systems == NULL) ! 258: { ! 259: char ab[sizeof OLDCONFIGLIB + sizeof HDB_SYSTEMS - 1]; ! 260: ! 261: memcpy ((pointer) ab, (pointer) abHoldconfiglib, ! 262: sizeof OLDCONFIGLIB - 1); ! 263: memcpy ((pointer) (ab + sizeof OLDCONFIGLIB - 1), ! 264: (pointer) HDB_SYSTEMS, sizeof HDB_SYSTEMS); ! 265: iret = _uuconf_iadd_string (qglobal, ab, TRUE, FALSE, ! 266: &qglobal->qprocess->pzhdb_systems, ! 267: pblock); ! 268: } ! 269: if (qglobal->qprocess->pzhdb_devices == NULL && iret == UUCONF_SUCCESS) ! 270: { ! 271: char ab[sizeof OLDCONFIGLIB + sizeof HDB_DEVICES - 1]; ! 272: ! 273: memcpy ((pointer) ab, (pointer) abHoldconfiglib, ! 274: sizeof OLDCONFIGLIB - 1); ! 275: memcpy ((pointer) (ab + sizeof OLDCONFIGLIB - 1), ! 276: (pointer) HDB_DEVICES, sizeof HDB_DEVICES); ! 277: iret = _uuconf_iadd_string (qglobal, ab, TRUE, FALSE, ! 278: &qglobal->qprocess->pzhdb_devices, ! 279: pblock); ! 280: } ! 281: if (qglobal->qprocess->pzhdb_dialers == NULL && iret == UUCONF_SUCCESS) ! 282: { ! 283: char ab[sizeof OLDCONFIGLIB + sizeof HDB_DIALERS - 1]; ! 284: ! 285: memcpy ((pointer) ab, (pointer) abHoldconfiglib, ! 286: sizeof OLDCONFIGLIB - 1); ! 287: memcpy ((pointer) (ab + sizeof OLDCONFIGLIB - 1), ! 288: (pointer) HDB_DIALERS, sizeof HDB_DIALERS); ! 289: iret = _uuconf_iadd_string (qglobal, ab, TRUE, FALSE, ! 290: &qglobal->qprocess->pzhdb_dialers, ! 291: pblock); ! 292: } ! 293: ! 294: return iret; ! 295: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.