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

1.1     ! root        1: /* tsinfo.c
        !             2:    Get information about a system from 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_tsinfo_rcsid[] = "$Id: tsinfo.c,v 1.1 93/07/30 08:08:05 bin Exp Locker: bin $";
        !            30: #endif
        !            31: 
        !            32: #include <errno.h>
        !            33: #include <ctype.h>
        !            34: 
        !            35: #ifndef SEEK_SET
        !            36: #define SEEK_SET 0
        !            37: #endif
        !            38: 
        !            39: static void uiset_call P((struct uuconf_system *qsys));
        !            40: static int iisizecmp P((long i1, long i2));
        !            41: 
        !            42: /* Local functions needed to parse the system information file.  */
        !            43: 
        !            44: #define CMDTABFN(z) \
        !            45:   static int z P((pointer, int, char **, pointer, pointer))
        !            46: 
        !            47: CMDTABFN (iisystem);
        !            48: CMDTABFN (iialias);
        !            49: CMDTABFN (iialternate);
        !            50: CMDTABFN (iidefault_alternates);
        !            51: CMDTABFN (iitime);
        !            52: CMDTABFN (iitimegrade);
        !            53: CMDTABFN (iisize);
        !            54: CMDTABFN (iibaud_range);
        !            55: CMDTABFN (iiport);
        !            56: CMDTABFN (iichat);
        !            57: CMDTABFN (iicalled_login);
        !            58: CMDTABFN (iiproto_param);
        !            59: CMDTABFN (iirequest);
        !            60: CMDTABFN (iitransfer);
        !            61: CMDTABFN (iiforward);
        !            62: CMDTABFN (iiunknown);
        !            63: 
        !            64: #undef CMDTABFN
        !            65: 
        !            66: /* We have to pass a fair amount of information in and out of the
        !            67:    various system commands.  Using global variables would make the
        !            68:    code non-reentrant, so we instead pass a pointer to single
        !            69:    structure as the pinfo argument to the system commands.  */
        !            70: 
        !            71: struct sinfo
        !            72: {
        !            73:   /* The system information we're building up.  */
        !            74:   struct uuconf_system *qsys;
        !            75:   /* Whether any alternates have been used.  */
        !            76:   boolean falternates;
        !            77:   /* A list of the previous alternates.  */
        !            78:   struct uuconf_system salternate;
        !            79:   /* Whether to use extra alternates from the file wide defaults.  */
        !            80:   int fdefault_alternates;
        !            81: };
        !            82: 
        !            83: /* The command table for system commands.  */
        !            84: static const struct cmdtab_offset asIcmds[] =
        !            85: {
        !            86:   { "system", UUCONF_CMDTABTYPE_FN | 2, (size_t) -1, iisystem },
        !            87:   { "alias", UUCONF_CMDTABTYPE_FN | 2, (size_t) -1, iialias },
        !            88:   { "alternate", UUCONF_CMDTABTYPE_FN | 0, (size_t) -1, iialternate },
        !            89:   { "default-alternates", UUCONF_CMDTABTYPE_FN | 2, (size_t) -1,
        !            90:       iidefault_alternates },
        !            91:   { "time", UUCONF_CMDTABTYPE_FN | 0,
        !            92:       offsetof (struct uuconf_system, uuconf_qtimegrade), iitime },
        !            93:   { "timegrade", UUCONF_CMDTABTYPE_FN | 0,
        !            94:       offsetof (struct uuconf_system, uuconf_qtimegrade), iitimegrade },
        !            95:   { "max-retries", UUCONF_CMDTABTYPE_INT,
        !            96:       offsetof (struct uuconf_system, uuconf_cmax_retries), NULL },
        !            97:   { "success-wait", UUCONF_CMDTABTYPE_INT,
        !            98:       offsetof (struct uuconf_system, uuconf_csuccess_wait), NULL },
        !            99:   { "call-timegrade", UUCONF_CMDTABTYPE_FN | 3,
        !           100:       offsetof (struct uuconf_system, uuconf_qcalltimegrade), iitimegrade },
        !           101:   { "call-local-size", UUCONF_CMDTABTYPE_FN | 3,
        !           102:       offsetof (struct uuconf_system, uuconf_qcall_local_size), iisize },
        !           103:   { "call-remote-size", UUCONF_CMDTABTYPE_FN | 3,
        !           104:       offsetof (struct uuconf_system, uuconf_qcall_remote_size), iisize },
        !           105:   { "called-local-size", UUCONF_CMDTABTYPE_FN | 3,
        !           106:       offsetof (struct uuconf_system, uuconf_qcalled_local_size), iisize },
        !           107:   { "called-remote-size", UUCONF_CMDTABTYPE_FN | 3,
        !           108:       offsetof (struct uuconf_system, uuconf_qcalled_remote_size), iisize },
        !           109:   { "timetable", UUCONF_CMDTABTYPE_FN | 3, (size_t) -1, _uuconf_itimetable },
        !           110:   { "baud", UUCONF_CMDTABTYPE_LONG,
        !           111:       offsetof (struct uuconf_system, uuconf_ibaud), NULL },
        !           112:   { "speed", UUCONF_CMDTABTYPE_LONG,
        !           113:       offsetof (struct uuconf_system, uuconf_ibaud), NULL },
        !           114:   { "baud-range", UUCONF_CMDTABTYPE_FN | 3, 0, iibaud_range },
        !           115:   { "speed-range", UUCONF_CMDTABTYPE_FN | 3, 0, iibaud_range },
        !           116:   { "port", UUCONF_CMDTABTYPE_FN | 0, (size_t) -1, iiport },
        !           117:   { "phone", UUCONF_CMDTABTYPE_STRING,
        !           118:       offsetof (struct uuconf_system, uuconf_zphone), NULL },
        !           119:   { "address", UUCONF_CMDTABTYPE_STRING,
        !           120:       offsetof (struct uuconf_system, uuconf_zphone), NULL },
        !           121:   { "chat", UUCONF_CMDTABTYPE_PREFIX | 0,
        !           122:       offsetof (struct uuconf_system, uuconf_schat), iichat },
        !           123:   { "call-login", UUCONF_CMDTABTYPE_STRING,
        !           124:       offsetof (struct uuconf_system, uuconf_zcall_login), NULL },
        !           125:   { "call-password", UUCONF_CMDTABTYPE_STRING,
        !           126:       offsetof (struct uuconf_system, uuconf_zcall_password), NULL },
        !           127:   { "called-login", UUCONF_CMDTABTYPE_FN | 0,
        !           128:       offsetof (struct uuconf_system, uuconf_zcalled_login), iicalled_login },
        !           129:   { "callback", UUCONF_CMDTABTYPE_BOOLEAN,
        !           130:       offsetof (struct uuconf_system, uuconf_fcallback), NULL },
        !           131:   { "sequence", UUCONF_CMDTABTYPE_BOOLEAN,
        !           132:       offsetof (struct uuconf_system, uuconf_fsequence), NULL },
        !           133:   { "protocol", UUCONF_CMDTABTYPE_STRING,
        !           134:       offsetof (struct uuconf_system, uuconf_zprotocols), NULL },
        !           135:   { "protocol-parameter", UUCONF_CMDTABTYPE_FN | 0,
        !           136:       offsetof (struct uuconf_system, uuconf_qproto_params), iiproto_param },
        !           137:   { "called-chat", UUCONF_CMDTABTYPE_PREFIX | 0,
        !           138:       offsetof (struct uuconf_system, uuconf_scalled_chat), iichat },
        !           139:   { "debug", UUCONF_CMDTABTYPE_STRING,
        !           140:       offsetof (struct uuconf_system, uuconf_zdebug), NULL },
        !           141:   { "max-remote-debug", UUCONF_CMDTABTYPE_STRING,
        !           142:       offsetof (struct uuconf_system, uuconf_zmax_remote_debug), NULL },
        !           143:   { "send-request", UUCONF_CMDTABTYPE_BOOLEAN,
        !           144:       offsetof (struct uuconf_system, uuconf_fsend_request), NULL },
        !           145:   { "receive-request", UUCONF_CMDTABTYPE_BOOLEAN,
        !           146:       offsetof (struct uuconf_system, uuconf_frec_request), NULL },
        !           147:   { "request", UUCONF_CMDTABTYPE_FN | 2, (size_t) -1, iirequest },
        !           148:   { "call-transfer", UUCONF_CMDTABTYPE_BOOLEAN,
        !           149:       offsetof (struct uuconf_system, uuconf_fcall_transfer), NULL },
        !           150:   { "called-transfer", UUCONF_CMDTABTYPE_BOOLEAN,
        !           151:       offsetof (struct uuconf_system, uuconf_fcalled_transfer), NULL },
        !           152:   { "transfer", UUCONF_CMDTABTYPE_FN | 2, (size_t) -1, iitransfer },
        !           153:   { "local-send", UUCONF_CMDTABTYPE_FULLSTRING,
        !           154:       offsetof (struct uuconf_system, uuconf_pzlocal_send), NULL },
        !           155:   { "remote-send", UUCONF_CMDTABTYPE_FULLSTRING,
        !           156:       offsetof (struct uuconf_system, uuconf_pzremote_send), NULL },
        !           157:   { "local-receive", UUCONF_CMDTABTYPE_FULLSTRING,
        !           158:       offsetof (struct uuconf_system, uuconf_pzlocal_receive), NULL },
        !           159:   { "remote-receive", UUCONF_CMDTABTYPE_FULLSTRING,
        !           160:       offsetof (struct uuconf_system, uuconf_pzremote_receive), NULL },
        !           161:   { "command-path", UUCONF_CMDTABTYPE_FULLSTRING,
        !           162:       offsetof (struct uuconf_system, uuconf_pzpath), NULL },
        !           163:   { "commands", UUCONF_CMDTABTYPE_FULLSTRING,
        !           164:       offsetof (struct uuconf_system, uuconf_pzcmds), NULL },
        !           165:   { "free-space", UUCONF_CMDTABTYPE_LONG,
        !           166:       offsetof (struct uuconf_system, uuconf_cfree_space), NULL },
        !           167:   { "forward-from", UUCONF_CMDTABTYPE_FULLSTRING,
        !           168:       offsetof (struct uuconf_system, uuconf_pzforward_from), NULL },
        !           169:   { "forward-to", UUCONF_CMDTABTYPE_FULLSTRING,
        !           170:       offsetof (struct uuconf_system, uuconf_pzforward_to), NULL },
        !           171:   { "forward", UUCONF_CMDTABTYPE_FN | 0, (size_t) -1, iiforward },
        !           172:   { "pubdir", UUCONF_CMDTABTYPE_STRING,
        !           173:       offsetof (struct uuconf_system, uuconf_zpubdir), NULL },
        !           174:   { "myname", UUCONF_CMDTABTYPE_STRING,
        !           175:       offsetof (struct uuconf_system, uuconf_zlocalname), NULL },
        !           176:   { NULL, 0, 0, NULL }
        !           177: };
        !           178: 
        !           179: #define CSYSTEM_CMDS (sizeof asIcmds / sizeof asIcmds[0])
        !           180: 
        !           181: /* Get information about the system zsystem from the Taylor UUCP
        !           182:    configuration files.  Sets *qsys.  This does not ensure that all
        !           183:    default information is set.  */
        !           184: 
        !           185: int
        !           186: _uuconf_itaylor_system_internal (qglobal, zsystem, qsys)
        !           187:      struct sglobal *qglobal;
        !           188:      const char *zsystem;
        !           189:      struct uuconf_system *qsys;
        !           190: {
        !           191:   int iret;
        !           192:   struct stsysloc *qloc;
        !           193:   struct uuconf_cmdtab as[CSYSTEM_CMDS];
        !           194:   struct sinfo si;
        !           195:   struct uuconf_system sdefaults;
        !           196: 
        !           197:   if (! qglobal->qprocess->fread_syslocs)
        !           198:     {
        !           199:       iret = _uuconf_iread_locations (qglobal);
        !           200:       if (iret != UUCONF_SUCCESS)
        !           201:        return iret;
        !           202:     }
        !           203: 
        !           204:   /* Find the system in the list of locations.  */
        !           205:   for (qloc = qglobal->qprocess->qsyslocs; qloc != NULL; qloc = qloc->qnext)
        !           206:     if (qloc->zname[0] == zsystem[0]
        !           207:        && strcmp (qloc->zname, zsystem) == 0)
        !           208:       break;
        !           209:   if (qloc == NULL)
        !           210:     return UUCONF_NOT_FOUND;
        !           211: 
        !           212:   /* If this is an alias, then the real system is the next non-alias
        !           213:      in the list.  */
        !           214:   while (qloc->falias)
        !           215:     {
        !           216:       qloc = qloc->qnext;
        !           217:       if (qloc == NULL)
        !           218:        return UUCONF_NOT_FOUND;
        !           219:     }
        !           220: 
        !           221:   _uuconf_ucmdtab_base (asIcmds, CSYSTEM_CMDS, (char *) qsys, as);
        !           222: 
        !           223:   rewind (qloc->e);
        !           224: 
        !           225:   /* Read the file wide defaults from the start of the file.  */
        !           226:   _uuconf_uclear_system (qsys);
        !           227: 
        !           228:   si.qsys = qsys;
        !           229:   si.falternates = FALSE;
        !           230:   si.fdefault_alternates = TRUE;
        !           231:   qsys->uuconf_palloc = uuconf_malloc_block ();
        !           232:   if (qsys->uuconf_palloc == NULL)
        !           233:     {
        !           234:       qglobal->ierrno = errno;
        !           235:       return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           236:     }
        !           237: 
        !           238:   iret = uuconf_cmd_file ((pointer) qglobal, qloc->e, as, (pointer) &si,
        !           239:                          iiunknown, UUCONF_CMDTABFLAG_BACKSLASH,
        !           240:                          qsys->uuconf_palloc);
        !           241:   if (iret != UUCONF_SUCCESS)
        !           242:     {
        !           243:       qglobal->zfilename = qloc->zfile;
        !           244:       return iret | UUCONF_ERROR_FILENAME;
        !           245:     }
        !           246: 
        !           247:   if (! si.falternates)
        !           248:     uiset_call (qsys);
        !           249:   else
        !           250:     {
        !           251:       /* Attach the final alternate.  */
        !           252:       iret = iialternate ((pointer) qglobal, 0, (char **) NULL,
        !           253:                          (pointer) NULL, (pointer) &si);
        !           254:       if (iret != UUCONF_SUCCESS)
        !           255:        return iret;
        !           256:     }
        !           257: 
        !           258:   /* Save off the defaults.  */
        !           259:   sdefaults = *qsys;
        !           260: 
        !           261:   /* Advance to the information for the system we want.  */
        !           262:   if (fseek (qloc->e, qloc->iloc, SEEK_SET) != 0)
        !           263:     {
        !           264:       qglobal->ierrno = errno;
        !           265:       qglobal->zfilename = qloc->zfile;
        !           266:       return (UUCONF_FSEEK_FAILED
        !           267:              | UUCONF_ERROR_ERRNO
        !           268:              | UUCONF_ERROR_FILENAME);
        !           269:     }
        !           270: 
        !           271:   /* Read in the system we want.  */
        !           272:   _uuconf_uclear_system (qsys);
        !           273:   qsys->uuconf_zname = (char *) qloc->zname;
        !           274:   qsys->uuconf_palloc = sdefaults.uuconf_palloc;
        !           275: 
        !           276:   si.falternates = FALSE;
        !           277: 
        !           278:   iret = uuconf_cmd_file (qglobal, qloc->e, as, (pointer) &si, iiunknown,
        !           279:                          UUCONF_CMDTABFLAG_BACKSLASH, qsys->uuconf_palloc);
        !           280:   qglobal->ilineno += qloc->ilineno;
        !           281: 
        !           282:   if (iret == UUCONF_SUCCESS)
        !           283:     {
        !           284:       if (! si.falternates)
        !           285:        uiset_call (qsys);
        !           286:       else
        !           287:        iret = iialternate ((pointer) qglobal, 0, (char **) NULL,
        !           288:                            (pointer) NULL, (pointer) &si);
        !           289:     }
        !           290: 
        !           291:   /* Merge in the defaults.  */
        !           292:   if (iret == UUCONF_SUCCESS)
        !           293:     iret = _uuconf_isystem_default (qglobal, qsys, &sdefaults,
        !           294:                                    si.fdefault_alternates);
        !           295: 
        !           296:   /* The first alternate is always available for calling in.  */
        !           297:   if (iret == UUCONF_SUCCESS)
        !           298:     qsys->uuconf_fcalled = TRUE;
        !           299: 
        !           300:   if (iret != UUCONF_SUCCESS)
        !           301:     {
        !           302:       qglobal->zfilename = qloc->zfile;
        !           303:       iret |= UUCONF_ERROR_FILENAME;
        !           304:     }
        !           305: 
        !           306:   return iret;
        !           307: }
        !           308: 
        !           309: /* Set the fcall and fcalled field for the system.  This marks a
        !           310:    particular alternate for use when calling out or calling in.  This
        !           311:    is where we implement the semantics described in the documentation:
        !           312:    a change to a relevant field implies that the alternate is used.
        !           313:    If all the relevant fields are unchanged, the alternate is not
        !           314:    used.  */
        !           315: 
        !           316: static void
        !           317: uiset_call (qsys)
        !           318:      struct uuconf_system *qsys;
        !           319: {
        !           320:   qsys->uuconf_fcall =
        !           321:     (qsys->uuconf_qtimegrade != (struct uuconf_timespan *) &_uuconf_unset
        !           322:      || qsys->uuconf_zport != (char *) &_uuconf_unset
        !           323:      || qsys->uuconf_qport != (struct uuconf_port *) &_uuconf_unset
        !           324:      || qsys->uuconf_ibaud >= 0
        !           325:      || qsys->uuconf_zphone != (char *) &_uuconf_unset
        !           326:      || qsys->uuconf_schat.uuconf_pzchat != (char **) &_uuconf_unset
        !           327:      || qsys->uuconf_schat.uuconf_pzprogram != (char **) &_uuconf_unset);
        !           328: 
        !           329:   qsys->uuconf_fcalled =
        !           330:     qsys->uuconf_zcalled_login != (char *) &_uuconf_unset;
        !           331: }
        !           332: 
        !           333: /* Handle the "system" command.  Because we skip directly to the
        !           334:    system we want to read, a "system" command means we've reached the
        !           335:    end of it.  */
        !           336: 
        !           337: static int
        !           338: iisystem (pglobal, argc, argv, pvar, pinfo)
        !           339:      pointer pglobal;
        !           340:      int argc;
        !           341:      char **argv;
        !           342:      pointer pvar;
        !           343:      pointer pinfo;
        !           344: {
        !           345:   return UUCONF_CMDTABRET_EXIT;
        !           346: }
        !           347: 
        !           348: /* Handle the "alias" command.  */
        !           349: 
        !           350: /*ARGSUSED*/
        !           351: static int
        !           352: iialias (pglobal, argc, argv, pvar, pinfo)
        !           353:      pointer pglobal;
        !           354:      int argc;
        !           355:      char **argv;
        !           356:      pointer pvar;
        !           357:      pointer pinfo;
        !           358: {
        !           359:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           360:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           361:   int iret;
        !           362: 
        !           363:   iret = _uuconf_iadd_string (qglobal, argv[1], TRUE, FALSE,
        !           364:                              &qinfo->qsys->uuconf_pzalias,
        !           365:                              qinfo->qsys->uuconf_palloc);
        !           366:   if (iret != UUCONF_SUCCESS)
        !           367:     iret |= UUCONF_CMDTABRET_EXIT;
        !           368:   return iret;
        !           369: }
        !           370: 
        !           371: /* Handle the "alternate" command.  The information just read is in
        !           372:    sIhold.  If this is the first "alternate" command for this system,
        !           373:    we save off the current information in sIalternate.  Otherwise we
        !           374:    default this information to sIalternate, and then add it to the end
        !           375:    of the list of alternates in sIalternate.  */
        !           376: 
        !           377: static int
        !           378: iialternate (pglobal, argc, argv, pvar, pinfo)
        !           379:      pointer pglobal;
        !           380:      int argc;
        !           381:      char **argv;
        !           382:      pointer pvar;
        !           383:      pointer pinfo;
        !           384: {
        !           385:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           386:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           387: 
        !           388:   uiset_call (qinfo->qsys);
        !           389: 
        !           390:   if (! qinfo->falternates)
        !           391:     {
        !           392:       qinfo->salternate = *qinfo->qsys;
        !           393:       qinfo->falternates = TRUE;
        !           394:     }
        !           395:   else
        !           396:     {
        !           397:       int iret;
        !           398:       struct uuconf_system *qnew, **pq;
        !           399: 
        !           400:       iret = _uuconf_isystem_default (qglobal, qinfo->qsys,
        !           401:                                      &qinfo->salternate, FALSE);
        !           402:       if (iret != UUCONF_SUCCESS)
        !           403:        return iret | UUCONF_CMDTABRET_EXIT;
        !           404:       qnew = ((struct uuconf_system *)
        !           405:              uuconf_malloc (qinfo->qsys->uuconf_palloc,
        !           406:                              sizeof (struct uuconf_system)));
        !           407:       if (qnew == NULL)
        !           408:        {
        !           409:          qglobal->ierrno = errno;;
        !           410:          return (UUCONF_MALLOC_FAILED
        !           411:                  | UUCONF_ERROR_ERRNO
        !           412:                  | UUCONF_CMDTABRET_EXIT);
        !           413:        }
        !           414:       *qnew = *qinfo->qsys;
        !           415:       for (pq = &qinfo->salternate.uuconf_qalternate;
        !           416:           *pq != NULL;
        !           417:           pq = &(*pq)->uuconf_qalternate)
        !           418:        ;
        !           419:       *pq = qnew;
        !           420:     }
        !           421: 
        !           422:   /* If this is the last alternate command, move the information back
        !           423:      to qinfo->qsys.  */
        !           424:   if (argc == 0)
        !           425:     *qinfo->qsys = qinfo->salternate;
        !           426:   else
        !           427:     {
        !           428:       _uuconf_uclear_system (qinfo->qsys);
        !           429:       qinfo->qsys->uuconf_zname = qinfo->salternate.uuconf_zname;
        !           430:       qinfo->qsys->uuconf_palloc = qinfo->salternate.uuconf_palloc;
        !           431:       if (argc > 1)
        !           432:        {
        !           433:          qinfo->qsys->uuconf_zalternate = argv[1];
        !           434:          return UUCONF_CMDTABRET_KEEP;
        !           435:        }
        !           436:     }
        !           437: 
        !           438:   return UUCONF_CMDTABRET_CONTINUE;
        !           439: }
        !           440: 
        !           441: /* Handle the "default-alternates" command.  This just takes a boolean
        !           442:    argument which is used to set the fdefault_alternates field of the
        !           443:    sinfo structure.  */
        !           444: 
        !           445: /*ARGSUSED*/
        !           446: static int
        !           447: iidefault_alternates (pglobal, argc, argv, pvar, pinfo)
        !           448:      pointer pglobal;
        !           449:      int argc;
        !           450:      char **argv;
        !           451:      pointer pvar;
        !           452:      pointer pinfo;
        !           453: {
        !           454:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           455:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           456: 
        !           457:   return _uuconf_iboolean (qglobal, argv[1], &qinfo->fdefault_alternates);
        !           458: }
        !           459: 
        !           460: /* Handle the "time" command.  We do this by turning it into a
        !           461:    "timegrade" command with a grade of BGRADE_LOW.  The first argument
        !           462:    is a time string, and the optional second argument is the retry
        !           463:    time.  */
        !           464: 
        !           465: /*ARGSUSED*/
        !           466: static int
        !           467: iitime (pglobal, argc, argv, pvar, pinfo)
        !           468:      pointer pglobal;
        !           469:      int argc;
        !           470:      char **argv;
        !           471:      pointer pvar;
        !           472:      pointer pinfo;
        !           473: {
        !           474:   char *aznew[4];
        !           475:   char ab[2];
        !           476: 
        !           477:   if (argc != 2 && argc != 3)
        !           478:     return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
        !           479: 
        !           480:   aznew[0] = argv[0];
        !           481:   ab[0] = UUCONF_GRADE_LOW;
        !           482:   ab[1] = '\0';
        !           483:   aznew[1] = ab;
        !           484:   aznew[2] = argv[1];
        !           485:   if (argc > 2)
        !           486:     aznew[3] = argv[2];
        !           487: 
        !           488:   return iitimegrade (pglobal, argc + 1, aznew, pvar, pinfo);
        !           489: }
        !           490: 
        !           491: /* Handle the "timegrade" command by calling _uuconf_itime_parse with
        !           492:    appropriate ival (the work grade) and cretry (the retry time)
        !           493:    arguments.  */
        !           494: 
        !           495: static int
        !           496: iitimegrade (pglobal, argc, argv, pvar, pinfo)
        !           497:      pointer pglobal;
        !           498:      int argc;
        !           499:      char **argv;
        !           500:      pointer pvar;
        !           501:      pointer pinfo;
        !           502: {
        !           503:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           504:   struct uuconf_timespan **pqspan = (struct uuconf_timespan **) pvar;
        !           505:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           506:   int cretry;
        !           507:   int iret;
        !           508: 
        !           509:   if (argc < 3 || argc > 4)
        !           510:     return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
        !           511: 
        !           512:   if (argv[1][1] != '\0' || ! UUCONF_GRADE_LEGAL (argv[1][0]))
        !           513:     return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
        !           514: 
        !           515:   if (argc == 3)
        !           516:     cretry = 0;
        !           517:   else
        !           518:     {
        !           519:       iret = _uuconf_iint (qglobal, argv[3], (pointer) &cretry, TRUE);
        !           520:       if (iret != UUCONF_SUCCESS)
        !           521:        return iret;
        !           522:     }
        !           523: 
        !           524:   iret = _uuconf_itime_parse (qglobal, argv[2], (long) argv[1][0],
        !           525:                              cretry, _uuconf_itime_grade_cmp, pqspan,
        !           526:                              qinfo->qsys->uuconf_palloc);
        !           527:   if (iret != UUCONF_SUCCESS)
        !           528:     iret |= UUCONF_CMDTABRET_EXIT;
        !           529:   return iret;
        !           530: }
        !           531: 
        !           532: /* Handle the "baud-range" command, also known as "speed-range".  */
        !           533: 
        !           534: static int
        !           535: iibaud_range (pglobal, argc, argv, pvar, pinfo)
        !           536:      pointer pglobal;
        !           537:      int argc;
        !           538:      char **argv;
        !           539:      pointer pvar;
        !           540:      pointer pinfo;
        !           541: {
        !           542:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           543:   struct uuconf_system *qsys = (struct uuconf_system *) pvar;
        !           544:   int iret;
        !           545: 
        !           546:   iret = _uuconf_iint (qglobal, argv[1], (pointer) &qsys->uuconf_ibaud,
        !           547:                       FALSE);
        !           548:   if (iret != UUCONF_SUCCESS)
        !           549:     return iret;
        !           550:   return _uuconf_iint (qglobal, argv[2], (pointer) &qsys->uuconf_ihighbaud,
        !           551:                       FALSE);
        !           552: }
        !           553: 
        !           554: /* Handle one of the size commands ("call-local-size", etc.).  The
        !           555:    first argument is a number of bytes, and the second argument is a
        !           556:    time string.  The pvar argument points to the string array to which
        !           557:    we add this new string.  */
        !           558: 
        !           559: /*ARGSUSED*/
        !           560: static int
        !           561: iisize (pglobal, argc, argv, pvar, pinfo)
        !           562:      pointer pglobal;
        !           563:      int argc;
        !           564:      char **argv;
        !           565:      pointer pvar;
        !           566:      pointer pinfo;
        !           567: {
        !           568:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           569:   struct uuconf_timespan **pqspan = (struct uuconf_timespan **) pvar;
        !           570:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           571:   long ival;
        !           572:   int iret;
        !           573: 
        !           574:   iret = _uuconf_iint (qglobal, argv[1], (pointer) &ival, FALSE);
        !           575:   if (iret != UUCONF_SUCCESS)
        !           576:     return iret;
        !           577: 
        !           578:   iret = _uuconf_itime_parse (qglobal, argv[2], ival, 0, iisizecmp,
        !           579:                              pqspan, qinfo->qsys->uuconf_palloc);
        !           580:   if (iret != UUCONF_SUCCESS)
        !           581:     iret |= UUCONF_CMDTABRET_EXIT;
        !           582:   return iret;
        !           583: }
        !           584: 
        !           585: /* A comparison function for sizes to pass to _uuconf_itime_parse.  */
        !           586: 
        !           587: static int
        !           588: iisizecmp (i1, i2)
        !           589:      long i1;
        !           590:      long i2;
        !           591: {
        !           592:   /* We can't just return i1 - i2 because that would be a long.  */
        !           593:   if (i1 < i2)
        !           594:     return -1;
        !           595:   else if (i1 == i2)
        !           596:     return 0;
        !           597:   else
        !           598:     return 1;
        !           599: }
        !           600: 
        !           601: /* Handle the "port" command.  If there is one argument, this names a
        !           602:    port.  Otherwise, the remaining arguments form a command describing
        !           603:    the port.  */
        !           604: 
        !           605: /*ARGSUSED*/
        !           606: static int
        !           607: iiport (pglobal, argc, argv, pvar, pinfo)
        !           608:      pointer pglobal;
        !           609:      int argc;
        !           610:      char **argv;
        !           611:      pointer pvar;
        !           612:      pointer pinfo;
        !           613: {
        !           614:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           615:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           616: 
        !           617:   if (argc < 2)
        !           618:     return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
        !           619:   else if (argc == 2)
        !           620:     {
        !           621:       qinfo->qsys->uuconf_zport = argv[1];
        !           622:       return UUCONF_CMDTABRET_KEEP;
        !           623:     }
        !           624:   else
        !           625:     {
        !           626:       int iret;
        !           627: 
        !           628:       if (qinfo->qsys->uuconf_qport
        !           629:          == (struct uuconf_port *) &_uuconf_unset)
        !           630:        {
        !           631:          struct uuconf_port *qnew;
        !           632: 
        !           633:          qnew = ((struct uuconf_port *)
        !           634:                  uuconf_malloc (qinfo->qsys->uuconf_palloc,
        !           635:                                  sizeof (struct uuconf_port)));
        !           636:          if (qnew == NULL)
        !           637:            {
        !           638:              qglobal->ierrno = errno;
        !           639:              return (UUCONF_MALLOC_FAILED
        !           640:                      | UUCONF_ERROR_ERRNO
        !           641:                      | UUCONF_CMDTABRET_EXIT);
        !           642:            }
        !           643: 
        !           644:          _uuconf_uclear_port (qnew);
        !           645: 
        !           646:          if (qinfo->qsys->uuconf_zname == NULL)
        !           647:            qnew->uuconf_zname = (char *) "default system file port";
        !           648:          else
        !           649:            {
        !           650:              char *zname;
        !           651:              size_t clen;
        !           652: 
        !           653:              clen = strlen (qinfo->qsys->uuconf_zname);
        !           654:              zname = (char *) uuconf_malloc (qinfo->qsys->uuconf_palloc,
        !           655:                                              clen + sizeof "system  port");
        !           656:              if (zname == NULL)
        !           657:                {
        !           658:                  qglobal->ierrno = errno;
        !           659:                  return (UUCONF_MALLOC_FAILED
        !           660:                          | UUCONF_ERROR_ERRNO
        !           661:                          | UUCONF_CMDTABRET_EXIT);
        !           662:                }
        !           663: 
        !           664:              memcpy ((pointer) zname, (pointer) "system ",
        !           665:                      sizeof "system " - 1);
        !           666:              memcpy ((pointer) (zname + sizeof "system " - 1),
        !           667:                      (pointer) qinfo->qsys->uuconf_zname,
        !           668:                      clen);
        !           669:              memcpy ((pointer) (zname + sizeof "system " - 1 + clen),
        !           670:                      (pointer) " port", sizeof " port");
        !           671: 
        !           672:              qnew->uuconf_zname = zname;
        !           673:            }
        !           674: 
        !           675:          qnew->uuconf_palloc = qinfo->qsys->uuconf_palloc;
        !           676: 
        !           677:          qinfo->qsys->uuconf_qport = qnew;
        !           678:        }
        !           679: 
        !           680:       iret = _uuconf_iport_cmd (qglobal, argc - 1, argv + 1,
        !           681:                                qinfo->qsys->uuconf_qport);
        !           682:       if (UUCONF_ERROR_VALUE (iret) != UUCONF_SUCCESS)
        !           683:        iret |= UUCONF_CMDTABRET_EXIT;
        !           684:       return iret;
        !           685:     }
        !           686: }
        !           687: 
        !           688: /* Handle the "chat" and "called-chat" set of commands.  These just
        !           689:    hand off to the generic chat script function.  */
        !           690: 
        !           691: static int
        !           692: iichat (pglobal, argc, argv, pvar, pinfo)
        !           693:      pointer pglobal;
        !           694:      int argc;
        !           695:      char **argv;
        !           696:      pointer pvar;
        !           697:      pointer pinfo;
        !           698: {
        !           699:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           700:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           701:   struct uuconf_chat *qchat = (struct uuconf_chat *) pvar;
        !           702:   int iret;
        !           703: 
        !           704:   iret = _uuconf_ichat_cmd (qglobal, argc, argv, qchat,
        !           705:                            qinfo->qsys->uuconf_palloc);
        !           706:   if (UUCONF_ERROR_VALUE (iret) != UUCONF_SUCCESS)
        !           707:     iret |= UUCONF_CMDTABRET_EXIT;
        !           708:   return iret;
        !           709: }
        !           710: 
        !           711: /* Handle the "called-login" command.  This only needs to be in a
        !           712:    function because there can be additional arguments listing the
        !           713:    remote systems which are permitted to use this login name.  The
        !           714:    additional arguments are not actually handled here; they are
        !           715:    handled by uuconf_taylor_system_names, which already has to go
        !           716:    through all the system files.  */
        !           717: 
        !           718: /*ARGSUSED*/
        !           719: static int
        !           720: iicalled_login (pglobal, argc, argv, pvar, pinfo)
        !           721:      pointer pglobal;
        !           722:      int argc;
        !           723:      char **argv;
        !           724:      pointer pvar;
        !           725:      pointer pinfo;
        !           726: {
        !           727:   char **pz = (char **) pvar;
        !           728: 
        !           729:   if (argc < 2)
        !           730:     return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
        !           731:   *pz = argv[1];
        !           732:   return UUCONF_CMDTABRET_KEEP;
        !           733: }
        !           734: 
        !           735: /* Handle the "protocol-parameter" command.  This just hands off to
        !           736:    the generic protocol parameter handler.  */
        !           737: 
        !           738: static int
        !           739: iiproto_param (pglobal, argc, argv, pvar, pinfo)
        !           740:      pointer pglobal;
        !           741:      int argc;
        !           742:      char **argv;
        !           743:      pointer pvar;
        !           744:      pointer pinfo;
        !           745: {
        !           746:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           747:   struct uuconf_proto_param **pqparam = (struct uuconf_proto_param **) pvar;
        !           748:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           749: 
        !           750:   if (*pqparam == (struct uuconf_proto_param *) &_uuconf_unset)
        !           751:     *pqparam = NULL;
        !           752:   return _uuconf_iadd_proto_param (qglobal, argc - 1, argv + 1, pqparam,
        !           753:                                   qinfo->qsys->uuconf_palloc);
        !           754: }
        !           755: 
        !           756: /* Handle the "request" command.  This is equivalent to specifying
        !           757:    both "call-request" and "called-request".  */
        !           758: 
        !           759: /*ARGSUSED*/
        !           760: static int
        !           761: iirequest (pglobal, argc, argv, pvar, pinfo)
        !           762:      pointer pglobal;
        !           763:      int argc;
        !           764:      char **argv;
        !           765:      pointer pvar;
        !           766:      pointer pinfo;
        !           767: {
        !           768:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           769:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           770:   int iret;
        !           771: 
        !           772:   iret = _uuconf_iboolean (qglobal, argv[1],
        !           773:                           &qinfo->qsys->uuconf_fsend_request);
        !           774:   if (UUCONF_ERROR_VALUE (iret) == UUCONF_SUCCESS)
        !           775:     qinfo->qsys->uuconf_frec_request = qinfo->qsys->uuconf_fsend_request;
        !           776: 
        !           777:   return iret;
        !           778: }
        !           779: 
        !           780: /* Handle the "transfer" command.  This is equivalent to specifying
        !           781:    both "call-transfer" and "called-transfer".  */
        !           782: 
        !           783: /*ARGSUSED*/
        !           784: static int
        !           785: iitransfer (pglobal, argc, argv, pvar, pinfo)
        !           786:      pointer pglobal;
        !           787:      int argc;
        !           788:      char **argv;
        !           789:      pointer pvar;
        !           790:      pointer pinfo;
        !           791: {
        !           792:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           793:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           794:   int iret;
        !           795: 
        !           796:   iret = _uuconf_iboolean (qglobal, argv[1],
        !           797:                           &qinfo->qsys->uuconf_fcall_transfer);
        !           798:   if (UUCONF_ERROR_VALUE (iret) == UUCONF_SUCCESS)
        !           799:     qinfo->qsys->uuconf_fcalled_transfer = qinfo->qsys->uuconf_fcall_transfer;
        !           800: 
        !           801:   return iret;
        !           802: }
        !           803: 
        !           804: /* Handle the "forward" command.  This is equivalent to specifying
        !           805:    both "forward-from" and "forward-to".  */
        !           806: 
        !           807: /*ARGSUSED*/
        !           808: static int
        !           809: iiforward (pglobal, argc, argv, pvar, pinfo)
        !           810:      pointer pglobal;
        !           811:      int argc;
        !           812:      char **argv;
        !           813:      pointer pvar;
        !           814:      pointer pinfo;
        !           815: {
        !           816:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           817:   struct sinfo *qinfo = (struct sinfo *) pinfo;
        !           818:   struct uuconf_system *qsys;
        !           819:   int i;
        !           820:   int iret;
        !           821: 
        !           822:   qsys = qinfo->qsys;
        !           823:   qsys->uuconf_pzforward_from = NULL;
        !           824:   qsys->uuconf_pzforward_to = NULL;
        !           825:   for (i = 1; i < argc; i++)
        !           826:     {
        !           827:       iret = _uuconf_iadd_string (qglobal, argv[i], FALSE, FALSE,
        !           828:                                  &qsys->uuconf_pzforward_to,
        !           829:                                  qsys->uuconf_palloc);
        !           830:       if (iret != UUCONF_SUCCESS)
        !           831:        return iret | UUCONF_CMDTABRET_KEEP | UUCONF_CMDTABRET_EXIT;
        !           832:       iret = _uuconf_iadd_string (qglobal, argv[i], FALSE, FALSE,
        !           833:                                  &qsys->uuconf_pzforward_from,
        !           834:                                  qsys->uuconf_palloc);
        !           835:       if (iret != UUCONF_SUCCESS)
        !           836:        return iret | UUCONF_CMDTABRET_KEEP | UUCONF_CMDTABRET_EXIT;
        !           837:     }
        !           838: 
        !           839:   return UUCONF_CMDTABRET_KEEP;
        !           840: }
        !           841: 
        !           842: /* Handle an unknown command.  This should probably be done more
        !           843:    intelligently.  */
        !           844: 
        !           845: /*ARGSUSED*/
        !           846: static int
        !           847: iiunknown (pglobal, argc, argv, pvar, pinfo)
        !           848:      pointer pglobal;
        !           849:      int argc;
        !           850:      char **argv;
        !           851:      pointer pvar;
        !           852:      pointer pinfo;
        !           853: {
        !           854:   return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
        !           855: }
        !           856: 
        !           857: /* Return information for an unknown system.  It would be better to
        !           858:    put this in a different file, but it would require breaking several
        !           859:    functions out of this file.  Perhaps I will do it sometime.  */
        !           860: 
        !           861: int
        !           862: uuconf_taylor_system_unknown (pglobal, qsys)
        !           863:      pointer pglobal;
        !           864:      struct uuconf_system *qsys;
        !           865: {
        !           866:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !           867:   struct uuconf_cmdtab as[CSYSTEM_CMDS];
        !           868:   struct sinfo si;
        !           869:   struct sunknown *q;
        !           870:   int iret;
        !           871: 
        !           872:   if (qglobal->qprocess->qunknown == NULL)
        !           873:     return UUCONF_NOT_FOUND;
        !           874: 
        !           875:   _uuconf_ucmdtab_base (asIcmds, CSYSTEM_CMDS, (char *) qsys, as);
        !           876: 
        !           877:   _uuconf_uclear_system (qsys);
        !           878: 
        !           879:   si.qsys = qsys;
        !           880:   si.falternates = FALSE;
        !           881:   si.fdefault_alternates = TRUE;
        !           882:   qsys->uuconf_palloc = uuconf_malloc_block ();
        !           883:   if (qsys->uuconf_palloc == NULL)
        !           884:     {
        !           885:       qglobal->ierrno = errno;
        !           886:       return UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           887:     }
        !           888: 
        !           889:   for (q = qglobal->qprocess->qunknown; q != NULL; q = q->qnext)
        !           890:     {
        !           891:       iret = uuconf_cmd_args (pglobal, q->cargs, q->pzargs, as,
        !           892:                              (pointer) &si, iiunknown,
        !           893:                              UUCONF_CMDTABFLAG_BACKSLASH,
        !           894:                              qsys->uuconf_palloc);
        !           895:       iret &=~ UUCONF_CMDTABRET_KEEP;
        !           896:       if (UUCONF_ERROR_VALUE (iret) != UUCONF_SUCCESS)
        !           897:        {
        !           898:          qglobal->zfilename = qglobal->qprocess->zconfigfile;
        !           899:          qglobal->ilineno = q->ilineno;
        !           900:          return ((iret &~ UUCONF_CMDTABRET_EXIT)
        !           901:                  | UUCONF_ERROR_FILENAME
        !           902:                  | UUCONF_ERROR_LINENO);
        !           903:        }
        !           904:       if ((iret & UUCONF_CMDTABRET_EXIT) != 0)
        !           905:        break;
        !           906:     }
        !           907: 
        !           908:   if (! si.falternates)
        !           909:     uiset_call (qsys);
        !           910:   else
        !           911:     {
        !           912:       iret = iialternate (pglobal, 0, (char **) NULL, (pointer) NULL,
        !           913:                          (pointer) &si);
        !           914:       if (iret != UUCONF_SUCCESS)
        !           915:        return iret;
        !           916:     }
        !           917: 
        !           918:   /* The first alternate is always available for calling in.  */
        !           919:   qsys->uuconf_fcalled = TRUE;
        !           920: 
        !           921:   return _uuconf_isystem_basic_default (qglobal, qsys);
        !           922: }

unix.superglobalmegacorp.com

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