212 lines
6.8 KiB
C
212 lines
6.8 KiB
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
|
||
|
||
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));
|
||
|
||
/* 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])
|
||
|
||
/* 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;
|
||
}
|
||
|
||
/* 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;
|
||
}
|