added kdebug, mtu, lock, escape, disconnect options;
[ppp.git] / pppd / options.c
index 769d2e86b55dd083cf6c4343e67ffd8097af6cac..622ca31ebd5b5abaf73c77d20f273228fc2b16d2 100644 (file)
@@ -18,7 +18,7 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$Id: options.c,v 1.2 1993/11/23 23:40:53 paulus Exp $";
+static char rcsid[] = "$Id: options.c,v 1.5 1994/04/18 04:07:48 paulus Exp $";
 #endif
 
 #include <stdio.h>
@@ -45,11 +45,15 @@ static char rcsid[] = "$Id: options.c,v 1.2 1993/11/23 23:40:53 paulus Exp $";
 #define FALSE  0
 #define TRUE   1
 
+#ifdef ultrix
+char *strdup __ARGS((char *));
+#endif
 
 /*
  * Prototypes
  */
 static int setdebug __ARGS((void));
+static int setkdebug __ARGS((char **));
 static int setpassive __ARGS((void));
 static int setsilent __ARGS((void));
 static int noopt __ARGS((void));
@@ -65,16 +69,20 @@ static int noasyncmap __ARGS((void));
 static int noipaddr __ARGS((void));
 static int nomagicnumber __ARGS((void));
 static int setasyncmap __ARGS((char **));
+static int setescape __ARGS((char **));
 static int setmru __ARGS((char **));
+static int setmtu __ARGS((char **));
 static int nomru __ARGS((void));
 static int nopcomp __ARGS((void));
 static int setconnector __ARGS((char **));
+static int setdisconnector __ARGS((char **));
 static int setdomain __ARGS((char **));
 static int setnetmask __ARGS((char **));
 static int setcrtscts __ARGS((void));
 static int setnodetach __ARGS((void));
 static int setmodem __ARGS((void));
 static int setlocal __ARGS((void));
+static int setlock __ARGS((void));
 static int setname __ARGS((char **));
 static int setuser __ARGS((char **));
 static int setremote __ARGS((char **));
@@ -85,6 +93,7 @@ static int setproxyarp __ARGS((void));
 static int setpersist __ARGS((void));
 static int setdologin __ARGS((void));
 static int setusehostname __ARGS((void));
+static int setnoipdflt __ARGS((void));
 static int setlcptimeout __ARGS((char **));
 static int setlcpterm __ARGS((char **));
 static int setlcpconf __ARGS((char **));
@@ -98,6 +107,8 @@ static int setpapreqs __ARGS((char **));
 static int setchaptimeout __ARGS((char **));
 static int setchapchal __ARGS((char **));
 static int setchapintv __ARGS((char **));
+static int setipcpaccl __ARGS((void));
+static int setipcpaccr __ARGS((void));
 
 static int number_option __ARGS((char *, long *, int));
 
@@ -107,10 +118,13 @@ static int number_option __ARGS((char *, long *, int));
  */
 extern char *progname;
 extern int debug;
+extern int kdebugflag;
 extern int modem;
+extern int lockflag;
 extern int crtscts;
 extern int nodetach;
 extern char *connector;
+extern char *disconnector;
 extern int inspeed;
 extern char devname[];
 extern int default_device;
@@ -125,6 +139,7 @@ extern int uselogin;
 extern char our_name[];
 extern char remote_name[];
 int usehostname;
+int disable_defaultip;
 
 /*
  * Valid arguments.
@@ -152,16 +167,21 @@ static struct cmd {
     "-chap", 0, nochap,                /* Don't allow CHAP authentication with peer */
     "-vj", 0, setnovj,         /* disable VJ compression */
     "asyncmap", 1, setasyncmap,        /* set the desired async map */
+    "escape", 1, setescape,    /* set chars to escape on transmission */
     "connect", 1, setconnector,        /* A program to set up a connection */
+    "disconnect", 1, setdisconnector,  /* program to disconnect serial dev. */
     "crtscts", 0, setcrtscts,  /* set h/w flow control */
     "debug", 0, setdebug,      /* Increase debugging level */
+    "kdebug", 1, setkdebug,    /* Enable kernel-level debugging */
     "domain", 1, setdomain,    /* Add given domain name to hostname*/
     "mru", 1, setmru,          /* Set MRU value for negotiation */
