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

1.1     ! root        1: /* rdlocs.c
        !             2:    Get the locations of systems in the 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_rdlocs_rcsid[] = "$Id: rdlocs.c,v 1.1 93/07/30 08:07:28 bin Exp Locker: bin $";
        !            30: #endif
        !            31: 
        !            32: #include <errno.h>
        !            33: 
        !            34: static int itsystem P((pointer pglobal, int argc, char **argv,
        !            35:                       pointer pvar, pointer pinfo));
        !            36: static int itcalled_login P((pointer pglobal, int argc, char **argv,
        !            37:                             pointer pvar, pointer pinfo));
        !            38: static int itmyname P((pointer pglobal, int argc, char **argv,
        !            39:                       pointer pvar, pointer pinfo));
        !            40: 
        !            41: /* This code scans through the Taylor UUCP system files in order to
        !            42:    locate each system and to gather the login restrictions (since this
        !            43:    information is held in additional arguments to the "called-login"
        !            44:    command, it can appear anywhere in the systems files).  It also
        !            45:    records whether any "myname" appears, as an optimization for
        !            46:    uuconf_taylor_localname.
        !            47: 
        !            48:    This table is used to dispatch the appropriate commands.  Most
        !            49:    commands are simply ignored.  Note that this is a uuconf_cmdtab,
        !            50:    not a cmdtab_offset.  */
        !            51: 
        !            52: static const struct uuconf_cmdtab asTcmds[] =
        !            53: {
        !            54:   { "system", UUCONF_CMDTABTYPE_FN | 2, NULL, itsystem },
        !            55:   { "alias", UUCONF_CMDTABTYPE_FN | 2, (pointer) asTcmds, itsystem },
        !            56:   { "called-login", UUCONF_CMDTABTYPE_FN | 0, NULL, itcalled_login },
        !            57:   { "myname", UUCONF_CMDTABTYPE_FN | 2, NULL, itmyname },
        !            58:   { NULL, 0, NULL, NULL }
        !            59: };
        !            60: 
        !            61: /* This structure is used to pass information into the command table
        !            62:    functions.  */
        !            63: 
        !            64: struct sinfo
        !            65: {
        !            66:   /* The sys file name.  */
        !            67:   const char *zname;
        !            68:   /* The open sys file.  */
        !            69:   FILE *e;
        !            70:   /* The list of locations we are building.  */
        !            71:   struct stsysloc *qlocs;
        !            72:   /* The list of validation restrictions we are building.  */
        !            73:   struct svalidate *qvals;
        !            74: };
        !            75: 
        !            76: /* Look through the sys files to find the location and names of all
        !            77:    the systems.  Since we're scanning the sys files, we also record
        !            78:    the validation information specified by the additional arguments to
        !            79:    the called-login command.  We don't use uuconf_cmd_file to avoid
        !            80:    the overhead of breaking the line up into arguments if not
        !            81:    necessary.  */
        !            82: 
        !            83: int
        !            84: _uuconf_iread_locations (qglobal)
        !            85:      struct sglobal *qglobal;
        !            86: {
        !            87:   char *zline;
        !            88:   size_t cline;
        !            89:   struct sinfo si;
        !            90:   int iret;
        !            91:   char **pz;
        !            92: 
        !            93:   if (qglobal->qprocess->fread_syslocs)
        !            94:     return UUCONF_SUCCESS;
        !            95: 
        !            96:   zline = NULL;
        !            97:   cline = 0;
        !            98: 
        !            99:   si.qlocs = NULL;
        !           100:   si.qvals = NULL;
        !           101: 
        !           102:   iret = UUCONF_SUCCESS;
        !           103: 
        !           104:   for (pz = qglobal->qprocess->pzsysfiles; *pz != NULL; pz++)
        !           105:     {
        !           106:       FILE *e;
        !           107:       int cchars;
        !           108: 
        !           109:       qglobal->ilineno = 0;
        !           110: 
        !           111:       e = fopen (*pz, "r");
        !           112:       if (e == NULL)
        !           113:        {
        !           114:          if (FNO_SUCH_FILE ())
        !           115:            continue;
        !           116:          qglobal->ierrno = errno;
        !           117:          iret = UUCONF_FOPEN_FAILED | UUCONF_ERROR_ERRNO;
        !           118:          break;
        !           119:        }
        !           120: 
        !           121: #ifdef CLOSE_ON_EXEC
        !           122:       CLOSE_ON_EXEC (e);
        !           123: #endif
        !           124: 
        !           125:       si.zname = *pz;
        !           126:       si.e = e;
        !           127: 
        !           128:       while ((cchars = _uuconf_getline (qglobal, &zline, &cline, e)) > 0)
        !           129:        {
        !           130:          char *zcmd;
        !           131: 
        !           132:          ++qglobal->ilineno;
        !           133: 
        !           134:          zcmd = zline + strspn (zline, " \t");
        !           135:          if (strncasecmp (zcmd, "system", sizeof "system" - 1) == 0
        !           136:              || strncasecmp (zcmd, "alias", sizeof "alias" - 1) == 0
        !           137:              || strncasecmp (zcmd, "called-login",
        !           138:                              sizeof "called-login" - 1) == 0
        !           139:              || strncasecmp (zcmd, "myname", sizeof "myname" - 1) == 0)
        !           140:            {
        !           141:              iret = uuconf_cmd_line ((pointer) qglobal, zline, asTcmds,
        !           142:                                      (pointer) &si, (uuconf_cmdtabfn) NULL,
        !           143:                                      0, qglobal->pblock);
        !           144:              if ((iret & UUCONF_CMDTABRET_KEEP) != 0)
        !           145:                {
        !           146:                  iret &=~ UUCONF_CMDTABRET_KEEP;
        !           147:                  zline = NULL;
        !           148:                  cline = 0;
        !           149:                }
        !           150:              if (iret != UUCONF_SUCCESS)
        !           151:                {
        !           152:                  iret &=~ UUCONF_CMDTABRET_EXIT;
        !           153:                  break;
        !           154:                }
        !           155:            }
        !           156:        }
        !           157: 
        !           158:       if (iret != UUCONF_SUCCESS)
        !           159:        break;
        !           160:     }
        !           161: 
        !           162:   if (zline != NULL)
        !           163:     free ((pointer) zline);
        !           164: 
        !           165:   if (iret != UUCONF_SUCCESS)
        !           166:     {
        !           167:       qglobal->zfilename = *pz;
        !           168:       iret |= UUCONF_ERROR_FILENAME | UUCONF_ERROR_LINENO;
        !           169:       if (UUCONF_ERROR_VALUE (iret) != UUCONF_MALLOC_FAILED)
        !           170:        qglobal->qprocess->fread_syslocs = TRUE;
        !           171:     }
        !           172:   else
        !           173:     {
        !           174:       qglobal->qprocess->qsyslocs = si.qlocs;
        !           175:       qglobal->qprocess->qvalidate = si.qvals;
        !           176:       qglobal->qprocess->fread_syslocs = TRUE;
        !           177:     }  
        !           178: 
        !           179:   return iret;
        !           180: }
        !           181: 
        !           182: /* Handle a "system" or "alias" command by recording the file and
        !           183:    location.  If pvar is not NULL, this is an "alias" command.  */
        !           184: 
        !           185: /*ARGSUSED*/
        !           186: static int
        !           187: itsystem (pglobal, argc, argv, pvar, pinfo)
        !           188:      pointer pglobal;
        !           189:      int argc;
        !           190:      char **argv;
        !           191:      pointer pvar;
        !           192:      pointer pinfo;
        !           193: {
        !           194:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           195:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           196:   struct stsysloc *q;
        !           197:   size_t csize;
        !           198: 
        !           199:   q = (struct stsysloc *) uuconf_malloc (qglobal->pblock,
        !           200:                                         sizeof (struct stsysloc));
        !           201:   if (q == NULL)
        !           202:     {
        !           203:       qglobal->ierrno = errno;
        !           204:       return (UUCONF_MALLOC_FAILED
        !           205:              | UUCONF_ERROR_ERRNO
        !           206:              | UUCONF_CMDTABRET_EXIT);
        !           207:     }
        !           208: 
        !           209:   csize = strlen (argv[1]) + 1;
        !           210:   q->zname = uuconf_malloc (qglobal->pblock, csize);
        !           211:   if (q->zname == NULL)
        !           212:     {
        !           213:       qglobal->ierrno = errno;
        !           214:       return (UUCONF_MALLOC_FAILED
        !           215:              | UUCONF_ERROR_ERRNO
        !           216:              | UUCONF_CMDTABRET_EXIT);
        !           217:     }
        !           218: 
        !           219:   q->qnext = qinfo->qlocs;
        !           220:   memcpy ((pointer) q->zname, (pointer) argv[1], csize);
        !           221:   q->falias = pvar != NULL;
        !           222:   q->zfile = qinfo->zname;
        !           223:   q->e = qinfo->e;
        !           224:   q->iloc = ftell (qinfo->e);
        !           225:   q->ilineno = qglobal->ilineno;
        !           226: 
        !           227:   qinfo->qlocs = q;
        !           228: 
        !           229:   return UUCONF_CMDTABRET_CONTINUE;
        !           230: }
        !           231: 
        !           232: /* Handle the "called-login" command.  This just records any extra
        !           233:    arguments, so that uuconf_validate can check them later if
        !           234:    necessary.  */
        !           235: 
        !           236: /*ARGSUSED*/
        !           237: static int
        !           238: itcalled_login (pglobal, argc, argv, pvar, pinfo)
        !           239:      pointer pglobal;
        !           240:      int argc;
        !           241:      char **argv;
        !           242:      pointer pvar;
        !           243:      pointer pinfo;
        !           244: {
        !           245:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           246:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           247:   register struct svalidate *qval;
        !           248:   int i;
        !           249: 
        !           250:   if (argc <= 2)
        !           251:     return UUCONF_CMDTABRET_CONTINUE;
        !           252: 
        !           253:   for (qval = qinfo->qvals; qval != NULL; qval = qval->qnext)
        !           254:     if (strcmp (argv[1], qval->zlogname) == 0)
        !           255:       break;
        !           256: 
        !           257:   if (qval == NULL)
        !           258:     {
        !           259:       qval = (struct svalidate *) uuconf_malloc (qglobal->pblock,
        !           260:                                                 sizeof (struct svalidate));
        !           261:       if (qval == NULL)
        !           262:        {
        !           263:          qglobal->ierrno = errno;
        !           264:          return (UUCONF_MALLOC_FAILED
        !           265:                  | UUCONF_ERROR_ERRNO
        !           266:                  | UUCONF_CMDTABRET_EXIT);
        !           267:        }
        !           268: 
        !           269:       qval->qnext = qinfo->qvals;
        !           270:       qval->zlogname = argv[1];
        !           271:       qval->pzmachines = NULL;
        !           272: 
        !           273:       qinfo->qvals = qval;
        !           274:     }
        !           275: 
        !           276:   for (i = 2; i < argc; i++)
        !           277:     {
        !           278:       int iret;
        !           279: 
        !           280:       iret = _uuconf_iadd_string (qglobal, argv[i], FALSE, TRUE,
        !           281:                                  &qval->pzmachines, qglobal->pblock);
        !           282:       if (iret != UUCONF_SUCCESS)
        !           283:        return iret | UUCONF_CMDTABRET_EXIT;
        !           284:     }
        !           285: 
        !           286:   return UUCONF_CMDTABRET_KEEP;
        !           287: }
        !           288: 
        !           289: /* Handle the "myname" command by simply recording that it appears.
        !           290:    This information is used by uuconf_taylor_localname.  */
        !           291: 
        !           292: /*ARGSUSED*/
        !           293: static int
        !           294: itmyname (pglobal, argc, argv, pvar, pinfo)
        !           295:      pointer pglobal;
        !           296:      int argc;
        !           297:      char **argv;
        !           298:      pointer pvar;
        !           299:      pointer pinfo;
        !           300: {
        !           301:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           302: 
        !           303:   qglobal->qprocess->fuses_myname = TRUE;
        !           304:   return UUCONF_CMDTABRET_CONTINUE;
        !           305: }

unix.superglobalmegacorp.com

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