* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-#define RCSID "$Id: options.c,v 1.68 1999/11/15 03:55:37 paulus Exp $"
+#define RCSID "$Id: options.c,v 1.72 2000/04/04 07:06:52 paulus Exp $"
#include <ctype.h>
#include <stdio.h>
bool nodetach = 0; /* Don't detach from controlling tty */
bool updetach = 0; /* Detach once link is up */
char *initializer = NULL; /* Script to initialize physical link */
-char *connector = NULL; /* Script to establish physical link */
-char *disconnector = NULL; /* Script to disestablish physical link */
+char *connect_script = NULL; /* Script to establish physical link */
+char *disconnect_script = NULL; /* Script to disestablish physical link */
char *welcomer = NULL; /* Script to run after phys link estab. */
char *ptycommand = NULL; /* Command to run on other side of pty */
int maxconnect = 0; /* Maximum connect time */
int holdoff = 30; /* # seconds to pause before reconnecting */
bool holdoff_specified; /* true if a holdoff value has been given */
bool notty = 0; /* Stdin/out is not a tty */
+char *pty_socket = NULL; /* Socket to connect to pty */
char *record_file = NULL; /* File to record chars sent/received */
int using_pty = 0;
bool sync_serial = 0; /* Device is synchronous serial device */
int maxfail = 10; /* max # of unsuccessful connection attempts */
char linkname[MAXPATHLEN]; /* logical name for link */
bool tune_kernel; /* may alter kernel settings */
+int connect_delay = 1000; /* wait this many ms after connect script */
+int max_data_rate; /* max bytes/sec through charshunt */
+int req_unit = -1; /* requested interface unit */
+bool multilink = 0; /* Enable multilink operation */
+char *bundle_name = NULL; /* bundle name for multilink */
extern option_t auth_options[];
extern struct stat devstat;
extern int prepass; /* Doing pre-pass to find device name */
struct option_info initializer_info;
-struct option_info connector_info;
-struct option_info disconnector_info;
+struct option_info connect_script_info;
+struct option_info disconnect_script_info;
struct option_info welcomer_info;
struct option_info devnam_info;
struct option_info ptycommand_info;
{ "init", o_string, &initializer,
"A program to initialize the device",
OPT_A2INFO | OPT_PRIVFIX, &initializer_info },
- { "connect", o_string, &connector,
+ { "connect", o_string, &connect_script,
"A program to set up a connection",
- OPT_A2INFO | OPT_PRIVFIX, &connector_info },
- { "disconnect", o_string, &disconnector,
+ OPT_A2INFO | OPT_PRIVFIX, &connect_script_info },
+ { "disconnect", o_string, &disconnect_script,
"Program to disconnect serial device",
- OPT_A2INFO | OPT_PRIVFIX, &disconnector_info },
+ OPT_A2INFO | OPT_PRIVFIX, &disconnect_script_info },
{ "welcome", o_string, &welcomer,
"Script to welcome client",
OPT_A2INFO | OPT_PRIVFIX, &welcomer_info },
OPT_A2INFO | OPT_PRIVFIX | OPT_DEVNAM, &ptycommand_info },
{ "notty", o_bool, ¬ty,
"Input/output is not a tty", OPT_DEVNAM | 1 },
+ { "socket", o_string, &pty_socket,
+ "Send and receive over socket, arg is host:port", OPT_DEVNAM },
{ "record", o_string, &record_file,
"Record characters sent/received to file" },
{ "maxconnect", o_int, &maxconnect,
"Alter kernel settings as necessary", 1 },
{ "noktune", o_bool, &tune_kernel,
"Don't alter kernel settings", 0 },
+ { "connect-delay", o_int, &connect_delay,
+ "Maximum time (in ms) to wait after connect script finishes" },
+ { "datarate", o_int, &max_data_rate,
+ "Maximum data rate in bytes/sec (with pty, notty or record option)" },
+ { "unit", o_int, &req_unit,
+ "PPP interface unit number to use if possible", OPT_LLIMIT, 0, 0 },
+#ifdef HAVE_MULTILINK
+ { "multilink", o_bool, &multilink,
+ "Enable multilink operation", 1 },
+ { "nomultilink", o_bool, &multilink,
+ "Disable multilink operation", 0 },
+ { "mp", o_bool, &multilink,
+ "Enable multilink operation", 1 },
+ { "nomp", o_bool, &multilink,
+ "Disable multilink operation", 0 },
+ { "bundle", o_string, &bundle_name,
+ "Bundle name for multilink" },
+#endif /* HAVE_MULTILINK */
#ifdef PLUGIN
{ "plugin", o_special, loadplugin,
"Load a plug-in module into pppd", OPT_PRIV },
setnetmask(argv)
char **argv;
{
- u_int32_t mask, b;
- int n, ok;
- char *p, *endp;
+ u_int32_t mask;
+ int n;
+ char *p;
/*
* Unfortunately, if we use inet_addr, we can't tell whether
* a result of all 1s is an error or a valid 255.255.255.255.
*/
p = *argv;
- ok = 0;
- mask = 0;
- for (n = 3;; --n) {
- b = strtoul(p, &endp, 0);
- if (endp == p)
- break;
- if (b > 255) {
- if (n == 3) {
- /* accept e.g. 0xffffff00 */
- p = endp;
- mask = b;
- }
- break;
- }
- mask |= b << (n * 8);
- p = endp;
- if (*p != '.' || n == 0)
- break;
- ++p;
- }
+ n = parse_dotted_ip(p, &mask);
mask = htonl(mask);
- if (*p != 0 || (netmask & ~mask) != 0) {
+ if (n == 0 || p[n] != 0 || (netmask & ~mask) != 0) {
option_error("invalid netmask value '%s'", *argv);
return 0;
}
return (1);
}
+int
+parse_dotted_ip(p, vp)
+ char *p;
+ u_int32_t *vp;
+{
+ int n;
+ u_int32_t v, b;
+ char *endp, *p0 = p;
+
+ v = 0;
+ for (n = 3;; --n) {
+ b = strtoul(p, &endp, 0);
+ if (endp == p)
+ return 0;
+ if (b > 255) {
+ if (n < 3)
+ return 0;
+ /* accept e.g. 0xffffff00 */
+ *vp = b;
+ return endp - p0;
+ }
+ v |= b << (n * 8);
+ p = endp;
+ if (n == 0)
+ break;
+ if (*p != '.')
+ return 0;
+ ++p;
+ }
+ *vp = v;
+ return p - p0;
+}
+
static int
setxonxoff(argv)
char **argv;