1993-08-05 18:28:27 +00:00
|
|
|
|
/* 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
|
1995-08-19 21:30:30 +00:00
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
1993-08-05 18:28:27 +00:00
|
|
|
|
|
|
|
|
|
The author of the program may be contacted at ian@airs.com or
|
1995-08-19 21:30:30 +00:00
|
|
|
|
c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
|
1993-08-05 18:28:27 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "uucnfi.h"
|
|
|
|
|
|
|
|
|
|
#if USE_RCS_ID
|
1999-08-27 23:37:10 +00:00
|
|
|
|
const char _uuconf_tdialc_rcsid[] = "$FreeBSD$";
|
1993-08-05 18:28:27 +00:00
|
|
|
|
#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*/
|
1995-08-19 21:30:30 +00:00
|
|
|
|
static int
|
1993-08-05 18:28:27 +00:00
|
|
|
|
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;
|
|
|
|
|
|
1995-08-19 21:30:30 +00:00
|
|
|
|
return _uuconf_iadd_proto_param (qglobal, argc - 1, argv + 1, pqparam,
|
1993-08-05 18:28:27 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|