+    "mtu", 1, setmtu,          /* Set our MTU */
     "netmask", 1, setnetmask,  /* set netmask */
     "passive", 0, setpassive,  /* Set passive mode */
     "silent", 0, setsilent,    /* Set silent mode */
     "modem", 0, setmodem,      /* Use modem control lines */
     "local", 0, setlocal,      /* Don't use modem control lines */
+    "lock", 0, setlock,                /* Lock serial device (with lock file) */
     "name", 1, setname,                /* Set local name for authentication */
     "user", 1, setuser,                /* Set username for PAP auth with peer */
     "usehostname", 0, setusehostname,  /* Must use hostname for auth. */
@@ -172,6 +192,7 @@ static struct cmd {
     "proxyarp", 0, setproxyarp,        /* Add proxy ARP entry */
     "persist", 0, setpersist,  /* Keep on reopening connection after close */
     "login", 0, setdologin,    /* Use system password database for UPAP */
+    "noipdefault", 0, setnoipdflt, /* Don't use name for default IP adrs */
     "lcp-restart", 1, setlcptimeout,   /* Set timeout for LCP */
     "lcp-max-terminate", 1, setlcpterm,        /* Set max #xmits for term-reqs */
     "lcp-max-configure", 1, setlcpconf,        /* Set max #xmits for conf-reqs */
@@ -185,6 +206,8 @@ static struct cmd {
     "chap-restart", 1, setchaptimeout, /* Set timeout for CHAP */
     "chap-max-challenge", 1, setchapchal, /* Set max #xmits for challenge */
     "chap-interval", 1, setchapintv,   /* Set interval for rechallenge */
+    "ipcp-accept-local", 0, setipcpaccl, /* Accept peer's address for us */
+    "ipcp-accept-remote", 0, setipcpaccr, /* Accept peer's address for it */
     NULL
 };
 
@@ -208,34 +231,6 @@ Usage: %s [ arguments ], where arguments are:\n\
 See pppd(8) for more options.\n\
 ";
 
-/*
-Options omitted:
-       -all            Don't request/allow any options\n\
-       -ac             Disable Address/Control compression\n\
-       -am             Disable asyncmap negotiation\n\
-       -as <n>         Set the desired async map to hex <n>\n\
-       -d              Increase debugging level\n\
-       -detach         Don't fork to background\n\
-       -ip             Disable IP address negotiation\n\
-       -mn             Disable magic number negotiation\n\
-       -mru            Disable mru negotiation\n\
-       -p              Set passive mode\n\
-       -pc             Disable protocol field compression\n\
-       +ua <f>         Get username and password for authenticating\n\
-                       with peer using PAP from file <f>\n\
-       +pap            Require PAP authentication from peer\n\
-       -pap            Don't agree to authenticating with peer using PAP\n\
-       +chap           Require CHAP authentication from peer\n\
-       -chap           Don't agree to authenticating with peer using CHAP\n\
-        -vj             disable VJ compression\n\
-       -auth           Don't agree to authenticate with peer\n\
-       debug           Increase debugging level\n\
-        domain <d>      Append domain name <d> to hostname for authentication\n\
-       passive         Set passive mode\n\
-       local           Don't use modem control lines\n\
-       proxyarp        Add proxy ARP entry\n\
-*/
-
 
 /*
  * parse_args - parse a string of arguments, from the command
@@ -461,7 +456,7 @@ getword(f, word, newlinep, filename)
                word[len] = c;
            ++len;
            if (c == '\\')
-               quoted = 1;
+               escape = 1;
        }
        if ((c = getc(f)) == EOF)
            break;
@@ -542,10 +537,19 @@ static int
 setdebug()
 {
     debug++;
-    setlogmask(LOG_UPTO(LOG_DEBUG));
     return (1);
 }
 
+/*
+ * setkdebug - Set kernel debugging level.
+ */
+static int
+setkdebug(argv)
+    char **argv;
+{
+    return int_option(*argv, &kdebugflag);
+}
+
 /*
  * noopt - Disable all options.
  */
@@ -636,6 +640,27 @@ setmru(argv)
 }
 
 
