X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Foptions.c;h=5f22c1759485442c519478b89d79d507f8be7113;hp=af2116dac2711dca610298ad80c2adb1ee9c1189;hb=3c0c031beb1b4f715e2b4bb79c7fd835d1aacc32;hpb=b87d00d8a7fb49857175ee79f0327f382386901b diff --git a/pppd/options.c b/pppd/options.c index af2116d..5f22c17 100644 --- a/pppd/options.c +++ b/pppd/options.c @@ -17,7 +17,7 @@ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#define RCSID "$Id: options.c,v 1.69 1999/12/23 01:28:52 paulus Exp $" +#define RCSID "$Id: options.c,v 1.73 2000/04/13 12:05:16 paulus Exp $" #include #include @@ -93,6 +93,7 @@ int idle_time_limit = 0; /* Disconnect if idle for this many seconds */ 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 */ @@ -101,6 +102,10 @@ 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; @@ -123,6 +128,7 @@ char *current_option; /* the name of the option being parsed */ 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 @@ -205,6 +211,8 @@ option_t general_options[] = { 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, @@ -250,7 +258,8 @@ option_t general_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" }, + "Send log messages to this file descriptor", + 0, &log_to_specific_fd }, { "logfile", o_special, setlogfile, "Append log messages to this file" }, { "nolog", o_int, &log_to_fd, @@ -270,6 +279,22 @@ option_t general_options[] = { "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 }, @@ -1466,39 +1491,20 @@ static int 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; } @@ -1507,6 +1513,39 @@ setnetmask(argv) 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;