Taylor UUCP 1.04
[unix-history] / gnu / libexec / uucp / libuuconf / tdialc.c
/* tdialc.c
Handle a Taylor UUCP dialer command.
Copyright (C) 1992 Ian Lance Taylor
This file is part of the Taylor UUCP uuconf library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License
as published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
*/
#include "uucnfi.h"
#if USE_RCS_ID
const char _uuconf_tdialc_rcsid[] = "$Id: tdialc.c,v 1.1 1993/08/04 19:35:09 jtc Exp $";
#endif
\f
static int idchat P((pointer pglobal, int argc, char **argv, pointer pvar,
pointer pinfo));
static int iddtr_toggle P((pointer pglobal, int argc, char **argv,
pointer pvar, pointer pinfo));
static int idcomplete P((pointer pglobal, int argc, char **argv,
pointer pvar, pointer pinfo));
static int idproto_param P((pointer pglobal, int argc, char **argv,
pointer pvar, pointer pinfo));
static int idcunknown P((pointer pglobal, int argc, char **argv,
pointer pvar, pointer pinfo));
\f
/* The command table for dialer commands. The "dialer" command is
handled specially. */
static const struct cmdtab_offset asDialer_cmds[] =
{
{ "chat", UUCONF_CMDTABTYPE_PREFIX | 0,
offsetof (struct uuconf_dialer, uuconf_schat), idchat },
{ "dialtone", UUCONF_CMDTABTYPE_STRING,
offsetof (struct uuconf_dialer, uuconf_zdialtone), NULL },
{ "pause", UUCONF_CMDTABTYPE_STRING,
offsetof (struct uuconf_dialer, uuconf_zpause), NULL },
{ "carrier", UUCONF_CMDTABTYPE_BOOLEAN,
offsetof (struct uuconf_dialer, uuconf_fcarrier), NULL },
{ "carrier-wait", UUCONF_CMDTABTYPE_INT,
offsetof (struct uuconf_dialer, uuconf_ccarrier_wait), NULL },
{ "dtr-toggle", UUCONF_CMDTABTYPE_FN | 0, (size_t) -1, iddtr_toggle },
{ "complete", UUCONF_CMDTABTYPE_FN | 2,
offsetof (struct uuconf_dialer, uuconf_scomplete), idcomplete },
{ "complete-chat", UUCONF_CMDTABTYPE_PREFIX,
offsetof (struct uuconf_dialer, uuconf_scomplete), idchat },
{ "abort", UUCONF_CMDTABTYPE_FN | 2,
offsetof (struct uuconf_dialer, uuconf_sabort), idcomplete },
{ "abort-chat", UUCONF_CMDTABTYPE_PREFIX,
offsetof (struct uuconf_dialer, uuconf_sabort), idchat },
{ "protocol-parameter", UUCONF_CMDTABTYPE_FN | 0,
offsetof (struct uuconf_dialer, uuconf_qproto_params), idproto_param },
{ "seven-bit", UUCONF_CMDTABTYPE_FN | 2,
offsetof (struct uuconf_dialer, uuconf_ireliable), _uuconf_iseven_bit },
{ "reliable", UUCONF_CMDTABTYPE_FN | 2,
offsetof (struct uuconf_dialer, uuconf_ireliable), _uuconf_ireliable },
{ "half-duplex", UUCONF_CMDTABTYPE_FN | 2,
offsetof (struct uuconf_dialer, uuconf_ireliable),
_uuconf_ihalf_duplex },
{ NULL, 0, 0, NULL }
};
#define CDIALER_CMDS (sizeof asDialer_cmds / sizeof asDialer_cmds[0])
\f
/* Handle a command passed to a dialer from a Taylor UUCP
configuration file. This can be called when reading the dialer
file, the port file, or the sys file. The return value may have
UUCONF_CMDTABRET_KEEP set, but not UUCONF_CMDTABRET_EXIT. It
assigns values to the elements of qdialer. The first time this is
called, qdialer->uuconf_palloc should be set. This will not set
qdialer->uuconf_zname. */
int
_uuconf_idialer_cmd (qglobal, argc, argv, qdialer)
struct sglobal *qglobal;
int argc;
char **argv;
struct uuconf_dialer *qdialer;
{
struct uuconf_cmdtab as[CDIALER_CMDS];
int iret;
_uuconf_ucmdtab_base (asDialer_cmds, CDIALER_CMDS, (char *) qdialer, as);
iret = uuconf_cmd_args ((pointer) qglobal, argc, argv, as,
(pointer) qdialer, idcunknown, 0,
qdialer->uuconf_palloc);
return iret &~ UUCONF_CMDTABRET_EXIT;
}
\f
/* Reroute a chat script command. */
static int
idchat (pglobal, argc, argv, pvar, pinfo)
pointer pglobal;
int argc;
char **argv;
pointer pvar;
pointer pinfo;
{
struct sglobal *qglobal = (struct sglobal *) pglobal;
struct uuconf_chat *qchat = (struct uuconf_chat *) pvar;
struct uuconf_dialer *qdialer = (struct uuconf_dialer *) pinfo;
return _uuconf_ichat_cmd (qglobal, argc, argv, qchat,
qdialer->uuconf_palloc);
}
/* Handle the "dtr-toggle" command, which may take two arguments. */
/*ARGSUSED*/
static int
iddtr_toggle (pglobal, argc, argv, pvar, pinfo)
pointer pglobal;
int argc;
char **argv;
pointer pvar;
pointer pinfo;
{
struct sglobal *qglobal = (struct sglobal *) pglobal;
struct uuconf_dialer *qdialer = (struct uuconf_dialer *) pinfo;
int iret;
if (argc < 2 || argc > 3)
return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
iret = _uuconf_iboolean (qglobal, argv[1], &qdialer->uuconf_fdtr_toggle);
if ((iret &~ UUCONF_CMDTABRET_KEEP) != UUCONF_SUCCESS)
return iret;
if (argc < 3)
return iret;
iret |= _uuconf_iboolean (qglobal, argv[2],
&qdialer->uuconf_fdtr_toggle_wait);
return iret;
}
/* Handle the "complete" and "abort" commands. These just turn a
string into a trivial chat script. */
/*ARGSUSED*/
static int
idcomplete (pglobal, argc, argv, pvar, pinfo)
pointer pglobal;
int argc;
char **argv;
pointer pvar;
pointer pinfo;
{
struct sglobal *qglobal = (struct sglobal *) pglobal;
struct uuconf_chat *qchat = (struct uuconf_chat *) pvar;
struct uuconf_dialer *qdialer = (struct uuconf_dialer *) pinfo;
char *azargs[3];
azargs[0] = (char *) "complete-chat";
azargs[1] = (char *) "\"\"";
azargs[2] = (char *) argv[1];
return _uuconf_ichat_cmd (qglobal, 3, azargs, qchat,
qdialer->uuconf_palloc);
}
/* Handle the "protocol-parameter" command. */
static int
idproto_param (pglobal, argc, argv, pvar, pinfo)
pointer pglobal;
int argc;
char **argv;
pointer pvar;
pointer pinfo;
{
struct sglobal *qglobal = (struct sglobal *) pglobal;
struct uuconf_proto_param **pqparam = (struct uuconf_proto_param **) pvar;
struct uuconf_dialer *qdialer = (struct uuconf_dialer *) pinfo;
return _uuconf_iadd_proto_param (qglobal, argc - 1, argv + 1, pqparam,
qdialer->uuconf_palloc);
}
/* Give an error for an unknown dialer command. */
/*ARGSUSED*/
static int
idcunknown (pglobal, argc, argv, pvar, pinfo)
pointer pglobal;
int argc;
char **argv;
pointer pvar;
pointer pinfo;
{
return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
}