Annotation of coherent/g/usr/lib/uucp/tay104/uuconf/hinit.c, revision 1.1

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: }

unix.superglobalmegacorp.com

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