+/*
+ * setmru - Set the largest MTU we'll use.
+ */
+static int
+setmtu(argv)
+    char **argv;
+{
+    long mtu;
+
+    if (!number_option(*argv, &mtu, 0))
+       return 0;
+    if (mtu < MINMRU || mtu > MAXMRU) {
+       fprintf(stderr, "mtu option value of %d is too %s\n", mtu,
+               (mtu < MINMRU? "small": "large"));
+       return 0;
+    }
+    lcp_allowoptions[0].mru = mtu;
+    return (1);
+}
+
+
 /*
  * nopcomp - Disable Protocol field compression negotiation.
  */
@@ -781,6 +806,20 @@ setconnector(argv)
     return (1);
 }
 
+/*
+ * setdisconnector - Set a program to disconnect from the serial line
+ */
+static int
+setdisconnector(argv)
+    char **argv;
+{
+    disconnector = strdup(*argv);
+    if (disconnector == NULL)
+       novm("disconnector string");
+  
+    return (1);
+}
+
 
 /*
  * setdomain - Set domain name to append to hostname 
@@ -794,6 +833,10 @@ setdomain(argv)
     return (1);
 }
 
+
+/*
+ * setasyncmap - add bits to asyncmap (what we request peer to escape).
+ */
 static int
 setasyncmap(argv)
     char **argv;
@@ -807,6 +850,38 @@ setasyncmap(argv)
     return(1);
 }
 
+
+/*
+ * setescape - add chars to the set we escape on transmission.
+ */
+static int
+setescape(argv)
+    char **argv;
+{
+    int n, ret;
+    char *p, *endp;
+
+    p = *argv;
+    ret = 1;
+    while (*p) {
+       n = strtol(p, &endp, 16);
+       if (p == endp) {
+           fprintf(stderr, "%s: invalid hex number: %s\n", progname, p);
+           return 0;
+       }
+       p = endp;
+       if (n < 0 || 0x20 <= n && n <= 0x3F || n == 0x5E || n > 0xFF) {
+           fprintf(stderr, "%s: can't escape character 0x%x\n", n);
+           ret = 0;
+       } else
+           xmit_accm[0][n >> 5] |= 1 << (n & 0x1F);
+       while (*p == ',' || *p == ' ')
+           ++p;
+    }
+    return ret;
+}
+
+
 /*
  * setspeed - Set the speed.
  */
@@ -925,6 +1000,39 @@ setipaddr(arg)
 }
 
 
+/*
+ * setnoipdflt - disable setipdefault()
+ */
+static int
+setnoipdflt()
+{
+    disable_defaultip = 1;
+    return 1;
+}
+
+
+/*
+ * setipcpaccl - accept peer's idea of our address
+ */
+static int
+setipcpaccl()
+{
+    ipcp_wantoptions[0].accept_local = 1;
+    return 1;
+}
+
+
+/*
+ * setipcpaccr - accept peer's idea of its address
+ */
+static int
+setipcpaccr()
+{
+    ipcp_wantoptions[0].accept_remote = 1;
+    return 1;
+}
+
+
 /*
  * setipdefault - default our local IP address based on our hostname.
  */
@@ -938,7 +1046,7 @@ setipdefault()
     /*
      * If local IP address already given, don't bother.
      */
-    if (wo->ouraddr != 0)
+    if (wo->ouraddr != 0 || disable_defaultip)
        return;
 
     /*
@@ -946,6 +1054,7 @@ setipdefault()
      * and take the first IP address as our local IP address.
      * If there isn't an IP address for our hostname, too bad.
      */
+    wo->accept_local = 1;      /* don't insist on this default value */
     if ((hp = gethostbyname(hostname)) == NULL)
        return;
     local = *(long *)hp->h_addr;
@@ -972,6 +1081,19 @@ setnetmask(argv)
     return (1);
 }
 
+/*
+ * Return user specified netmask. A value of zero means no netmask has
+ * been set. 
+ */
+/* ARGSUSED */
+u_long
+GetMask(addr)
+    u_long addr;
+{
+    return(netmask);
+}
+
+
 static int
 setcrtscts()
 {
@@ -1000,6 +1122,13 @@ setlocal()
     return 1;
 }
 
+static int
+setlock()
+{
+    lockflag = 1;
+    return 1;
+}
+
 static int
 setusehostname()
 {