#include "uucnfi.h"
#if USE_RCS_ID
const char uuconv_rcsid[] = "$Id: uuconv.c,v 1.30 2002/03/05 19:10:42 ian Rel $";
#endif
#include "getopt.h"
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));
const char *zProgram;
static struct shpermissions *qVperms;
enum tconfig
{
CONFIG_TAYLOR,
CONFIG_V2,
CONFIG_HDB
};
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;
{
const char *zconfig = NULL;
const char *zinput = NULL;
const char *zoutput = NULL;
const char *zprogram = NULL;
int iopt;
enum tconfig tinput, toutput;
int iret;
pointer pinput;
if (argc < 1)
{
zProgram = "uuconv";
uvusage ();
}
zProgram = argv[0];
while ((iopt = getopt_long (argc, argv, "i:I:o:p:vx:", asVlongopts,
(int *) NULL)) != EOF)
{
switch (iopt)
{
case 'i':
zinput = optarg;
break;
case 'o':
zoutput = optarg;
break;
case 'p':
zprogram = optarg;
break;
case 'I':
zconfig = optarg;
break;
case 'x':
break;
case 'v':
printf ("uuconv (Taylor UUCP) %s\n", VERSION);
printf ("Copyright (C) 1991, 92, 93, 94, 1995, 2002 Ian Lance Taylor\n");
printf ("This program is free software; you may redistribute it under the terms of\n");
printf ("the GNU General Public LIcense. This program has ABSOLUTELY NO WARRANTY.\n");
exit (EXIT_SUCCESS);
case 1:
uvhelp ();
exit (EXIT_SUCCESS);
case 0:
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;
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;
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
{
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);
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);
}
}
}
{
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);
}
}
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;
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
{
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);
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);
return 0;
}
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);
}
static void
uvhelp ()
{
printf ("Taylor UUCP %s, copyright (C) 1991, 92, 93, 94, 1995, 2002 Ian Lance Taylor\n",
VERSION);
printf ("Converts UUCP configuration files from one format to another.\n");
printf ("Usage: %s -i input -o output [-p program] [-I file]\n", zProgram);
printf (" -i,--input input: Set input type (one of taylor, v2, hdb)\n");
printf (" -o,--output output: Set output type (one of taylor, v2, hdb)\n");
printf (" -p,--program program: Program to convert (e.g., uucp or cu)\n");
printf (" -I,--config file: Set Taylor UUCP configuration file to use\n");
printf (" -v,--version: Print version and exit\n");
printf (" --help: Print help and exit\n");
printf ("Report bugs to taylor-uucp@gnu.org\n");
}
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, ",");
}
}
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);
}
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");
}
}
}
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");
}
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");
}
}
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);
}
}
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);
}
}
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");
}
}
}
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");
}
}
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");
}
}
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");
}
}
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);
}
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);
}
}
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;
}
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;
}
static void
uvadd_perm (qadd)
struct shpermissions *qadd;
{
struct shpermissions *qlook;
struct shpermissions *qnew;
int iret;
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)
{
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;
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;
}
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;
}
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);
}
}
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);
}
}
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);
}
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);
}
}
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);
}
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;
}
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;
}
}
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;
}
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;
}
static void
uvwrite_taylor_dialer (e, qdialer, zprefix)
FILE *e;
struct uuconf_dialer *qdialer;
const char *zprefix;
{
char ab[100];
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);
}
}
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");
}
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);
}