* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-#define RCSID "$Id: options.c,v 1.70 2000/03/13 23:39:58 paulus Exp $"
+#define RCSID "$Id: options.c,v 1.74 2000/04/15 01:27:13 masputra Exp $"
#include <ctype.h>
#include <stdio.h>
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;
int privileged_option; /* set iff the current option came from root */
char *option_source; /* string saying where the option came from */
bool log_to_file; /* log_to_fd is a file opened by us */
+bool log_to_specific_fd; /* log_to_fd was specified by user option */
/*
* Prototypes
"Set time in seconds before disconnecting idle link" },
{ "lock", o_bool, &lockflag,
"Lock serial device with UUCP-style lock file", 1 },
- { "-all", o_special_noarg, noopt,
+ { "-all", o_special_noarg, (void *)noopt,
"Don't request/allow any LCP or IPCP options (useless)" },
{ "init", o_string, &initializer,
"A program to initialize the device",
"Set alternate hardware (DTR/CTS) flow control", OPT_NOARG|OPT_VAL(2) },
{ "nocdtrcts", o_int, &crtscts,
"Disable hardware flow control", OPT_NOARG|OPT_VAL(-1) },
- { "xonxoff", o_special_noarg, setxonxoff,
+ { "xonxoff", o_special_noarg, (void *)setxonxoff,
"Set software (XON/XOFF) flow control" },
- { "domain", o_special, setdomain,
+ { "domain", o_special, (void *)setdomain,
"Add given domain name to hostname" },
{ "mtu", o_int, &lcp_allowoptions[0].mru,
"Set our MTU", OPT_LIMITS, NULL, MAXMRU, MINMRU },
- { "netmask", o_special, setnetmask,
+ { "netmask", o_special, (void *)setnetmask,
"set netmask" },
{ "modem", o_bool, &modem,
"Use modem control lines", 1 },
{ "local", o_bool, &modem,
"Don't use modem control lines" },
- { "file", o_special, readfile,
+ { "file", o_special, (void *)readfile,
"Take options from a file", OPT_PREPASS },
- { "call", o_special, callfile,
+ { "call", o_special, (void *)callfile,
"Take options from a privileged file", OPT_PREPASS },
{ "persist", o_bool, &persist,
"Keep on reopening connection after close", 1 },
"Turn off persist option" },
{ "demand", o_bool, &demand,
"Dial on demand", OPT_INITONLY | 1, &persist },
- { "--version", o_special_noarg, showversion,
+ { "--version", o_special_noarg, (void *)showversion,
"Show version number" },
- { "--help", o_special_noarg, showhelp,
+ { "--help", o_special_noarg, (void *)showhelp,
"Show brief listing of options" },
- { "-h", o_special_noarg, showhelp,
+ { "-h", o_special_noarg, (void *)showhelp,
"Show brief listing of options" },
{ "sync", o_bool, &sync_serial,
"Use synchronous HDLC serial encoding", 1 },
{ "logfd", o_int, &log_to_fd,
- "Send log messages to this file descriptor" },
- { "logfile", o_special, setlogfile,
+ "Send log messages to this file descriptor",
+ 0, &log_to_specific_fd },
+ { "logfile", o_special, (void *)setlogfile,
"Append log messages to this file" },
{ "nolog", o_int, &log_to_fd,
"Don't send log messages to any file",
"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,
+ { "plugin", o_special, (void *)loadplugin,
"Load a plug-in module into pppd", OPT_PRIV },
#endif
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;
option_error("Couldn't load plugin %s", arg);
return 0;
}
- init = dlsym(handle, "plugin_init");
+ init = (void (*)(void))dlsym(handle, "plugin_init");
if (init == 0) {
option_error("%s has no initialization entry point", arg);
dlclose(handle);