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

1.1     ! root        1: /* uuconv.c
        !             2:    Convert one type of UUCP configuration file to another.
        !             3: 
        !             4:    Copyright (C) 1991, 1992 Ian Lance Taylor
        !             5: 
        !             6:    This file is part of the Taylor UUCP package.
        !             7: 
        !             8:    This program is free software; you can redistribute it and/or
        !             9:    modify it under the terms of the GNU General Public License as
        !            10:    published by the Free Software Foundation; either version 2 of the
        !            11:    License, or (at your option) any later version.
        !            12: 
        !            13:    This program 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:    General Public License for more details.
        !            17: 
        !            18:    You should have received a copy of the GNU General Public License
        !            19:    along with this program; 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 uuconv_rcsid[] = "$Id: uuconv.c,v 1.1 93/07/30 07:58:14 bin Exp Locker: bin $";
        !            30: #endif
        !            31: 
        !            32: #include "getopt.h"
        !            33: 
        !            34: /* Local functions.  */
        !            35: 
        !            36: static void uvusage P((void));
        !            37: static void uvwrite_time P((FILE *e, struct uuconf_timespan *qtime));
        !            38: static void uvwrite_string P((FILE *e, const char *zarg, const char *zcmd));
        !            39: static void uvwrite_size P((FILE *e, struct uuconf_timespan *qsize,
        !            40:                            const char *zcmd));
        !            41: static void uvwrite_boolean P((FILE *e, int iarg, const char *zcmd));
        !            42: static void uvwrite_string_array P((FILE *e, char **pz, const char *zcmd));
        !            43: static void uvwrite_chat_script P((FILE *e, char **pz));
        !            44: static void uvwrite_chat P((FILE *e, const struct uuconf_chat *qchat,
        !            45:                            const struct uuconf_chat *qlast,
        !            46:                            const char *zprefix, boolean fforce));
        !            47: static void uvwrite_proto_params P((FILE *e,
        !            48:                                    const struct uuconf_proto_param *qparam,
        !            49:                                    const char *zprefix));
        !            50: static void uvwrite_taylor_system P((FILE *e,
        !            51:                                     const struct uuconf_system *qsys));
        !            52: static void uvwrite_v2_system P((FILE *e,
        !            53:                                 const struct uuconf_system *qsys));
        !            54: static void uvwrite_hdb_system P((FILE *e,
        !            55:                                  const struct uuconf_system *qsys));
        !            56: static boolean fvperm_string_cmp P((const char *z1, const char *z2));
        !            57: static boolean fvperm_array_cmp P((const char **pz1, const char **pz2));
        !            58: static void uvadd_perm P((struct shpermissions *qadd));
        !            59: static void uvwrite_perms P((void));
        !            60: static void uvwrite_perm_array P((FILE *e, const char **pz,
        !            61:                                  const char *zcmd, size_t *pccol));
        !            62: static void uvwrite_perm_boolean P((FILE *e, int f, const char *zcmd,
        !            63:                                    size_t *pccol, boolean fsendfiles));
        !            64: static void uvwrite_perm_rw_array P((FILE *e, const char **pz,
        !            65:                                     const char *zcmd, size_t *pccol));
        !            66: static void uvwrite_perm_string P((FILE *e, const char *z, const char *zcmd,
        !            67:                                   size_t *pccol));
        !            68: static int ivwrite_taylor_port P((struct uuconf_port *qport,
        !            69:                                  pointer pinfo));
        !            70: static int ivwrite_v2_port P((struct uuconf_port *qport, pointer pinfo));
        !            71: static int ivwrite_hdb_port P((struct uuconf_port *qport, pointer pinfo));
        !            72: static void uvwrite_taylor_port P((FILE *e, struct uuconf_port *qport,
        !            73:                                   const char *zprefix));
        !            74: static void uvwrite_taylor_dialer P((FILE *e, struct uuconf_dialer *qdialer,
        !            75:                                     const char *zprefix));
        !            76: static void uvwrite_hdb_dialer P((FILE *e, struct uuconf_dialer *qdialer));
        !            77: static void uvuuconf_error P((pointer puuconf, int iret));
        !            78: 
        !            79: /* A list of Permissions entries built when writing out HDB system
        !            80:    information.  */
        !            81: static struct shpermissions *qVperms;
        !            82: 
        !            83: /* Type of configuration file.  */
        !            84: enum tconfig
        !            85: {
        !            86:   CONFIG_TAYLOR,
        !            87:   CONFIG_V2,
        !            88:   CONFIG_HDB
        !            89: };
        !            90: 
        !            91: /* Long getopt options.  */
        !            92: static const struct option asVlongopts[] = { { NULL, 0, NULL, 0 } };
        !            93: 
        !            94: int
        !            95: main (argc, argv)
        !            96:      int argc;
        !            97:      char **argv;
        !            98: {
        !            99:   /* -I: The configuration file name.  */
        !           100:   const char *zconfig = NULL;
        !           101:   /* -i: Input type.  */
        !           102:   const char *zinput = NULL;
        !           103:   /* -o: Output type.  */
        !           104:   const char *zoutput = NULL;
        !           105:   /* -p: Program name.  */
        !           106:   const char *zprogram = NULL;
        !           107:   int iopt;
        !           108:   enum tconfig tinput, toutput;
        !           109:   int iret;
        !           110:   pointer pinput;
        !           111: 
        !           112:   while ((iopt = getopt_long (argc, argv, "i:I:o:p:x:", asVlongopts,
        !           113:                              (int *) NULL)) != EOF)
        !           114:     {
        !           115:       switch (iopt)
        !           116:        {
        !           117:        case 'i':
        !           118:          /* Input type.  */
        !           119:          zinput = optarg;
        !           120:          break;
        !           121: 
        !           122:        case 'o':
        !           123:          /* Output type.  */
        !           124:          zoutput = optarg;
        !           125:          break;
        !           126: 
        !           127:        case 'p':
        !           128:          /* Program name.  */
        !           129:          zprogram = optarg;
        !           130:          break;
        !           131: 
        !           132:        case 'I':
        !           133:          /* Set the configuration file name.  */
        !           134:          zconfig = optarg;
        !           135:          break;
        !           136: 
        !           137:        case 'x':
        !           138:          /* Set the debugging level.  */
        !           139:          break;
        !           140: 
        !           141:        case 0:
        !           142:          /* Long option found and flag set.  */
        !           143:          break;
        !           144: 
        !           145:        default:
        !           146:          uvusage ();
        !           147:          break;
        !           148:        }
        !           149:     }
        !           150: 
        !           151:   if (optind != argc
        !           152:       || zinput == NULL
        !           153:       || zoutput == NULL)
        !           154:     uvusage ();
        !           155: 
        !           156:   if (strcasecmp (zinput, "taylor") == 0)
        !           157:     tinput = CONFIG_TAYLOR;
        !           158:   else if (strcasecmp (zinput, "v2") == 0)
        !           159:     tinput = CONFIG_V2;
        !           160:   else if (strcasecmp (zinput, "hdb") == 0)
        !           161:     tinput = CONFIG_HDB;
        !           162:   else
        !           163:     {
        !           164:       uvusage ();
        !           165:       tinput = CONFIG_TAYLOR;
        !           166:     }
        !           167: 
        !           168:   if (strcasecmp (zoutput, "taylor") == 0)
        !           169:     toutput = CONFIG_TAYLOR;
        !           170:   else if (strcasecmp (zoutput, "v2") == 0)
        !           171:     toutput = CONFIG_V2;
        !           172:   else if (strcasecmp (zoutput, "hdb") == 0)
        !           173:     toutput = CONFIG_HDB;
        !           174:   else
        !           175:     {
        !           176:       uvusage ();
        !           177:       toutput = CONFIG_TAYLOR;
        !           178:     }
        !           179: 
        !           180:   if (tinput == toutput)
        !           181:     uvusage ();
        !           182: 
        !           183:   iret = UUCONF_SUCCESS;
        !           184: 
        !           185:   /* Initialize the input.  */
        !           186:   pinput = NULL;
        !           187:   switch (tinput)
        !           188:     {
        !           189:     case CONFIG_TAYLOR:
        !           190:       iret = uuconf_taylor_init (&pinput, zprogram, zconfig);
        !           191:       break;
        !           192:     case CONFIG_V2:
        !           193:       iret = uuconf_v2_init (&pinput);
        !           194:       break;
        !           195:     case CONFIG_HDB:
        !           196:       iret = uuconf_hdb_init (&pinput, zprogram);
        !           197:       break;
        !           198:     }
        !           199:   if (iret != UUCONF_SUCCESS)
        !           200:     {
        !           201:       uvuuconf_error (pinput, iret);
        !           202:       exit (EXIT_FAILURE);
        !           203:     }
        !           204: 
        !           205:   {
        !           206:     char **pzsystems;
        !           207:     char *zsys;
        !           208:     char abtaylor[sizeof ZCURDIR + sizeof SYSFILE - 1];
        !           209:     char abv2[sizeof ZCURDIR + sizeof V2_SYSTEMS - 1];
        !           210:     char abhdb[sizeof ZCURDIR + sizeof HDB_SYSTEMS - 1];
        !           211:     FILE *esys;
        !           212:     char **pz;
        !           213: 
        !           214:     /* Get the list of systems.  */
        !           215:     switch (tinput)
        !           216:       {
        !           217:       case CONFIG_TAYLOR:
        !           218:        iret = uuconf_taylor_system_names (pinput, &pzsystems, FALSE);
        !           219:        break;
        !           220:       case CONFIG_V2:
        !           221:        iret = uuconf_v2_system_names (pinput, &pzsystems, FALSE);
        !           222:        break;
        !           223:       case CONFIG_HDB:
        !           224:        iret = uuconf_hdb_system_names (pinput, &pzsystems, FALSE);
        !           225:        break;
        !           226:       }
        !           227:     if (iret != UUCONF_SUCCESS)
        !           228:       uvuuconf_error (pinput, iret);
        !           229:     else
        !           230:       {
        !           231:        /* Open the sys file for the output type.  */
        !           232:        switch (toutput)
        !           233:          {
        !           234:          default:
        !           235:          case CONFIG_TAYLOR:
        !           236:            sprintf (abtaylor, "%s%s", ZCURDIR, SYSFILE);
        !           237:            zsys = abtaylor;
        !           238:            break;
        !           239:          case CONFIG_V2:
        !           240:            sprintf (abv2, "%s%s", ZCURDIR, V2_SYSTEMS);
        !           241:            zsys = abv2;
        !           242:            break;
        !           243:          case CONFIG_HDB:
        !           244:            sprintf (abhdb, "%s%s", ZCURDIR, HDB_SYSTEMS);
        !           245:            zsys = abhdb;
        !           246:            break;
        !           247:          }
        !           248:        esys = fopen (zsys, "w");
        !           249:        if (esys == NULL)
        !           250:          {
        !           251:            fprintf (stderr, "uuchk:%s: ", zsys);
        !           252:            perror ("fopen");
        !           253:            exit (EXIT_FAILURE);
        !           254:          }
        !           255: 
        !           256:        fprintf (esys, "# %s file automatically generated by uuconv.\n",
        !           257:                 zsys);
        !           258: 
        !           259:        /* Read and write each system.  We cheat and call the internal
        !           260:           routines, so that we can easily detect default information and
        !           261:           not write it out.  This isn't necessary, but it makes the output
        !           262:           smaller and simpler.  */
        !           263:        for (pz = pzsystems; *pz != NULL; pz++)
        !           264:          {
        !           265:            struct uuconf_system ssys;
        !           266: 
        !           267:            switch (tinput)
        !           268:              {
        !           269:              case CONFIG_TAYLOR:
        !           270:                iret = _uuconf_itaylor_system_internal (pinput, *pz, &ssys);
        !           271:                break;
        !           272:              case CONFIG_V2:
        !           273:                iret = _uuconf_iv2_system_internal (pinput, *pz, &ssys);
        !           274:                break;
        !           275:              case CONFIG_HDB:
        !           276:                iret = _uuconf_ihdb_system_internal (pinput, *pz, &ssys);
        !           277:                break;
        !           278:              }
        !           279:            if (iret != UUCONF_SUCCESS)
        !           280:              uvuuconf_error (pinput, iret);
        !           281:            else
        !           282:              {
        !           283:                switch (toutput)
        !           284:                  {
        !           285:                  case CONFIG_TAYLOR:
        !           286:                    uvwrite_taylor_system (esys, &ssys);
        !           287:                    break;
        !           288:                  case CONFIG_V2:
        !           289:                    uvwrite_v2_system (esys, &ssys);
        !           290:                    break;
        !           291:                  case CONFIG_HDB:
        !           292:                    uvwrite_hdb_system (esys, &ssys);
        !           293:                    break;
        !           294:                  }
        !           295:                if (toutput != CONFIG_HDB)
        !           296:                  (void) uuconf_system_free (pinput, &ssys);
        !           297:              }
        !           298:          }
        !           299: 
        !           300:        if (toutput == CONFIG_HDB)
        !           301:          uvwrite_perms ();
        !           302: 
        !           303:        if (ferror (esys)
        !           304:            || fclose (esys) == EOF)
        !           305:          {
        !           306:            fprintf (stderr, "uuchk:%s: error during output\n", zsys);
        !           307:            exit (EXIT_FAILURE);
        !           308:          }
        !           309:       }
        !           310:   }
        !           311: 
        !           312:   {
        !           313:     /* Open the port file for the output type.  */
        !           314:     char *zport;
        !           315:     char abtaylor[sizeof ZCURDIR + sizeof PORTFILE - 1];
        !           316:     char abv2[sizeof ZCURDIR + sizeof V2_DEVICES - 1];
        !           317:     char abhdb[sizeof ZCURDIR + sizeof HDB_DEVICES - 1];
        !           318:     FILE *eport;
        !           319:     int (*piportfn) P((struct uuconf_port *, pointer));
        !           320:     struct uuconf_port sport;
        !           321: 
        !           322:     switch (toutput)
        !           323:       {
        !           324:       default:
        !           325:       case CONFIG_TAYLOR:
        !           326:        sprintf (abtaylor, "%s%s", ZCURDIR, PORTFILE);
        !           327:        zport = abtaylor;
        !           328:        piportfn = ivwrite_taylor_port;
        !           329:        break;
        !           330:       case CONFIG_V2:
        !           331:        sprintf (abv2, "%s%s", ZCURDIR, V2_DEVICES);
        !           332:        zport = abv2;
        !           333:        piportfn = ivwrite_v2_port;
        !           334:        break;
        !           335:       case CONFIG_HDB:
        !           336:        sprintf (abhdb, "%s%s", ZCURDIR, HDB_DEVICES);
        !           337:        zport = abhdb;
        !           338:        piportfn = ivwrite_hdb_port;
        !           339:        break;
        !           340:       }
        !           341:     eport = fopen (zport, "w");
        !           342:     if (eport == NULL)
        !           343:       {
        !           344:        fprintf (stderr, "uuchk:%s: ", zport);
        !           345:        perror ("fopen");
        !           346:        exit (EXIT_FAILURE);
        !           347:       }
        !           348: 
        !           349:     fprintf (eport, "# %s file automatically generated by uuconv.\n", zport);
        !           350: 
        !           351:     switch (tinput)
        !           352:       {
        !           353:       case CONFIG_TAYLOR:
        !           354:        iret = uuconf_taylor_find_port (pinput, (const char *) NULL, 0L,
        !           355:                                        0L, piportfn, (pointer) eport,
        !           356:                                        &sport);
        !           357:        break;
        !           358:       case CONFIG_V2:
        !           359:        iret = uuconf_v2_find_port (pinput, (const char *) NULL, 0L, 0L,
        !           360:                                    piportfn, (pointer) eport, &sport);
        !           361:        break;
        !           362:       case CONFIG_HDB:
        !           363:        iret = uuconf_hdb_find_port (pinput, (const char *) NULL, 0L, 0L,
        !           364:                                     piportfn, (pointer) eport, &sport);
        !           365:        break;
        !           366:       }
        !           367:        
        !           368:     if (iret != UUCONF_NOT_FOUND)
        !           369:       uvuuconf_error (pinput, iret);
        !           370: 
        !           371:     if (ferror (eport)
        !           372:        || fclose (eport) == EOF)
        !           373:       {
        !           374:        fprintf (stderr, "uuchk:%s: error during output\n", zport);
        !           375:        exit (EXIT_FAILURE);
        !           376:       }
        !           377:   }
        !           378: 
        !           379:   /* V2 configuration files don't support dialers.  */
        !           380:   if (tinput != CONFIG_V2 && toutput != CONFIG_V2)
        !           381:     {
        !           382:       char **pzdialers;
        !           383:       char *zdialer;
        !           384:       char abtaylor[sizeof ZCURDIR + sizeof DIALFILE - 1];
        !           385:       char abhdb[sizeof ZCURDIR + sizeof HDB_DIALERS - 1];
        !           386:       FILE *edialer;
        !           387:       char **pz;
        !           388: 
        !           389:       /* Get the list of dialers.  */
        !           390:       switch (tinput)
        !           391:        {
        !           392:        default:
        !           393:        case CONFIG_TAYLOR:
        !           394:          iret = uuconf_taylor_dialer_names (pinput, &pzdialers);
        !           395:          break;
        !           396:        case CONFIG_HDB:
        !           397:          iret = uuconf_hdb_dialer_names (pinput, &pzdialers);
        !           398:          break;
        !           399:        }
        !           400:       if (iret != UUCONF_SUCCESS)
        !           401:        uvuuconf_error (pinput, iret);
        !           402:       else
        !           403:        {
        !           404:          /* Open the sys file for the output type.  */
        !           405:          switch (toutput)
        !           406:            {
        !           407:            default:
        !           408:            case CONFIG_TAYLOR:
        !           409:              sprintf (abtaylor, "%s%s", ZCURDIR, DIALFILE);
        !           410:              zdialer = abtaylor;
        !           411:              break;
        !           412:            case CONFIG_HDB:
        !           413:              sprintf (abhdb, "%s%s", ZCURDIR, HDB_DIALERS);
        !           414:              zdialer = abhdb;
        !           415:              break;
        !           416:            }
        !           417:          edialer = fopen (zdialer, "w");
        !           418:          if (edialer == NULL)
        !           419:            {
        !           420:              fprintf (stderr, "uuchk:%s: ", zdialer);
        !           421:              perror ("fopen");
        !           422:              exit (EXIT_FAILURE);
        !           423:            }
        !           424: 
        !           425:          fprintf (edialer, "# %s file automatically generated by uuconv.\n",
        !           426:                   zdialer);
        !           427: 
        !           428:          /* Read and write each dialer.  */
        !           429:          for (pz = pzdialers; *pz != NULL; pz++)
        !           430:            {
        !           431:              struct uuconf_dialer sdialer;
        !           432: 
        !           433:              switch (tinput)
        !           434:                {
        !           435:                default:
        !           436:                case CONFIG_TAYLOR:
        !           437:                  iret = uuconf_taylor_dialer_info (pinput, *pz, &sdialer);
        !           438:                  break;
        !           439:                case CONFIG_HDB:
        !           440:                  iret = uuconf_hdb_dialer_info (pinput, *pz, &sdialer);
        !           441:                  break;
        !           442:                }
        !           443:              if (iret != UUCONF_SUCCESS)
        !           444:                uvuuconf_error (pinput, iret);
        !           445:              else
        !           446:                {
        !           447:                  switch (toutput)
        !           448:                    {
        !           449:                    default:
        !           450:                    case CONFIG_TAYLOR:
        !           451:                      fprintf (edialer, "# Start of dialer %s\n",
        !           452:                               sdialer.uuconf_zname);
        !           453:                      fprintf (edialer, "dialer %s\n", sdialer.uuconf_zname);
        !           454:                      uvwrite_taylor_dialer (edialer, &sdialer, "");
        !           455:                      break;
        !           456:                    case CONFIG_HDB:
        !           457:                      uvwrite_hdb_dialer (edialer, &sdialer);
        !           458:                      break;
        !           459:                    }
        !           460:                  (void) uuconf_dialer_free (pinput, &sdialer);
        !           461:                }
        !           462:            }
        !           463: 
        !           464:          if (ferror (edialer)
        !           465:              || fclose (edialer) == EOF)
        !           466:            {
        !           467:              fprintf (stderr, "uuchk:%s: error during output\n", zdialer);
        !           468:              exit (EXIT_FAILURE);
        !           469:            }
        !           470:        }
        !           471:     }
        !           472: 
        !           473:   exit (EXIT_SUCCESS);
        !           474: }
        !           475: 
        !           476: /* Print out a usage message and die.  */
        !           477: 
        !           478: static void
        !           479: uvusage ()
        !           480: {
        !           481:   fprintf (stderr,
        !           482:           "Taylor UUCP version %s, copyright (C) 1991, 1992 Ian Lance Taylor\n",
        !           483:           VERSION);
        !           484:   fprintf (stderr,
        !           485:           "Usage: uuconv -i input -o output [-p program] [-I file]\n");
        !           486:   fprintf (stderr,
        !           487:           " -i input: Set input type (one of taylor, v2, hdb)\n");
        !           488:   fprintf (stderr,
        !           489:           " -o output: Set output type (one of taylor, v2, hdb)\n");
        !           490:   fprintf (stderr,
        !           491:           " -p program: Program to convert (e.g., uucp or cu)\n");
        !           492:   fprintf (stderr,
        !           493:           " -I file: Set Taylor UUCP configuration file to use\n");
        !           494:   exit (EXIT_FAILURE);
        !           495: }
        !           496: 
        !           497: /* Write out a timespan.  */
        !           498: 
        !           499: static void
        !           500: uvwrite_time (e, qtime)
        !           501:      FILE *e;
        !           502:      struct uuconf_timespan *qtime;
        !           503: {
        !           504:   if (qtime == NULL)
        !           505:     {
        !           506:       fprintf (e, "Never");
        !           507:       return;
        !           508:     }
        !           509: 
        !           510:   if (qtime->uuconf_istart == 0 && qtime->uuconf_iend == 7 * 24 * 60)
        !           511:     {
        !           512:       fprintf (e, "Any");
        !           513:       return;
        !           514:     }
        !           515: 
        !           516:   for (; qtime != NULL; qtime = qtime->uuconf_qnext)
        !           517:     {
        !           518:       int idaystart, idayend;
        !           519:       int ihourstart, ihourend;
        !           520:       int iminutestart, iminuteend;
        !           521:       const char * const zdays = "Su\0Mo\0Tu\0We\0Th\0Fr\0Sa";
        !           522: 
        !           523:       idaystart = qtime->uuconf_istart / (24 * 60);
        !           524:       ihourstart = (qtime->uuconf_istart % (24 * 60)) / 60;
        !           525:       iminutestart = qtime->uuconf_istart % 60;
        !           526:       if (qtime->uuconf_iend >= 7 * 24 * 60)
        !           527:        qtime->uuconf_iend = 7 * 24 * 60 - 1;
        !           528:       idayend = qtime->uuconf_iend / (24 * 60);
        !           529:       ihourend = (qtime->uuconf_iend % (24 * 60)) / 60;
        !           530:       iminuteend = qtime->uuconf_iend % 60;
        !           531:       if (ihourend == 0 && iminuteend == 0)
        !           532:        --idayend;
        !           533: 
        !           534:       if (idaystart == idayend)
        !           535:        fprintf (e, "%s%02d%02d-%02d%02d", zdays + idaystart * 3,
        !           536:                 ihourstart, iminutestart, ihourend, iminuteend);
        !           537:       else
        !           538:        {
        !           539:          int i;
        !           540: 
        !           541:          fprintf (e, "%s%02d%02d-0000", zdays + idaystart * 3,
        !           542:                   ihourstart, iminutestart);
        !           543:          for (i = idaystart + 1; i < idayend; i++)
        !           544:            fprintf (e, ",%s", zdays + i * 3);
        !           545:          if (ihourend != 0 || iminuteend != 0)
        !           546:            fprintf (e, ",%s0000-%02d%02d", zdays + idayend * 3, ihourend,
        !           547:                     iminuteend);
        !           548:        }
        !           549: 
        !           550:       if (qtime->uuconf_qnext != NULL)
        !           551:        fprintf (e, ",");
        !           552:     }
        !           553: }
        !           554: 
        !           555: /* Some subroutines used when writing out Taylor UUCP configuration
        !           556:    files.  */
        !           557: 
        !           558: /* Write a command with a string argument.  */
        !           559: 
        !           560: static void
        !           561: uvwrite_string (e, zarg, zcmd)
        !           562:      FILE *e;
        !           563:      const char *zarg;
        !           564:      const char *zcmd;
        !           565: {
        !           566:   if (zarg != (const char *) &_uuconf_unset)
        !           567:     fprintf (e, "%s %s\n", zcmd, zarg == NULL ? (const char *) "" : zarg);
        !           568: }
        !           569: 
        !           570: /* Write out a size restriction command.  */
        !           571: 
        !           572: static void
        !           573: uvwrite_size (e, qtime, zcmd)
        !           574:      FILE *e;
        !           575:      struct uuconf_timespan *qtime;
        !           576:      const char *zcmd;
        !           577: {
        !           578:   if (qtime != (struct uuconf_timespan *) &_uuconf_unset)
        !           579:     {
        !           580:       for (; qtime != NULL; qtime = qtime->uuconf_qnext)
        !           581:        {
        !           582:          fprintf (e, "%s %ld", zcmd, qtime->uuconf_ival);
        !           583:          uvwrite_time (e, qtime);
        !           584:          fprintf (e, "\n");
        !           585:        }
        !           586:     }
        !           587: }
        !           588: 
        !           589: /* Write out a boolean argument with a string command.  If the value
        !           590:    is less than zero, than it was uninitialized and we don't write
        !           591:    anything.  */
        !           592: 
        !           593: static void
        !           594: uvwrite_boolean (e, fval, zcmd)
        !           595:      FILE *e;
        !           596:      int fval;
        !           597:      const char *zcmd;
        !           598: {
        !           599:   if (fval >= 0)
        !           600:     fprintf (e, "%s %s\n", zcmd, fval > 0 ? "true" : "false");
        !           601: }
        !           602: 
        !           603: /* Write out a string array as a single command.  */
        !           604: 
        !           605: static void
        !           606: uvwrite_string_array (e, pz, zcmd)
        !           607:      FILE *e;
        !           608:      char **pz;
        !           609:      const char *zcmd;
        !           610: {
        !           611:   if (pz != (char **) &_uuconf_unset)
        !           612:     {
        !           613:       fprintf (e, "%s", zcmd);
        !           614:       if (pz != NULL)
        !           615:        for (; *pz != NULL; pz++)
        !           616:          fprintf (e, " %s", *pz);
        !           617:       fprintf (e, "\n");
        !           618:     }
        !           619: }
        !           620: 
        !           621: /* Write out a chat script.  Don't separate subsend/subexpect strings
        !           622:    by spaces.  */
        !           623: 
        !           624: static void
        !           625: uvwrite_chat_script (e, pzarg)
        !           626:      FILE *e;
        !           627:      char **pzarg;
        !           628: {
        !           629:   char **pz;
        !           630: 
        !           631:   if (pzarg == NULL || pzarg == (char **) &_uuconf_unset)
        !           632:     return;
        !           633: 
        !           634:   for (pz = pzarg; *pz != NULL; pz++)
        !           635:     {
        !           636:       if ((*pz)[0] != '-' && pz != pzarg)
        !           637:        fprintf (e, " ");
        !           638:       fprintf (e, *pz);
        !           639:     }
        !           640: }
        !           641: 
        !           642: /* Write out chat information.  If the qlast argument is not NULL,
        !           643:    then only values that are different from qlast should be written.
        !           644:    The fforce argument is used to get around a peculiar problem: if
        !           645:    the ``chat'' command is used with no arguments for a system, then
        !           646:    uuconf_pzchat will be NULL (not &_uuconf_unset) and the default
        !           647:    chat script will not be used.  We must distinguish this case from
        !           648:    the ``chat'' command not appearing at all for a port or dialer, in
        !           649:    which case the value will again be NULL.  In the former case we
        !           650:    must output a ``chat'' command, in the latter case we would prefer
        !           651:    not to.  */
        !           652: 
        !           653: static void
        !           654: uvwrite_chat (e, q, qlast, zprefix, fforce)
        !           655:      FILE *e;
        !           656:      const struct uuconf_chat *q;
        !           657:      const struct uuconf_chat *qlast;
        !           658:      const char *zprefix;
        !           659:      boolean fforce;
        !           660: {
        !           661:   char **pz;
        !           662:   char ab[100];
        !           663: 
        !           664:   if (q->uuconf_pzchat != (char **) &_uuconf_unset
        !           665:       && (qlast == NULL
        !           666:          ? (fforce || q->uuconf_pzchat != NULL)
        !           667:          : qlast->uuconf_pzchat != q->uuconf_pzchat))
        !           668:     {
        !           669:       fprintf (e, "%schat ", zprefix);
        !           670:       uvwrite_chat_script (e, q->uuconf_pzchat);
        !           671:       fprintf (e, "\n");
        !           672:     }
        !           673: 
        !           674:   if (q->uuconf_pzprogram != (char **) &_uuconf_unset
        !           675:       && (qlast == NULL
        !           676:          ? q->uuconf_pzprogram != NULL
        !           677:          : qlast->uuconf_pzprogram != q->uuconf_pzprogram))
        !           678:     {
        !           679:       sprintf (ab, "%schat-program", zprefix);
        !           680:       uvwrite_string_array (e, q->uuconf_pzprogram, ab);
        !           681:     }
        !           682: 
        !           683:   if (q->uuconf_ctimeout >= 0
        !           684:       && (qlast == NULL
        !           685:          || qlast->uuconf_ctimeout != q->uuconf_ctimeout))
        !           686:     fprintf (e, "%schat-timeout %d\n", zprefix, q->uuconf_ctimeout);
        !           687: 
        !           688:   if (q->uuconf_pzfail != NULL
        !           689:       && q->uuconf_pzfail != (char **) &_uuconf_unset
        !           690:       && (qlast == NULL
        !           691:          || qlast->uuconf_pzfail != q->uuconf_pzfail))
        !           692:     for (pz = q->uuconf_pzfail; *pz != NULL; pz++)
        !           693:       fprintf (e, "%schat-fail %s\n", zprefix, *pz);
        !           694:       
        !           695:   if (qlast == NULL || qlast->uuconf_fstrip != q->uuconf_fstrip)
        !           696:     {
        !           697:       sprintf (ab, "%schat-strip", zprefix);
        !           698:       uvwrite_boolean (e, q->uuconf_fstrip, ab);
        !           699:     }
        !           700: }
        !           701: 
        !           702: /* Write out protocol parameters to a Taylor UUCP file.  */
        !           703: 
        !           704: static void
        !           705: uvwrite_proto_params (e, qparams, zprefix)
        !           706:      FILE *e;
        !           707:      const struct uuconf_proto_param *qparams;
        !           708:      const char *zprefix;
        !           709: {
        !           710:   const struct uuconf_proto_param *qp;
        !           711: 
        !           712:   if (qparams == NULL
        !           713:       || qparams == (struct uuconf_proto_param *) &_uuconf_unset)
        !           714:     return;
        !           715: 
        !           716:   for (qp = qparams; qp->uuconf_bproto != '\0'; qp++)
        !           717:     {
        !           718:       const struct uuconf_proto_param_entry *qe;
        !           719: 
        !           720:       for (qe = qp->uuconf_qentries; qe->uuconf_cargs > 0; qe++)
        !           721:        {
        !           722:          int i;
        !           723: 
        !           724:          fprintf (e, "%sprotocol-parameter %c", zprefix, qp->uuconf_bproto);
        !           725:          for (i = 0; i < qe->uuconf_cargs; i++)
        !           726:            fprintf (e, " %s", qe->uuconf_pzargs[i]);
        !           727:          fprintf (e, "\n");
        !           728:        }
        !           729:     }
        !           730: }
        !           731: 
        !           732: /* Write out Taylor UUCP system information.  */
        !           733: 
        !           734: static void
        !           735: uvwrite_taylor_system (e, q)
        !           736:      FILE *e;
        !           737:      const struct uuconf_system *q;
        !           738: {
        !           739:   char **pz;
        !           740:   const struct uuconf_system *qlast;
        !           741: 
        !           742:   fprintf (e, "# Start of system %s\n", q->uuconf_zname);
        !           743: 
        !           744:   fprintf (e, "system %s\n", q->uuconf_zname);
        !           745:   if (q->uuconf_pzalias != NULL
        !           746:       && q->uuconf_pzalias != (char **) &_uuconf_unset)
        !           747:     for (pz = q->uuconf_pzalias; *pz != NULL; pz++)
        !           748:       uvwrite_string (e, *pz, "alias");
        !           749: 
        !           750:   for (qlast = NULL; q != NULL; qlast = q, q = q->uuconf_qalternate)
        !           751:     {
        !           752:       struct uuconf_timespan *qtime;
        !           753: 
        !           754:       if (qlast != NULL)
        !           755:        {
        !           756:          fprintf (e, "alternate");
        !           757:          if (q->uuconf_zalternate != (char *) &_uuconf_unset
        !           758:              && q->uuconf_zalternate != NULL)
        !           759:            fprintf (e, " %s", q->uuconf_zalternate);
        !           760:          fprintf (e, "\n");
        !           761:        }
        !           762: 
        !           763: #define CHANGED(x) (qlast == NULL || qlast->x != q->x)
        !           764: 
        !           765:       if (CHANGED (uuconf_qtimegrade)
        !           766:          && (q->uuconf_qtimegrade
        !           767:              != (struct uuconf_timespan *) &_uuconf_unset))
        !           768:        {
        !           769:          if (q->uuconf_qtimegrade == NULL)
        !           770:            fprintf (e, "time never\n");
        !           771:          else
        !           772:            {
        !           773:              for (qtime = q->uuconf_qtimegrade;
        !           774:                   qtime != NULL;
        !           775:                   qtime = qtime->uuconf_qnext)
        !           776:                {
        !           777:                  if ((char) qtime->uuconf_ival == UUCONF_GRADE_LOW)
        !           778:                    fprintf (e, "time ");
        !           779:                  else
        !           780:                    fprintf (e, "timegrade %c ", (char) qtime->uuconf_ival);
        !           781:                  uvwrite_time (e, qtime);
        !           782:                  if (qtime->uuconf_cretry != 0)
        !           783:                    fprintf (e, " %d", qtime->uuconf_cretry);
        !           784:                  fprintf (e, "\n");
        !           785:                }
        !           786:            }
        !           787:        }
        !           788: 
        !           789:       if (CHANGED (uuconf_qcalltimegrade)
        !           790:          && (q->uuconf_qcalltimegrade
        !           791:              != (struct uuconf_timespan *) &_uuconf_unset))
        !           792:        {
        !           793:          for (qtime = q->uuconf_qcalltimegrade;
        !           794:               qtime != NULL;
        !           795:               qtime = qtime->uuconf_qnext)
        !           796:            {
        !           797:              fprintf (e, "call-timegrade %c ", (char) qtime->uuconf_ival);
        !           798:              uvwrite_time (e, qtime);
        !           799:              fprintf (e, "\n");
        !           800:            }
        !           801:        }
        !           802: 
        !           803:       if (CHANGED (uuconf_qcall_local_size))
        !           804:        uvwrite_size (e, q->uuconf_qcall_local_size, "call-local-size");
        !           805: 
        !           806:       if (CHANGED (uuconf_qcall_remote_size))
        !           807:        uvwrite_size (e, q->uuconf_qcall_remote_size, "call-remote-size");
        !           808: 
        !           809:       if (CHANGED (uuconf_qcalled_local_size))
        !           810:        uvwrite_size (e, q->uuconf_qcalled_local_size, "called-local-size");
        !           811: 
        !           812:       if (CHANGED (uuconf_qcalled_remote_size))
        !           813:        uvwrite_size (e, q->uuconf_qcalled_remote_size, "called-remote-size");
        !           814: 
        !           815:       if (CHANGED (uuconf_ibaud) || CHANGED (uuconf_ihighbaud))
        !           816:        {
        !           817:          if (q->uuconf_ibaud >= 0)
        !           818:            {
        !           819:              if (q->uuconf_ihighbaud > 0)
        !           820:                fprintf (e, "baud-range %ld %ld\n", q->uuconf_ibaud,
        !           821:                         q->uuconf_ihighbaud);
        !           822:              else
        !           823:                fprintf (e, "baud %ld\n", q->uuconf_ibaud);
        !           824:            }
        !           825:        }
        !           826: 
        !           827:       if (CHANGED (uuconf_zport) || CHANGED (uuconf_qport))
        !           828:        {
        !           829:          if (q->uuconf_zport != NULL
        !           830:              && q->uuconf_zport != (char *) &_uuconf_unset)
        !           831:            uvwrite_string (e, q->uuconf_zport, "port");
        !           832:          else if (q->uuconf_qport != NULL
        !           833:                   && (q->uuconf_qport
        !           834:                       != (struct uuconf_port *) &_uuconf_unset))
        !           835:            uvwrite_taylor_port (e, q->uuconf_qport, "port ");
        !           836:        }
        !           837: 
        !           838:       if (CHANGED (uuconf_zphone))
        !           839:        {
        !           840:          const char *zcmd;
        !           841: 
        !           842:          if (q->uuconf_qport != NULL
        !           843:              && q->uuconf_qport != (struct uuconf_port *) &_uuconf_unset
        !           844:              && (q->uuconf_qport->uuconf_ttype == UUCONF_PORTTYPE_TCP
        !           845:                  || q->uuconf_qport->uuconf_ttype == UUCONF_PORTTYPE_TLI))
        !           846:            zcmd = "address";
        !           847:          else
        !           848:            zcmd = "phone";
        !           849:          uvwrite_string (e, q->uuconf_zphone, zcmd);
        !           850:        }
        !           851: 
        !           852:       uvwrite_chat (e, &q->uuconf_schat,
        !           853:                    (qlast == NULL
        !           854:                     ? (struct uuconf_chat *) NULL
        !           855:                     : &qlast->uuconf_schat),
        !           856:                    "", TRUE);
        !           857: 
        !           858:       if (CHANGED (uuconf_zcall_login))
        !           859:        uvwrite_string (e, q->uuconf_zcall_login, "call-login");
        !           860: 
        !           861:       if (CHANGED (uuconf_zcall_password))
        !           862:        uvwrite_string (e, q->uuconf_zcall_password, "call-password");
        !           863: 
        !           864:       if (CHANGED (uuconf_zcalled_login))
        !           865:        uvwrite_string (e, q->uuconf_zcalled_login, "called-login");
        !           866: 
        !           867:       if (CHANGED (uuconf_fcallback))
        !           868:        uvwrite_boolean (e, q->uuconf_fcallback, "callback");
        !           869: 
        !           870:       if (CHANGED (uuconf_fsequence))
        !           871:        uvwrite_boolean (e, q->uuconf_fsequence, "sequence");
        !           872: 
        !           873:       if (CHANGED (uuconf_zprotocols))
        !           874:        uvwrite_string (e, q->uuconf_zprotocols, "protocol");
        !           875: 
        !           876:       if (CHANGED (uuconf_qproto_params))
        !           877:        uvwrite_proto_params (e, q->uuconf_qproto_params, "");
        !           878:       
        !           879:       uvwrite_chat (e, &q->uuconf_scalled_chat,
        !           880:                    (qlast == NULL
        !           881:                     ? (struct uuconf_chat *) NULL
        !           882:                     : &qlast->uuconf_scalled_chat),
        !           883:                    "called-", FALSE);
        !           884: 
        !           885:       if (CHANGED (uuconf_zdebug))
        !           886:        uvwrite_string (e, q->uuconf_zdebug, "debug");
        !           887: 
        !           888:       if (CHANGED (uuconf_zmax_remote_debug))
        !           889:        uvwrite_string (e, q->uuconf_zmax_remote_debug, "max-remote-debug");
        !           890: 
        !           891:       if ((CHANGED (uuconf_fsend_request)
        !           892:           || CHANGED (uuconf_frec_request))
        !           893:          && (q->uuconf_fsend_request >= 0
        !           894:              || q->uuconf_frec_request >= 0))
        !           895:        {
        !           896:          if (q->uuconf_fsend_request >= 0
        !           897:              && (q->uuconf_fsend_request > 0
        !           898:                  ? q->uuconf_frec_request > 0
        !           899:                  : q->uuconf_frec_request == 0))
        !           900:            uvwrite_boolean (e, q->uuconf_fsend_request, "request");
        !           901:          else
        !           902:            {
        !           903:              uvwrite_boolean (e, q->uuconf_fsend_request, "send-request");
        !           904:              uvwrite_boolean (e, q->uuconf_frec_request,
        !           905:                               "receive-request");
        !           906:            }
        !           907:        }
        !           908: 
        !           909:       if ((CHANGED (uuconf_fcall_transfer)
        !           910:           || CHANGED (uuconf_fcalled_transfer))
        !           911:          && (q->uuconf_fcall_transfer >= 0
        !           912:              || q->uuconf_fcalled_transfer >= 0))
        !           913:        {
        !           914:          if (q->uuconf_fcall_transfer >= 0
        !           915:              && (q->uuconf_fcall_transfer > 0
        !           916:                  ? q->uuconf_fcalled_transfer > 0
        !           917:                  : q->uuconf_fcalled_transfer == 0))
        !           918:            uvwrite_boolean (e, q->uuconf_fcall_transfer, "transfer");
        !           919:          else
        !           920:            {
        !           921:              uvwrite_boolean (e, q->uuconf_fcall_transfer, "call-transfer");
        !           922:              uvwrite_boolean (e, q->uuconf_fcalled_transfer,
        !           923:                               "called-transfer");
        !           924:            }
        !           925:        }
        !           926: 
        !           927:       if (CHANGED (uuconf_pzlocal_send))
        !           928:        uvwrite_string_array (e, q->uuconf_pzlocal_send, "local-send");
        !           929: 
        !           930:       if (CHANGED (uuconf_pzremote_send))
        !           931:        uvwrite_string_array (e, q->uuconf_pzremote_send, "remote-send");
        !           932: 
        !           933:       if (CHANGED (uuconf_pzlocal_receive))
        !           934:        uvwrite_string_array (e, q->uuconf_pzlocal_receive, "local-receive");
        !           935: 
        !           936:       if (CHANGED (uuconf_pzremote_receive))
        !           937:        uvwrite_string_array (e, q->uuconf_pzremote_receive,
        !           938:                              "remote-receive");
        !           939: 
        !           940:       if (CHANGED (uuconf_pzpath))
        !           941:        uvwrite_string_array (e, q->uuconf_pzpath, "command-path");
        !           942: 
        !           943:       if (CHANGED (uuconf_pzcmds))
        !           944:        uvwrite_string_array (e, q->uuconf_pzcmds, "commands");
        !           945: 
        !           946:       if (CHANGED (uuconf_cfree_space)
        !           947:          && q->uuconf_cfree_space >= 0)
        !           948:        fprintf (e, "free-space %ld\n", q->uuconf_cfree_space);
        !           949: 
        !           950:       if (CHANGED (uuconf_pzforward_from))
        !           951:        uvwrite_string_array (e, q->uuconf_pzforward_from, "forward-from");
        !           952: 
        !           953:       if (CHANGED (uuconf_pzforward_to))
        !           954:        uvwrite_string_array (e, q->uuconf_pzforward_to, "forward-to");
        !           955: 
        !           956:       if (CHANGED (uuconf_zpubdir))
        !           957:        uvwrite_string (e, q->uuconf_zpubdir, "pubdir");
        !           958: 
        !           959:       if (CHANGED (uuconf_zlocalname))
        !           960:        uvwrite_string (e, q->uuconf_zlocalname, "myname");
        !           961:     }
        !           962: }
        !           963: 
        !           964: /* Write out V2 system information.  */
        !           965: 
        !           966: static void
        !           967: uvwrite_v2_system (e, q)
        !           968:      FILE *e;
        !           969:      const struct uuconf_system *q;
        !           970: {
        !           971:   for (; q != NULL; q = q->uuconf_qalternate)
        !           972:     {
        !           973:       fprintf (e, "%s", q->uuconf_zname);
        !           974: 
        !           975:       if (q->uuconf_qtimegrade != (struct uuconf_timespan *) &_uuconf_unset)
        !           976:        {
        !           977:          fprintf (e, " ");
        !           978:          uvwrite_time (e, q->uuconf_qtimegrade);
        !           979: 
        !           980:          if (q->uuconf_zport != (char *) &_uuconf_unset
        !           981:              || q->uuconf_qport != (struct uuconf_port *) &_uuconf_unset)
        !           982:            {
        !           983:              struct uuconf_port *qp;
        !           984:              boolean ftcp;
        !           985: 
        !           986:              qp = q->uuconf_qport;
        !           987:              ftcp = (qp != (struct uuconf_port *) &_uuconf_unset
        !           988:                      && qp != NULL
        !           989:                      && qp->uuconf_ttype == UUCONF_PORTTYPE_TCP);
        !           990:              if (ftcp
        !           991:                  || (q->uuconf_zport != NULL
        !           992:                      && q->uuconf_zport != (char *) &_uuconf_unset))
        !           993:                {
        !           994:                  if (ftcp)
        !           995:                    fprintf (e, " TCP");
        !           996:                  else
        !           997:                    fprintf (e, " %s", q->uuconf_zport);
        !           998: 
        !           999:                  if (ftcp || q->uuconf_ibaud >= 0)
        !          1000:                    {
        !          1001:                      fprintf (e, " ");
        !          1002:                      if (ftcp)
        !          1003:                        {
        !          1004:                          const char *zport;
        !          1005: 
        !          1006:                          zport = qp->uuconf_u.uuconf_stcp.uuconf_zport;
        !          1007:                          if (zport == NULL)
        !          1008:                            zport = "uucp";
        !          1009:                          fprintf (e, "%s", zport);
        !          1010:                        }
        !          1011:                      else
        !          1012:                        fprintf (e, "%ld", q->uuconf_ibaud);
        !          1013: 
        !          1014:                      if (q->uuconf_zphone != (char *) &_uuconf_unset
        !          1015:                          && q->uuconf_zphone != NULL)
        !          1016:                        {
        !          1017:                          char **pzc;
        !          1018:                          
        !          1019:                          fprintf (e, " %s", q->uuconf_zphone);
        !          1020:                          pzc = q->uuconf_schat.uuconf_pzchat;
        !          1021:                          if (pzc != (char **) &_uuconf_unset
        !          1022:                              && pzc != NULL)
        !          1023:                            {
        !          1024:                              fprintf (e, " ");
        !          1025:                              uvwrite_chat_script (e, pzc);
        !          1026:                            }
        !          1027:                        }
        !          1028:                    }
        !          1029:                }
        !          1030:            }
        !          1031:        }
        !          1032: 
        !          1033:       fprintf (e, "\n");
        !          1034: 
        !          1035:       /* Here we should gather information to write out to USERFILE
        !          1036:         and L.cmds, and perhaps some day we will.  It's much more
        !          1037:         likely to happen if somebody else does it, though.  */
        !          1038:     }
        !          1039: }
        !          1040: 
        !          1041: /* Write out HDB system information.  */
        !          1042: 
        !          1043: static void
        !          1044: uvwrite_hdb_system (e, qsys)
        !          1045:      FILE *e;
        !          1046:      const struct uuconf_system *qsys;
        !          1047: {
        !          1048:   const struct uuconf_system *q;
        !          1049:   struct shpermissions sperm;
        !          1050:   char *azmachine[2];
        !          1051:   char *azlogname[2];
        !          1052: 
        !          1053:   for (q = qsys; q != NULL; q = q->uuconf_qalternate)
        !          1054:     {
        !          1055:       if (q->uuconf_fcall)
        !          1056:        {
        !          1057:          fprintf (e, "%s", q->uuconf_zname);
        !          1058: 
        !          1059:          if (q->uuconf_qtimegrade
        !          1060:              != (struct uuconf_timespan *) &_uuconf_unset)
        !          1061:            {
        !          1062:              const char *zport;
        !          1063: 
        !          1064:              fprintf (e, " ");
        !          1065:              uvwrite_time (e, q->uuconf_qtimegrade);
        !          1066: 
        !          1067:              zport = q->uuconf_zport;
        !          1068:              if (q->uuconf_qport != NULL
        !          1069:                  && q->uuconf_qport != (struct uuconf_port *) &_uuconf_unset
        !          1070:                  && q->uuconf_qport->uuconf_ttype == UUCONF_PORTTYPE_TCP)
        !          1071:                zport = "TCP";
        !          1072:              if (zport != NULL && zport != (char *) &_uuconf_unset)
        !          1073:                {
        !          1074:                  fprintf (e, " %s", zport);
        !          1075:                  if (q->uuconf_zprotocols != (char *) &_uuconf_unset
        !          1076:                      && q->uuconf_zprotocols != NULL)
        !          1077:                    fprintf (e, ",%s", q->uuconf_zprotocols);
        !          1078: 
        !          1079:                  if (q->uuconf_ibaud >= 0
        !          1080:                      || q->uuconf_zphone != (char *) &_uuconf_unset)
        !          1081:                    {
        !          1082:                      fprintf (e, " ");
        !          1083:                      if (q->uuconf_ibaud < 0)
        !          1084:                        fprintf (e, "Any");
        !          1085:                      else
        !          1086:                        {
        !          1087:                          fprintf (e, "%ld", q->uuconf_ibaud);
        !          1088:                          if (q->uuconf_ihighbaud >= 0)
        !          1089:                            fprintf (e, "-%ld", q->uuconf_ihighbaud);
        !          1090:                        }
        !          1091: 
        !          1092:                      if (q->uuconf_zphone != (char *) &_uuconf_unset
        !          1093:                          && q->uuconf_zphone != NULL)
        !          1094:                        {
        !          1095:                          char **pzc;
        !          1096:                          
        !          1097:                          fprintf (e, " %s", q->uuconf_zphone);
        !          1098:                          pzc = q->uuconf_schat.uuconf_pzchat;
        !          1099:                          if (pzc != (char **) &_uuconf_unset
        !          1100:                              && pzc != NULL)
        !          1101:                            {
        !          1102:                              fprintf (e, " ");
        !          1103:                              uvwrite_chat_script (e, pzc);
        !          1104:                            }
        !          1105:                        }
        !          1106:                    }
        !          1107:                }
        !          1108:            }
        !          1109: 
        !          1110:          fprintf (e, "\n");
        !          1111:        }
        !          1112:     }
        !          1113: 
        !          1114:   /* Build a Permissions entry for this system.  There will be only
        !          1115:      one MACHINE entry for a given system.  */
        !          1116: 
        !          1117:   for (q = qsys; q != NULL; q = q->uuconf_qalternate)
        !          1118:     if (q->uuconf_fcall)
        !          1119:       break;
        !          1120: 
        !          1121:   if (q != NULL)
        !          1122:     {
        !          1123:       sperm.qnext = NULL;
        !          1124:       sperm.pzlogname = NULL;
        !          1125:       sperm.pzmachine = NULL;
        !          1126:       sperm.frequest = -1;
        !          1127:       sperm.fsendfiles = -1;
        !          1128:       sperm.pzread = NULL;
        !          1129:       sperm.pzwrite = NULL;
        !          1130:       sperm.fcallback = -1;
        !          1131:       sperm.pzcommands = NULL;
        !          1132:       sperm.pzvalidate = NULL;
        !          1133:       sperm.zmyname = NULL;
        !          1134:       sperm.zpubdir = NULL;
        !          1135:       sperm.pzalias = NULL;
        !          1136: 
        !          1137:       azmachine[0] = q->uuconf_zname;
        !          1138:       azmachine[1] = NULL;
        !          1139:       sperm.pzmachine = azmachine;
        !          1140:       if (q->uuconf_fsend_request >= 0)
        !          1141:        sperm.frequest = q->uuconf_fsend_request;
        !          1142:       if (q->uuconf_pzremote_send != (char **) &_uuconf_unset
        !          1143:          && q->uuconf_pzremote_send != NULL)
        !          1144:        sperm.pzread = q->uuconf_pzremote_send;
        !          1145:       if (q->uuconf_pzremote_receive != (char **) &_uuconf_unset
        !          1146:          && q->uuconf_pzremote_receive != NULL)
        !          1147:        sperm.pzwrite = q->uuconf_pzremote_receive;
        !          1148:       if (q->uuconf_pzcmds != (char **) &_uuconf_unset
        !          1149:          && q->uuconf_pzcmds != NULL)
        !          1150:        sperm.pzcommands = q->uuconf_pzcmds;
        !          1151:       if (q->uuconf_zlocalname != (char *) &_uuconf_unset
        !          1152:          && q->uuconf_zlocalname != NULL)
        !          1153:        sperm.zmyname = q->uuconf_zlocalname;
        !          1154:       if (q->uuconf_zpubdir != (char *) &_uuconf_unset
        !          1155:          && q->uuconf_zpubdir != NULL)
        !          1156:        sperm.zpubdir = q->uuconf_zpubdir;
        !          1157:       if (q->uuconf_pzalias != (char **) &_uuconf_unset
        !          1158:          && q->uuconf_pzalias != NULL)
        !          1159:        sperm.pzalias = q->uuconf_pzalias;
        !          1160: 
        !          1161:       if (q->uuconf_fcalled
        !          1162:          && q->uuconf_zcalled_login != (char *) &_uuconf_unset
        !          1163:          && q->uuconf_zcalled_login != NULL)
        !          1164:        {
        !          1165:          azlogname[0] = q->uuconf_zcalled_login;
        !          1166:          azlogname[1] = NULL;
        !          1167:          sperm.pzlogname = azlogname;
        !          1168:          if (q->uuconf_fcalled_transfer >= 0)
        !          1169:            sperm.fsendfiles = q->uuconf_fcalled_transfer;
        !          1170:          if (q->uuconf_fcallback >= 0)
        !          1171:            sperm.fcallback = q->uuconf_fcallback;
        !          1172:          sperm.pzvalidate = azmachine;
        !          1173:        }
        !          1174: 
        !          1175:       uvadd_perm (&sperm);
        !          1176:     }
        !          1177: 
        !          1178:   /* Now add a Permissions entry for each alternative that is not used
        !          1179:      for calling out.  */
        !          1180:   for (q = qsys; q != NULL; q = q->uuconf_qalternate)
        !          1181:     {
        !          1182:       if (! q->uuconf_fcalled || q->uuconf_fcall)
        !          1183:        continue;
        !          1184: 
        !          1185:       sperm.qnext = NULL;
        !          1186:       sperm.pzlogname = NULL;
        !          1187:       sperm.pzmachine = NULL;
        !          1188:       sperm.frequest = -1;
        !          1189:       sperm.fsendfiles = -1;
        !          1190:       sperm.pzread = NULL;
        !          1191:       sperm.pzwrite = NULL;
        !          1192:       sperm.fcallback = -1;
        !          1193:       sperm.pzcommands = NULL;
        !          1194:       sperm.pzvalidate = NULL;
        !          1195:       sperm.zmyname = NULL;
        !          1196:       sperm.zpubdir = NULL;
        !          1197:       sperm.pzalias = NULL;
        !          1198: 
        !          1199:       if (q->uuconf_zcalled_login != (char *) &_uuconf_unset
        !          1200:          && q->uuconf_zcalled_login != NULL)
        !          1201:        azlogname[0] = q->uuconf_zcalled_login;
        !          1202:       else
        !          1203:        azlogname[0] = (char *) "OTHER";
        !          1204:       azlogname[1] = NULL;
        !          1205:       sperm.pzlogname = azlogname;
        !          1206: 
        !          1207:       if (q->uuconf_fsend_request >= 0)
        !          1208:        sperm.frequest = q->uuconf_fsend_request;
        !          1209:       if (q->uuconf_fcalled_transfer >= 0)
        !          1210:        sperm.fsendfiles = q->uuconf_fcalled_transfer;
        !          1211:       if (q->uuconf_pzremote_send != (char **) &_uuconf_unset
        !          1212:          && q->uuconf_pzremote_send != NULL)
        !          1213:        sperm.pzread = q->uuconf_pzremote_send;
        !          1214:       if (q->uuconf_pzremote_receive != (char **) &_uuconf_unset
        !          1215:          && q->uuconf_pzremote_receive != NULL)
        !          1216:        sperm.pzwrite = q->uuconf_pzremote_receive;
        !          1217:       if (q->uuconf_fcallback >= 0)
        !          1218:        sperm.fcallback = q->uuconf_fcallback;
        !          1219:       if (q->uuconf_zlocalname != (char *) &_uuconf_unset
        !          1220:          && q->uuconf_zlocalname != NULL)
        !          1221:        sperm.zmyname = q->uuconf_zlocalname;
        !          1222:       if (q->uuconf_zpubdir != (char *) &_uuconf_unset
        !          1223:          && q->uuconf_zpubdir != NULL)
        !          1224:        sperm.zpubdir = q->uuconf_zpubdir;
        !          1225: 
        !          1226:       uvadd_perm (&sperm);
        !          1227:     }
        !          1228: }
        !          1229: 
        !          1230: /* Compare two strings from a Permissions entry, returning TRUE if
        !          1231:    they are the same.  */
        !          1232: static boolean
        !          1233: fvperm_string_cmp (z1, z2)
        !          1234:      const char *z1;
        !          1235:      const char *z2;
        !          1236: {
        !          1237:   if (z1 == NULL
        !          1238:       ? z2 != NULL
        !          1239:       : z2 == NULL)
        !          1240:     return FALSE;
        !          1241: 
        !          1242:   if (z1 == NULL)
        !          1243:     return TRUE;
        !          1244: 
        !          1245:   return strcmp (z1, z2) == 0;
        !          1246: }
        !          1247: 
        !          1248: /* Compare two arrays of strings from a Permissions entry, returning
        !          1249:    TRUE if they are the same.  */
        !          1250: 
        !          1251: static boolean
        !          1252: fvperm_array_cmp (pz1, pz2)
        !          1253:      const char **pz1;
        !          1254:      const char **pz2;
        !          1255: {
        !          1256:   if (pz1 == NULL
        !          1257:       ? pz2 != NULL
        !          1258:       : pz2 == NULL)
        !          1259:     return FALSE;
        !          1260: 
        !          1261:   if (pz1 == NULL)
        !          1262:     return TRUE;
        !          1263: 
        !          1264:   for (; *pz1 != NULL && *pz2 != NULL; pz1++, pz2++)
        !          1265:     if (strcmp (*pz1, *pz2) != 0)
        !          1266:       break;
        !          1267: 
        !          1268:   return *pz1 == NULL && *pz2 == NULL;
        !          1269: }      
        !          1270: 
        !          1271: /* Add a Permissions entry to a global list, combining entries where
        !          1272:    possible.  */
        !          1273: 
        !          1274: static void
        !          1275: uvadd_perm (qadd)
        !          1276:      struct shpermissions *qadd;
        !          1277: {
        !          1278:   struct shpermissions *qlook;
        !          1279:   struct shpermissions *qnew;
        !          1280:   int iret;
        !          1281: 
        !          1282:   /* If there's no information, don't bother to add this entry.  */
        !          1283:   if (qadd->pzlogname == NULL
        !          1284:       && qadd->frequest < 0
        !          1285:       && qadd->fsendfiles < 0
        !          1286:       && qadd->pzread == NULL
        !          1287:       && qadd->pzwrite == NULL
        !          1288:       && qadd->fcallback < 0
        !          1289:       && qadd->pzcommands == NULL
        !          1290:       && qadd->pzvalidate == NULL
        !          1291:       && qadd->zmyname == NULL
        !          1292:       && qadd->zpubdir == NULL
        !          1293:       && qadd->pzalias == NULL)
        !          1294:     return;
        !          1295: 
        !          1296:   for (qlook = qVperms; qlook != NULL; qlook = qlook->qnext)
        !          1297:     {
        !          1298:       /* See if we can merge qadd into qlook.  */
        !          1299:       if (qadd->pzlogname == NULL
        !          1300:          ? qlook->pzlogname != NULL
        !          1301:          : qlook->pzlogname == NULL)
        !          1302:        continue;
        !          1303:       if (qadd->pzmachine == NULL
        !          1304:          ? qlook->pzmachine != NULL
        !          1305:          : qlook->pzmachine == NULL)
        !          1306:        continue;
        !          1307:       if (qadd->frequest != qlook->frequest
        !          1308:          || qadd->fsendfiles != qlook->fsendfiles
        !          1309:          || qadd->fcallback != qlook->fcallback)
        !          1310:        continue;
        !          1311:       if (! fvperm_string_cmp (qadd->zmyname, qlook->zmyname)
        !          1312:          || ! fvperm_string_cmp (qadd->zpubdir, qlook->zpubdir))
        !          1313:        continue;
        !          1314:       if (! fvperm_array_cmp ((const char **) qadd->pzread,
        !          1315:                              (const char **) qlook->pzread)
        !          1316:          || ! fvperm_array_cmp ((const char **)  qadd->pzwrite,
        !          1317:                                 (const char **) qlook->pzwrite)
        !          1318:          || ! fvperm_array_cmp ((const char **) qadd->pzcommands,
        !          1319:                                 (const char **) qlook->pzcommands))
        !          1320:        continue;
        !          1321: 
        !          1322:       /* Merge qadd into qlook.  */
        !          1323:       if (qadd->pzmachine != NULL)
        !          1324:        {
        !          1325:          iret = _uuconf_iadd_string ((struct sglobal *) NULL,
        !          1326:                                      qadd->pzmachine[0], FALSE,
        !          1327:                                      TRUE, &qlook->pzmachine,
        !          1328:                                      (pointer) NULL);
        !          1329:          if (iret != UUCONF_SUCCESS)
        !          1330:            uvuuconf_error ((pointer) NULL, iret);
        !          1331:        }
        !          1332:       if (qadd->pzlogname != NULL)
        !          1333:        {
        !          1334:          iret = _uuconf_iadd_string ((struct sglobal *) NULL,
        !          1335:                                      qadd->pzlogname[0], FALSE,
        !          1336:                                      TRUE, &qlook->pzlogname,
        !          1337:                                      (pointer) NULL);
        !          1338:          if (iret != UUCONF_SUCCESS)
        !          1339:            uvuuconf_error ((pointer) NULL, iret);
        !          1340:        }
        !          1341:       if (qadd->pzalias != NULL)
        !          1342:        {
        !          1343:          char **pz;
        !          1344: 
        !          1345:          for (pz = qadd->pzalias; *pz != NULL; pz++)
        !          1346:            {
        !          1347:              iret = _uuconf_iadd_string ((struct sglobal *) NULL,
        !          1348:                                          *pz, FALSE, TRUE,
        !          1349:                                          &qlook->pzalias, (pointer) NULL);
        !          1350:              if (iret != UUCONF_SUCCESS)
        !          1351:                uvuuconf_error ((pointer) NULL, iret);
        !          1352:            }
        !          1353:        }
        !          1354: 
        !          1355:       return;
        !          1356:     }
        !          1357: 
        !          1358:   /* We must add qadd as a new entry on the list, which means we must
        !          1359:      copy it into the heap.  */
        !          1360: 
        !          1361:   qnew = (struct shpermissions *) malloc (sizeof (struct shpermissions));
        !          1362:   if (qnew == NULL)
        !          1363:     uvuuconf_error ((pointer) NULL, UUCONF_MALLOC_FAILED);
        !          1364:   *qnew = *qadd;
        !          1365:   if (qadd->pzmachine != NULL)
        !          1366:     {
        !          1367:       qnew->pzmachine = NULL;
        !          1368:       iret = _uuconf_iadd_string ((struct sglobal *) NULL,
        !          1369:                                  qadd->pzmachine[0], FALSE,
        !          1370:                                  FALSE, &qnew->pzmachine,
        !          1371:                                  (pointer) NULL);
        !          1372:       if (iret != UUCONF_SUCCESS)
        !          1373:        uvuuconf_error ((pointer) NULL, iret);
        !          1374:     }
        !          1375:   if (qadd->pzlogname != NULL)
        !          1376:     {
        !          1377:       qnew->pzlogname = NULL;
        !          1378:       iret = _uuconf_iadd_string ((struct sglobal *) NULL,
        !          1379:                                  qadd->pzlogname[0], FALSE,
        !          1380:                                  FALSE, &qnew->pzlogname,
        !          1381:                                  (pointer) NULL);
        !          1382:       if (iret != UUCONF_SUCCESS)
        !          1383:        uvuuconf_error ((pointer) NULL, iret);
        !          1384:     }
        !          1385:   if (qadd->pzvalidate != NULL)
        !          1386:     qnew->pzvalidate = qnew->pzmachine;
        !          1387: 
        !          1388:   qnew->qnext = qVperms;
        !          1389:   qVperms = qnew;
        !          1390: }
        !          1391: 
        !          1392: /* Write out the Permissions entries.  */
        !          1393: 
        !          1394: static void
        !          1395: uvwrite_perms ()
        !          1396: {
        !          1397:   char ab[sizeof ZCURDIR + sizeof HDB_PERMISSIONS - 1];
        !          1398:   FILE *e;
        !          1399:   struct shpermissions *q;
        !          1400: 
        !          1401:   sprintf (ab, "%s%s", ZCURDIR, HDB_PERMISSIONS);
        !          1402:   e = fopen (ab, "w");
        !          1403:   if (e == NULL)
        !          1404:     {
        !          1405:       fprintf (stderr, "uuchk:%s: ", ab);
        !          1406:       perror ("fopen");
        !          1407:       exit (EXIT_FAILURE);
        !          1408:     }
        !          1409: 
        !          1410:   fprintf (e, "# Permissions file automatically generated by uuconv.\n");
        !          1411: 
        !          1412:   for (q = qVperms; q != NULL; q = q->qnext)
        !          1413:     {
        !          1414:       size_t ccol;
        !          1415: 
        !          1416:       ccol = 0;
        !          1417:       uvwrite_perm_array (e, (const char **) q->pzlogname, "LOGNAME", &ccol);
        !          1418:       uvwrite_perm_array (e, (const char **) q->pzmachine, "MACHINE", &ccol);
        !          1419:       uvwrite_perm_boolean (e, q->frequest, "REQUEST", &ccol, FALSE);
        !          1420:       uvwrite_perm_boolean (e, q->fsendfiles, "SENDFILES", &ccol, TRUE);
        !          1421:       uvwrite_perm_rw_array (e, (const char **) q->pzread, "READ", &ccol);
        !          1422:       uvwrite_perm_rw_array (e, (const char **) q->pzwrite, "WRITE", &ccol);
        !          1423:       uvwrite_perm_boolean (e, q->fcallback, "CALLBACK", &ccol, FALSE);
        !          1424:       uvwrite_perm_array (e, (const char **) q->pzcommands, "COMMANDS",
        !          1425:                          &ccol);
        !          1426:       uvwrite_perm_array (e, (const char **) q->pzvalidate, "VALIDATE",
        !          1427:                          &ccol);
        !          1428:       uvwrite_perm_string (e, q->zmyname, "MYNAME", &ccol);
        !          1429:       uvwrite_perm_string (e, q->zpubdir, "PUBDIR", &ccol);
        !          1430:       uvwrite_perm_array (e, (const char **) q->pzalias, "ALIAS", &ccol);
        !          1431: 
        !          1432:       fprintf (e, "\n");
        !          1433:     }
        !          1434: 
        !          1435:   if (ferror (e)
        !          1436:       || fclose (e) == EOF)
        !          1437:     {
        !          1438:       fprintf (stderr, "uuchk:%s: error during output\n", HDB_PERMISSIONS);
        !          1439:       exit (EXIT_FAILURE);
        !          1440:     }
        !          1441: }
        !          1442: 
        !          1443: /* Write an array out to the Permissions file.  */
        !          1444: 
        !          1445: static void
        !          1446: uvwrite_perm_array (e, pzarg, zcmd, pccol)
        !          1447:      FILE *e;
        !          1448:      const char **pzarg;
        !          1449:      const char *zcmd;
        !          1450:      size_t *pccol;
        !          1451: {
        !          1452:   size_t c;
        !          1453:   const char **pz;
        !          1454: 
        !          1455:   if (pzarg == NULL)
        !          1456:     return;
        !          1457: 
        !          1458:   c = strlen (zcmd) + 1;
        !          1459:   
        !          1460:   for (pz = pzarg; *pz != NULL; pz++)
        !          1461:     c += strlen (*pz) + 1;
        !          1462: 
        !          1463:   if (*pccol > 20 && c + *pccol > 75)
        !          1464:     {
        !          1465:       fprintf (e, " \\\n");
        !          1466:       *pccol = c - 1;
        !          1467:     }
        !          1468:   else
        !          1469:     {
        !          1470:       if (*pccol != 0)
        !          1471:        fprintf (e, " ");
        !          1472:       *pccol += c;
        !          1473:     }
        !          1474: 
        !          1475:   fprintf (e, "%s=", zcmd);
        !          1476:   for (pz = pzarg; *pz != NULL; pz++)
        !          1477:     {
        !          1478:       if (pz != pzarg)
        !          1479:        fprintf (e, ":");
        !          1480:       fprintf (e, "%s", *pz);
        !          1481:     }
        !          1482: }
        !          1483: 
        !          1484: /* Write a boolean value out to the Permissions file.  This may be
        !          1485:    either a yes/no boolean or a yes/call boolean (the latter is for
        !          1486:    SENDFILES).  */
        !          1487: 
        !          1488: static void
        !          1489: uvwrite_perm_boolean (e, f, zcmd, pccol, fsendfiles)
        !          1490:      FILE *e;
        !          1491:      int f;
        !          1492:      const char *zcmd;
        !          1493:      size_t *pccol;
        !          1494:      boolean fsendfiles;
        !          1495: {
        !          1496:   const char *az[2];
        !          1497: 
        !          1498:   if (f < 0)
        !          1499:     return;
        !          1500: 
        !          1501:   if (f)
        !          1502:     az[0] = "yes";
        !          1503:   else
        !          1504:     az[0] = fsendfiles ? "call" : "no";
        !          1505:   az[1] = NULL;
        !          1506: 
        !          1507:   uvwrite_perm_array (e, az, zcmd, pccol);
        !          1508: }
        !          1509: 
        !          1510: /* Write a set of READ or WRITE entries to the Permissions file.  We
        !          1511:    have to separate out all entries that start with '!'.  */
        !          1512: 
        !          1513: static void
        !          1514: uvwrite_perm_rw_array (e, pzarg, zcmd, pccol)
        !          1515:      FILE *e;
        !          1516:      const char **pzarg;
        !          1517:      const char *zcmd;
        !          1518:      size_t *pccol;
        !          1519: {
        !          1520:   size_t c;
        !          1521:   const char **pz, **pzcopy, **pzset;
        !          1522: 
        !          1523:   if (pzarg == NULL)
        !          1524:     return;
        !          1525: 
        !          1526:   c = 0;
        !          1527:   for (pz = pzarg; *pz != NULL; pz++)
        !          1528:     c++;
        !          1529: 
        !          1530:   pzcopy = (const char **) malloc ((c + 1) * sizeof (char *));
        !          1531:   if (pzcopy == NULL)
        !          1532:     uvuuconf_error ((pointer) NULL, UUCONF_MALLOC_FAILED);
        !          1533: 
        !          1534:   pzset = pzcopy;
        !          1535:   for (pz = pzarg; *pz != NULL; pz++)
        !          1536:     if ((*pz)[0] != '!')
        !          1537:       *pzset++ = *pz;
        !          1538:   *pzset = NULL;
        !          1539: 
        !          1540:   if (pzset != pzcopy)
        !          1541:     uvwrite_perm_array (e, (const char **) pzcopy, zcmd, pccol);
        !          1542: 
        !          1543:   pzset = pzcopy;
        !          1544:   for (pz = pzarg; *pz != NULL; pz++)
        !          1545:     if ((*pz)[0] == '!')
        !          1546:       *pzset++ = *pz;
        !          1547:   *pzset = NULL;
        !          1548: 
        !          1549:   if (pzset != pzcopy)
        !          1550:     {
        !          1551:       char ab[20];
        !          1552: 
        !          1553:       sprintf (ab, "NO%s", zcmd);
        !          1554:       uvwrite_perm_array (e, (const char **) pzcopy, ab, pccol);
        !          1555:     }
        !          1556: }
        !          1557: 
        !          1558: /* Write a string out to the Permissions file.  */
        !          1559: 
        !          1560: static void
        !          1561: uvwrite_perm_string (e, z, zcmd, pccol)
        !          1562:      FILE *e;
        !          1563:      const char *z;
        !          1564:      const char *zcmd;
        !          1565:      size_t *pccol;
        !          1566: {
        !          1567:   const char *az[2];
        !          1568: 
        !          1569:   if (z == NULL)
        !          1570:     return;
        !          1571: 
        !          1572:   az[0] = z;
        !          1573:   az[1] = NULL;
        !          1574: 
        !          1575:   uvwrite_perm_array (e, az, zcmd, pccol);
        !          1576: }
        !          1577: 
        !          1578: /* Write out a Taylor UUCP port.  This is called via uuconf_find_port;
        !          1579:    the pinfo argument is the port file.  */
        !          1580: 
        !          1581: static int
        !          1582: ivwrite_taylor_port (qport, pinfo)
        !          1583:      struct uuconf_port *qport;
        !          1584:      pointer pinfo;
        !          1585: {
        !          1586:   FILE *e = (FILE *) pinfo;
        !          1587: 
        !          1588:   fprintf (e, "port %s\n", qport->uuconf_zname);
        !          1589: 
        !          1590:   uvwrite_taylor_port (e, qport, "");
        !          1591: 
        !          1592:   /* Return UUCONF_NOT_FOUND to force uuconf_find_port to keep looking
        !          1593:      for ports.  */
        !          1594:   return UUCONF_NOT_FOUND;
        !          1595: }
        !          1596: 
        !          1597: /* Write a port out to a Taylor UUCP configuration file.  This doesn't
        !          1598:    output the name, since it is called to output a specially defined
        !          1599:    port in the sys file.  */
        !          1600: 
        !          1601: static void
        !          1602: uvwrite_taylor_port (e, qport, zprefix)
        !          1603:      FILE *e;
        !          1604:      struct uuconf_port *qport;
        !          1605:      const char *zprefix;
        !          1606: {
        !          1607:   const char *ztype;
        !          1608:   char ab[100];
        !          1609: 
        !          1610:   switch (qport->uuconf_ttype)
        !          1611:     {
        !          1612:     default:
        !          1613:     case UUCONF_PORTTYPE_UNKNOWN:
        !          1614:       fprintf (stderr, "uuconv: Bad port type\n");
        !          1615:       exit (EXIT_FAILURE);
        !          1616:       break;
        !          1617:     case UUCONF_PORTTYPE_STDIN:
        !          1618:       ztype = "stdin";
        !          1619:       break;
        !          1620:     case UUCONF_PORTTYPE_MODEM:
        !          1621:       ztype = "modem";
        !          1622:       break;
        !          1623:     case UUCONF_PORTTYPE_DIRECT:
        !          1624:       ztype = "direct";
        !          1625:       break;
        !          1626:     case UUCONF_PORTTYPE_TCP:
        !          1627:       ztype = "tcp";
        !          1628:       break;
        !          1629:     case UUCONF_PORTTYPE_TLI:
        !          1630:       ztype = "tli";
        !          1631:       break;
        !          1632:     }
        !          1633: 
        !          1634:   fprintf (e, "%stype %s\n", zprefix, ztype);
        !          1635: 
        !          1636:   if (qport->uuconf_zprotocols != NULL)
        !          1637:     fprintf (e, "%sprotocol %s\n", zprefix, qport->uuconf_zprotocols);
        !          1638: 
        !          1639:   if (qport->uuconf_qproto_params != NULL)
        !          1640:     uvwrite_proto_params (e, qport->uuconf_qproto_params, zprefix);
        !          1641: 
        !          1642:   if ((qport->uuconf_ireliable & UUCONF_RELIABLE_SPECIFIED) != 0)
        !          1643:     {
        !          1644:       sprintf (ab, "%sseven-bit", zprefix);
        !          1645:       uvwrite_boolean (e,
        !          1646:                       ((qport->uuconf_ireliable & UUCONF_RELIABLE_EIGHT)
        !          1647:                        == 0),
        !          1648:                       ab);
        !          1649:       sprintf (ab, "%sreliable", zprefix);
        !          1650:       uvwrite_boolean (e,
        !          1651:                       ((qport->uuconf_ireliable & UUCONF_RELIABLE_RELIABLE)
        !          1652:                        != 0),
        !          1653:                       ab);
        !          1654:       sprintf (ab, "%shalf-duplex", zprefix);
        !          1655:       uvwrite_boolean (e,
        !          1656:                       ((qport->uuconf_ireliable & UUCONF_RELIABLE_FULLDUPLEX)
        !          1657:                        == 0),
        !          1658:                       ab);
        !          1659:     }
        !          1660: 
        !          1661:   if (qport->uuconf_zlockname != NULL)
        !          1662:     fprintf (e, "%slockname %s\n", zprefix, qport->uuconf_zlockname);
        !          1663: 
        !          1664:   switch (qport->uuconf_ttype)
        !          1665:     {
        !          1666:     default:
        !          1667:       break;
        !          1668:     case UUCONF_PORTTYPE_MODEM:
        !          1669:       {
        !          1670:        struct uuconf_modem_port *qm;
        !          1671: 
        !          1672:        qm = &qport->uuconf_u.uuconf_smodem;
        !          1673:        if (qm->uuconf_zdevice != NULL)
        !          1674:          fprintf (e, "%sdevice %s\n", zprefix, qm->uuconf_zdevice);
        !          1675:        if (qm->uuconf_zdial_device != NULL)
        !          1676:          fprintf (e, "%sdial-device %s\n", zprefix, qm->uuconf_zdial_device);
        !          1677:        if (qm->uuconf_ibaud != 0)
        !          1678:          fprintf (e, "%sbaud %ld\n", zprefix, qm->uuconf_ibaud);
        !          1679:        if (qm->uuconf_ilowbaud != 0)
        !          1680:          fprintf (e, "%sbaud-range %ld %ld\n", zprefix, qm->uuconf_ilowbaud,
        !          1681:                   qm->uuconf_ihighbaud);
        !          1682:        if (! qm->uuconf_fcarrier)
        !          1683:          fprintf (e, "%scarrier false\n", zprefix);
        !          1684:        if (qm->uuconf_pzdialer != NULL)
        !          1685:          {
        !          1686:            if (qm->uuconf_pzdialer[1] == NULL)
        !          1687:              fprintf (e, "%sdialer %s\n", zprefix, qm->uuconf_pzdialer[0]);
        !          1688:            else
        !          1689:              {
        !          1690:                sprintf (ab, "%sdialer-sequence", zprefix);
        !          1691:                uvwrite_string_array (e, qm->uuconf_pzdialer, zprefix);
        !          1692:              }
        !          1693:          }
        !          1694:        if (qm->uuconf_qdialer != NULL)
        !          1695:          {
        !          1696:            sprintf (ab, "%sdialer ", zprefix);
        !          1697:            uvwrite_taylor_dialer (e, qm->uuconf_qdialer, ab);
        !          1698:          }
        !          1699:       }
        !          1700:       break;
        !          1701:     case UUCONF_PORTTYPE_DIRECT:
        !          1702:       {
        !          1703:        struct uuconf_direct_port *qd;
        !          1704: 
        !          1705:        qd = &qport->uuconf_u.uuconf_sdirect;
        !          1706:        if (qd->uuconf_zdevice != NULL)
        !          1707:          fprintf (e, "%sdevice %s\n", zprefix, qd->uuconf_zdevice);
        !          1708:        if (qd->uuconf_ibaud != 0)
        !          1709:          fprintf (e, "%sbaud %ld\n", zprefix, qd->uuconf_ibaud);
        !          1710:       }
        !          1711:       break;
        !          1712:     case UUCONF_PORTTYPE_TCP:
        !          1713:       if (qport->uuconf_u.uuconf_stcp.uuconf_zport != NULL)
        !          1714:        fprintf (e, "%sservice %s\n", zprefix,
        !          1715:                 qport->uuconf_u.uuconf_stcp.uuconf_zport);
        !          1716:       break;
        !          1717:     case UUCONF_PORTTYPE_TLI:
        !          1718:       {
        !          1719:        struct uuconf_tli_port *qt;
        !          1720: 
        !          1721:        qt = &qport->uuconf_u.uuconf_stli;
        !          1722:        if (qt->uuconf_zdevice != NULL)
        !          1723:          fprintf (e, "%sdevice %s\n", zprefix, qt->uuconf_zdevice);
        !          1724:        sprintf (ab, "%sstream", zprefix);
        !          1725:        uvwrite_boolean (e, qt->uuconf_fstream, ab);
        !          1726:        if (qt->uuconf_pzpush != NULL)
        !          1727:          {
        !          1728:            sprintf (ab, "%spush", zprefix);
        !          1729:            uvwrite_string_array (e, qt->uuconf_pzpush, ab);
        !          1730:          }
        !          1731:        if (qt->uuconf_pzdialer != NULL)
        !          1732:          {
        !          1733:            sprintf (ab, "%sdialer-sequence", zprefix);
        !          1734:            uvwrite_string_array (e, qt->uuconf_pzdialer, ab);
        !          1735:          }
        !          1736:        if (qt->uuconf_zservaddr != NULL)
        !          1737:          fprintf (e, "%sserver-address %s\n", zprefix,
        !          1738:                   qt->uuconf_zservaddr);
        !          1739:       }
        !          1740:       break;
        !          1741:     }
        !          1742: }
        !          1743: 
        !          1744: /* Write out a port to the V2 L-devices file.  This is called via
        !          1745:    uuconf_find_port.  */
        !          1746: 
        !          1747: static int
        !          1748: ivwrite_v2_port (qport, pinfo)
        !          1749:      struct uuconf_port *qport;
        !          1750:      pointer pinfo;
        !          1751: {
        !          1752:   FILE *e = (FILE *) pinfo;
        !          1753: 
        !          1754:   if (qport->uuconf_ttype == UUCONF_PORTTYPE_DIRECT)
        !          1755:     {
        !          1756:       fprintf (e, "DIR %s - %ld direct",
        !          1757:               qport->uuconf_u.uuconf_sdirect.uuconf_zdevice,
        !          1758:               qport->uuconf_u.uuconf_sdirect.uuconf_ibaud);
        !          1759:     }
        !          1760:   else if (qport->uuconf_ttype == UUCONF_PORTTYPE_MODEM)
        !          1761:     {
        !          1762:       fprintf (e, "%s %s ", qport->uuconf_zname,
        !          1763:               qport->uuconf_u.uuconf_smodem.uuconf_zdevice);
        !          1764:       if (qport->uuconf_u.uuconf_smodem.uuconf_zdial_device != NULL)
        !          1765:        fprintf (e, "%s", qport->uuconf_u.uuconf_smodem.uuconf_zdial_device);
        !          1766:       else
        !          1767:        fprintf (e, "-");
        !          1768:       fprintf (e, " ");
        !          1769:       if (qport->uuconf_u.uuconf_smodem.uuconf_ilowbaud != 0L)
        !          1770:        fprintf (e, "%ld-%ld",
        !          1771:                 qport->uuconf_u.uuconf_smodem.uuconf_ilowbaud,
        !          1772:                 qport->uuconf_u.uuconf_smodem.uuconf_ihighbaud);
        !          1773:       else if (qport->uuconf_u.uuconf_smodem.uuconf_ibaud != 0L)
        !          1774:        fprintf (e, "%ld", qport->uuconf_u.uuconf_smodem.uuconf_ibaud);
        !          1775:       else
        !          1776:        fprintf (e, "Any");
        !          1777:       if (qport->uuconf_u.uuconf_smodem.uuconf_pzdialer != NULL)
        !          1778:        fprintf (e, " %s",
        !          1779:                 qport->uuconf_u.uuconf_smodem.uuconf_pzdialer[0]);
        !          1780:     }
        !          1781:   else
        !          1782:     {
        !          1783:       fprintf (e, "# Ignoring port %s with unsupported type",
        !          1784:               qport->uuconf_zname);
        !          1785:     }
        !          1786: 
        !          1787:   fprintf (e, "\n");
        !          1788: 
        !          1789:   /* Return UUCONF_NOT_FOUND to force uuconf_find_port to keep looking
        !          1790:      for a port.  */
        !          1791:   return UUCONF_NOT_FOUND;
        !          1792: }
        !          1793: 
        !          1794: /* Write out a port to the HDB Devices file.  This is called via
        !          1795:    uuconf_find_port.  */
        !          1796: 
        !          1797: static int
        !          1798: ivwrite_hdb_port (qport, pinfo)
        !          1799:      struct uuconf_port *qport;
        !          1800:      pointer pinfo;
        !          1801: {
        !          1802:   FILE *e = (FILE *) pinfo;
        !          1803: 
        !          1804:   if (qport->uuconf_ttype == UUCONF_PORTTYPE_DIRECT)
        !          1805:     {
        !          1806:       fprintf (e, "Direct");
        !          1807:       if (qport->uuconf_zprotocols != NULL)
        !          1808:        fprintf (e, ",%s", qport->uuconf_zprotocols);
        !          1809:       fprintf (e, " ");
        !          1810:       if (qport->uuconf_u.uuconf_sdirect.uuconf_zdevice != NULL)
        !          1811:        fprintf (e, "%s", qport->uuconf_u.uuconf_sdirect.uuconf_zdevice);
        !          1812:       else
        !          1813:        fprintf (e, "%s", qport->uuconf_zname);
        !          1814:       fprintf (e, " - %ld", qport->uuconf_u.uuconf_sdirect.uuconf_ibaud);
        !          1815:     }
        !          1816:   else if (qport->uuconf_ttype == UUCONF_PORTTYPE_MODEM)
        !          1817:     {
        !          1818:       fprintf (e, "%s", qport->uuconf_zname);
        !          1819:       if (qport->uuconf_zprotocols != NULL)
        !          1820:        fprintf (e, ",%s", qport->uuconf_zprotocols);
        !          1821:       fprintf (e, " ");
        !          1822:       if (qport->uuconf_u.uuconf_smodem.uuconf_zdevice != NULL)
        !          1823:        fprintf (e, "%s", qport->uuconf_u.uuconf_smodem.uuconf_zdevice);
        !          1824:       else
        !          1825:        fprintf (e, "%s", qport->uuconf_zname);
        !          1826:       fprintf (e, " ");
        !          1827:       if (qport->uuconf_u.uuconf_smodem.uuconf_zdial_device != NULL)
        !          1828:        fprintf (e, "%s", qport->uuconf_u.uuconf_smodem.uuconf_zdial_device);
        !          1829:       else
        !          1830:        fprintf (e, "-");
        !          1831:       fprintf (e, " ");
        !          1832:       if (qport->uuconf_u.uuconf_smodem.uuconf_ilowbaud != 0L)
        !          1833:        fprintf (e, "%ld-%ld",
        !          1834:                 qport->uuconf_u.uuconf_smodem.uuconf_ilowbaud,
        !          1835:                 qport->uuconf_u.uuconf_smodem.uuconf_ihighbaud);
        !          1836:       else if (qport->uuconf_u.uuconf_smodem.uuconf_ibaud != 0L)
        !          1837:        fprintf (e, "%ld", qport->uuconf_u.uuconf_smodem.uuconf_ibaud);
        !          1838:       else
        !          1839:        fprintf (e, "Any");
        !          1840:       if (qport->uuconf_u.uuconf_smodem.uuconf_pzdialer != NULL)
        !          1841:        {
        !          1842:          char **pz;
        !          1843: 
        !          1844:          for (pz = qport->uuconf_u.uuconf_smodem.uuconf_pzdialer;
        !          1845:               *pz != NULL;
        !          1846:               pz++)
        !          1847:            fprintf (e, " %s", *pz);
        !          1848:        }
        !          1849:     }
        !          1850:   else if (qport->uuconf_ttype == UUCONF_PORTTYPE_TCP)
        !          1851:     {
        !          1852:       fprintf (e, "TCP");
        !          1853:       if (qport->uuconf_zprotocols != NULL)
        !          1854:        fprintf (e, ",%s", qport->uuconf_zprotocols);
        !          1855:       fprintf (e, " ");
        !          1856:       if (qport->uuconf_u.uuconf_stcp.uuconf_zport == NULL)
        !          1857:        fprintf (e, "uucp");
        !          1858:       else
        !          1859:        fprintf (e, "%s", qport->uuconf_u.uuconf_stcp.uuconf_zport);
        !          1860:       fprintf (e, " - -");
        !          1861:     }
        !          1862:   else if (qport->uuconf_ttype == UUCONF_PORTTYPE_TLI)
        !          1863:     {
        !          1864:       char **pz;
        !          1865: 
        !          1866:       fprintf (e, "%s", qport->uuconf_zname);
        !          1867:       if (qport->uuconf_zprotocols != NULL)
        !          1868:        fprintf (e, ",%s", qport->uuconf_zprotocols);
        !          1869:       fprintf (e, " ");
        !          1870:       if (qport->uuconf_u.uuconf_stli.uuconf_zdevice != NULL)
        !          1871:        fprintf (e, "%s", qport->uuconf_u.uuconf_smodem.uuconf_zdevice);
        !          1872:       else
        !          1873:        fprintf (e, "-");
        !          1874:       fprintf (e, " - -");
        !          1875:       pz = qport->uuconf_u.uuconf_stli.uuconf_pzdialer;
        !          1876:       if (pz == NULL
        !          1877:          || *pz == NULL
        !          1878:          || (strcmp (*pz, "TLI") != 0
        !          1879:              && strcmp (*pz, "TLIS") != 0))
        !          1880:        fprintf (e, " TLI%s \\D",
        !          1881:                 qport->uuconf_u.uuconf_stli.uuconf_fstream ? "S" : "");
        !          1882:       if (pz != NULL)
        !          1883:        for (; *pz != NULL; pz++)
        !          1884:          fprintf (e, " %s", *pz);
        !          1885:     }
        !          1886:   else
        !          1887:     {
        !          1888:       fprintf (e, "# Ignoring port %s with unsupported type",
        !          1889:               qport->uuconf_zname);
        !          1890:     }
        !          1891: 
        !          1892:   fprintf (e, "\n");
        !          1893: 
        !          1894:   /* Return UUCONF_NOT_FOUND to force uuconf_find_port to keep looking
        !          1895:      for a port.  */
        !          1896:   return UUCONF_NOT_FOUND;
        !          1897: }
        !          1898: 
        !          1899: /* Write a dialer out to a Taylor UUCP configuration file.  This
        !          1900:    doesn't output the name, since it is called to output a specially
        !          1901:    defined dialer in the sys or port file.  */
        !          1902: 
        !          1903: static void
        !          1904: uvwrite_taylor_dialer (e, qdialer, zprefix)
        !          1905:      FILE *e;
        !          1906:      struct uuconf_dialer *qdialer;
        !          1907:      const char *zprefix;
        !          1908: {
        !          1909:   char ab[100];
        !          1910: 
        !          1911:   /* Reset default values, so we don't output them unnecessarily.  */
        !          1912:   if (qdialer->uuconf_schat.uuconf_ctimeout == 60)
        !          1913:     qdialer->uuconf_schat.uuconf_ctimeout = -1;
        !          1914:   if (qdialer->uuconf_schat.uuconf_fstrip)
        !          1915:     qdialer->uuconf_schat.uuconf_fstrip = -1;
        !          1916:   if (qdialer->uuconf_scomplete.uuconf_ctimeout == 60)
        !          1917:     qdialer->uuconf_scomplete.uuconf_ctimeout = -1;
        !          1918:   if (qdialer->uuconf_scomplete.uuconf_fstrip)
        !          1919:     qdialer->uuconf_scomplete.uuconf_fstrip = -1;
        !          1920:   if (qdialer->uuconf_sabort.uuconf_ctimeout == 60)
        !          1921:     qdialer->uuconf_sabort.uuconf_ctimeout = -1;
        !          1922:   if (qdialer->uuconf_sabort.uuconf_fstrip)
        !          1923:     qdialer->uuconf_sabort.uuconf_fstrip = -1;
        !          1924:   
        !          1925:   uvwrite_chat (e, &qdialer->uuconf_schat, (struct uuconf_chat *) NULL,
        !          1926:                zprefix, FALSE);
        !          1927:   if (qdialer->uuconf_zdialtone != NULL
        !          1928:       && strcmp (qdialer->uuconf_zdialtone, ",") != 0)
        !          1929:     fprintf (e, "%sdialtone %s\n", zprefix, qdialer->uuconf_zdialtone);
        !          1930:   if (qdialer->uuconf_zpause != NULL
        !          1931:       && strcmp (qdialer->uuconf_zpause, ",") != 0)
        !          1932:     fprintf (e, "%spause %s\n", zprefix, qdialer->uuconf_zpause);
        !          1933:   if (! qdialer->uuconf_fcarrier)
        !          1934:     fprintf (e, "%scarrier false\n", zprefix);
        !          1935:   if (qdialer->uuconf_ccarrier_wait != 60)
        !          1936:     fprintf (e, "%scarrier-wait %d\n", zprefix,
        !          1937:             qdialer->uuconf_ccarrier_wait);
        !          1938:   if (qdialer->uuconf_fdtr_toggle)
        !          1939:     fprintf (e, "%sdtr-toggle %s %s\n", zprefix,
        !          1940:             qdialer->uuconf_fdtr_toggle ? "true" : "false",
        !          1941:             qdialer->uuconf_fdtr_toggle_wait ? "true" : "false");
        !          1942:   sprintf (ab, "%scomplete-", zprefix);
        !          1943:   uvwrite_chat (e, &qdialer->uuconf_scomplete, (struct uuconf_chat *) NULL,
        !          1944:                ab, FALSE);
        !          1945:   sprintf (ab, "%sabort-", zprefix);
        !          1946:   uvwrite_chat (e, &qdialer->uuconf_sabort, (struct uuconf_chat *) NULL,
        !          1947:                ab, FALSE);
        !          1948:   if (qdialer->uuconf_qproto_params != NULL)
        !          1949:     uvwrite_proto_params (e, qdialer->uuconf_qproto_params, zprefix);
        !          1950:   if ((qdialer->uuconf_ireliable & UUCONF_RELIABLE_SPECIFIED) != 0)
        !          1951:     {
        !          1952:       sprintf (ab, "%sseven-bit", zprefix);
        !          1953:       uvwrite_boolean (e,
        !          1954:                       ((qdialer->uuconf_ireliable & UUCONF_RELIABLE_EIGHT)
        !          1955:                        == 0),
        !          1956:                       ab);
        !          1957:       sprintf (ab, "%sreliable", zprefix);
        !          1958:       uvwrite_boolean (e,
        !          1959:                       ((qdialer->uuconf_ireliable & UUCONF_RELIABLE_RELIABLE)
        !          1960:                        != 0),
        !          1961:                       ab);
        !          1962:       sprintf (ab, "%shalf-duplex", zprefix);
        !          1963:       uvwrite_boolean (e,
        !          1964:                       ((qdialer->uuconf_ireliable
        !          1965:                         & UUCONF_RELIABLE_FULLDUPLEX) == 0),
        !          1966:                       ab);
        !          1967:     }
        !          1968: }
        !          1969: 
        !          1970: /* Write a dialer out to an HDB configuration file.  */
        !          1971: 
        !          1972: static void
        !          1973: uvwrite_hdb_dialer (e, qdialer)
        !          1974:      FILE *e;
        !          1975:      struct uuconf_dialer *qdialer;
        !          1976: {
        !          1977:   fprintf (e, "%s ", qdialer->uuconf_zname);
        !          1978: 
        !          1979:   if (qdialer->uuconf_zdialtone != NULL)
        !          1980:     fprintf (e, "=%c", qdialer->uuconf_zdialtone[0]);
        !          1981:   if (qdialer->uuconf_zpause != NULL)
        !          1982:     fprintf (e, "-%c", qdialer->uuconf_zpause[0]);
        !          1983: 
        !          1984:   if (qdialer->uuconf_schat.uuconf_pzchat != NULL)
        !          1985:     {
        !          1986:       if (qdialer->uuconf_zdialtone == NULL
        !          1987:          && qdialer->uuconf_zpause == NULL)
        !          1988:        fprintf (e, "\"\"");
        !          1989:       fprintf (e, " ");
        !          1990:       uvwrite_chat_script (e, qdialer->uuconf_schat.uuconf_pzchat);
        !          1991:     }
        !          1992: 
        !          1993:   fprintf (e, "\n");
        !          1994: }
        !          1995: 
        !          1996: /* Display a uuconf error and exit.  */
        !          1997: 
        !          1998: static void
        !          1999: uvuuconf_error (puuconf, iret)
        !          2000:      pointer puuconf;
        !          2001:      int iret;
        !          2002: {
        !          2003:   char ab[512];
        !          2004: 
        !          2005:   (void) uuconf_error_string (puuconf, iret, ab, sizeof ab);
        !          2006:   if ((iret & UUCONF_ERROR_FILENAME) == 0)
        !          2007:     fprintf (stderr, "uuconv: %s\n", ab);
        !          2008:   else
        !          2009:     fprintf (stderr, "uuconv:%s\n", ab);
        !          2010:   if (UUCONF_ERROR_VALUE (iret) != UUCONF_FOPEN_FAILED)
        !          2011:     exit (EXIT_FAILURE);
        !          2012: }

unix.superglobalmegacorp.com

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