2107 lines
56 KiB
C
2107 lines
56 KiB
C
/* uuconv.c
|
||
Convert one type of UUCP configuration file to another.
|
||
|
||
Copyright (C) 1991, 1992, 1993, 1994, 1995 Ian Lance Taylor
|
||
|
||
This file is part of the Taylor UUCP package.
|
||
|
||
This program is free software; you can redistribute it and/or
|
||
modify it under the terms of the GNU General Public License as
|
||
published by the Free Software Foundation; either version 2 of the
|
||
License, or (at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful, but
|
||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program; if not, write to the Free Software
|
||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
|
||
The author of the program may be contacted at ian@airs.com or
|
||
c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
|
||
*/
|
||
|
||
#include "uucnfi.h"
|
||
|
||
#if USE_RCS_ID
|
||
const char uuconv_rcsid[] = "$Id: uuconv.c,v 1.27 1995/06/29 19:36:27 ian Rel $";
|
||
#endif
|
||
|
||
#include "getopt.h"
|
||
|
||
/* Local functions. */
|
||
|
||
static void uvusage P((void));
|
||
static void uvhelp P((void));
|
||
static void uvwrite_time P((FILE *e, struct uuconf_timespan *qtime));
|
||
static void uvwrite_string P((FILE *e, const char *zarg, const char *zcmd));
|
||
static void uvwrite_size P((FILE *e, struct uuconf_timespan *qsize,
|
||
const char *zcmd));
|
||
static void uvwrite_boolean P((FILE *e, int iarg, const char *zcmd));
|
||
static void uvwrite_string_array P((FILE *e, char **pz, const char *zcmd));
|
||
static void uvwrite_chat_script P((FILE *e, char **pz));
|
||
static void uvwrite_chat P((FILE *e, const struct uuconf_chat *qchat,
|
||
const struct uuconf_chat *qlast,
|
||
const char *zprefix, boolean fforce));
|
||
static void uvwrite_proto_params P((FILE *e,
|
||
const struct uuconf_proto_param *qparam,
|
||
const char *zprefix));
|
||
static void uvwrite_taylor_system P((FILE *e,
|
||
const struct uuconf_system *qsys));
|
||
static void uvwrite_v2_system P((FILE *e,
|
||
const struct uuconf_system *qsys));
|
||
static void uvwrite_hdb_system P((FILE *e,
|
||
const struct uuconf_system *qsys));
|
||
static boolean fvperm_string_cmp P((const char *z1, const char *z2));
|
||
static boolean fvperm_array_cmp P((const char **pz1, const char **pz2));
|
||
static void uvadd_perm P((struct shpermissions *qadd));
|
||
static void uvwrite_perms P((void));
|
||
static void uvwrite_perm_array P((FILE *e, const char **pz,
|
||
const char *zcmd, size_t *pccol));
|
||
static void uvwrite_perm_boolean P((FILE *e, int f, const char *zcmd,
|
||
size_t *pccol, boolean fsendfiles));
|
||
static void uvwrite_perm_rw_array P((FILE *e, const char **pz,
|
||
const char *zcmd, size_t *pccol));
|
||
static void uvwrite_perm_string P((FILE *e, const char *z, const char *zcmd,
|
||
size_t *pccol));
|
||
static int ivwrite_taylor_port P((struct uuconf_port *qport,
|
||
pointer pinfo));
|
||
static int ivwrite_v2_port P((struct uuconf_port *qport, pointer pinfo));
|
||
static int ivwrite_hdb_port P((struct uuconf_port *qport, pointer pinfo));
|
||
static void uvwrite_taylor_port P((FILE *e, struct uuconf_port *qport,
|
||
const char *zprefix));
|
||
static void uvwrite_taylor_dialer P((FILE *e, struct uuconf_dialer *qdialer,
|
||
const char *zprefix));
|
||
static void uvwrite_hdb_dialer P((FILE *e, struct uuconf_dialer *qdialer));
|
||
static void uvuuconf_error P((pointer puuconf, int iret));
|
||
|
||
/* The program name. */
|
||
const char *zProgram;
|
||
|
||
/* A list of Permissions entries built when writing out HDB system
|
||
information. */
|
||
static struct shpermissions *qVperms;
|
||
|
||
/* Type of configuration file. */
|
||
enum tconfig
|
||
{
|
||
CONFIG_TAYLOR,
|
||
CONFIG_V2,
|
||
CONFIG_HDB
|
||
};
|
||
|
||
/* Long getopt options. */
|
||
static const struct option asVlongopts[] =
|
||
{
|
||
{ "input", required_argument, NULL, 'i' },
|
||
{ "output", required_argument, NULL, 'o' },
|
||
{ "program", required_argument, NULL, 'p' },
|
||
{ "config", required_argument, NULL, 'I' },
|
||
{ "debug", required_argument, NULL, 'x' },
|
||
{ "version", no_argument, NULL, 'v' },
|
||
{ "help", no_argument, NULL, 1 },
|
||
{ NULL, 0, NULL, 0 }
|
||
};
|
||
|
||
int
|
||
main (argc, argv)
|
||
int argc;
|
||
char **argv;
|
||
{
|
||
/* -I: The configuration file name. */
|
||
const char *zconfig = NULL;
|
||
/* -i: Input type. */
|
||
const char *zinput = NULL;
|
||
/* -o: Output type. */
|
||
const char *zoutput = NULL;
|
||
/* -p: Program name. */
|
||
const char *zprogram = NULL;
|
||
int iopt;
|
||
enum tconfig tinput, toutput;
|
||
int iret;
|
||
pointer pinput;
|
||
|
||
zProgram = argv[0];
|
||
|
||
while ((iopt = getopt_long (argc, argv, "i:I:o:p:vx:", asVlongopts,
|
||
(int *) NULL)) != EOF)
|
||
{
|
||
switch (iopt)
|
||
{
|
||
case 'i':
|
||
/* Input type. */
|
||
zinput = optarg;
|
||
break;
|
||
|
||
case 'o':
|
||
/* Output type. */
|
||
zoutput = optarg;
|
||
break;
|
||
|
||
case 'p':
|
||
/* Program name. */
|
||
zprogram = optarg;
|
||
break;
|
||
|
||
case 'I':
|
||
/* Set the configuration file name. */
|
||
zconfig = optarg;
|
||
break;
|
||
|
||
case 'x':
|
||
/* Set the debugging level. */
|
||
break;
|
||
|
||
case 'v':
|
||
/* Print version and exit. */
|
||
fprintf
|
||
(stderr,
|
||
"%s: Taylor UUCP %s, copyright (C) 1991, 92, 93, 94, 1995 Ian Lance Taylor\n",
|
||
zProgram, VERSION);
|
||
exit (EXIT_SUCCESS);
|
||
/*NOTREACHED*/
|
||
|
||
case 1:
|
||
/* --help. */
|
||
uvhelp ();
|
||
exit (EXIT_SUCCESS);
|
||
/*NOTREACHED*/
|
||
|
||
case 0:
|
||
/* Long option found, and flag value set. */
|
||
break;
|
||
|
||
default:
|
||
uvusage ();
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (optind != argc
|
||
|| zinput == NULL
|
||
|| zoutput == NULL)
|
||
uvusage ();
|
||
|
||
if (strcasecmp (zinput, "taylor") == 0)
|
||
tinput = CONFIG_TAYLOR;
|
||
else if (strcasecmp (zinput, "v2") == 0)
|
||
tinput = CONFIG_V2;
|
||
else if (strcasecmp (zinput, "hdb") == 0)
|
||
tinput = CONFIG_HDB;
|
||
else
|
||
{
|
||
uvusage ();
|
||
tinput = CONFIG_TAYLOR;
|
||
}
|
||
|
||
if (strcasecmp (zoutput, "taylor") == 0)
|
||
toutput = CONFIG_TAYLOR;
|
||
else if (strcasecmp (zoutput, "v2") == 0)
|
||
toutput = CONFIG_V2;
|
||
else if (strcasecmp (zoutput, "hdb") == 0)
|
||
toutput = CONFIG_HDB;
|
||
else
|
||
{
|
||
uvusage ();
|
||
toutput = CONFIG_TAYLOR;
|
||
}
|
||
|
||
if (tinput == toutput)
|
||
uvusage ();
|
||
|
||
iret = UUCONF_SUCCESS;
|
||
|
||
/* Initialize the input. */
|
||
pinput = NULL;
|
||
switch (tinput)
|
||
{
|
||
case CONFIG_TAYLOR:
|
||
iret = uuconf_taylor_init (&pinput, zprogram, zconfig);
|
||
break;
|
||
case CONFIG_V2:
|
||
iret = uuconf_v2_init (&pinput);
|
||
break;
|
||
case CONFIG_HDB:
|
||
iret = uuconf_hdb_init (&pinput, zprogram);
|
||
break;
|
||
}
|
||
if (iret != UUCONF_SUCCESS)
|
||
{
|
||
uvuuconf_error (pinput, iret);
|
||
exit (EXIT_FAILURE);
|
||
}
|
||
|
||
{
|
||
char **pzsystems;
|
||
char *zsys;
|
||
char abtaylor[sizeof ZCURDIR + sizeof SYSFILE - 1];
|
||
char abv2[sizeof ZCURDIR + sizeof V2_SYSTEMS - 1];
|
||
char abhdb[sizeof ZCURDIR + sizeof HDB_SYSTEMS - 1];
|
||
FILE *esys;
|
||
char **pz;
|
||
|
||
/* Get the list of systems. */
|
||
switch (tinput)
|
||
{
|
||
case CONFIG_TAYLOR:
|
||
iret = uuconf_taylor_system_names (pinput, &pzsystems, FALSE);
|
||
break;
|
||
case CONFIG_V2:
|
||
iret = uuconf_v2_system_names (pinput, &pzsystems, FALSE);
|
||
break;
|
||
case CONFIG_HDB:
|
||
iret = uuconf_hdb_system_names (pinput, &pzsystems, FALSE);
|
||
break;
|
||
}
|
||
if (iret != UUCONF_SUCCESS)
|
||
uvuuconf_error (pinput, iret);
|
||
else
|
||
{
|
||
/* Open the sys file for the output type. */
|
||
switch (toutput)
|
||
{
|
||
default:
|
||
case CONFIG_TAYLOR:
|
||
sprintf (abtaylor, "%s%s", ZCURDIR, SYSFILE);
|
||
zsys = abtaylor;
|
||
break;
|
||
case CONFIG_V2:
|
||
sprintf (abv2, "%s%s", ZCURDIR, V2_SYSTEMS);
|
||
zsys = abv2;
|
||
break;
|
||
case CONFIG_HDB:
|
||
sprintf (abhdb, "%s%s", ZCURDIR, HDB_SYSTEMS);
|
||
zsys = abhdb;
|
||
break;
|
||
}
|
||
esys = fopen (zsys, "w");
|
||
if (esys == NULL)
|
||
{
|
||
fprintf (stderr, "uuchk:%s: ", zsys);
|
||
perror ("fopen");
|
||
exit (EXIT_FAILURE);
|
||
}
|
||
|
||
fprintf (esys, "# %s file automatically generated by uuconv.\n",
|
||
zsys);
|
||
|
||
/* Read and write each system. We cheat and call the internal
|
||
routines, so that we can easily detect default information and
|
||
not write it out. This isn't necessary, but it makes the output
|
||
smaller and simpler. */
|
||
for (pz = pzsystems; *pz != NULL; pz++)
|
||
{
|
||
struct uuconf_system ssys;
|
||
|
||
switch (tinput)
|
||
{
|
||
case CONFIG_TAYLOR:
|
||
iret = _uuconf_itaylor_system_internal (pinput, *pz, &ssys);
|
||
break;
|
||
case CONFIG_V2:
|
||
iret = _uuconf_iv2_system_internal (pinput, *pz, &ssys);
|
||
break;
|
||
case CONFIG_HDB:
|
||
iret = _uuconf_ihdb_system_internal (pinput, *pz, &ssys);
|
||
break;
|
||
}
|
||
if (iret != UUCONF_SUCCESS)
|
||
uvuuconf_error (pinput, iret);
|
||
else
|
||
{
|
||
switch (toutput)
|
||
{
|
||
case CONFIG_TAYLOR:
|
||
uvwrite_taylor_system (esys, &ssys);
|
||
break;
|
||
case CONFIG_V2:
|
||
uvwrite_v2_system (esys, &ssys);
|
||
break;
|
||
case CONFIG_HDB:
|
||
uvwrite_hdb_system (esys, &ssys);
|
||
break;
|
||
}
|
||
if (toutput != CONFIG_HDB)
|
||
(void) uuconf_system_free (pinput, &ssys);
|
||
}
|
||
}
|
||
|
||
if (toutput == CONFIG_HDB)
|
||
uvwrite_perms ();
|
||
|
||
if (ferror (esys)
|
||
|| fclose (esys) == EOF)
|
||
{
|
||
fprintf (stderr, "uuchk:%s: error during output\n", zsys);
|
||
exit (EXIT_FAILURE);
|
||
}
|
||
}
|
||
}
|
||
|
||
{
|
||
/* Open the port file for the output type. */
|
||
char *zport;
|
||
char abtaylor[sizeof ZCURDIR + sizeof PORTFILE - 1];
|
||
char abv2[sizeof ZCURDIR + sizeof V2_DEVICES - 1];
|
||
char abhdb[sizeof ZCURDIR + sizeof HDB_DEVICES - 1];
|
||
FILE *eport;
|
||
int (*piportfn) P((struct uuconf_port *, pointer));
|
||
struct uuconf_port sport;
|
||
|
||
switch (toutput)
|
||
{
|
||
default:
|
||
case CONFIG_TAYLOR:
|
||
sprintf (abtaylor, "%s%s", ZCURDIR, PORTFILE);
|
||
zport = abtaylor;
|
||
piportfn = ivwrite_taylor_port;
|
||
break;
|
||
case CONFIG_V2:
|
||
sprintf (abv2, "%s%s", ZCURDIR, V2_DEVICES);
|
||
zport = abv2;
|
||
piportfn = ivwrite_v2_port;
|
||
break;
|
||
case CONFIG_HDB:
|
||
sprintf (abhdb, "%s%s", ZCURDIR, HDB_DEVICES);
|
||
zport = abhdb;
|
||
piportfn = ivwrite_hdb_port;
|
||
break;
|
||
}
|
||
eport = fopen (zport, "w");
|
||
if (eport == NULL)
|
||
{
|
||
fprintf (stderr, "uuchk:%s: ", zport);
|
||
perror ("fopen");
|
||
exit (EXIT_FAILURE);
|
||
}
|
||
|
||
fprintf (eport, "# %s file automatically generated by uuconv.\n", zport);
|
||
|
||
switch (tinput)
|
||
{
|
||
case CONFIG_TAYLOR:
|
||
iret = uuconf_taylor_find_port (pinput, (const char *) NULL, 0L,
|
||
0L, piportfn, (pointer) eport,
|
||
&sport);
|
||
break;
|
||
case CONFIG_V2:
|
||
iret = uuconf_v2_find_port (pinput, (const char *) NULL, 0L, 0L,
|
||
piportfn, (pointer) eport, &sport);
|
||
break;
|
||
case CONFIG_HDB:
|
||
iret = uuconf_hdb_find_port (pinput, (const char *) NULL, 0L, 0L,
|
||
piportfn, (pointer) eport, &sport);
|
||
break;
|
||
}
|
||
|
||
if (iret != UUCONF_NOT_FOUND)
|
||
uvuuconf_error (pinput, iret);
|
||
|
||
if (ferror (eport)
|
||
|| fclose (eport) == EOF)
|
||
{
|
||
fprintf (stderr, "uuchk:%s: error during output\n", zport);
|
||
exit (EXIT_FAILURE);
|
||
}
|
||
}
|
||
|
||
/* V2 configuration files don't support dialers. */
|
||
if (tinput != CONFIG_V2 && toutput != CONFIG_V2)
|
||
{
|
||
char **pzdialers;
|
||
char *zdialer;
|
||
char abtaylor[sizeof ZCURDIR + sizeof DIALFILE - 1];
|
||
char abhdb[sizeof ZCURDIR + sizeof HDB_DIALERS - 1];
|
||
FILE *edialer;
|
||
char **pz;
|
||
|
||
/* Get the list of dialers. */
|
||
switch (tinput)
|
||
{
|
||
default:
|
||
case CONFIG_TAYLOR:
|
||
iret = uuconf_taylor_dialer_names (pinput, &pzdialers);
|
||
break;
|
||
case CONFIG_HDB:
|
||
iret = uuconf_hdb_dialer_names (pinput, &pzdialers);
|
||
break;
|
||
}
|
||
if (iret != UUCONF_SUCCESS)
|
||
uvuuconf_error (pinput, iret);
|
||
else
|
||
{
|
||
/* Open the sys file for the output type. */
|
||
switch (toutput)
|
||
{
|
||
default:
|
||
case CONFIG_TAYLOR:
|
||
sprintf (abtaylor, "%s%s", ZCURDIR, DIALFILE);
|
||
zdialer = abtaylor;
|
||
break;
|
||
case CONFIG_HDB:
|
||
sprintf (abhdb, "%s%s", ZCURDIR, HDB_DIALERS);
|
||
zdialer = abhdb;
|
||
break;
|
||
}
|
||
edialer = fopen (zdialer, "w");
|
||
if (edialer == NULL)
|
||
{
|
||
fprintf (stderr, "uuchk:%s: ", zdialer);
|
||
perror ("fopen");
|
||
exit (EXIT_FAILURE);
|
||
}
|
||
|
||
fprintf (edialer, "# %s file automatically generated by uuconv.\n",
|
||
zdialer);
|
||
|
||
/* Read and write each dialer. */
|
||
for (pz = pzdialers; *pz != NULL; pz++)
|
||
{
|
||
struct uuconf_dialer sdialer;
|
||
|
||
switch (tinput)
|
||
{
|
||
default:
|
||
case CONFIG_TAYLOR:
|
||
iret = uuconf_taylor_dialer_info (pinput, *pz, &sdialer);
|
||
break;
|
||
case CONFIG_HDB:
|
||
iret = uuconf_hdb_dialer_info (pinput, *pz, &sdialer);
|
||
break;
|
||
}
|
||
if (iret != UUCONF_SUCCESS)
|
||
uvuuconf_error (pinput, iret);
|
||
else
|
||
{
|
||
switch (toutput)
|
||
{
|
||
default:
|
||
case CONFIG_TAYLOR:
|
||
fprintf (edialer, "# Start of dialer %s\n",
|
||
sdialer.uuconf_zname);
|
||
fprintf (edialer, "dialer %s\n", sdialer.uuconf_zname);
|
||
uvwrite_taylor_dialer (edialer, &sdialer, "");
|
||
break;
|
||
case CONFIG_HDB:
|
||
uvwrite_hdb_dialer (edialer, &sdialer);
|
||
break;
|
||
}
|
||
(void) uuconf_dialer_free (pinput, &sdialer);
|
||
}
|
||
}
|
||
|
||
if (ferror (edialer)
|
||
|| fclose (edialer) == EOF)
|
||
{
|
||
fprintf (stderr, "uuchk:%s: error during output\n", zdialer);
|
||
exit (EXIT_FAILURE);
|
||
}
|
||
}
|
||
}
|
||
|
||
exit (EXIT_SUCCESS);
|
||
|
||
/* Avoid complaints about not returning. */
|
||
return 0;
|
||
}
|
||
|
||
/* Print out a usage message and die. */
|
||
|
||
static void
|
||
uvusage ()
|
||
{
|
||
fprintf (stderr, "Usage: %s -i input-type -o output-type [-p program]\n",
|
||
zProgram);
|
||
fprintf (stderr, "Use %s --help for help\n", zProgram);
|
||
exit (EXIT_FAILURE);
|
||
}
|
||
|
||
/* Print a help message. */
|
||
|
||
static void
|
||
uvhelp ()
|
||
{
|
||
fprintf (stderr,
|
||
"Taylor UUCP %s, copyright (C) 1991, 92, 93, 94, 1995 Ian Lance Taylor\n",
|
||
VERSION);
|
||
fprintf (stderr, "Converts UUCP configuration files from one format to another.\n");
|
||
fprintf (stderr,
|
||
"Usage: %s -i input -o output [-p program] [-I file]\n", zProgram);
|
||
fprintf (stderr,
|
||
" -i,--input input: Set input type (one of taylor, v2, hdb)\n");
|
||
fprintf (stderr,
|
||
" -o,--output output: Set output type (one of taylor, v2, hdb)\n");
|
||
fprintf (stderr,
|
||
" -p,--program program: Program to convert (e.g., uucp or cu)\n");
|
||
fprintf (stderr,
|
||
" -I,--config file: Set Taylor UUCP configuration file to use\n");
|
||
fprintf (stderr,
|
||
" -v,--version: Print version and exit\n");
|
||
fprintf (stderr,
|
||
" --help: Print help and exit\n");
|
||
}
|
||
|
||
/* Write out a timespan. */
|
||
|
||
static void
|
||
uvwrite_time (e, qtime)
|
||
FILE *e;
|
||
struct uuconf_timespan *qtime;
|
||
{
|
||
if (qtime == NULL)
|
||
{
|
||
fprintf (e, "Never");
|
||
return;
|
||
}
|
||
|
||
if (qtime->uuconf_istart == 0 && qtime->uuconf_iend == 7 * 24 * 60)
|
||
{
|
||
fprintf (e, "Any");
|
||
return;
|
||
}
|
||
|
||
for (; qtime != NULL; qtime = qtime->uuconf_qnext)
|
||
{
|
||
int idaystart, idayend;
|
||
int ihourstart, ihourend;
|
||
int iminutestart, iminuteend;
|
||
const char * const zdays = "Su\0Mo\0Tu\0We\0Th\0Fr\0Sa";
|
||
|
||
idaystart = qtime->uuconf_istart / (24 * 60);
|
||
ihourstart = (qtime->uuconf_istart % (24 * 60)) / 60;
|
||
iminutestart = qtime->uuconf_istart % 60;
|
||
if (qtime->uuconf_iend >= 7 * 24 * 60)
|
||
qtime->uuconf_iend = 7 * 24 * 60 - 1;
|
||
idayend = qtime->uuconf_iend / (24 * 60);
|
||
ihourend = (qtime->uuconf_iend % (24 * 60)) / 60;
|
||
iminuteend = qtime->uuconf_iend % 60;
|
||
if (ihourend == 0 && iminuteend == 0)
|
||
--idayend;
|
||
|
||
if (idaystart == idayend)
|
||
fprintf (e, "%s%02d%02d-%02d%02d", zdays + idaystart * 3,
|
||
ihourstart, iminutestart, ihourend, iminuteend);
|
||
else
|
||
{
|
||
int i;
|
||
|
||
fprintf (e, "%s%02d%02d-0000", zdays + idaystart * 3,
|
||
ihourstart, iminutestart);
|
||
for (i = idaystart + 1; i < idayend; i++)
|
||
fprintf (e, ",%s", zdays + i * 3);
|
||
if (ihourend != 0 || iminuteend != 0)
|
||
fprintf (e, ",%s0000-%02d%02d", zdays + idayend * 3, ihourend,
|
||
iminuteend);
|
||
}
|
||
|
||
if (qtime->uuconf_qnext != NULL)
|
||
fprintf (e, ",");
|
||
}
|
||
}
|
||
|
||
/* Some subroutines used when writing out Taylor UUCP configuration
|
||
files. */
|
||
|
||
/* Write a command with a string argument. */
|
||
|
||
static void
|
||
uvwrite_string (e, zarg, zcmd)
|
||
FILE *e;
|
||
const char *zarg;
|
||
const char *zcmd;
|
||
{
|
||
if (zarg != (const char *) &_uuconf_unset)
|
||
fprintf (e, "%s %s\n", zcmd, zarg == NULL ? (const char *) "" : zarg);
|
||
}
|
||
|
||
/* Write out a size restriction command. */
|
||
|
||
static void
|
||
uvwrite_size (e, qtime, zcmd)
|
||
FILE *e;
|
||
struct uuconf_timespan *qtime;
|
||
const char *zcmd;
|
||
{
|
||
if (qtime != (struct uuconf_timespan *) &_uuconf_unset)
|
||
{
|
||
for (; qtime != NULL; qtime = qtime->uuconf_qnext)
|
||
{
|
||
fprintf (e, "%s %ld", zcmd, qtime->uuconf_ival);
|
||
uvwrite_time (e, qtime);
|
||
fprintf (e, "\n");
|
||
}
|
||
}
|
||
}
|
||
|
||
/* Write out a boolean argument with a string command. If the value
|
||
is less than zero, than it was uninitialized and we don't write
|
||
anything. */
|
||
|
||
static void
|
||
uvwrite_boolean (e, fval, zcmd)
|
||
FILE *e;
|
||
int fval;
|
||
const char *zcmd;
|
||
{
|
||
if (fval >= 0)
|
||
fprintf (e, "%s %s\n", zcmd, fval > 0 ? "true" : "false");
|
||
}
|
||
|
||
/* Write out a string array as a single command. */
|
||
|
||
static void
|
||
uvwrite_string_array (e, pz, zcmd)
|
||
FILE *e;
|
||
char **pz;
|
||
const char *zcmd;
|
||
{
|
||
if (pz != (char **) &_uuconf_unset)
|
||
{
|
||
fprintf (e, "%s", zcmd);
|
||
if (pz != NULL)
|
||
for (; *pz != NULL; pz++)
|
||
fprintf (e, " %s", *pz);
|
||
fprintf (e, "\n");
|
||
}
|
||
}
|
||
|
||
/* Write out a chat script. Don't separate subsend/subexpect strings
|
||
by spaces. */
|
||
|
||
static void
|
||
uvwrite_chat_script (e, pzarg)
|
||
FILE *e;
|
||
char **pzarg;
|
||
{
|
||
char **pz;
|
||
|
||
if (pzarg == NULL || pzarg == (char **) &_uuconf_unset)
|
||
return;
|
||
|
||
for (pz = pzarg; *pz != NULL; pz++)
|
||
{
|
||
if ((*pz)[0] != '-' && pz != pzarg)
|
||
fprintf (e, " ");
|
||
fprintf (e, *pz);
|
||
}
|
||
}
|
||
|
||
/* Write out chat information. If the qlast argument is not NULL,
|
||
then only values that are different from qlast should be written.
|
||
The fforce argument is used to get around a peculiar problem: if
|
||
the ``chat'' command is used with no arguments for a system, then
|
||
uuconf_pzchat will be NULL (not &_uuconf_unset) and the default
|
||
chat script will not be used. We must distinguish this case from
|
||
the ``chat'' command not appearing at all for a port or dialer, in
|
||
which case the value will again be NULL. In the former case we
|
||
must output a ``chat'' command, in the latter case we would prefer
|
||
not to. */
|
||
|
||
static void
|
||
uvwrite_chat (e, q, qlast, zprefix, fforce)
|
||
FILE *e;
|
||
const struct uuconf_chat *q;
|
||
const struct uuconf_chat *qlast;
|
||
const char *zprefix;
|
||
boolean fforce;
|
||
{
|
||
char **pz;
|
||
char ab[100];
|
||
|
||
if (q->uuconf_pzchat != (char **) &_uuconf_unset
|
||
&& (qlast == NULL
|
||
? (fforce || q->uuconf_pzchat != NULL)
|
||
: qlast->uuconf_pzchat != q->uuconf_pzchat))
|
||
{
|
||
fprintf (e, "%schat ", zprefix);
|
||
uvwrite_chat_script (e, q->uuconf_pzchat);
|
||
fprintf (e, "\n");
|
||
}
|
||
|
||
if (q->uuconf_pzprogram != (char **) &_uuconf_unset
|
||
&& (qlast == NULL
|
||
? q->uuconf_pzprogram != NULL
|
||
: qlast->uuconf_pzprogram != q->uuconf_pzprogram))
|
||
{
|
||
sprintf (ab, "%schat-program", zprefix);
|
||
uvwrite_string_array (e, q->uuconf_pzprogram, ab);
|
||
}
|
||
|
||
if (q->uuconf_ctimeout >= 0
|
||
&& (qlast == NULL
|
||
|| qlast->uuconf_ctimeout != q->uuconf_ctimeout))
|
||
fprintf (e, "%schat-timeout %d\n", zprefix, q->uuconf_ctimeout);
|
||
|
||
if (q->uuconf_pzfail != NULL
|
||
&& q->uuconf_pzfail != (char **) &_uuconf_unset
|
||
&& (qlast == NULL
|
||
|| qlast->uuconf_pzfail != q->uuconf_pzfail))
|
||
for (pz = q->uuconf_pzfail; *pz != NULL; pz++)
|
||
fprintf (e, "%schat-fail %s\n", zprefix, *pz);
|
||
|
||
if (qlast == NULL || qlast->uuconf_fstrip != q->uuconf_fstrip)
|
||
{
|
||
sprintf (ab, "%schat-strip", zprefix);
|
||
uvwrite_boolean (e, q->uuconf_fstrip, ab);
|
||
}
|
||
}
|
||
|
||
/* Write out protocol parameters to a Taylor UUCP file. */
|
||
|
||
static void
|
||
uvwrite_proto_params (e, qparams, zprefix)
|
||
FILE *e;
|
||
const struct uuconf_proto_param *qparams;
|
||
const char *zprefix;
|
||
{
|
||
const struct uuconf_proto_param *qp;
|
||
|
||
if (qparams == NULL
|
||
|| qparams == (struct uuconf_proto_param *) &_uuconf_unset)
|
||
return;
|
||
|
||
for (qp = qparams; qp->uuconf_bproto != '\0'; qp++)
|
||
{
|
||
const struct uuconf_proto_param_entry *qe;
|
||
|
||
for (qe = qp->uuconf_qentries; qe->uuconf_cargs > 0; qe++)
|
||
{
|
||
int i;
|
||
|
||
fprintf (e, "%sprotocol-parameter %c", zprefix, qp->uuconf_bproto);
|
||
for (i = 0; i < qe->uuconf_cargs; i++)
|
||
fprintf (e, " %s", qe->uuconf_pzargs[i]);
|
||
fprintf (e, "\n");
|
||
}
|
||
}
|
||
}
|
||
|
||
/* Write out Taylor UUCP system information. */
|
||
|
||
static void
|
||
uvwrite_taylor_system (e, q)
|
||
FILE *e;
|
||
const struct uuconf_system *q;
|
||
{
|
||
char **pz;
|
||
const struct uuconf_system *qlast;
|
||
|
||
fprintf (e, "# Start of system %s\n", q->uuconf_zname);
|
||
|
||
fprintf (e, "system %s\n", q->uuconf_zname);
|
||
if (q->uuconf_pzalias != NULL
|
||
&& q->uuconf_pzalias != (char **) &_uuconf_unset)
|
||
for (pz = q->uuconf_pzalias; *pz != NULL; pz++)
|
||
uvwrite_string (e, *pz, "alias");
|
||
|
||
for (qlast = NULL; q != NULL; qlast = q, q = q->uuconf_qalternate)
|
||
{
|
||
struct uuconf_timespan *qtime;
|
||
|
||
if (qlast != NULL)
|
||
{
|
||
fprintf (e, "alternate");
|
||
if (q->uuconf_zalternate != (char *) &_uuconf_unset
|
||
&& q->uuconf_zalternate != NULL)
|
||
fprintf (e, " %s", q->uuconf_zalternate);
|
||
fprintf (e, "\n");
|
||
}
|
||
|
||
#define CHANGED(x) (qlast == NULL || qlast->x != q->x)
|
||
|
||
if (CHANGED (uuconf_qtimegrade)
|
||
&& (q->uuconf_qtimegrade
|
||
!= (struct uuconf_timespan *) &_uuconf_unset))
|
||
{
|
||
if (q->uuconf_qtimegrade == NULL)
|
||
fprintf (e, "time never\n");
|
||
else
|
||
{
|
||
for (qtime = q->uuconf_qtimegrade;
|
||
qtime != NULL;
|
||
qtime = qtime->uuconf_qnext)
|
||
{
|
||
if ((char) qtime->uuconf_ival == UUCONF_GRADE_LOW)
|
||
fprintf (e, "time ");
|
||
else
|
||
fprintf (e, "timegrade %c ", (char) qtime->uuconf_ival);
|
||
uvwrite_time (e, qtime);
|
||
if (qtime->uuconf_cretry != 0)
|
||
fprintf (e, " %d", qtime->uuconf_cretry);
|
||
fprintf (e, "\n");
|
||
}
|
||
}
|
||
}
|
||
|
||
if (CHANGED (uuconf_qcalltimegrade)
|
||
&& (q->uuconf_qcalltimegrade
|
||
!= (struct uuconf_timespan *) &_uuconf_unset))
|
||
{
|
||
for (qtime = q->uuconf_qcalltimegrade;
|
||
qtime != NULL;
|
||
qtime = qtime->uuconf_qnext)
|
||
{
|
||
fprintf (e, "call-timegrade %c ", (char) qtime->uuconf_ival);
|
||
uvwrite_time (e, qtime);
|
||
fprintf (e, "\n");
|
||
}
|
||
}
|
||
|
||
if (CHANGED (uuconf_qcalledtimegrade)
|
||
&& (q->uuconf_qcalledtimegrade
|
||
!= (struct uuconf_timespan *) &_uuconf_unset))
|
||
{
|
||
for (qtime = q->uuconf_qcalledtimegrade;
|
||
qtime != NULL;
|
||
qtime = qtime->uuconf_qnext)
|
||
{
|
||
fprintf (e, "called-timegrade %c ", (char) qtime->uuconf_ival);
|
||
uvwrite_time (e, qtime);
|
||
fprintf (e, "\n");
|
||
}
|
||
}
|
||
|
||
if (CHANGED (uuconf_qcall_local_size))
|
||
uvwrite_size (e, q->uuconf_qcall_local_size, "call-local-size");
|
||
|
||
if (CHANGED (uuconf_qcall_remote_size))
|
||
uvwrite_size (e, q->uuconf_qcall_remote_size, "call-remote-size");
|
||
|
||
if (CHANGED (uuconf_qcalled_local_size))
|
||
uvwrite_size (e, q->uuconf_qcalled_local_size, "called-local-size");
|
||
|
||
if (CHANGED (uuconf_qcalled_remote_size))
|
||
uvwrite_size (e, q->uuconf_qcalled_remote_size, "called-remote-size");
|
||
|
||
if (CHANGED (uuconf_ibaud) || CHANGED (uuconf_ihighbaud))
|
||
{
|
||
if (q->uuconf_ibaud >= 0)
|
||
{
|
||
if (q->uuconf_ihighbaud > 0)
|
||
fprintf (e, "baud-range %ld %ld\n", q->uuconf_ibaud,
|
||
q->uuconf_ihighbaud);
|
||
else
|
||
fprintf (e, "baud %ld\n", q->uuconf_ibaud);
|
||
}
|
||
}
|
||
|
||
if (CHANGED (uuconf_zport) || CHANGED (uuconf_qport))
|
||
{
|
||
if (q->uuconf_zport != NULL
|
||
&& q->uuconf_zport != (char *) &_uuconf_unset)
|
||
uvwrite_string (e, q->uuconf_zport, "port");
|
||
else if (q->uuconf_qport != NULL
|
||
&& (q->uuconf_qport
|
||
!= (struct uuconf_port *) &_uuconf_unset))
|
||
uvwrite_taylor_port (e, q->uuconf_qport, "port ");
|
||
}
|
||
|
||
if (CHANGED (uuconf_zphone))
|
||
{
|
||
const char *zcmd;
|
||
|
||
if (q->uuconf_qport != NULL
|
||
&& q->uuconf_qport != (struct uuconf_port *) &_uuconf_unset
|
||
&& (q->uuconf_qport->uuconf_ttype == UUCONF_PORTTYPE_TCP
|
||
|| q->uuconf_qport->uuconf_ttype == UUCONF_PORTTYPE_TLI))
|
||
zcmd = "address";
|
||
else
|
||
zcmd = "phone";
|
||
uvwrite_string (e, q->uuconf_zphone, zcmd);
|
||
}
|
||
|
||
uvwrite_chat (e, &q->uuconf_schat,
|
||
(qlast == NULL
|
||
? (struct uuconf_chat *) NULL
|
||
: &qlast->uuconf_schat),
|
||
"", TRUE);
|
||
|
||
if (CHANGED (uuconf_zcall_login))
|
||
uvwrite_string (e, q->uuconf_zcall_login, "call-login");
|
||
|
||
if (CHANGED (uuconf_zcall_password))
|
||
uvwrite_string (e, q->uuconf_zcall_password, "call-password");
|
||
|
||
if (CHANGED (uuconf_zcalled_login))
|
||
uvwrite_string (e, q->uuconf_zcalled_login, "called-login");
|
||
|
||
if (CHANGED (uuconf_fcallback))
|
||
uvwrite_boolean (e, q->uuconf_fcallback, "callback");
|
||
|
||
if (CHANGED (uuconf_fsequence))
|
||
uvwrite_boolean (e, q->uuconf_fsequence, "sequence");
|
||
|
||
if (CHANGED (uuconf_zprotocols))
|
||
uvwrite_string (e, q->uuconf_zprotocols, "protocol");
|
||
|
||
if (CHANGED (uuconf_qproto_params))
|
||
uvwrite_proto_params (e, q->uuconf_qproto_params, "");
|
||
|
||
uvwrite_chat (e, &q->uuconf_scalled_chat,
|
||
(qlast == NULL
|
||
? (struct uuconf_chat *) NULL
|
||
: &qlast->uuconf_scalled_chat),
|
||
"called-", FALSE);
|
||
|
||
if (CHANGED (uuconf_zdebug))
|
||
uvwrite_string (e, q->uuconf_zdebug, "debug");
|
||
|
||
if (CHANGED (uuconf_zmax_remote_debug))
|
||
uvwrite_string (e, q->uuconf_zmax_remote_debug, "max-remote-debug");
|
||
|
||
if ((CHANGED (uuconf_fsend_request)
|
||
|| CHANGED (uuconf_frec_request))
|
||
&& (q->uuconf_fsend_request >= 0
|
||
|| q->uuconf_frec_request >= 0))
|
||
{
|
||
if (q->uuconf_fsend_request >= 0
|
||
&& (q->uuconf_fsend_request > 0
|
||
? q->uuconf_frec_request > 0
|
||
: q->uuconf_frec_request == 0))
|
||
uvwrite_boolean (e, q->uuconf_fsend_request, "request");
|
||
else
|
||
{
|
||
uvwrite_boolean (e, q->uuconf_fsend_request, "send-request");
|
||
uvwrite_boolean (e, q->uuconf_frec_request,
|
||
"receive-request");
|
||
}
|
||
}
|
||
|
||
if ((CHANGED (uuconf_fcall_transfer)
|
||
|| CHANGED (uuconf_fcalled_transfer))
|
||
&& (q->uuconf_fcall_transfer >= 0
|
||
|| q->uuconf_fcalled_transfer >= 0))
|
||
{
|
||
if (q->uuconf_fcall_transfer >= 0
|
||
&& (q->uuconf_fcall_transfer > 0
|
||
? q->uuconf_fcalled_transfer > 0
|
||
: q->uuconf_fcalled_transfer == 0))
|
||
uvwrite_boolean (e, q->uuconf_fcall_transfer, "transfer");
|
||
else
|
||
{
|
||
uvwrite_boolean (e, q->uuconf_fcall_transfer, "call-transfer");
|
||
uvwrite_boolean (e, q->uuconf_fcalled_transfer,
|
||
"called-transfer");
|
||
}
|
||
}
|
||
|
||
if (CHANGED (uuconf_pzlocal_send))
|
||
uvwrite_string_array (e, q->uuconf_pzlocal_send, "local-send");
|
||
|
||
if (CHANGED (uuconf_pzremote_send))
|
||
uvwrite_string_array (e, q->uuconf_pzremote_send, "remote-send");
|
||
|
||
if (CHANGED (uuconf_pzlocal_receive))
|
||
uvwrite_string_array (e, q->uuconf_pzlocal_receive, "local-receive");
|
||
|
||
if (CHANGED (uuconf_pzremote_receive))
|
||
uvwrite_string_array (e, q->uuconf_pzremote_receive,
|
||
"remote-receive");
|
||
|
||
if (CHANGED (uuconf_pzpath))
|
||
uvwrite_string_array (e, q->uuconf_pzpath, "command-path");
|
||
|
||
if (CHANGED (uuconf_pzcmds))
|
||
uvwrite_string_array (e, q->uuconf_pzcmds, "commands");
|
||
|
||
if (CHANGED (uuconf_cfree_space)
|
||
&& q->uuconf_cfree_space >= 0)
|
||
fprintf (e, "free-space %ld\n", q->uuconf_cfree_space);
|
||
|
||
if (CHANGED (uuconf_pzforward_from))
|
||
uvwrite_string_array (e, q->uuconf_pzforward_from, "forward-from");
|
||
|
||
if (CHANGED (uuconf_pzforward_to))
|
||
uvwrite_string_array (e, q->uuconf_pzforward_to, "forward-to");
|
||
|
||
if (CHANGED (uuconf_zpubdir))
|
||
uvwrite_string (e, q->uuconf_zpubdir, "pubdir");
|
||
|
||
if (CHANGED (uuconf_zlocalname))
|
||
uvwrite_string (e, q->uuconf_zlocalname, "myname");
|
||
}
|
||
}
|
||
|
||
/* Write out V2 system information. */
|
||
|
||
static void
|
||
uvwrite_v2_system (e, q)
|
||
FILE *e;
|
||
const struct uuconf_system *q;
|
||
{
|
||
for (; q != NULL; q = q->uuconf_qalternate)
|
||
{
|
||
fprintf (e, "%s", q->uuconf_zname);
|
||
|
||
if (q->uuconf_qtimegrade != (struct uuconf_timespan *) &_uuconf_unset)
|
||
{
|
||
fprintf (e, " ");
|
||
uvwrite_time (e, q->uuconf_qtimegrade);
|
||
|
||
if (q->uuconf_zport != (char *) &_uuconf_unset
|
||
|| q->uuconf_qport != (struct uuconf_port *) &_uuconf_unset)
|
||
{
|
||
struct uuconf_port *qp;
|
||
boolean ftcp;
|
||
|
||
qp = q->uuconf_qport;
|
||
ftcp = (qp != (struct uuconf_port *) &_uuconf_unset
|
||
&& qp != NULL
|
||
&& qp->uuconf_ttype == UUCONF_PORTTYPE_TCP);
|
||
if (ftcp
|
||
|| (q->uuconf_zport != NULL
|
||
&& q->uuconf_zport != (char *) &_uuconf_unset))
|
||
{
|
||
if (ftcp)
|
||
fprintf (e, " TCP");
|
||
else
|
||
fprintf (e, " %s", q->uuconf_zport);
|
||
|
||
if (ftcp || q->uuconf_ibaud >= 0)
|
||
{
|
||
fprintf (e, " ");
|
||
if (ftcp)
|
||
{
|
||
const char *zport;
|
||
|
||
zport = qp->uuconf_u.uuconf_stcp.uuconf_zport;
|
||
if (zport == NULL)
|
||
zport = "uucp";
|
||
fprintf (e, "%s", zport);
|
||
}
|
||
else
|
||
fprintf (e, "%ld", q->uuconf_ibaud);
|
||
|
||
if (q->uuconf_zphone != (char *) &_uuconf_unset
|
||
&& q->uuconf_zphone != NULL)
|
||
{
|
||
char **pzc;
|
||
|
||
fprintf (e, " %s", q->uuconf_zphone);
|
||
pzc = q->uuconf_schat.uuconf_pzchat;
|
||
if (pzc != (char **) &_uuconf_unset
|
||
&& pzc != NULL)
|
||
{
|
||
fprintf (e, " ");
|
||
uvwrite_chat_script (e, pzc);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
fprintf (e, "\n");
|
||
|
||
/* Here we should gather information to write out to USERFILE
|
||
and L.cmds, and perhaps some day we will. It's much more
|
||
likely to happen if somebody else does it, though. */
|
||
}
|
||
}
|
||
|
||
/* Write out HDB system information. */
|
||
|
||
static void
|
||
uvwrite_hdb_system (e, qsys)
|
||
FILE *e;
|
||
const struct uuconf_system *qsys;
|
||
{
|
||
const struct uuconf_system *q;
|
||
struct shpermissions sperm;
|
||
char *azmachine[2];
|
||
char *azlogname[2];
|
||
|
||
for (q = qsys; q != NULL; q = q->uuconf_qalternate)
|
||
{
|
||
if (q->uuconf_fcall)
|
||
{
|
||
fprintf (e, "%s", q->uuconf_zname);
|
||
|
||
if (q->uuconf_qtimegrade
|
||
!= (struct uuconf_timespan *) &_uuconf_unset)
|
||
{
|
||
const char *zport;
|
||
|
||
fprintf (e, " ");
|
||
uvwrite_time (e, q->uuconf_qtimegrade);
|
||
|
||
zport = q->uuconf_zport;
|
||
if (q->uuconf_qport != NULL
|
||
&& q->uuconf_qport != (struct uuconf_port *) &_uuconf_unset
|
||
&& q->uuconf_qport->uuconf_ttype == UUCONF_PORTTYPE_TCP)
|
||
zport = "TCP";
|
||
if (zport != NULL && zport != (char *) &_uuconf_unset)
|
||
{
|
||
fprintf (e, " %s", zport);
|
||
if (q->uuconf_zprotocols != (char *) &_uuconf_unset
|
||
&& q->uuconf_zprotocols != NULL)
|
||
fprintf (e, ",%s", q->uuconf_zprotocols);
|
||
|
||
if (q->uuconf_ibaud >= 0
|
||
|| q->uuconf_zphone != (char *) &_uuconf_unset)
|
||
{
|
||
fprintf (e, " ");
|
||
if (q->uuconf_ibaud < 0)
|
||
fprintf (e, "Any");
|
||
else
|
||
{
|
||
fprintf (e, "%ld", q->uuconf_ibaud);
|
||
if (q->uuconf_ihighbaud >= 0)
|
||
fprintf (e, "-%ld", q->uuconf_ihighbaud);
|
||
}
|
||
|
||
if (q->uuconf_zphone != (char *) &_uuconf_unset
|
||
&& q->uuconf_zphone != NULL)
|
||
{
|
||
char **pzc;
|
||
|
||
fprintf (e, " %s", q->uuconf_zphone);
|
||
pzc = q->uuconf_schat.uuconf_pzchat;
|
||
if (pzc != (char **) &_uuconf_unset
|
||
&& pzc != NULL)
|
||
{
|
||
fprintf (e, " ");
|
||
uvwrite_chat_script (e, pzc);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
fprintf (e, "\n");
|
||
}
|
||
}
|
||
|
||
/* Build a Permissions entry for this system. There will be only
|
||
one MACHINE entry for a given system. */
|
||
|
||
for (q = qsys; q != NULL; q = q->uuconf_qalternate)
|
||
if (q->uuconf_fcall)
|
||
break;
|
||
|
||
if (q != NULL)
|
||
{
|
||
sperm.qnext = NULL;
|
||
sperm.pzlogname = NULL;
|
||
sperm.pzmachine = NULL;
|
||
sperm.frequest = -1;
|
||
sperm.fsendfiles = -1;
|
||
sperm.pzread = NULL;
|
||
sperm.pzwrite = NULL;
|
||
sperm.fcallback = -1;
|
||
sperm.pzcommands = NULL;
|
||
sperm.pzvalidate = NULL;
|
||
sperm.zmyname = NULL;
|
||
sperm.zpubdir = NULL;
|
||
sperm.pzalias = NULL;
|
||
|
||
azmachine[0] = q->uuconf_zname;
|
||
azmachine[1] = NULL;
|
||
sperm.pzmachine = azmachine;
|
||
if (q->uuconf_fsend_request >= 0)
|
||
sperm.frequest = q->uuconf_fsend_request;
|
||
if (q->uuconf_pzremote_send != (char **) &_uuconf_unset
|
||
&& q->uuconf_pzremote_send != NULL)
|
||
sperm.pzread = q->uuconf_pzremote_send;
|
||
if (q->uuconf_pzremote_receive != (char **) &_uuconf_unset
|
||
&& q->uuconf_pzremote_receive != NULL)
|
||
sperm.pzwrite = q->uuconf_pzremote_receive;
|
||
if (q->uuconf_pzcmds != (char **) &_uuconf_unset
|
||
&& q->uuconf_pzcmds != NULL)
|
||
sperm.pzcommands = q->uuconf_pzcmds;
|
||
if (q->uuconf_zlocalname != (char *) &_uuconf_unset
|
||
&& q->uuconf_zlocalname != NULL)
|
||
sperm.zmyname = q->uuconf_zlocalname;
|
||
if (q->uuconf_zpubdir != (char *) &_uuconf_unset
|
||
&& q->uuconf_zpubdir != NULL)
|
||
sperm.zpubdir = q->uuconf_zpubdir;
|
||
if (q->uuconf_pzalias != (char **) &_uuconf_unset
|
||
&& q->uuconf_pzalias != NULL)
|
||
sperm.pzalias = q->uuconf_pzalias;
|
||
|
||
if (q->uuconf_fcalled
|
||
&& q->uuconf_zcalled_login != (char *) &_uuconf_unset
|
||
&& q->uuconf_zcalled_login != NULL)
|
||
{
|
||
azlogname[0] = q->uuconf_zcalled_login;
|
||
azlogname[1] = NULL;
|
||
sperm.pzlogname = azlogname;
|
||
if (q->uuconf_fcalled_transfer >= 0)
|
||
sperm.fsendfiles = q->uuconf_fcalled_transfer;
|
||
if (q->uuconf_fcallback >= 0)
|
||
sperm.fcallback = q->uuconf_fcallback;
|
||
sperm.pzvalidate = azmachine;
|
||
}
|
||
|
||
uvadd_perm (&sperm);
|
||
}
|
||
|
||
/* Now add a Permissions entry for each alternative that is not used
|
||
for calling out. */
|
||
for (q = qsys; q != NULL; q = q->uuconf_qalternate)
|
||
{
|
||
if (! q->uuconf_fcalled || q->uuconf_fcall)
|
||
continue;
|
||
|
||
sperm.qnext = NULL;
|
||
sperm.pzlogname = NULL;
|
||
sperm.pzmachine = NULL;
|
||
sperm.frequest = -1;
|
||
sperm.fsendfiles = -1;
|
||
sperm.pzread = NULL;
|
||
sperm.pzwrite = NULL;
|
||
sperm.fcallback = -1;
|
||
sperm.pzcommands = NULL;
|
||
sperm.pzvalidate = NULL;
|
||
sperm.zmyname = NULL;
|
||
sperm.zpubdir = NULL;
|
||
sperm.pzalias = NULL;
|
||
|
||
if (q->uuconf_zcalled_login != (char *) &_uuconf_unset
|
||
&& q->uuconf_zcalled_login != NULL)
|
||
azlogname[0] = q->uuconf_zcalled_login;
|
||
else
|
||
azlogname[0] = (char *) "OTHER";
|
||
azlogname[1] = NULL;
|
||
sperm.pzlogname = azlogname;
|
||
|
||
if (q->uuconf_fsend_request >= 0)
|
||
sperm.frequest = q->uuconf_fsend_request;
|
||
if (q->uuconf_fcalled_transfer >= 0)
|
||
sperm.fsendfiles = q->uuconf_fcalled_transfer;
|
||
if (q->uuconf_pzremote_send != (char **) &_uuconf_unset
|
||
&& q->uuconf_pzremote_send != NULL)
|
||
sperm.pzread = q->uuconf_pzremote_send;
|
||
if (q->uuconf_pzremote_receive != (char **) &_uuconf_unset
|
||
&& q->uuconf_pzremote_receive != NULL)
|
||
sperm.pzwrite = q->uuconf_pzremote_receive;
|
||
if (q->uuconf_fcallback >= 0)
|
||
sperm.fcallback = q->uuconf_fcallback;
|
||
if (q->uuconf_zlocalname != (char *) &_uuconf_unset
|
||
&& q->uuconf_zlocalname != NULL)
|
||
sperm.zmyname = q->uuconf_zlocalname;
|
||
if (q->uuconf_zpubdir != (char *) &_uuconf_unset
|
||
&& q->uuconf_zpubdir != NULL)
|
||
sperm.zpubdir = q->uuconf_zpubdir;
|
||
|
||
uvadd_perm (&sperm);
|
||
}
|
||
}
|
||
|
||
/* Compare two strings from a Permissions entry, returning TRUE if
|
||
they are the same. */
|
||
|
||
static boolean
|
||
fvperm_string_cmp (z1, z2)
|
||
const char *z1;
|
||
const char *z2;
|
||
{
|
||
if (z1 == NULL)
|
||
return z2 == NULL;
|
||
|
||
if (z2 == NULL)
|
||
return FALSE;
|
||
|
||
return strcmp (z1, z2) == 0;
|
||
}
|
||
|
||
/* Compare two arrays of strings from a Permissions entry, returning
|
||
TRUE if they are the same. */
|
||
|
||
static boolean
|
||
fvperm_array_cmp (pz1, pz2)
|
||
const char **pz1;
|
||
const char **pz2;
|
||
{
|
||
if (pz1 == NULL)
|
||
return pz2 == NULL;
|
||
|
||
if (pz2 == NULL)
|
||
return FALSE;
|
||
|
||
for (; *pz1 != NULL && *pz2 != NULL; pz1++, pz2++)
|
||
if (strcmp (*pz1, *pz2) != 0)
|
||
break;
|
||
|
||
return *pz1 == NULL && *pz2 == NULL;
|
||
}
|
||
|
||
/* Add a Permissions entry to a global list, combining entries where
|
||
possible. */
|
||
|
||
static void
|
||
uvadd_perm (qadd)
|
||
struct shpermissions *qadd;
|
||
{
|
||
struct shpermissions *qlook;
|
||
struct shpermissions *qnew;
|
||
int iret;
|
||
|
||
/* If there's no information, don't bother to add this entry. */
|
||
if (qadd->pzlogname == NULL
|
||
&& qadd->frequest < 0
|
||
&& qadd->fsendfiles < 0
|
||
&& qadd->pzread == NULL
|
||
&& qadd->pzwrite == NULL
|
||
&& qadd->fcallback < 0
|
||
&& qadd->pzcommands == NULL
|
||
&& qadd->pzvalidate == NULL
|
||
&& qadd->zmyname == NULL
|
||
&& qadd->zpubdir == NULL
|
||
&& qadd->pzalias == NULL)
|
||
return;
|
||
|
||
for (qlook = qVperms; qlook != NULL; qlook = qlook->qnext)
|
||
{
|
||
/* See if we can merge qadd into qlook. */
|
||
if (qadd->pzlogname == NULL
|
||
? qlook->pzlogname != NULL
|
||
: qlook->pzlogname == NULL)
|
||
continue;
|
||
if (qadd->pzmachine == NULL
|
||
? qlook->pzmachine != NULL
|
||
: qlook->pzmachine == NULL)
|
||
continue;
|
||
if (qadd->frequest != qlook->frequest
|
||
|| qadd->fsendfiles != qlook->fsendfiles
|
||
|| qadd->fcallback != qlook->fcallback)
|
||
continue;
|
||
if (! fvperm_string_cmp (qadd->zmyname, qlook->zmyname)
|
||
|| ! fvperm_string_cmp (qadd->zpubdir, qlook->zpubdir))
|
||
continue;
|
||
if (! fvperm_array_cmp ((const char **) qadd->pzread,
|
||
(const char **) qlook->pzread)
|
||
|| ! fvperm_array_cmp ((const char **) qadd->pzwrite,
|
||
(const char **) qlook->pzwrite)
|
||
|| ! fvperm_array_cmp ((const char **) qadd->pzcommands,
|
||
(const char **) qlook->pzcommands))
|
||
continue;
|
||
|
||
/* Merge qadd into qlook. */
|
||
if (qadd->pzmachine != NULL)
|
||
{
|
||
iret = _uuconf_iadd_string ((struct sglobal *) NULL,
|
||
qadd->pzmachine[0], FALSE,
|
||
TRUE, &qlook->pzmachine,
|
||
(pointer) NULL);
|
||
if (iret != UUCONF_SUCCESS)
|
||
uvuuconf_error ((pointer) NULL, iret);
|
||
}
|
||
if (qadd->pzlogname != NULL)
|
||
{
|
||
iret = _uuconf_iadd_string ((struct sglobal *) NULL,
|
||
qadd->pzlogname[0], FALSE,
|
||
TRUE, &qlook->pzlogname,
|
||
(pointer) NULL);
|
||
if (iret != UUCONF_SUCCESS)
|
||
uvuuconf_error ((pointer) NULL, iret);
|
||
}
|
||
if (qadd->pzalias != NULL)
|
||
{
|
||
char **pz;
|
||
|
||
for (pz = qadd->pzalias; *pz != NULL; pz++)
|
||
{
|
||
iret = _uuconf_iadd_string ((struct sglobal *) NULL,
|
||
*pz, FALSE, TRUE,
|
||
&qlook->pzalias, (pointer) NULL);
|
||
if (iret != UUCONF_SUCCESS)
|
||
uvuuconf_error ((pointer) NULL, iret);
|
||
}
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
/* We must add qadd as a new entry on the list, which means we must
|
||
copy it into the heap. */
|
||
|
||
qnew = (struct shpermissions *) malloc (sizeof (struct shpermissions));
|
||
if (qnew == NULL)
|
||
uvuuconf_error ((pointer) NULL, UUCONF_MALLOC_FAILED);
|
||
*qnew = *qadd;
|
||
if (qadd->pzmachine != NULL)
|
||
{
|
||
qnew->pzmachine = NULL;
|
||
iret = _uuconf_iadd_string ((struct sglobal *) NULL,
|
||
qadd->pzmachine[0], FALSE,
|
||
FALSE, &qnew->pzmachine,
|
||
(pointer) NULL);
|
||
if (iret != UUCONF_SUCCESS)
|
||
uvuuconf_error ((pointer) NULL, iret);
|
||
}
|
||
if (qadd->pzlogname != NULL)
|
||
{
|
||
qnew->pzlogname = NULL;
|
||
iret = _uuconf_iadd_string ((struct sglobal *) NULL,
|
||
qadd->pzlogname[0], FALSE,
|
||
FALSE, &qnew->pzlogname,
|
||
(pointer) NULL);
|
||
if (iret != UUCONF_SUCCESS)
|
||
uvuuconf_error ((pointer) NULL, iret);
|
||
}
|
||
if (qadd->pzvalidate != NULL)
|
||
qnew->pzvalidate = qnew->pzmachine;
|
||
|
||
qnew->qnext = qVperms;
|
||
qVperms = qnew;
|
||
}
|
||
|
||
/* Write out the Permissions entries. */
|
||
|
||
static void
|
||
uvwrite_perms ()
|
||
{
|
||
char ab[sizeof ZCURDIR + sizeof HDB_PERMISSIONS - 1];
|
||
FILE *e;
|
||
struct shpermissions *q;
|
||
|
||
sprintf (ab, "%s%s", ZCURDIR, HDB_PERMISSIONS);
|
||
e = fopen (ab, "w");
|
||
if (e == NULL)
|
||
{
|
||
fprintf (stderr, "uuchk:%s: ", ab);
|
||
perror ("fopen");
|
||
exit (EXIT_FAILURE);
|
||
}
|
||
|
||
fprintf (e, "# Permissions file automatically generated by uuconv.\n");
|
||
|
||
for (q = qVperms; q != NULL; q = q->qnext)
|
||
{
|
||
size_t ccol;
|
||
|
||
ccol = 0;
|
||
uvwrite_perm_array (e, (const char **) q->pzlogname, "LOGNAME", &ccol);
|
||
uvwrite_perm_array (e, (const char **) q->pzmachine, "MACHINE", &ccol);
|
||
uvwrite_perm_boolean (e, q->frequest, "REQUEST", &ccol, FALSE);
|
||
uvwrite_perm_boolean (e, q->fsendfiles, "SENDFILES", &ccol, TRUE);
|
||
uvwrite_perm_rw_array (e, (const char **) q->pzread, "READ", &ccol);
|
||
uvwrite_perm_rw_array (e, (const char **) q->pzwrite, "WRITE", &ccol);
|
||
uvwrite_perm_boolean (e, q->fcallback, "CALLBACK", &ccol, FALSE);
|
||
uvwrite_perm_array (e, (const char **) q->pzcommands, "COMMANDS",
|
||
&ccol);
|
||
uvwrite_perm_array (e, (const char **) q->pzvalidate, "VALIDATE",
|
||
&ccol);
|
||
uvwrite_perm_string (e, q->zmyname, "MYNAME", &ccol);
|
||
uvwrite_perm_string (e, q->zpubdir, "PUBDIR", &ccol);
|
||
uvwrite_perm_array (e, (const char **) q->pzalias, "ALIAS", &ccol);
|
||
|
||
fprintf (e, "\n");
|
||
}
|
||
|
||
if (ferror (e)
|
||
|| fclose (e) == EOF)
|
||
{
|
||
fprintf (stderr, "uuchk:%s: error during output\n", HDB_PERMISSIONS);
|
||
exit (EXIT_FAILURE);
|
||
}
|
||
}
|
||
|
||
/* Write an array out to the Permissions file. */
|
||
|
||
static void
|
||
uvwrite_perm_array (e, pzarg, zcmd, pccol)
|
||
FILE *e;
|
||
const char **pzarg;
|
||
const char *zcmd;
|
||
size_t *pccol;
|
||
{
|
||
size_t c;
|
||
const char **pz;
|
||
|
||
if (pzarg == NULL)
|
||
return;
|
||
|
||
c = strlen (zcmd) + 1;
|
||
|
||
for (pz = pzarg; *pz != NULL; pz++)
|
||
c += strlen (*pz) + 1;
|
||
|
||
if (*pccol > 20 && c + *pccol > 75)
|
||
{
|
||
fprintf (e, " \\\n");
|
||
*pccol = c - 1;
|
||
}
|
||
else
|
||
{
|
||
if (*pccol != 0)
|
||
fprintf (e, " ");
|
||
*pccol += c;
|
||
}
|
||
|
||
fprintf (e, "%s=", zcmd);
|
||
for (pz = pzarg; *pz != NULL; pz++)
|
||
{
|
||
if (pz != pzarg)
|
||
fprintf (e, ":");
|
||
fprintf (e, "%s", *pz);
|
||
}
|
||
}
|
||
|
||
/* Write a boolean value out to the Permissions file. This may be
|
||
either a yes/no boolean or a yes/call boolean (the latter is for
|
||
SENDFILES). */
|
||
|
||
static void
|
||
uvwrite_perm_boolean (e, f, zcmd, pccol, fsendfiles)
|
||
FILE *e;
|
||
int f;
|
||
const char *zcmd;
|
||
size_t *pccol;
|
||
boolean fsendfiles;
|
||
{
|
||
const char *az[2];
|
||
|
||
if (f < 0)
|
||
return;
|
||
|
||
if (f)
|
||
az[0] = "yes";
|
||
else
|
||
az[0] = fsendfiles ? "call" : "no";
|
||
az[1] = NULL;
|
||
|
||
uvwrite_perm_array (e, az, zcmd, pccol);
|
||
}
|
||
|
||
/* Write a set of READ or WRITE entries to the Permissions file. We
|
||
have to separate out all entries that start with '!'. */
|
||
|
||
static void
|
||
uvwrite_perm_rw_array (e, pzarg, zcmd, pccol)
|
||
FILE *e;
|
||
const char **pzarg;
|
||
const char *zcmd;
|
||
size_t *pccol;
|
||
{
|
||
size_t c;
|
||
const char **pz, **pzcopy, **pzset;
|
||
|
||
if (pzarg == NULL)
|
||
return;
|
||
|
||
c = 0;
|
||
for (pz = pzarg; *pz != NULL; pz++)
|
||
c++;
|
||
|
||
pzcopy = (const char **) malloc ((c + 1) * sizeof (char *));
|
||
if (pzcopy == NULL)
|
||
uvuuconf_error ((pointer) NULL, UUCONF_MALLOC_FAILED);
|
||
|
||
pzset = pzcopy;
|
||
for (pz = pzarg; *pz != NULL; pz++)
|
||
if ((*pz)[0] != '!')
|
||
*pzset++ = *pz;
|
||
*pzset = NULL;
|
||
|
||
if (pzset != pzcopy)
|
||
uvwrite_perm_array (e, (const char **) pzcopy, zcmd, pccol);
|
||
|
||
pzset = pzcopy;
|
||
for (pz = pzarg; *pz != NULL; pz++)
|
||
if ((*pz)[0] == '!')
|
||
*pzset++ = *pz;
|
||
*pzset = NULL;
|
||
|
||
if (pzset != pzcopy)
|
||
{
|
||
char ab[20];
|
||
|
||
sprintf (ab, "NO%s", zcmd);
|
||
uvwrite_perm_array (e, (const char **) pzcopy, ab, pccol);
|
||
}
|
||
}
|
||
|
||
/* Write a string out to the Permissions file. */
|
||
|
||
static void
|
||
uvwrite_perm_string (e, z, zcmd, pccol)
|
||
FILE *e;
|
||
const char *z;
|
||
const char *zcmd;
|
||
size_t *pccol;
|
||
{
|
||
const char *az[2];
|
||
|
||
if (z == NULL)
|
||
return;
|
||
|
||
az[0] = z;
|
||
az[1] = NULL;
|
||
|
||
uvwrite_perm_array (e, az, zcmd, pccol);
|
||
}
|
||
|
||
/* Write out a Taylor UUCP port. This is called via uuconf_find_port;
|
||
the pinfo argument is the port file. */
|
||
|
||
static int
|
||
ivwrite_taylor_port (qport, pinfo)
|
||
struct uuconf_port *qport;
|
||
pointer pinfo;
|
||
{
|
||
FILE *e = (FILE *) pinfo;
|
||
|
||
fprintf (e, "port %s\n", qport->uuconf_zname);
|
||
|
||
uvwrite_taylor_port (e, qport, "");
|
||
|
||
/* Return UUCONF_NOT_FOUND to force uuconf_find_port to keep looking
|
||
for ports. */
|
||
return UUCONF_NOT_FOUND;
|
||
}
|
||
|
||
/* Write a port out to a Taylor UUCP configuration file. This doesn't
|
||
output the name, since it is called to output a specially defined
|
||
port in the sys file. */
|
||
|
||
static void
|
||
uvwrite_taylor_port (e, qport, zprefix)
|
||
FILE *e;
|
||
struct uuconf_port *qport;
|
||
const char *zprefix;
|
||
{
|
||
const char *ztype;
|
||
char ab[100];
|
||
|
||
switch (qport->uuconf_ttype)
|
||
{
|
||
default:
|
||
case UUCONF_PORTTYPE_UNKNOWN:
|
||
fprintf (stderr, "uuconv: Bad port type\n");
|
||
exit (EXIT_FAILURE);
|
||
break;
|
||
case UUCONF_PORTTYPE_STDIN:
|
||
ztype = "stdin";
|
||
break;
|
||
case UUCONF_PORTTYPE_MODEM:
|
||
ztype = "modem";
|
||
break;
|
||
case UUCONF_PORTTYPE_DIRECT:
|
||
ztype = "direct";
|
||
break;
|
||
case UUCONF_PORTTYPE_TCP:
|
||
ztype = "tcp";
|
||
break;
|
||
case UUCONF_PORTTYPE_TLI:
|
||
ztype = "tli";
|
||
break;
|
||
case UUCONF_PORTTYPE_PIPE:
|
||
ztype = "pipe";
|
||
break;
|
||
}
|
||
|
||
fprintf (e, "%stype %s\n", zprefix, ztype);
|
||
|
||
if (qport->uuconf_zprotocols != NULL)
|
||
fprintf (e, "%sprotocol %s\n", zprefix, qport->uuconf_zprotocols);
|
||
|
||
if (qport->uuconf_qproto_params != NULL)
|
||
uvwrite_proto_params (e, qport->uuconf_qproto_params, zprefix);
|
||
|
||
if ((qport->uuconf_ireliable & UUCONF_RELIABLE_SPECIFIED) != 0)
|
||
{
|
||
sprintf (ab, "%sseven-bit", zprefix);
|
||
uvwrite_boolean (e,
|
||
((qport->uuconf_ireliable & UUCONF_RELIABLE_EIGHT)
|
||
== 0),
|
||
ab);
|
||
sprintf (ab, "%sreliable", zprefix);
|
||
uvwrite_boolean (e,
|
||
((qport->uuconf_ireliable & UUCONF_RELIABLE_RELIABLE)
|
||
!= 0),
|
||
ab);
|
||
sprintf (ab, "%shalf-duplex", zprefix);
|
||
uvwrite_boolean (e,
|
||
((qport->uuconf_ireliable & UUCONF_RELIABLE_FULLDUPLEX)
|
||
== 0),
|
||
ab);
|
||
}
|
||
|
||
if (qport->uuconf_zlockname != NULL)
|
||
fprintf (e, "%slockname %s\n", zprefix, qport->uuconf_zlockname);
|
||
|
||
switch (qport->uuconf_ttype)
|
||
{
|
||
default:
|
||
break;
|
||
case UUCONF_PORTTYPE_MODEM:
|
||
{
|
||
struct uuconf_modem_port *qm;
|
||
|
||
qm = &qport->uuconf_u.uuconf_smodem;
|
||
if (qm->uuconf_zdevice != NULL)
|
||
fprintf (e, "%sdevice %s\n", zprefix, qm->uuconf_zdevice);
|
||
if (qm->uuconf_zdial_device != NULL)
|
||
fprintf (e, "%sdial-device %s\n", zprefix, qm->uuconf_zdial_device);
|
||
if (qm->uuconf_ibaud != 0)
|
||
fprintf (e, "%sbaud %ld\n", zprefix, qm->uuconf_ibaud);
|
||
if (qm->uuconf_ilowbaud != 0)
|
||
fprintf (e, "%sbaud-range %ld %ld\n", zprefix, qm->uuconf_ilowbaud,
|
||
qm->uuconf_ihighbaud);
|
||
if (! qm->uuconf_fcarrier)
|
||
fprintf (e, "%scarrier false\n", zprefix);
|
||
if (! qm->uuconf_fhardflow)
|
||
fprintf (e, "%shardflow false\n", zprefix);
|
||
if (qm->uuconf_pzdialer != NULL)
|
||
{
|
||
if (qm->uuconf_pzdialer[1] == NULL)
|
||
fprintf (e, "%sdialer %s\n", zprefix, qm->uuconf_pzdialer[0]);
|
||
else
|
||
{
|
||
sprintf (ab, "%sdialer-sequence", zprefix);
|
||
uvwrite_string_array (e, qm->uuconf_pzdialer, ab);
|
||
}
|
||
}
|
||
if (qm->uuconf_qdialer != NULL)
|
||
{
|
||
sprintf (ab, "%sdialer ", zprefix);
|
||
uvwrite_taylor_dialer (e, qm->uuconf_qdialer, ab);
|
||
}
|
||
}
|
||
break;
|
||
case UUCONF_PORTTYPE_DIRECT:
|
||
{
|
||
struct uuconf_direct_port *qd;
|
||
|
||
qd = &qport->uuconf_u.uuconf_sdirect;
|
||
if (qd->uuconf_zdevice != NULL)
|
||
fprintf (e, "%sdevice %s\n", zprefix, qd->uuconf_zdevice);
|
||
if (qd->uuconf_ibaud != 0)
|
||
fprintf (e, "%sbaud %ld\n", zprefix, qd->uuconf_ibaud);
|
||
if (qd->uuconf_fcarrier)
|
||
fprintf (e, "%scarrier true\n", zprefix);
|
||
if (! qd->uuconf_fhardflow)
|
||
fprintf (e, "%shardflow false\n", zprefix);
|
||
}
|
||
break;
|
||
case UUCONF_PORTTYPE_TCP:
|
||
if (qport->uuconf_u.uuconf_stcp.uuconf_zport != NULL)
|
||
fprintf (e, "%sservice %s\n", zprefix,
|
||
qport->uuconf_u.uuconf_stcp.uuconf_zport);
|
||
if (qport->uuconf_u.uuconf_stcp.uuconf_pzdialer != NULL)
|
||
{
|
||
sprintf (ab, "%sdialer-sequence", zprefix);
|
||
uvwrite_string_array (e,
|
||
qport->uuconf_u.uuconf_stcp.uuconf_pzdialer,
|
||
ab);
|
||
}
|
||
break;
|
||
case UUCONF_PORTTYPE_TLI:
|
||
{
|
||
struct uuconf_tli_port *qt;
|
||
|
||
qt = &qport->uuconf_u.uuconf_stli;
|
||
if (qt->uuconf_zdevice != NULL)
|
||
fprintf (e, "%sdevice %s\n", zprefix, qt->uuconf_zdevice);
|
||
sprintf (ab, "%sstream", zprefix);
|
||
uvwrite_boolean (e, qt->uuconf_fstream, ab);
|
||
if (qt->uuconf_pzpush != NULL)
|
||
{
|
||
sprintf (ab, "%spush", zprefix);
|
||
uvwrite_string_array (e, qt->uuconf_pzpush, ab);
|
||
}
|
||
if (qt->uuconf_pzdialer != NULL)
|
||
{
|
||
sprintf (ab, "%sdialer-sequence", zprefix);
|
||
uvwrite_string_array (e, qt->uuconf_pzdialer, ab);
|
||
}
|
||
if (qt->uuconf_zservaddr != NULL)
|
||
fprintf (e, "%sserver-address %s\n", zprefix,
|
||
qt->uuconf_zservaddr);
|
||
}
|
||
break;
|
||
case UUCONF_PORTTYPE_PIPE:
|
||
{
|
||
struct uuconf_pipe_port *qp;
|
||
|
||
qp = &qport->uuconf_u.uuconf_spipe;
|
||
if (qp->uuconf_pzcmd != NULL)
|
||
{
|
||
sprintf (ab, "%scommad", zprefix);
|
||
uvwrite_string_array (e, qp->uuconf_pzcmd, ab);
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
/* Write out a port to the V2 L-devices file. This is called via
|
||
uuconf_find_port. */
|
||
|
||
static int
|
||
ivwrite_v2_port (qport, pinfo)
|
||
struct uuconf_port *qport;
|
||
pointer pinfo;
|
||
{
|
||
FILE *e = (FILE *) pinfo;
|
||
|
||
if (qport->uuconf_ttype == UUCONF_PORTTYPE_DIRECT)
|
||
{
|
||
fprintf (e, "DIR %s - %ld direct",
|
||
qport->uuconf_u.uuconf_sdirect.uuconf_zdevice,
|
||
qport->uuconf_u.uuconf_sdirect.uuconf_ibaud);
|
||
}
|
||
else if (qport->uuconf_ttype == UUCONF_PORTTYPE_MODEM)
|
||
{
|
||
fprintf (e, "%s %s ", qport->uuconf_zname,
|
||
qport->uuconf_u.uuconf_smodem.uuconf_zdevice);
|
||
if (qport->uuconf_u.uuconf_smodem.uuconf_zdial_device != NULL)
|
||
fprintf (e, "%s", qport->uuconf_u.uuconf_smodem.uuconf_zdial_device);
|
||
else
|
||
fprintf (e, "-");
|
||
fprintf (e, " ");
|
||
if (qport->uuconf_u.uuconf_smodem.uuconf_ilowbaud != 0L)
|
||
fprintf (e, "%ld-%ld",
|
||
qport->uuconf_u.uuconf_smodem.uuconf_ilowbaud,
|
||
qport->uuconf_u.uuconf_smodem.uuconf_ihighbaud);
|
||
else if (qport->uuconf_u.uuconf_smodem.uuconf_ibaud != 0L)
|
||
fprintf (e, "%ld", qport->uuconf_u.uuconf_smodem.uuconf_ibaud);
|
||
else
|
||
fprintf (e, "Any");
|
||
if (qport->uuconf_u.uuconf_smodem.uuconf_pzdialer != NULL)
|
||
fprintf (e, " %s",
|
||
qport->uuconf_u.uuconf_smodem.uuconf_pzdialer[0]);
|
||
}
|
||
else
|
||
{
|
||
fprintf (e, "# Ignoring port %s with unsupported type",
|
||
qport->uuconf_zname);
|
||
}
|
||
|
||
fprintf (e, "\n");
|
||
|
||
/* Return UUCONF_NOT_FOUND to force uuconf_find_port to keep looking
|
||
for a port. */
|
||
return UUCONF_NOT_FOUND;
|
||
}
|
||
|
||
/* Write out a port to the HDB Devices file. This is called via
|
||
uuconf_find_port. */
|
||
|
||
static int
|
||
ivwrite_hdb_port (qport, pinfo)
|
||
struct uuconf_port *qport;
|
||
pointer pinfo;
|
||
{
|
||
FILE *e = (FILE *) pinfo;
|
||
|
||
if (qport->uuconf_ttype == UUCONF_PORTTYPE_DIRECT)
|
||
{
|
||
fprintf (e, "Direct");
|
||
if (qport->uuconf_zprotocols != NULL)
|
||
fprintf (e, ",%s", qport->uuconf_zprotocols);
|
||
fprintf (e, " ");
|
||
if (qport->uuconf_u.uuconf_sdirect.uuconf_zdevice != NULL)
|
||
fprintf (e, "%s", qport->uuconf_u.uuconf_sdirect.uuconf_zdevice);
|
||
else
|
||
fprintf (e, "%s", qport->uuconf_zname);
|
||
fprintf (e, " - %ld", qport->uuconf_u.uuconf_sdirect.uuconf_ibaud);
|
||
}
|
||
else if (qport->uuconf_ttype == UUCONF_PORTTYPE_MODEM)
|
||
{
|
||
fprintf (e, "%s", qport->uuconf_zname);
|
||
if (qport->uuconf_zprotocols != NULL)
|
||
fprintf (e, ",%s", qport->uuconf_zprotocols);
|
||
fprintf (e, " ");
|
||
if (qport->uuconf_u.uuconf_smodem.uuconf_zdevice != NULL)
|
||
fprintf (e, "%s", qport->uuconf_u.uuconf_smodem.uuconf_zdevice);
|
||
else
|
||
fprintf (e, "%s", qport->uuconf_zname);
|
||
fprintf (e, " ");
|
||
if (qport->uuconf_u.uuconf_smodem.uuconf_zdial_device != NULL)
|
||
fprintf (e, "%s", qport->uuconf_u.uuconf_smodem.uuconf_zdial_device);
|
||
else
|
||
fprintf (e, "-");
|
||
fprintf (e, " ");
|
||
if (qport->uuconf_u.uuconf_smodem.uuconf_ilowbaud != 0L)
|
||
fprintf (e, "%ld-%ld",
|
||
qport->uuconf_u.uuconf_smodem.uuconf_ilowbaud,
|
||
qport->uuconf_u.uuconf_smodem.uuconf_ihighbaud);
|
||
else if (qport->uuconf_u.uuconf_smodem.uuconf_ibaud != 0L)
|
||
fprintf (e, "%ld", qport->uuconf_u.uuconf_smodem.uuconf_ibaud);
|
||
else
|
||
fprintf (e, "Any");
|
||
if (qport->uuconf_u.uuconf_smodem.uuconf_pzdialer != NULL)
|
||
{
|
||
char **pz;
|
||
|
||
for (pz = qport->uuconf_u.uuconf_smodem.uuconf_pzdialer;
|
||
*pz != NULL;
|
||
pz++)
|
||
fprintf (e, " %s", *pz);
|
||
}
|
||
}
|
||
else if (qport->uuconf_ttype == UUCONF_PORTTYPE_TCP)
|
||
{
|
||
char **pz;
|
||
|
||
fprintf (e, "TCP");
|
||
if (qport->uuconf_zprotocols != NULL)
|
||
fprintf (e, ",%s", qport->uuconf_zprotocols);
|
||
fprintf (e, " ");
|
||
if (qport->uuconf_u.uuconf_stcp.uuconf_zport == NULL)
|
||
fprintf (e, "uucp");
|
||
else
|
||
fprintf (e, "%s", qport->uuconf_u.uuconf_stcp.uuconf_zport);
|
||
fprintf (e, " - -");
|
||
pz = qport->uuconf_u.uuconf_stcp.uuconf_pzdialer;
|
||
if (pz != NULL)
|
||
for (; *pz != NULL; pz++)
|
||
fprintf (e, " %s", *pz);
|
||
}
|
||
else if (qport->uuconf_ttype == UUCONF_PORTTYPE_TLI)
|
||
{
|
||
char **pz;
|
||
|
||
fprintf (e, "%s", qport->uuconf_zname);
|
||
if (qport->uuconf_zprotocols != NULL)
|
||
fprintf (e, ",%s", qport->uuconf_zprotocols);
|
||
fprintf (e, " ");
|
||
if (qport->uuconf_u.uuconf_stli.uuconf_zdevice != NULL)
|
||
fprintf (e, "%s", qport->uuconf_u.uuconf_smodem.uuconf_zdevice);
|
||
else
|
||
fprintf (e, "-");
|
||
fprintf (e, " - -");
|
||
pz = qport->uuconf_u.uuconf_stli.uuconf_pzdialer;
|
||
if (pz == NULL
|
||
|| *pz == NULL
|
||
|| (strcmp (*pz, "TLI") != 0
|
||
&& strcmp (*pz, "TLIS") != 0))
|
||
fprintf (e, " TLI%s \\D",
|
||
qport->uuconf_u.uuconf_stli.uuconf_fstream ? "S" : "");
|
||
if (pz != NULL)
|
||
for (; *pz != NULL; pz++)
|
||
fprintf (e, " %s", *pz);
|
||
}
|
||
else
|
||
{
|
||
fprintf (e, "# Ignoring port %s with unsupported type",
|
||
qport->uuconf_zname);
|
||
}
|
||
|
||
fprintf (e, "\n");
|
||
|
||
/* Return UUCONF_NOT_FOUND to force uuconf_find_port to keep looking
|
||
for a port. */
|
||
return UUCONF_NOT_FOUND;
|
||
}
|
||
|
||
/* Write a dialer out to a Taylor UUCP configuration file. This
|
||
doesn't output the name, since it is called to output a specially
|
||
defined dialer in the sys or port file. */
|
||
|
||
static void
|
||
uvwrite_taylor_dialer (e, qdialer, zprefix)
|
||
FILE *e;
|
||
struct uuconf_dialer *qdialer;
|
||
const char *zprefix;
|
||
{
|
||
char ab[100];
|
||
|
||
/* Reset default values, so we don't output them unnecessarily. */
|
||
if (qdialer->uuconf_schat.uuconf_ctimeout == 60)
|
||
qdialer->uuconf_schat.uuconf_ctimeout = -1;
|
||
if (qdialer->uuconf_schat.uuconf_fstrip)
|
||
qdialer->uuconf_schat.uuconf_fstrip = -1;
|
||
if (qdialer->uuconf_scomplete.uuconf_ctimeout == 60)
|
||
qdialer->uuconf_scomplete.uuconf_ctimeout = -1;
|
||
if (qdialer->uuconf_scomplete.uuconf_fstrip)
|
||
qdialer->uuconf_scomplete.uuconf_fstrip = -1;
|
||
if (qdialer->uuconf_sabort.uuconf_ctimeout == 60)
|
||
qdialer->uuconf_sabort.uuconf_ctimeout = -1;
|
||
if (qdialer->uuconf_sabort.uuconf_fstrip)
|
||
qdialer->uuconf_sabort.uuconf_fstrip = -1;
|
||
|
||
uvwrite_chat (e, &qdialer->uuconf_schat, (struct uuconf_chat *) NULL,
|
||
zprefix, FALSE);
|
||
if (qdialer->uuconf_zdialtone != NULL
|
||
&& strcmp (qdialer->uuconf_zdialtone, ",") != 0)
|
||
fprintf (e, "%sdialtone %s\n", zprefix, qdialer->uuconf_zdialtone);
|
||
if (qdialer->uuconf_zpause != NULL
|
||
&& strcmp (qdialer->uuconf_zpause, ",") != 0)
|
||
fprintf (e, "%spause %s\n", zprefix, qdialer->uuconf_zpause);
|
||
if (! qdialer->uuconf_fcarrier)
|
||
fprintf (e, "%scarrier false\n", zprefix);
|
||
if (qdialer->uuconf_ccarrier_wait != 60)
|
||
fprintf (e, "%scarrier-wait %d\n", zprefix,
|
||
qdialer->uuconf_ccarrier_wait);
|
||
if (qdialer->uuconf_fdtr_toggle)
|
||
fprintf (e, "%sdtr-toggle %s %s\n", zprefix,
|
||
qdialer->uuconf_fdtr_toggle ? "true" : "false",
|
||
qdialer->uuconf_fdtr_toggle_wait ? "true" : "false");
|
||
sprintf (ab, "%scomplete-", zprefix);
|
||
uvwrite_chat (e, &qdialer->uuconf_scomplete, (struct uuconf_chat *) NULL,
|
||
ab, FALSE);
|
||
sprintf (ab, "%sabort-", zprefix);
|
||
uvwrite_chat (e, &qdialer->uuconf_sabort, (struct uuconf_chat *) NULL,
|
||
ab, FALSE);
|
||
if (qdialer->uuconf_qproto_params != NULL)
|
||
uvwrite_proto_params (e, qdialer->uuconf_qproto_params, zprefix);
|
||
if ((qdialer->uuconf_ireliable & UUCONF_RELIABLE_SPECIFIED) != 0)
|
||
{
|
||
sprintf (ab, "%sseven-bit", zprefix);
|
||
uvwrite_boolean (e,
|
||
((qdialer->uuconf_ireliable & UUCONF_RELIABLE_EIGHT)
|
||
== 0),
|
||
ab);
|
||
sprintf (ab, "%sreliable", zprefix);
|
||
uvwrite_boolean (e,
|
||
((qdialer->uuconf_ireliable & UUCONF_RELIABLE_RELIABLE)
|
||
!= 0),
|
||
ab);
|
||
sprintf (ab, "%shalf-duplex", zprefix);
|
||
uvwrite_boolean (e,
|
||
((qdialer->uuconf_ireliable
|
||
& UUCONF_RELIABLE_FULLDUPLEX) == 0),
|
||
ab);
|
||
}
|
||
}
|
||
|
||
/* Write a dialer out to an HDB configuration file. */
|
||
|
||
static void
|
||
uvwrite_hdb_dialer (e, qdialer)
|
||
FILE *e;
|
||
struct uuconf_dialer *qdialer;
|
||
{
|
||
fprintf (e, "%s ", qdialer->uuconf_zname);
|
||
|
||
if (qdialer->uuconf_zdialtone != NULL)
|
||
fprintf (e, "=%c", qdialer->uuconf_zdialtone[0]);
|
||
if (qdialer->uuconf_zpause != NULL)
|
||
fprintf (e, "-%c", qdialer->uuconf_zpause[0]);
|
||
|
||
if (qdialer->uuconf_schat.uuconf_pzchat != NULL)
|
||
{
|
||
if (qdialer->uuconf_zdialtone == NULL
|
||
&& qdialer->uuconf_zpause == NULL)
|
||
fprintf (e, "\"\"");
|
||
fprintf (e, " ");
|
||
uvwrite_chat_script (e, qdialer->uuconf_schat.uuconf_pzchat);
|
||
}
|
||
|
||
fprintf (e, "\n");
|
||
}
|
||
|
||
/* Display a uuconf error and exit. */
|
||
|
||
static void
|
||
uvuuconf_error (puuconf, iret)
|
||
pointer puuconf;
|
||
int iret;
|
||
{
|
||
char ab[512];
|
||
|
||
(void) uuconf_error_string (puuconf, iret, ab, sizeof ab);
|
||
if ((iret & UUCONF_ERROR_FILENAME) == 0)
|
||
fprintf (stderr, "uuconv: %s\n", ab);
|
||
else
|
||
fprintf (stderr, "uuconv:%s\n", ab);
|
||
if (UUCONF_ERROR_VALUE (iret) != UUCONF_FOPEN_FAILED)
|
||
exit (EXIT_FAILURE);
|
||
}
|