home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / uucp / uuchk / uuchk.c < prev   
C/C++ Source or Header  |  1995-08-20  |  30KB  |  1,128 lines

  1. /* uuchk.c
  2.    Display what we think the permissions of systems are.
  3.  
  4.    Copyright (C) 1991, 1992, 1993, 1994, 1995 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  21.  
  22.    The author of the program may be contacted at ian@airs.com or
  23.    c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
  24.    */
  25.  
  26. #include "uucp.h"
  27.  
  28. #if USE_RCS_ID
  29. const char uuchk_rcsid[] = "$Id: uuchk.c,v 1.65 1995/07/18 00:59:30 ian Rel $";
  30. #endif
  31.  
  32. #include "getopt.h"
  33.  
  34. #include "uuconf.h"
  35.  
  36. /* Local functions.  */
  37.  
  38. static void ukusage P((void));
  39. static void ukhelp P((void));
  40. static void ukshow P((const struct uuconf_system *qsys,
  41.               pointer puuconf));
  42. static int ikshow_port P((struct uuconf_port *qport, pointer pinfo));
  43. static void ukshow_dialer P((struct uuconf_dialer *qdial));
  44. static void ukshow_chat P((const struct uuconf_chat *qchat,
  45.                const char *zhdr));
  46. static void ukshow_size P((struct uuconf_timespan *q, boolean fcall,
  47.                boolean flocal));
  48. static void ukshow_reliable P ((int i, const char *zhdr));
  49. static void ukshow_proto_params P((struct uuconf_proto_param *pas,
  50.                    int cindent));
  51. static void ukshow_time P((const struct uuconf_timespan *));
  52. static struct uuconf_timespan *qcompress_span P((struct uuconf_timespan *));
  53. static void ukuuconf_error P((pointer puuconf, int iret));
  54.  
  55. /* Structure used to pass uuconf pointer into ikshow_port and also let
  56.    it record whether any ports were found.  */
  57. struct sinfo
  58. {
  59.   /* The uuconf global pointer.  */
  60.   pointer puuconf;
  61.   /* The system.  */
  62.   const struct uuconf_system *qsys;
  63.   /* Whether any ports were seen.  */
  64.   boolean fgot;
  65. };
  66.  
  67. /* Program name.  */
  68. static const char *zKprogram;
  69.  
  70. /* Long getopt options.  */
  71. static const struct option asKlongopts[] =
  72. {
  73.   { "system", required_argument, NULL,'s' },
  74.   { "config", required_argument, NULL, 'I' },
  75.   { "debug", required_argument, NULL, 'x' },
  76.   { "version", no_argument, NULL, 'v' },
  77.   { "help", no_argument, NULL, 1 },
  78.   { NULL, 0, NULL, 0 }
  79. };
  80.  
  81. int
  82. main (argc, argv)
  83.      int argc;
  84.      char **argv;
  85. {
  86.   int iopt;
  87.   const char *zsystem = NULL;
  88.   const char *zconfig = NULL;
  89.   int iret;
  90.   pointer puuconf;
  91.  
  92.   zKprogram = argv[0];
  93.  
  94.   while ((iopt = getopt_long (argc, argv, "I:s:vx:", asKlongopts,
  95.                   (int *) NULL)) != EOF)
  96.     {
  97.       switch (iopt)
  98.     {
  99.     case 's':
  100.       /* Examine specific system.  */
  101.       zsystem = optarg;
  102.       break;
  103.  
  104.     case 'I':
  105.       /* Set the configuration file name.  */
  106.       zconfig = optarg;
  107.       break;
  108.  
  109.     case 'x':
  110.       /* Set the debugging level.  There is actually no debugging
  111.          information for this program.  */
  112.       break;
  113.  
  114.     case 'v':
  115.       /* Print version and exit.  */
  116.       printf ("%s: Taylor UUCP %s, copyright (C) 1991, 92, 93, 94, 1995 Ian Lance Taylor\n",
  117.           zKprogram, VERSION);
  118.       exit (EXIT_SUCCESS);
  119.       /*NOTREACHED*/
  120.       
  121.     case 1:
  122.       /* --help.  */
  123.       ukhelp ();
  124.       exit (EXIT_SUCCESS);
  125.       /*NOTREACHED*/
  126.  
  127.     case 0:
  128.       /* Long option found and flag set.  */
  129.       break;
  130.  
  131.     default:
  132.       ukusage ();
  133.       /*NOTREACHED*/
  134.     }
  135.     }
  136.  
  137.   if (optind != argc)
  138.     {
  139.       fprintf (stderr, "%s: too many arguments", zKprogram);
  140.       ukusage ();
  141.     }
  142.  
  143.   iret = uuconf_init (&puuconf, (const char *) NULL, zconfig);
  144.   if (iret != UUCONF_SUCCESS)
  145.     ukuuconf_error (puuconf, iret);
  146.  
  147.   if (zsystem != NULL)
  148.     {
  149.       struct uuconf_system ssys;
  150.  
  151.       iret = uuconf_system_info (puuconf, zsystem, &ssys);
  152.       if (iret == UUCONF_NOT_FOUND)
  153.     {
  154.       fprintf (stderr, "%s: system not found\n", zsystem);
  155.       exit (EXIT_FAILURE);
  156.     }
  157.       else if (iret != UUCONF_SUCCESS)
  158.     ukuuconf_error (puuconf, iret);
  159.  
  160.       ukshow (&ssys, puuconf);
  161.       (void) uuconf_system_free (puuconf, &ssys);
  162.     }
  163.   else
  164.     {
  165.       const char *zstr;
  166.       int iint;
  167.       char **pzsystems;
  168.  
  169.       iret = uuconf_localname (puuconf, &zstr);
  170.       if (iret == UUCONF_SUCCESS)
  171.     printf ("Local node name %s\n", zstr);
  172.       else if (iret != UUCONF_NOT_FOUND)
  173.     ukuuconf_error (puuconf, iret);
  174.  
  175.       iret = uuconf_spooldir (puuconf, &zstr);
  176.       if (iret != UUCONF_SUCCESS)
  177.     ukuuconf_error (puuconf, iret);
  178.       printf ("Spool directory %s\n", zstr);
  179.  
  180.       iret = uuconf_pubdir (puuconf, &zstr);
  181.       if (iret != UUCONF_SUCCESS)
  182.     ukuuconf_error (puuconf, iret);
  183.       printf ("Public directory %s\n", zstr);
  184.  
  185.       iret = uuconf_lockdir (puuconf, &zstr);
  186.       if (iret != UUCONF_SUCCESS)
  187.     ukuuconf_error (puuconf, iret);
  188.       printf ("Lock directory %s\n", zstr);
  189.  
  190.       iret = uuconf_logfile (puuconf, &zstr);
  191.       if (iret != UUCONF_SUCCESS)
  192.     ukuuconf_error (puuconf, iret);
  193.       printf ("Log file %s\n", zstr);
  194.  
  195.       iret = uuconf_statsfile (puuconf, &zstr);
  196.       if (iret != UUCONF_SUCCESS)
  197.     ukuuconf_error (puuconf, iret);
  198.       printf ("Statistics file %s\n", zstr);
  199.  
  200.       iret = uuconf_debugfile (puuconf, &zstr);
  201.       if (iret != UUCONF_SUCCESS)
  202.     ukuuconf_error (puuconf, iret);
  203.       printf ("Debug file %s\n", zstr);
  204.  
  205.       iret = uuconf_debuglevel (puuconf, &zstr);
  206.       if (iret != UUCONF_SUCCESS)
  207.     ukuuconf_error (puuconf, iret);
  208.       if (zstr != NULL)
  209.     printf ("Global debugging level %s\n", zstr);
  210.  
  211.       iret = uuconf_strip (puuconf, &iint);
  212.       if (iret != UUCONF_SUCCESS)
  213.     ukuuconf_error (puuconf, iret);
  214.       printf ("uucico -l will %sstrip login names and passwords\n",
  215.           (iint & UUCONF_STRIP_LOGIN) != 0 ? "" : "not ");
  216.       printf ("uucico will %sstrip UUCP protocol commands\n",
  217.           (iint & UUCONF_STRIP_PROTO) != 0 ? "" : "not ");
  218.  
  219.       iret = uuconf_maxuuxqts (puuconf, &iint);
  220.       if (iret != UUCONF_SUCCESS)
  221.     ukuuconf_error (puuconf, iret);
  222.       if (iint != 0)
  223.     printf ("Maximum number of uuxqt processes permitted %d\n", iint);
  224.  
  225.       iret = uuconf_runuuxqt (puuconf, &iint);
  226.       if (iret != UUCONF_SUCCESS)
  227.     ukuuconf_error (puuconf, iret);
  228.       if (iint > 0)
  229.     printf ("Start uuxqt every %d jobs\n", iint);
  230.       else
  231.     {
  232.       switch (iint)
  233.         {
  234.         case UUCONF_RUNUUXQT_NEVER:
  235.           printf ("Never start uuxqt\n");
  236.           break;
  237.         case UUCONF_RUNUUXQT_ONCE:
  238.           printf ("Start uuxqt once per uucico invocation\n");
  239.           break;
  240.         case UUCONF_RUNUUXQT_PERCALL:
  241.           printf ("Start uuxqt once per call\n");
  242.           break;
  243.         default:
  244.           fprintf (stderr, "Illegal value from uuconf_runuuxqt\n");
  245.           exit (EXIT_FAILURE);
  246.           break;
  247.         }
  248.     }
  249.  
  250.       iret = uuconf_system_names (puuconf, &pzsystems, FALSE);
  251.       if (iret != UUCONF_SUCCESS)
  252.     ukuuconf_error (puuconf, iret);
  253.  
  254.       if (*pzsystems == NULL)
  255.     {
  256.       fprintf (stderr, "%s: no systems found\n", zKprogram);
  257.       exit (EXIT_FAILURE);
  258.     }
  259.  
  260.       while (*pzsystems != NULL)
  261.     {
  262.       struct uuconf_system ssys;
  263.  
  264.       printf ("\n");
  265.       iret = uuconf_system_info (puuconf, *pzsystems, &ssys);
  266.       if (iret != UUCONF_SUCCESS)
  267.         ukuuconf_error (puuconf, iret);
  268.       else
  269.         ukshow (&ssys, puuconf);
  270.       (void) uuconf_system_free (puuconf, &ssys);
  271.       ++pzsystems;
  272.     }
  273.     }
  274.  
  275.   exit (EXIT_SUCCESS);
  276.  
  277.   /* Avoid errors about not returning a value.  */
  278.   return 0;
  279. }
  280.  
  281. /* Print a usage message and die.  */
  282.  
  283. static void ukusage ()
  284. {
  285.   fprintf (stderr, "Usage: %s [-s system] [-I file]\n", zKprogram);
  286.   fprintf (stderr, "Use %s --help for help\n", zKprogram);
  287.   exit (EXIT_FAILURE);
  288. }
  289.  
  290. /* Print a help message.  */
  291.  
  292. static void
  293. ukhelp ()
  294. {
  295.   printf ("Taylor UUCP %s, copyright (C) 1991, 92, 93, 94, 1995 Ian Lance Taylor\n",
  296.       VERSION);
  297.   printf ("Usage: %s [-s system] [-I file] [-v]\n", zKprogram);
  298.   printf (" -s,--system system: Only print configuration for named system\n");
  299.   printf (" -I,--config file: Set configuration file to use\n");
  300.   printf (" -v,--version: Print version and exit\n");
  301.   printf (" --help: Print help and exit\n");
  302. }
  303.  
  304. /* Dump out the information for a system.  */
  305.  
  306. static void
  307. ukshow (qsys, puuconf)
  308.      const struct uuconf_system *qsys;
  309.      pointer puuconf;
  310. {
  311.   char **pz;
  312.   int i;
  313.   int iret;
  314.   boolean fanycall;
  315.  
  316.   printf ("System: %s", qsys->uuconf_zname);
  317.   if (qsys->uuconf_pzalias != NULL)
  318.     {
  319.       printf (" (");
  320.       for (pz = qsys->uuconf_pzalias; *pz != NULL; pz++)
  321.     {
  322.       printf ("%s", *pz);
  323.       if (pz[1] != NULL)
  324.         printf (" ");
  325.     }
  326.       printf (")");
  327.     }
  328.   printf ("\n");
  329.  
  330.   fanycall = FALSE;
  331.   for (i = 0; qsys != NULL; qsys = qsys->uuconf_qalternate, i++)
  332.     {
  333.       boolean fcall, fcalled;
  334.       struct uuconf_timespan *qtime, *qspan;
  335.  
  336.       if (i != 0 || qsys->uuconf_qalternate != NULL)
  337.     {
  338.       printf ("Alternate %d", i);
  339.       if (qsys->uuconf_zalternate != NULL)
  340.         printf (" (%s)", qsys->uuconf_zalternate);
  341.       printf ("\n");
  342.     }
  343.  
  344.       /* See if this alternate could be used when calling out.  */
  345.       fcall = qsys->uuconf_fcall;
  346.       if (qsys->uuconf_qtimegrade == NULL)
  347.     fcall = FALSE;
  348.  
  349.       /* See if this alternate could be used when calling in.  */
  350.       fcalled = qsys->uuconf_fcalled;
  351.  
  352.       if (! fcall && ! fcalled)
  353.     {
  354.       printf (" This alternate is never used\n");
  355.       continue;
  356.     }
  357.  
  358.       if (fcall)
  359.     fanycall = TRUE;
  360.  
  361.       if (fcalled)
  362.     {
  363.       if (qsys->uuconf_zcalled_login != NULL
  364.           && strcmp (qsys->uuconf_zcalled_login, "ANY") != 0)
  365.         {
  366.           if (i == 0 && qsys->uuconf_qalternate == NULL)
  367.         printf (" Caller must log in as %s\n",
  368.             qsys->uuconf_zcalled_login);
  369.           else
  370.         printf (" When called using login name %s\n",
  371.             qsys->uuconf_zcalled_login);
  372.         }
  373.       else
  374.         printf (" When called using any login name\n");
  375.  
  376.       if (qsys->uuconf_zlocalname != NULL)
  377.         printf (" Will use %s as name of local system\n",
  378.             qsys->uuconf_zlocalname);
  379.     }
  380.  
  381.       if (fcalled && qsys->uuconf_fcallback)
  382.     {
  383.       printf (" If called, will call back\n");
  384.       fcalled = FALSE;
  385.     }
  386.  
  387.       if (fcall)
  388.     {
  389.       struct sinfo si;
  390.  
  391.       if (i == 0 && qsys->uuconf_qalternate == NULL)
  392.         printf (" Call out");
  393.       else
  394.         printf (" This alternate applies when calling");
  395.       
  396.       if (qsys->uuconf_zport != NULL || qsys->uuconf_qport != NULL)
  397.         {
  398.           printf (" using ");
  399.           if (qsys->uuconf_zport != NULL)
  400.         printf ("port %s", qsys->uuconf_zport);
  401.           else
  402.         printf ("a specially defined port");
  403.           if (qsys->uuconf_ibaud != 0)
  404.         {
  405.           printf (" at speed %ld", qsys->uuconf_ibaud);
  406.           if (qsys->uuconf_ihighbaud != 0)
  407.             printf (" to %ld", qsys->uuconf_ihighbaud);
  408.         }
  409.           printf ("\n");
  410.         }
  411.       else if (qsys->uuconf_ibaud != 0)
  412.         {
  413.           printf (" at speed %ld", qsys->uuconf_ibaud);
  414.           if (qsys->uuconf_ihighbaud != 0)
  415.         printf (" to %ld", qsys->uuconf_ihighbaud);
  416.           printf ("\n");
  417.         }
  418.       else
  419.         printf (" using any port\n");
  420.  
  421.       si.puuconf = puuconf;
  422.       si.qsys = qsys;
  423.       si.fgot = FALSE;
  424.  
  425.       if (qsys->uuconf_qport != NULL)
  426.         {
  427.           printf (" The port is defined as:\n");
  428.           (void) ikshow_port (qsys->uuconf_qport, (pointer) &si);
  429.         }
  430.       else
  431.         {
  432.           struct uuconf_port sdummy;
  433.  
  434.           printf (" The possible ports are:\n");
  435.           iret = uuconf_find_port (puuconf, qsys->uuconf_zport,
  436.                        qsys->uuconf_ibaud,
  437.                        qsys->uuconf_ihighbaud,
  438.                        ikshow_port, (pointer) &si,
  439.                        &sdummy);
  440.           if (iret != UUCONF_NOT_FOUND)
  441.         ukuuconf_error (puuconf, iret);
  442.           if (! si.fgot)
  443.         printf (" *** There are no matching ports\n");
  444.         }
  445.  
  446.       if (qsys->uuconf_zphone != NULL)
  447.         {
  448.           if ((qsys->uuconf_zport != NULL
  449.            && strcmp (qsys->uuconf_zport, "TCP") == 0)
  450.           || (qsys->uuconf_qport != NULL
  451.               && (qsys->uuconf_qport->uuconf_ttype
  452.               == UUCONF_PORTTYPE_TCP
  453.               || qsys->uuconf_qport->uuconf_ttype
  454.               == UUCONF_PORTTYPE_TLI)))
  455.         printf (" Remote address %s\n", qsys->uuconf_zphone);
  456.           else
  457.         printf (" Phone number %s\n", qsys->uuconf_zphone);
  458.         }
  459.  
  460.       ukshow_chat (&qsys->uuconf_schat, " Chat");
  461.  
  462.       if (qsys->uuconf_zcall_login != NULL
  463.           || qsys->uuconf_zcall_password != NULL)
  464.         {
  465.           char *zlogin, *zpass;
  466.  
  467.           iret = uuconf_callout (puuconf, qsys, &zlogin, &zpass);
  468.           if (iret == UUCONF_NOT_FOUND)
  469.         printf (" Can not determine login name or password\n");
  470.           else if (UUCONF_ERROR_VALUE (iret) == UUCONF_FOPEN_FAILED)
  471.         printf (" Can not read call out file\n");
  472.           else if (iret != UUCONF_SUCCESS)
  473.         ukuuconf_error (puuconf, iret);
  474.           else
  475.         {
  476.           if (zlogin != NULL)
  477.             {
  478.               printf (" Login name %s\n", zlogin);
  479.               free ((pointer) zlogin);
  480.             }
  481.           if (zpass != NULL)
  482.             {
  483.               printf (" Password %s\n", zpass);
  484.               free ((pointer) zpass);
  485.             }
  486.         }
  487.         }
  488.  
  489.       qtime = qcompress_span (qsys->uuconf_qtimegrade);
  490.  
  491.       for (qspan = qtime; qspan != NULL; qspan = qspan->uuconf_qnext)
  492.         {
  493.           printf (" ");
  494.           ukshow_time (qspan);
  495.           printf (" may call if ");
  496.           if ((char) qspan->uuconf_ival == UUCONF_GRADE_LOW)
  497.         printf ("any work");
  498.           else
  499.         printf ("work grade %c or higher", (char) qspan->uuconf_ival);
  500.           if (qspan->uuconf_cretry != 0)
  501.         printf (" (retry %d)", qspan->uuconf_cretry);
  502.           printf ("\n");
  503.         }
  504.  
  505.       if (qsys->uuconf_cmax_retries > 0)
  506.         printf (" May retry the call up to %d times\n",
  507.             qsys->uuconf_cmax_retries);
  508.  
  509.       if (qsys->uuconf_qcalltimegrade != NULL)
  510.         {
  511.           boolean fprint, fother;
  512.  
  513.           qtime = qcompress_span (qsys->uuconf_qcalltimegrade);
  514.           fprint = FALSE;
  515.           fother = FALSE;
  516.           if (qtime->uuconf_istart != 0)
  517.         fother = TRUE;
  518.           for (qspan = qtime; qspan != NULL; qspan = qspan->uuconf_qnext)
  519.         {
  520.           if ((char) qspan->uuconf_ival == UUCONF_GRADE_LOW)
  521.             {
  522.               fother = TRUE;
  523.               continue;
  524.             }
  525.           fprint = TRUE;
  526.           printf (" ");
  527.           ukshow_time (qspan);
  528.           printf (" may accept work grade %c or higher\n",
  529.               (char) qspan->uuconf_ival);
  530.           if (qspan->uuconf_qnext == NULL)
  531.             {
  532.               if (qspan->uuconf_iend != 7 * 24 * 60)
  533.             fother = TRUE;
  534.             }
  535.           else
  536.             {
  537.               if (qspan->uuconf_iend
  538.               != qspan->uuconf_qnext->uuconf_istart)
  539.             fother = TRUE;
  540.             }
  541.         }
  542.           if (fprint && fother)
  543.         printf (" (At other times may accept any work)\n");
  544.         }
  545.     }
  546.  
  547.       if (fcalled)
  548.     {
  549.       if (qsys->uuconf_qcalledtimegrade != NULL)
  550.         {
  551.           boolean fprint, fother;
  552.  
  553.           qtime = qcompress_span (qsys->uuconf_qcalledtimegrade);
  554.           fprint = FALSE;
  555.           fother = FALSE;
  556.           if (qtime->uuconf_istart != 0)
  557.         fother = TRUE;
  558.           for (qspan = qtime; qspan != NULL; qspan = qspan->uuconf_qnext)
  559.         {
  560.           if ((char) qspan->uuconf_ival == UUCONF_GRADE_LOW)
  561.             {
  562.               fother = TRUE;
  563.               continue;
  564.             }
  565.           fprint = TRUE;
  566.           printf (" ");
  567.           ukshow_time (qspan);
  568.           printf (" will send work grade %c or higher\n",
  569.               (char) qspan->uuconf_ival);
  570.           if (qspan->uuconf_qnext == NULL)
  571.             {
  572.               if (qspan->uuconf_iend != 7 * 24 * 60)
  573.             fother = TRUE;
  574.             }
  575.           else
  576.             {
  577.               if (qspan->uuconf_iend
  578.               != qspan->uuconf_qnext->uuconf_istart)
  579.             fother = TRUE;
  580.             }
  581.         }
  582.           if (fprint && fother)
  583.         printf (" (At other times will send any work)\n");
  584.         }
  585.     }
  586.  
  587.       if (fcall && qsys->uuconf_csuccess_wait != 0)
  588.     printf (" Will wait %d seconds after a successful call\n",
  589.         qsys->uuconf_csuccess_wait);
  590.  
  591.       if (qsys->uuconf_fsequence)
  592.     printf (" Sequence numbers are used\n");
  593.  
  594.       if (fcalled)
  595.     ukshow_chat (&qsys->uuconf_scalled_chat, " When called, chat");
  596.  
  597.       if (qsys->uuconf_zdebug != NULL)
  598.     printf (" Debugging level %s\n", qsys->uuconf_zdebug);
  599.       if (qsys->uuconf_zmax_remote_debug != NULL)
  600.     printf (" Max remote debugging level %s\n",
  601.         qsys->uuconf_zmax_remote_debug);
  602.  
  603.       if (fcall)
  604.     {
  605.       ukshow_size (qsys->uuconf_qcall_local_size, TRUE, TRUE);
  606.       ukshow_size (qsys->uuconf_qcall_remote_size, TRUE, FALSE);
  607.     }
  608.       if (fcalled)
  609.     {
  610.       ukshow_size (qsys->uuconf_qcalled_local_size, FALSE, TRUE);
  611.       ukshow_size (qsys->uuconf_qcalled_remote_size, FALSE, FALSE);
  612.     }
  613.  
  614.       if (fcall)
  615.     printf (" May %smake local requests when calling\n",
  616.         qsys->uuconf_fcall_transfer ? "" : "not ");
  617.  
  618.       if (fcalled)
  619.     printf (" May %smake local requests when called\n",
  620.         qsys->uuconf_fcalled_transfer ? "" : "not ");
  621.  
  622.       if (qsys->uuconf_fcall_transfer || qsys->uuconf_fcalled_transfer)
  623.     {
  624.       printf (" May send by local request:");
  625.       for (pz = qsys->uuconf_pzlocal_send; *pz != NULL; pz++)
  626.         printf (" %s", *pz);
  627.       printf ("\n");
  628.     }
  629.       if (! qsys->uuconf_fsend_request)
  630.     printf (" May not send files by remote request\n");
  631.       else
  632.     {
  633.       printf (" May send by remote request:");
  634.       for (pz = qsys->uuconf_pzremote_send; *pz != NULL; pz++)
  635.         printf (" %s", *pz);
  636.       printf ("\n");
  637.     }
  638.       if (qsys->uuconf_fcall_transfer || qsys->uuconf_fcalled_transfer)
  639.     {
  640.       printf (" May accept by local request:");
  641.       for (pz = qsys->uuconf_pzlocal_receive; *pz != NULL; pz++)
  642.         printf (" %s", *pz);
  643.       printf ("\n");
  644.     }
  645.       if (! qsys->uuconf_frec_request)
  646.     printf (" May not receive files by remote request\n");
  647.       else
  648.     {
  649.       printf (" May receive by remote request:");
  650.       for (pz = qsys->uuconf_pzremote_receive; *pz != NULL; pz++)
  651.         printf (" %s", *pz);
  652.       printf ("\n");
  653.     }
  654.  
  655.       printf (" May execute");
  656.       for (pz = qsys->uuconf_pzcmds; *pz != NULL; pz++)
  657.     printf (" %s", *pz);
  658.       printf ("\n");
  659.  
  660.       printf (" Execution path");
  661.       for (pz = qsys->uuconf_pzpath; *pz != NULL; pz++)
  662.     printf (" %s" , *pz);
  663.       printf ("\n");
  664.  
  665.       if (qsys->uuconf_cfree_space != 0)
  666.     printf (" Will leave %ld bytes available\n", qsys->uuconf_cfree_space);
  667.  
  668.       if (qsys->uuconf_zpubdir != NULL)
  669.     printf (" Public directory is %s\n", qsys->uuconf_zpubdir);
  670.  
  671.       if (qsys->uuconf_pzforward_from != NULL)
  672.     {
  673.       printf (" May forward from");
  674.       for (pz = qsys->uuconf_pzforward_from; *pz != NULL; pz++)
  675.         printf (" %s", *pz);
  676.       printf ("\n");
  677.     }
  678.       
  679.       if (qsys->uuconf_pzforward_to != NULL)
  680.     {
  681.       printf (" May forward to");
  682.       for (pz = qsys->uuconf_pzforward_to; *pz != NULL; pz++)
  683.         printf (" %s", *pz);
  684.       printf ("\n");
  685.     }
  686.       
  687.       if (qsys->uuconf_zprotocols != NULL)
  688.     printf (" Will use protocols %s\n", qsys->uuconf_zprotocols);
  689.       else
  690.     printf (" Will use any known protocol\n");
  691.  
  692.       if (qsys->uuconf_qproto_params != NULL)
  693.     ukshow_proto_params (qsys->uuconf_qproto_params, 1);
  694.     }
  695.  
  696.   if (! fanycall)
  697.     printf (" Calls will never be placed to this system\n");
  698. }
  699.  
  700. /* Show information about a port.  */
  701.  
  702. /*ARGSUSED*/
  703. static int
  704. ikshow_port (qport, pinfo)
  705.      struct uuconf_port *qport;
  706.      pointer pinfo;
  707. {
  708.   struct sinfo *qi = (struct sinfo *) pinfo;
  709.   char **pz;
  710.   struct uuconf_modem_port *qmodem;
  711.   struct uuconf_tcp_port *qtcp;
  712.   struct uuconf_tli_port *qtli;
  713.   struct uuconf_pipe_port *qpipe;
  714.  
  715.   qi->fgot = TRUE;
  716.  
  717.   printf ("  Port name %s\n", qport->uuconf_zname);
  718.   switch (qport->uuconf_ttype)
  719.     {
  720.     case UUCONF_PORTTYPE_STDIN:
  721.       printf ("   Port type stdin\n");
  722.       break;
  723.     case UUCONF_PORTTYPE_DIRECT:
  724.       printf ("   Port type direct\n");
  725.       if (qport->uuconf_u.uuconf_sdirect.uuconf_zdevice != NULL)
  726.     printf ("   Device %s\n",
  727.         qport->uuconf_u.uuconf_sdirect.uuconf_zdevice);
  728.       else
  729.     printf ("   Using port name as device name\n");
  730.       printf ("   Speed %ld\n", qport->uuconf_u.uuconf_sdirect.uuconf_ibaud);
  731.       printf ("   Carrier %savailable\n",
  732.           qport->uuconf_u.uuconf_sdirect.uuconf_fcarrier ? "" : "not ");
  733.       printf ("   Hardware flow control %savailable\n",
  734.           qport->uuconf_u.uuconf_sdirect.uuconf_fhardflow ? "" : "not ");
  735.       break;
  736.     case UUCONF_PORTTYPE_MODEM:
  737.       qmodem = &qport->uuconf_u.uuconf_smodem;
  738.       printf ("   Port type modem\n");
  739.       if (qmodem->uuconf_zdevice != NULL)
  740.     printf ("   Device %s\n", qmodem->uuconf_zdevice);
  741.       else
  742.     printf ("   Using port name as device name\n");
  743.       if (qmodem->uuconf_zdial_device != NULL)
  744.     printf ("   Dial device %s\n", qmodem->uuconf_zdial_device);
  745.       printf ("   Speed %ld\n", qmodem->uuconf_ibaud);
  746.       if (qmodem->uuconf_ilowbaud != qmodem->uuconf_ihighbaud)
  747.     printf ("   Speed range %ld to %ld\n", qmodem->uuconf_ilowbaud,
  748.         qmodem->uuconf_ihighbaud);
  749.       printf ("   Carrier %savailable\n",
  750.           qmodem->uuconf_fcarrier ? "" : "not ");
  751.       printf ("   Hardware flow control %savailable\n",
  752.           qmodem->uuconf_fhardflow ? "" : "not ");
  753.       if (qmodem->uuconf_qdialer != NULL)
  754.     {
  755.       printf ("   Specially defined dialer\n");
  756.       ukshow_dialer (qmodem->uuconf_qdialer);
  757.     }
  758.       else if (qmodem->uuconf_pzdialer != NULL
  759.            && qmodem->uuconf_pzdialer[0] != NULL)
  760.     {
  761.       struct uuconf_dialer sdial;
  762.       int iret;
  763.  
  764.       /* This might be a single dialer name, or it might be a
  765.          sequence of dialer/token pairs.  */
  766.  
  767.       if (qmodem->uuconf_pzdialer[1] == NULL
  768.           || qmodem->uuconf_pzdialer[2] == NULL)
  769.         {
  770.           iret = uuconf_dialer_info (qi->puuconf,
  771.                      qmodem->uuconf_pzdialer[0],
  772.                      &sdial);
  773.           if (iret == UUCONF_NOT_FOUND)
  774.         printf ("   *** No dialer %s\n", qmodem->uuconf_pzdialer[0]);
  775.           else if (iret != UUCONF_SUCCESS)
  776.         ukuuconf_error (qi->puuconf, iret);
  777.           else
  778.         {
  779.           printf ("   Dialer %s\n", qmodem->uuconf_pzdialer[0]);
  780.           ukshow_dialer (&sdial);
  781.           if (qmodem->uuconf_pzdialer[1] != NULL)
  782.             printf ("   Token %s\n", qmodem->uuconf_pzdialer[1]);
  783.         }
  784.         }
  785.       else
  786.         {
  787.           pz = qmodem->uuconf_pzdialer;
  788.           while (*pz != NULL)
  789.         {
  790.           iret = uuconf_dialer_info (qi->puuconf, *pz, &sdial);
  791.           if (iret == UUCONF_NOT_FOUND)
  792.             printf ("   *** No dialer %s\n", *pz);
  793.           else if (iret != UUCONF_SUCCESS)
  794.             ukuuconf_error (qi->puuconf, iret);
  795.           else
  796.             {
  797.               printf ("   Dialer %s\n", *pz);
  798.               ukshow_dialer (&sdial);
  799.             }
  800.  
  801.           ++pz;
  802.           if (*pz != NULL)
  803.             {
  804.               printf ("   Token %s\n", *pz);
  805.               ++pz;
  806.             }
  807.         }
  808.         }
  809.     }
  810.       else
  811.     printf ("   *** No dialer information\n");
  812.       break;
  813.     case UUCONF_PORTTYPE_TCP:
  814.       qtcp = &qport->uuconf_u.uuconf_stcp;
  815.       printf ("   Port type tcp\n");
  816.       printf ("   TCP service %s\n", qtcp->uuconf_zport);
  817.       if (qtcp->uuconf_pzdialer != NULL
  818.       && qtcp->uuconf_pzdialer[0] != NULL)
  819.     {
  820.       printf ("   Dialer sequence");
  821.       for (pz = qtcp->uuconf_pzdialer; *pz != NULL; pz++)
  822.         printf (" %s", *pz);
  823.       printf ("\n");
  824.     }
  825.       break;
  826.     case UUCONF_PORTTYPE_TLI:
  827.       qtli = &qport->uuconf_u.uuconf_stli;
  828.       printf ("   Port type TLI%s\n",
  829.           qtli->uuconf_fstream ? "S" : "");
  830.       if (qtli->uuconf_zdevice != NULL)
  831.     printf ("   Device %s\n", qtli->uuconf_zdevice);
  832.       else
  833.     printf ("   Using port name as device name\n");
  834.       if (qtli->uuconf_pzpush != NULL)
  835.     {
  836.       printf ("   Push");
  837.       for (pz = qtli->uuconf_pzpush; *pz != NULL; pz++)
  838.         printf (" %s", *pz);
  839.       printf ("\n");
  840.     }
  841.       if (qtli->uuconf_pzdialer != NULL
  842.       && qtli->uuconf_pzdialer[0] != NULL)
  843.     {
  844.       printf ("   Dialer sequence");
  845.       for (pz = qtli->uuconf_pzdialer; *pz != NULL; pz++)
  846.         printf (" %s", *pz);
  847.       printf ("\n");
  848.     }
  849.       if (qtli->uuconf_zservaddr != NULL)
  850.     printf ("   Server address %s\n", qtli->uuconf_zservaddr);
  851.       break;
  852.     case UUCONF_PORTTYPE_PIPE:
  853.       qpipe = &qport->uuconf_u.uuconf_spipe;
  854.       printf ("   Port type pipe\n");
  855.       if (qpipe->uuconf_pzcmd != NULL)
  856.     {
  857.       printf ("   Command");
  858.       for (pz = qpipe->uuconf_pzcmd; *pz != NULL; pz++)
  859.         printf (" %s", *pz);
  860.       printf ("\n");
  861.     }
  862.       break;
  863.     default:
  864.       fprintf (stderr, "   CAN'T HAPPEN\n");
  865.       break;
  866.     }
  867.  
  868.   if (qport->uuconf_zprotocols != NULL)
  869.     printf ("   Will use protocols %s\n", qport->uuconf_zprotocols);
  870.  
  871.   if (qport->uuconf_zlockname != NULL)
  872.     printf ("   Will use lockname %s\n", qport->uuconf_zlockname);
  873.  
  874.   if ((qport->uuconf_ireliable & UUCONF_RELIABLE_SPECIFIED) != 0)
  875.     ukshow_reliable (qport->uuconf_ireliable, "   ");
  876.  
  877.   if (qport->uuconf_qproto_params != NULL)
  878.     ukshow_proto_params (qport->uuconf_qproto_params, 3);
  879.  
  880.   /* Return NOT_FOUND to force find_port to continue searching.  */
  881.   return UUCONF_NOT_FOUND;
  882. }
  883.  
  884. /* Show information about a dialer.  */
  885.  
  886. static void
  887. ukshow_dialer (q)
  888.      struct uuconf_dialer *q;
  889. {
  890.   ukshow_chat (&q->uuconf_schat, "    Chat");
  891.   printf ("    Wait for dialtone %s\n", q->uuconf_zdialtone);
  892.   printf ("    Pause while dialing %s\n", q->uuconf_zpause);
  893.   printf ("    Carrier %savailable\n", q->uuconf_fcarrier ? "" : "not ");
  894.   if (q->uuconf_fcarrier)
  895.     printf ("    Wait %d seconds for carrier\n", q->uuconf_ccarrier_wait);
  896.   if (q->uuconf_fdtr_toggle)
  897.     {
  898.       printf ("    Toggle DTR");
  899.       if (q->uuconf_fdtr_toggle_wait)
  900.     printf (" and wait");
  901.       printf ("\n");
  902.     }
  903.   ukshow_chat (&q->uuconf_scomplete, "    When complete chat");
  904.   ukshow_chat (&q->uuconf_sabort, "    When aborting chat");
  905.   if ((q->uuconf_ireliable & UUCONF_RELIABLE_SPECIFIED) != 0)
  906.     ukshow_reliable (q->uuconf_ireliable, "   ");
  907.   if (q->uuconf_qproto_params != NULL)
  908.     ukshow_proto_params (q->uuconf_qproto_params, 4);
  909. }
  910.  
  911. /* Show a chat script.  */
  912.  
  913. static void
  914. ukshow_chat (qchat, zhdr)
  915.      const struct uuconf_chat *qchat;
  916.      const char *zhdr;
  917. {
  918.   char **pz;
  919.  
  920.   if (qchat->uuconf_pzprogram != NULL)
  921.     {
  922.       printf ("%s program", zhdr);
  923.       for (pz = qchat->uuconf_pzprogram; *pz != NULL; pz++)
  924.     printf (" %s", *pz);
  925.       printf ("\n");
  926.     }
  927.  
  928.   if (qchat->uuconf_pzchat != NULL)
  929.     {
  930.  
  931.       printf ("%s script", zhdr);
  932.       for (pz = qchat->uuconf_pzchat; *pz != NULL; pz++)
  933.     {
  934.       if ((*pz)[0] != '-' || pz == qchat->uuconf_pzchat)
  935.         printf (" ");
  936.       printf ("%s", *pz);
  937.     }
  938.       printf ("\n");
  939.       printf ("%s script timeout %d\n", zhdr, qchat->uuconf_ctimeout);
  940.       if (qchat->uuconf_pzfail != NULL)
  941.     {
  942.       printf ("%s failure strings", zhdr);
  943.       for (pz = qchat->uuconf_pzfail; *pz != NULL; pz++)
  944.         printf (" %s", *pz);
  945.       printf ("\n");
  946.     }
  947.       if (qchat->uuconf_fstrip)
  948.     printf ("%s script incoming bytes stripped to seven bits\n", zhdr);
  949.     }
  950. }
  951.  
  952. /* Show a size/time restriction.  */
  953.  
  954. static void
  955. ukshow_size (qspan, fcall, flocal)
  956.      struct uuconf_timespan *qspan;
  957.      boolean fcall;
  958.      boolean flocal;
  959. {
  960.   struct uuconf_timespan *q;
  961.   boolean fother;
  962.  
  963.   qspan = qcompress_span (qspan);
  964.   if (qspan == NULL)
  965.     return;
  966.  
  967.   printf (" If call%s the following applies to a %s request:\n",
  968.       fcall ? "ing" : "ed", flocal ? "local" : "remote");
  969.  
  970.   fother = FALSE;
  971.   if (qspan->uuconf_istart >= 60)
  972.     fother = TRUE;
  973.  
  974.   for (q = qspan; q != NULL; q = q->uuconf_qnext)
  975.     {
  976.       printf ("  ");
  977.       ukshow_time (q);
  978.       printf (" may transfer files %ld bytes or smaller\n", q->uuconf_ival);
  979.       if (q->uuconf_qnext == NULL)
  980.     {
  981.       if (q->uuconf_iend <= 6 * 24 * 60 + 23 * 60)
  982.         fother = TRUE;
  983.     }
  984.       else
  985.     {
  986.       if (q->uuconf_iend + 60 <= q->uuconf_qnext->uuconf_istart)
  987.         fother = TRUE;
  988.     }
  989.     }
  990.  
  991.   if (fother)
  992.     printf ("  (At other times may send files of any size)\n");
  993. }
  994.  
  995. /* Show reliability information.  */
  996.  
  997. static void
  998. ukshow_reliable (i, zhdr)
  999.      int i;
  1000.      const char *zhdr;
  1001. {
  1002.   printf ("%sCharacteristics:", zhdr);
  1003.   if ((i & UUCONF_RELIABLE_EIGHT) != 0)
  1004.     printf (" eight-bit-clean");
  1005.   else
  1006.     printf (" not-eight-bit-clean");
  1007.   if ((i & UUCONF_RELIABLE_RELIABLE) != 0)
  1008.     printf (" reliable");
  1009.   if ((i & UUCONF_RELIABLE_ENDTOEND) != 0)
  1010.     printf (" end-to-end");
  1011.   if ((i & UUCONF_RELIABLE_FULLDUPLEX) != 0)
  1012.     printf (" fullduplex");
  1013.   else
  1014.     printf (" halfduplex");
  1015.   printf ("\n");
  1016. }
  1017.  
  1018. /* Show protocol parameters.  */
  1019.  
  1020. static void
  1021. ukshow_proto_params (pas, cindent)
  1022.      struct uuconf_proto_param *pas;
  1023.      int cindent;
  1024. {
  1025.   struct uuconf_proto_param *q;
  1026.  
  1027.   for (q = pas; q->uuconf_bproto != '\0'; q++)
  1028.     {
  1029.       int i;
  1030.       struct uuconf_proto_param_entry *qe;
  1031.  
  1032.       for (i = 0; i < cindent; i++)
  1033.     printf (" ");
  1034.       printf ("For protocol %c will use the following parameters\n",
  1035.           q->uuconf_bproto);
  1036.       for (qe = q->uuconf_qentries; qe->uuconf_cargs > 0; qe++)
  1037.     {
  1038.       int ia;
  1039.  
  1040.       for (i = 0; i < cindent; i++)
  1041.         printf (" ");
  1042.       for (ia = 0; ia < qe->uuconf_cargs; ia++)
  1043.         printf (" %s", qe->uuconf_pzargs[ia]);
  1044.       printf ("\n");
  1045.     }
  1046.     }
  1047. }
  1048.  
  1049. /* Display a time span.  */
  1050.  
  1051. static void
  1052. ukshow_time (q)
  1053.      const struct uuconf_timespan *q;
  1054. {
  1055.   int idaystart, idayend;
  1056.   int ihourstart, ihourend;
  1057.   int iminutestart, iminuteend;
  1058.   const char * const zdays = "Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat\0Sun";
  1059.  
  1060.   if (q->uuconf_istart == 0 && q->uuconf_iend == 7 * 24 * 60)
  1061.     {
  1062.       printf ("At any time");
  1063.       return;
  1064.     }
  1065.  
  1066.   idaystart = q->uuconf_istart / (24 * 60);
  1067.   ihourstart = (q->uuconf_istart % (24 * 60)) / 60;
  1068.   iminutestart = q->uuconf_istart % 60;
  1069.   idayend = q->uuconf_iend / (24 * 60);
  1070.   ihourend = (q->uuconf_iend % (24 * 60)) / 60;
  1071.   iminuteend = q->uuconf_iend % 60;
  1072.  
  1073.   if (idaystart == idayend)
  1074.     printf ("%s from %02d:%02d to %02d:%02d", zdays + idaystart * 4,
  1075.         ihourstart, iminutestart, ihourend, iminuteend);
  1076.   else
  1077.     printf ("From %s %02d:%02d to %s %02d:%02d",
  1078.         zdays + idaystart * 4, ihourstart, iminutestart,
  1079.         zdays + idayend * 4, ihourend, iminuteend);
  1080. }
  1081.  
  1082. /* Compress a time span by merging any two adjacent spans with
  1083.    identical values.  This isn't necessary for uucico, but it looks
  1084.    nicer when printed out.  */
  1085.  
  1086. static struct uuconf_timespan *
  1087. qcompress_span (qlist)
  1088.      struct uuconf_timespan *qlist;
  1089. {
  1090.   struct uuconf_timespan **pq;
  1091.  
  1092.   pq = &qlist;
  1093.   while (*pq != NULL)
  1094.     {
  1095.       if ((*pq)->uuconf_qnext != NULL
  1096.       && (*pq)->uuconf_iend == (*pq)->uuconf_qnext->uuconf_istart
  1097.       && (*pq)->uuconf_ival == (*pq)->uuconf_qnext->uuconf_ival)
  1098.     {
  1099.       struct uuconf_timespan *qnext;
  1100.  
  1101.       qnext = (*pq)->uuconf_qnext;
  1102.       (*pq)->uuconf_qnext = qnext->uuconf_qnext;
  1103.       (*pq)->uuconf_iend = qnext->uuconf_iend;
  1104.     }
  1105.       else
  1106.     pq = &(*pq)->uuconf_qnext;
  1107.     }
  1108.  
  1109.   return qlist;
  1110. }
  1111.  
  1112. /* Display a uuconf error and exit.  */
  1113.  
  1114. static void
  1115. ukuuconf_error (puuconf, iret)
  1116.      pointer puuconf;
  1117.      int iret;
  1118. {
  1119.   char ab[512];
  1120.  
  1121.   (void) uuconf_error_string (puuconf, iret, ab, sizeof ab);
  1122.   if ((iret & UUCONF_ERROR_FILENAME) == 0)
  1123.     fprintf (stderr, "%s: %s\n", zKprogram, ab);
  1124.   else
  1125.     fprintf (stderr, "%s:%s\n", zKprogram, ab);
  1126.   exit (EXIT_FAILURE);
  1127. }
  1128.