]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/options.c
fixes for mtu setting on SVR4; add filtering stuff
[ppp.git] / pppd / options.c
index 73681155aa3d6d901bf81d2ebcecbb779535ddb9..2fd8820ea584e91cf3afdea03cbae9562bb1e2de 100644 (file)
@@ -18,7 +18,7 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$Id: options.c,v 1.35 1996/09/26 06:22:22 paulus Exp $";
+static char rcsid[] = "$Id: options.c,v 1.37 1997/03/04 03:41:58 paulus Exp $";
 #endif
 
 #include <ctype.h>
@@ -46,6 +46,9 @@ static char rcsid[] = "$Id: options.c,v 1.35 1996/09/26 06:22:22 paulus Exp $";
 #include "upap.h"
 #include "chap.h"
 #include "ccp.h"
+#ifdef CBCP_SUPPORT
+#include "cbcp.h"
+#endif
 
 #ifdef IPX_CHANGE
 #include "ipxcp.h"
@@ -137,6 +140,9 @@ static int setasyncmap __P((char **));
 static int setescape __P((char **));
 static int setmru __P((char **));
 static int setmtu __P((char **));
+#ifdef CBCP_SUPPORT
+static int setcbcp __P((char **));
+#endif
 static int nomru __P((void));
 static int nopcomp __P((void));
 static int setconnector __P((char **));
@@ -199,10 +205,13 @@ static int setpapcrypt __P((void));
 static int setidle __P((char **));
 static int setholdoff __P((char **));
 static int setdnsaddr __P((char **));
+static int resetipxproto __P((void));
+static int setwinsaddr __P((char **));
+static int showversion __P((void));
+static int showhelp __P((void));
 
 #ifdef IPX_CHANGE
 static int setipxproto __P((void));
-static int resetipxproto __P((void));
 static int setipxanet __P((void));
 static int setipxalcl __P((void));
 static int setipxarmt __P((void));
