Annotation of coherent/g/usr/lib/uucp/tay104/uuconv.c, revision 1.1.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.