@@ -277,6 +286,9 @@ static struct cmd {
     {"domain", 1, setdomain},  /* Add given domain name to hostname*/
     {"mru", 1, setmru},                /* Set MRU value for negotiation */
     {"mtu", 1, setmtu},                /* Set our MTU */
+#ifdef CBCP_SUPPORT
+    {"callback", 1, setcbcp},  /* Ask for callback */
+#endif
     {"netmask", 1, setnetmask},        /* set netmask */
     {"passive", 0, setpassive},        /* Set passive mode */
     {"silent", 0, setsilent},  /* Set silent mode */
@@ -336,6 +348,12 @@ static struct cmd {
     {"idle", 1, setidle},              /* idle time limit (seconds) */
     {"holdoff", 1, setholdoff},                /* set holdoff time (seconds) */
     {"ms-dns", 1, setdnsaddr},         /* DNS address for the peer's use */
+    {"ms-wins", 1, setwinsaddr},       /* Nameserver for SMB over TCP/IP for peer */
+    {"noipx",  0, resetipxproto},      /* Disable IPXCP (and IPX) */
+    {"-ipx",   0, resetipxproto},      /* Disable IPXCP (and IPX) */
+    {"--version", 0, showversion},     /* Show version number */
+    {"--help", 0, showhelp},           /* Show brief listing of options */
+    {"-h", 0, showhelp},               /* ditto */
 
 #ifdef IPX_CHANGE
     {"ipx-network",          1, setipxnetwork}, /* IPX network number */
@@ -353,9 +371,7 @@ static struct cmd {
     {"ipx-compression", 1, setipxcompression}, /* IPX compression number */
 #endif
     {"ipx",                 0, setipxproto},   /* Enable IPXCP (and IPX) */
-    {"noipx",               0, resetipxproto}, /* Disable IPXCP (and IPX) */
     {"+ipx",                0, setipxproto},   /* Enable IPXCP (and IPX) */
-    {"-ipx",                0, resetipxproto}, /* Disable IPXCP (and IPX) */
 #endif /* IPX_CHANGE */
 
     {NULL, 0, NULL}
@@ -486,6 +502,33 @@ usage()
                progname);
 }
 
+/*
+ * showhelp - print out usage message and exit.
+ */
+static int
+showhelp()
+{
+    if (phase == PHASE_INITIALIZE) {
+       usage();
+       exit(0);
+    }
+    return 0;
+}
+
+/*
+ * showversion - print out the version number and exit.
+ */
+static int
+showversion()
+{
+    if (phase == PHASE_INITIALIZE) {
+       fprintf(stderr, "pppd version %s patch level %d%s\n",
+               VERSION, PATCHLEVEL, IMPLEMENTATION);
+       exit(0);
+    }
+    return 0;
+}
+
 /*
  * options_from_file - Read a string of options from a file,
  * and interpret them.
@@ -1153,6 +1196,21 @@ setmtu(argv)
     return (1);
 }
 
+#ifdef CBCP_SUPPORT
+static int
+setcbcp(argv)
+    char **argv;
+{
+    lcp_wantoptions[0].neg_cbcp = 1;
+    cbcp_protent.enabled_flag = 1;
+    cbcp[0].us_number = strdup(*argv);
+    if (cbcp[0].us_number == 0)
+       novm("callback number");
+    cbcp[0].us_type |= (1 << CB_CONF_USER);
+    cbcp[0].us_type |= (1 << CB_CONF_ADMIN);
+    return (1);
+}
+#endif
 
 /*
  * nopcomp - Disable Protocol field compression negotiation.
@@ -1633,9 +1691,37 @@ static int
 setnetmask(argv)
     char **argv;
 {
-    u_int32_t mask;
+    u_int32_t mask, b;
+    int n, ok;
+    char *p, *endp;
+
+    /*
+     * 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 < 0 || 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;
+    }
 
-    if ((mask = inet_addr(*argv)) == -1 || (netmask & ~mask) != 0) {
+    if (*p != 0 || (netmask & ~mask) != 0) {
        option_error("invalid netmask value '%s'", *argv);
        return 0;
     }
@@ -2116,6 +2202,37 @@ setdnsaddr(argv)
     return (1);
 }
 
+/*
+ * setwinsaddr - set the wins address(es)
+ * This is primrarly used with the Samba package under UNIX or for pointing
+ * the caller to the existing WINS server on a Windows NT platform.
+ */
+static int
+setwinsaddr(argv)
+    char **argv;
+{
+    u_int32_t wins;
+    struct hostent *hp;
+
+    wins = inet_addr(*argv);
+    if (wins == -1) {
+       if ((hp = gethostbyname(*argv)) == NULL) {
+           option_error("invalid address parameter '%s' for ms-wins option",
+                        *argv);
+           return 0;
+       }
+       wins = *(u_int32_t *)hp->h_addr;
+    }
+
+    if (ipcp_allowoptions[0].winsaddr[0] == 0) {
+       ipcp_allowoptions[0].winsaddr[0] = wins;
+    } else {
+       ipcp_allowoptions[0].winsaddr[1] = wins;
+    }
+
+    return (1);
+}
+
 #ifdef IPX_CHANGE
 static int
 setipxrouter (argv)
@@ -2191,8 +2308,14 @@ static int
 setipxnetwork(argv)
     char **argv;
 {
-    ipxcp_wantoptions[0].neg_nn = 1;
-    return int_option(*argv, &ipxcp_wantoptions[0].our_network); 
+    u_int32_t v;
+
+    if (!number_option(*argv, &v, 16))
+       return 0;
+
+    ipxcp_wantoptions[0].our_network = (int) v;
+    ipxcp_wantoptions[0].neg_nn      = 1;
+    return 1;
 }
 
 static int
@@ -2277,4 +2400,11 @@ resetipxproto()
     ipxcp_protent.enabled_flag = 0;
     return 1;
 }
+#else
+
+static int
+resetipxproto()
+{
+    return 1;
+}
 #endif /* IPX_CHANGE */