summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pppd/options.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1995-10-31 21:21:51 +0000
committerpeter <peter@FreeBSD.org>1995-10-31 21:21:51 +0000
commit9fba2426b57d3eedd0717a9ebbbfcd4377a3fae5 (patch)
tree4d3d1e7e23ca53f41a20a9c41f78068854a5325f /usr.sbin/pppd/options.c
parent583ff5b6cdf30f69dbefba600748f3d4c9d15de4 (diff)
downloadFreeBSD-src-9fba2426b57d3eedd0717a9ebbbfcd4377a3fae5.zip
FreeBSD-src-9fba2426b57d3eedd0717a9ebbbfcd4377a3fae5.tar.gz
Bring pppd from ppp-2.2 onto the mainline..
(more work needs to be done here, I'm trying to beat the supscan)
Diffstat (limited to 'usr.sbin/pppd/options.c')
-rw-r--r--usr.sbin/pppd/options.c722
1 files changed, 504 insertions, 218 deletions
diff --git a/usr.sbin/pppd/options.c b/usr.sbin/pppd/options.c
index ec0b7f5..d6f89e2 100644
--- a/usr.sbin/pppd/options.c
+++ b/usr.sbin/pppd/options.c
@@ -18,16 +18,14 @@
*/
#ifndef lint
-static char rcsid[] = "$Id: options.c,v 1.4 1995/05/30 03:51:14 rgrimes Exp $";
+static char rcsid[] = "$Id: options.c,v 1.24 1995/08/16 01:39:35 paulus Exp $";
#endif
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <limits.h>
-#define devname STDLIB_devname
#include <stdlib.h>
-#undef devname
#include <termios.h>
#include <syslog.h>
#include <string.h>
@@ -37,7 +35,6 @@ static char rcsid[] = "$Id: options.c,v 1.4 1995/05/30 03:51:14 rgrimes Exp $";
#include <sys/stat.h>
#include <netinet/in.h>
-#include "ppp.h"
#include "pppd.h"
#include "pathnames.h"
#include "patchlevel.h"
@@ -46,12 +43,15 @@ static char rcsid[] = "$Id: options.c,v 1.4 1995/05/30 03:51:14 rgrimes Exp $";
#include "ipcp.h"
#include "upap.h"
#include "chap.h"
+#include "ccp.h"
+
+#include <net/ppp-comp.h>
#define FALSE 0
#define TRUE 1
-#ifdef ultrix
-char *strdup __ARGS((char *));
+#if defined(ultrix) || defined(NeXT)
+char *strdup __P((char *));
#endif
#ifndef GIDSET_TYPE
@@ -59,103 +59,119 @@ char *strdup __ARGS((char *));
#endif
/*
- * Prototypes
+ * Option variables and default values.
*/
-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));
-static int setnovj __ARGS((void));
-static int setnovjccomp __ARGS((void));
-static int setvjslots __ARGS((char **));
-static int reqpap __ARGS((void));
-static int nopap __ARGS((void));
-static int setupapfile __ARGS((char **));
-static int nochap __ARGS((void));
-static int reqchap __ARGS((void));
-static int setspeed __ARGS((char *));
-static int noaccomp __ARGS((void));
-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 setxonxoff __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 **));
-static int setauth __ARGS((void));
-static int readfile __ARGS((char **));
-static int setdefaultroute __ARGS((void));
-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 **));
-static int setlcpfails __ARGS((char **));
-static int setipcptimeout __ARGS((char **));
-static int setipcpterm __ARGS((char **));
-static int setipcpconf __ARGS((char **));
-static int setipcpfails __ARGS((char **));
-static int setpaptimeout __ARGS((char **));
-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 setlcpechointv __ARGS((char **));
-static int setlcpechofails __ARGS((char **));
-
-static int number_option __ARGS((char *, long *, int));
-static int readable __ARGS((int fd));
+int debug = 0; /* Debug flag */
+int kdebugflag = 0; /* Tell kernel to print debug messages */
+int default_device = 1; /* Using /dev/tty or equivalent */
+char devnam[MAXPATHLEN] = "/dev/tty"; /* Device name */
+int crtscts = 0; /* Use hardware flow control */
+int modem = 1; /* Use modem control lines */
+int inspeed = 0; /* Input/Output speed requested */
+u_int32_t netmask = 0; /* IP netmask to set on interface */
+int lockflag = 0; /* Create lock file to lock the serial dev */
+int nodetach = 0; /* Don't detach from controlling tty */
+char *connector = NULL; /* Script to establish physical link */
+char *disconnector = NULL; /* Script to disestablish physical link */
+char user[MAXNAMELEN]; /* Username for PAP */
+char passwd[MAXSECRETLEN]; /* Password for PAP */
+int auth_required = 0; /* Peer is required to authenticate */
+int defaultroute = 0; /* assign default route through interface */
+int proxyarp = 0; /* Set up proxy ARP entry for peer */
+int persist = 0; /* Reopen link after it goes down */
+int uselogin = 0; /* Use /etc/passwd for checking PAP */
+int lcp_echo_interval = 0; /* Interval between LCP echo-requests */
+int lcp_echo_fails = 0; /* Tolerance to unanswered echo-requests */
+char our_name[MAXNAMELEN]; /* Our name for authentication purposes */
+char remote_name[MAXNAMELEN]; /* Peer's name for authentication */
+int usehostname = 0; /* Use hostname for our_name */
+int disable_defaultip = 0; /* Don't use hostname for default IP adrs */
+char *ipparam = NULL; /* Extra parameter for ip up/down scripts */
+int cryptpap; /* Passwords in pap-secrets are encrypted */
+
+#ifdef _linux_
+int idle_time_limit = 0;
+static int setidle __P((char **));
+#endif
/*
- * Option variables
+ * Prototypes
*/
-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;
-extern u_long netmask;
-extern int detach;
-extern char user[];
-extern char passwd[];
-extern int auth_required;
-extern int proxyarp;
-extern int persist;
-extern int uselogin;
-extern u_long lcp_echo_interval;
-extern u_long lcp_echo_fails;
-extern char our_name[];
-extern char remote_name[];
-int usehostname;
-int disable_defaultip;
+static int setdebug __P((void));
+static int setkdebug __P((char **));
+static int setpassive __P((void));
+static int setsilent __P((void));
+static int noopt __P((void));
+static int setnovj __P((void));
+static int setnovjccomp __P((void));
+static int setvjslots __P((char **));
+static int reqpap __P((void));
+static int nopap __P((void));
+static int setupapfile __P((char **));
+static int nochap __P((void));
+static int reqchap __P((void));
+static int setspeed __P((char *));
+static int noaccomp __P((void));
+static int noasyncmap __P((void));
+static int noipaddr __P((void));
+static int nomagicnumber __P((void));
+static int setasyncmap __P((char **));
+static int setescape __P((char **));
+static int setmru __P((char **));
+static int setmtu __P((char **));
+static int nomru __P((void));
+static int nopcomp __P((void));
+static int setconnector __P((char **));
+static int setdisconnector __P((char **));
+static int setdomain __P((char **));
+static int setnetmask __P((char **));
+static int setcrtscts __P((void));
+static int setnocrtscts __P((void));
+static int setxonxoff __P((void));
+static int setnodetach __P((void));
+static int setmodem __P((void));
+static int setlocal __P((void));
+static int setlock __P((void));
+static int setname __P((char **));
+static int setuser __P((char **));
+static int setremote __P((char **));
+static int setauth __P((void));
+static int readfile __P((char **));
+static int setdefaultroute __P((void));
+static int setnodefaultroute __P((void));
+static int setproxyarp __P((void));
+static int setnoproxyarp __P((void));
+static int setpersist __P((void));
+static int setdologin __P((void));
+static int setusehostname __P((void));
+static int setnoipdflt __P((void));
+static int setlcptimeout __P((char **));
+static int setlcpterm __P((char **));
+static int setlcpconf __P((char **));
+static int setlcpfails __P((char **));
+static int setipcptimeout __P((char **));
+static int setipcpterm __P((char **));
+static int setipcpconf __P((char **));
+static int setipcpfails __P((char **));
+static int setpaptimeout __P((char **));
+static int setpapreqs __P((char **));
+static int setpapreqtime __P((char **));
+static int setchaptimeout __P((char **));
+static int setchapchal __P((char **));
+static int setchapintv __P((char **));
+static int setipcpaccl __P((void));
+static int setipcpaccr __P((void));
+static int setlcpechointv __P((char **));
+static int setlcpechofails __P((char **));
+static int setbsdcomp __P((char **));
+static int setnobsdcomp __P((void));
+static int setipparam __P((char **));
+static int setpapcrypt __P((void));
+
+static int number_option __P((char *, u_int32_t *, int));
+static int readable __P((int fd));
+
+void usage();
/*
* Valid arguments.
@@ -189,8 +205,8 @@ static struct cmd {
{"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 */
+ {"-crtscts", 0, setnocrtscts}, /* clear h/w flow control */
{"xonxoff", 0, setxonxoff}, /* set s/w flow control */
- {"-crtscts", 0, setxonxoff}, /* another name for xonxoff */
{"debug", 0, setdebug}, /* Increase debugging level */
{"kdebug", 1, setkdebug}, /* Enable kernel-level debugging */
{"domain", 1, setdomain}, /* Add given domain name to hostname*/
@@ -209,7 +225,9 @@ static struct cmd {
{"auth", 0, setauth}, /* Require authentication from peer */
{"file", 1, readfile}, /* Take options from a file */
{"defaultroute", 0, setdefaultroute}, /* Add default route */
+ {"-defaultroute", 0, setnodefaultroute}, /* disable defaultroute option */
{"proxyarp", 0, setproxyarp}, /* Add proxy ARP entry */
+ {"-proxyarp", 0, setnoproxyarp}, /* disable proxyarp option */
{"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 */
@@ -223,13 +241,21 @@ static struct cmd {
{"ipcp-max-terminate", 1, setipcpterm}, /* Set max #xmits for term-reqs */
{"ipcp-max-configure", 1, setipcpconf}, /* Set max #xmits for conf-reqs */
{"ipcp-max-failure", 1, setipcpfails}, /* Set max #conf-naks for IPCP */
- {"pap-restart", 1, setpaptimeout}, /* Set timeout for UPAP */
+ {"pap-restart", 1, setpaptimeout}, /* Set retransmit timeout for PAP */
{"pap-max-authreq", 1, setpapreqs}, /* Set max #xmits for auth-reqs */
+ {"pap-timeout", 1, setpapreqtime}, /* Set time limit for peer PAP auth. */
{"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 */
+ {"bsdcomp", 1, setbsdcomp}, /* request BSD-Compress */
+ {"-bsdcomp", 0, setnobsdcomp}, /* don't allow BSD-Compress */
+ {"ipparam", 1, setipparam}, /* set ip script parameter */
+ {"papcrypt", 0, setpapcrypt}, /* PAP passwords encrypted */
+#ifdef _linux_
+ {"idle-disconnect", 1, setidle}, /* seconds for disconnect of idle IP */
+#endif
{NULL, 0, NULL}
};
@@ -313,6 +339,7 @@ parse_args(argc, argv)
/*
* usage - print out a message telling how to use the program.
*/
+void
usage()
{
fprintf(stderr, usage_string, VERSION, PATCHLEVEL, IMPLEMENTATION,
@@ -427,9 +454,9 @@ options_for_tty()
char *dev, *path;
int ret;
- dev = strrchr(devname, '/');
+ dev = strrchr(devnam, '/');
if (dev == NULL)
- dev = devname;
+ dev = devnam;
else
++dev;
if (strcmp(dev, "tty") == 0)
@@ -474,10 +501,11 @@ readable(fd)
/*
* Read a word from a file.
- * Words are delimited by white-space or by quotes (").
+ * Words are delimited by white-space or by quotes (" or ').
* Quotes, white-space and \ may be escaped with \.
* \<newline> is ignored.
*/
+
int
getword(f, word, newlinep, filename)
FILE *f;
@@ -486,110 +514,250 @@ getword(f, word, newlinep, filename)
char *filename;
{
int c, len, escape;
- int quoted;
+ int quoted, comment;
+ int value, digit, got, n;
+
+#define isoctal(c) ((c) >= '0' && (c) < '8')
*newlinep = 0;
len = 0;
escape = 0;
- quoted = 0;
+ comment = 0;
/*
- * First skip white-space and comments
+ * First skip white-space and comments.
*/
- while ((c = getc(f)) != EOF) {
+ for (;;) {
+ c = getc(f);
+ if (c == EOF)
+ break;
+
+ /*
+ * A newline means the end of a comment; backslash-newline
+ * is ignored. Note that we cannot have escape && comment.
+ */
+ if (c == '\n') {
+ if (!escape) {
+ *newlinep = 1;
+ comment = 0;
+ } else
+ escape = 0;
+ continue;
+ }
+
+ /*
+ * Ignore characters other than newline in a comment.
+ */
+ if (comment)
+ continue;
+
+ /*
+ * If this character is escaped, we have a word start.
+ */
+ if (escape)
+ break;
+
+ /*
+ * If this is the escape character, look at the next character.
+ */
if (c == '\\') {
+ escape = 1;
+ continue;
+ }
+
+ /*
+ * If this is the start of a comment, ignore the rest of the line.
+ */
+ if (c == '#') {
+ comment = 1;
+ continue;
+ }
+
+ /*
+ * A non-whitespace character is the start of a word.
+ */
+ if (!isspace(c))
+ break;
+ }
+
+ /*
+ * Save the delimiter for quoted strings.
+ */
+ if (!escape && (c == '"' || c == '\'')) {
+ quoted = c;
+ c = getc(f);
+ } else
+ quoted = 0;
+
+ /*
+ * Process characters until the end of the word.
+ */
+ while (c != EOF) {
+ if (escape) {
/*
- * \<newline> is ignored; \ followed by anything else
- * starts a word.
+ * This character is escaped: backslash-newline is ignored,
+ * various other characters indicate particular values
+ * as for C backslash-escapes.
*/
- if ((c = getc(f)) == '\n')
+ escape = 0;
+ if (c == '\n') {
+ c = getc(f);
continue;
- word[len++] = '\\';
- escape = 1;
- break;
+ }
+
+ got = 0;
+ switch (c) {
+ case 'a':
+ value = '\a';
+ break;
+ case 'b':
+ value = '\b';
+ break;
+ case 'f':
+ value = '\f';
+ break;
+ case 'n':
+ value = '\n';
+ break;
+ case 'r':
+ value = '\r';
+ break;
+ case 's':
+ value = ' ';
+ break;
+ case 't':
+ value = '\t';
+ break;
+
+ default:
+ if (isoctal(c)) {
+ /*
+ * \ddd octal sequence
+ */
+ value = 0;
+ for (n = 0; n < 3 && isoctal(c); ++n) {
+ value = (value << 3) + (c & 07);
+ c = getc(f);
+ }
+ got = 1;
+ break;
+ }
+
+ if (c == 'x') {
+ /*
+ * \x<hex_string> sequence
+ */
+ value = 0;
+ c = getc(f);
+ for (n = 0; n < 2 && isxdigit(c); ++n) {
+ digit = toupper(c) - '0';
+ if (digit > 10)
+ digit += '0' + 10 - 'A';
+ value = (value << 4) + digit;
+ c = getc (f);
+ }
+ got = 1;
+ break;
+ }
+
+ /*
+ * Otherwise the character stands for itself.
+ */
+ value = c;
+ break;
+ }
+
+ /*
+ * Store the resulting character for the escape sequence.
+ */
+ if (len < MAXWORDLEN-1)
+ word[len] = value;
+ ++len;
+
+ if (!got)
+ c = getc(f);
+ continue;
+
}
- if (c == '\n')
- *newlinep = 1; /* next word starts a line */
- else if (c == '#') {
- /* comment - ignore until EOF or \n */
- while ((c = getc(f)) != EOF && c != '\n')
- ;
- if (c == EOF)
+
+ /*
+ * Not escaped: see if we've reached the end of the word.
+ */
+ if (quoted) {
+ if (c == quoted)
break;
- *newlinep = 1;
- } else if (!isspace(c))
- break;
+ } else {
+ if (isspace(c) || c == '#') {
+ ungetc (c, f);
+ break;
+ }
+ }
+
+ /*
+ * Backslash starts an escape sequence.
+ */
+ if (c == '\\') {
+ escape = 1;
+ c = getc(f);
+ continue;
+ }
+
+ /*
+ * An ordinary character: store it in the word and get another.
+ */
+ if (len < MAXWORDLEN-1)
+ word[len] = c;
+ ++len;
+
+ c = getc(f);
}
/*
- * End of file or error - fail
+ * End of the word: check for errors.
*/
if (c == EOF) {
if (ferror(f)) {
+ if (errno == 0)
+ errno = EIO;
perror(filename);
die(1);
}
- return 0;
- }
-
- for (;;) {
/*
- * Is this character escaped by \ ?
+ * If len is zero, then we didn't find a word before the
+ * end of the file.
*/
- if (escape) {
- if (c == '\n')
- --len; /* ignore \<newline> */
- else if (c == '"' || isspace(c) || c == '\\')
- word[len-1] = c; /* put special char in word */
- else {
- if (len < MAXWORDLEN-1)
- word[len] = c;
- ++len;
- }
- escape = 0;
- } else if (c == '"') {
- quoted = !quoted;
- } else if (!quoted && (isspace(c) || c == '#')) {
- ungetc(c, f);
- break;
- } else {
- if (len < MAXWORDLEN-1)
- word[len] = c;
- ++len;
- if (c == '\\')
- escape = 1;
- }
- if ((c = getc(f)) == EOF)
- break;
- }
-
- if (ferror(f)) {
- perror(filename);
- die(1);
+ if (len == 0)
+ return 0;
}
+ /*
+ * Warn if the word was too long, and append a terminating null.
+ */
if (len >= MAXWORDLEN) {
- word[MAXWORDLEN-1] = 0;
fprintf(stderr, "%s: warning: word in file %s too long (%.20s...)\n",
progname, filename, word);
- } else
- word[len] = 0;
+ len = MAXWORDLEN - 1;
+ }
+ word[len] = 0;
return 1;
+
+#undef isoctal
+
}
/*
- * number_option - parse a numeric parameter for an option
+ * number_option - parse an unsigned numeric parameter for an option.
*/
static int
number_option(str, valp, base)
char *str;
- long *valp;
+ u_int32_t *valp;
int base;
{
char *ptr;
- *valp = strtol(str, &ptr, base);
+ *valp = strtoul(str, &ptr, base);
if (ptr == str) {
fprintf(stderr, "%s: invalid number: %s\n", progname, str);
return 0;
@@ -608,7 +776,7 @@ int_option(str, valp)
char *str;
int *valp;
{
- long v;
+ u_int32_t v;
if (!number_option(str, &v, 0))
return 0;
@@ -731,7 +899,7 @@ static int
setmru(argv)
char **argv;
{
- long mru;
+ u_int32_t mru;
if (!number_option(*argv, &mru, 0))
return 0;
@@ -748,12 +916,12 @@ static int
setmtu(argv)
char **argv;
{
- long mtu;
+ u_int32_t 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,
+ fprintf(stderr, "mtu option value of %ld is too %s\n", mtu,
(mtu < MINMRU? "small": "large"));
return 0;
}
@@ -817,6 +985,7 @@ reqpap()
{
lcp_wantoptions[0].neg_upap = 1;
auth_required = 1;
+ return 1;
}
@@ -906,6 +1075,7 @@ setnovjccomp()
{
ipcp_wantoptions[0].cflag = 0;
ipcp_allowoptions[0].cflag = 0;
+ return 1;
}
@@ -940,7 +1110,7 @@ setconnector(argv)
connector = strdup(*argv);
if (connector == NULL)
novm("connector string");
-
+
return (1);
}
@@ -954,19 +1124,24 @@ setdisconnector(argv)
disconnector = strdup(*argv);
if (disconnector == NULL)
novm("disconnector string");
-
+
return (1);
}
/*
- * setdomain - Set domain name to append to hostname
+ * setdomain - Set domain name to append to hostname
*/
static int
setdomain(argv)
char **argv;
{
- strncat(hostname, *argv, MAXNAMELEN - strlen(hostname));
+ gethostname(hostname, MAXNAMELEN);
+ if (**argv != 0) {
+ if (**argv != '.')
+ strncat(hostname, ".", MAXNAMELEN - strlen(hostname));
+ strncat(hostname, *argv, MAXNAMELEN - strlen(hostname));
+ }
hostname[MAXNAMELEN-1] = 0;
return (1);
}
@@ -979,7 +1154,7 @@ static int
setasyncmap(argv)
char **argv;
{
- long asyncmap;
+ u_int32_t asyncmap;
if (!number_option(*argv, &asyncmap, 16))
return 0;
@@ -1048,7 +1223,7 @@ setdevname(cp)
struct stat statbuf;
char *tty, *ttyname();
char dev[MAXPATHLEN];
-
+
if (strncmp("/dev/", cp, 5) != 0) {
strcpy(dev, "/dev/");
strncat(dev, cp, MAXPATHLEN - 5);
@@ -1065,11 +1240,11 @@ setdevname(cp)
syslog(LOG_ERR, cp);
return -1;
}
-
- (void) strncpy(devname, cp, MAXPATHLEN);
- devname[MAXPATHLEN-1] = 0;
+
+ (void) strncpy(devnam, cp, MAXPATHLEN);
+ devnam[MAXPATHLEN-1] = 0;
default_device = FALSE;
-
+
return 1;
}
@@ -1082,16 +1257,16 @@ setipaddr(arg)
char *arg;
{
struct hostent *hp;
- char *colon, *index();
- u_long local, remote;
+ char *colon;
+ u_int32_t local, remote;
ipcp_options *wo = &ipcp_wantoptions[0];
-
+
/*
* IP address pair separated by ":".
*/
- if ((colon = index(arg, ':')) == NULL)
+ if ((colon = strchr(arg, ':')) == NULL)
return 0;
-
+
/*
* If colon first character, then no local addr.
*/
@@ -1102,7 +1277,7 @@ setipaddr(arg)
fprintf(stderr, "unknown host: %s\n", arg);
return -1;
} else {
- local = *(long *)hp->h_addr;
+ local = *(u_int32_t *)hp->h_addr;
if (our_name[0] == 0) {
strncpy(our_name, arg, MAXNAMELEN);
our_name[MAXNAMELEN-1] = 0;
@@ -1117,7 +1292,7 @@ setipaddr(arg)
wo->ouraddr = local;
*colon = ':';
}
-
+
/*
* If colon last character, then no remote addr.
*/
@@ -1127,7 +1302,7 @@ setipaddr(arg)
fprintf(stderr, "unknown host: %s\n", colon);
return -1;
} else {
- remote = *(long *)hp->h_addr;
+ remote = *(u_int32_t *)hp->h_addr;
if (remote_name[0] == 0) {
strncpy(remote_name, colon, MAXNAMELEN);
remote_name[MAXNAMELEN-1] = 0;
@@ -1186,7 +1361,7 @@ void
setipdefault()
{
struct hostent *hp;
- u_long local;
+ u_int32_t local;
ipcp_options *wo = &ipcp_wantoptions[0];
/*
@@ -1203,7 +1378,7 @@ setipdefault()
wo->accept_local = 1; /* don't insist on this default value */
if ((hp = gethostbyname(hostname)) == NULL)
return;
- local = *(long *)hp->h_addr;
+ local = *(u_int32_t *)hp->h_addr;
if (local != 0 && !bad_ip_adrs(local))
wo->ouraddr = local;
}
@@ -1216,40 +1391,37 @@ static int
setnetmask(argv)
char **argv;
{
- struct in_addr mask;
+ u_int32_t mask;
- if ((inet_aton(*argv, &mask) < 0) || (netmask & ~mask.s_addr)) {
+ if ((mask = inet_addr(*argv)) == -1 || (netmask & ~mask) != 0) {
fprintf(stderr, "Invalid netmask %s\n", *argv);
- return (0);
+ return 0;
}
- netmask = mask.s_addr;
+ netmask = mask;
return (1);
}
-/*
- * Return user specified netmask. A value of zero means no netmask has
- * been set.
- */
-/* ARGSUSED */
-u_long
-GetMask(addr)
- u_long addr;
+static int
+setcrtscts()
{
- return(netmask);
+ crtscts = 1;
+ return (1);
}
-
static int
-setcrtscts()
+setnocrtscts()
{
- crtscts = 1;
+ crtscts = -1;
return (1);
}
static int
setxonxoff()
{
+ lcp_wantoptions[0].asyncmap |= 0x000A0000; /* escape ^S and ^Q */
+ lcp_wantoptions[0].neg_asyncmap = 1;
+
crtscts = 2;
return (1);
}
@@ -1328,18 +1500,42 @@ setauth()
static int
setdefaultroute()
{
+ if (!ipcp_allowoptions[0].default_route) {
+ fprintf(stderr, "%s: defaultroute option is disabled\n", progname);
+ return 0;
+ }
ipcp_wantoptions[0].default_route = 1;
return 1;
}
static int
+setnodefaultroute()
+{
+ ipcp_allowoptions[0].default_route = 0;
+ ipcp_wantoptions[0].default_route = 0;
+ return 1;
+}
+
+static int
setproxyarp()
{
+ if (!ipcp_allowoptions[0].proxy_arp) {
+ fprintf(stderr, "%s: proxyarp option is disabled\n", progname);
+ return 0;
+ }
ipcp_wantoptions[0].proxy_arp = 1;
return 1;
}
static int
+setnoproxyarp()
+{
+ ipcp_wantoptions[0].proxy_arp = 0;
+ ipcp_allowoptions[0].proxy_arp = 0;
+ return 1;
+}
+
+static int
setpersist()
{
persist = 1;
@@ -1381,74 +1577,164 @@ setlcptimeout(argv)
return int_option(*argv, &lcp_fsm[0].timeouttime);
}
-static int setlcpterm(argv)
+static int
+setlcpterm(argv)
char **argv;
{
return int_option(*argv, &lcp_fsm[0].maxtermtransmits);
}
-static int setlcpconf(argv)
+static int
+setlcpconf(argv)
char **argv;
{
return int_option(*argv, &lcp_fsm[0].maxconfreqtransmits);
}
-static int setlcpfails(argv)
+static int
+setlcpfails(argv)
char **argv;
{
return int_option(*argv, &lcp_fsm[0].maxnakloops);
}
-static int setipcptimeout(argv)
+static int
+setipcptimeout(argv)
char **argv;
{
return int_option(*argv, &ipcp_fsm[0].timeouttime);
}
-static int setipcpterm(argv)
+static int
+setipcpterm(argv)
char **argv;
{
return int_option(*argv, &ipcp_fsm[0].maxtermtransmits);
}
-static int setipcpconf(argv)
+static int
+setipcpconf(argv)
char **argv;
{
return int_option(*argv, &ipcp_fsm[0].maxconfreqtransmits);
}
-static int setipcpfails(argv)
+static int
+setipcpfails(argv)
char **argv;
{
return int_option(*argv, &lcp_fsm[0].maxnakloops);
}
-static int setpaptimeout(argv)
+static int
+setpaptimeout(argv)
char **argv;
{
return int_option(*argv, &upap[0].us_timeouttime);
}
-static int setpapreqs(argv)
+static int
+setpapreqtime(argv)
+ char **argv;
+{
+ return int_option(*argv, &upap[0].us_reqtimeout);
+}
+
+static int
+setpapreqs(argv)
char **argv;
{
return int_option(*argv, &upap[0].us_maxtransmits);
}
-static int setchaptimeout(argv)
+static int
+setchaptimeout(argv)
char **argv;
{
return int_option(*argv, &chap[0].timeouttime);
}
-static int setchapchal(argv)
+static int
+setchapchal(argv)
char **argv;
{
return int_option(*argv, &chap[0].max_transmits);
}
-static int setchapintv(argv)
+static int
+setchapintv(argv)
char **argv;
{
return int_option(*argv, &chap[0].chal_interval);
}
+
+static int
+setbsdcomp(argv)
+ char **argv;
+{
+ int rbits, abits;
+ char *str, *endp;
+
+ str = *argv;
+ abits = rbits = strtol(str, &endp, 0);
+ if (endp != str && *endp == ',') {
+ str = endp + 1;
+ abits = strtol(str, &endp, 0);
+ }
+ if (*endp != 0 || endp == str) {
+ fprintf(stderr, "%s: invalid argument format for bsdcomp option\n",
+ progname);
+ return 0;
+ }
+ if (rbits != 0 && (rbits < BSD_MIN_BITS || rbits > BSD_MAX_BITS)
+ || abits != 0 && (abits < BSD_MIN_BITS || abits > BSD_MAX_BITS)) {
+ fprintf(stderr, "%s: bsdcomp option values must be 0 or %d .. %d\n",
+ progname, BSD_MIN_BITS, BSD_MAX_BITS);
+ return 0;
+ }
+ if (rbits > 0) {
+ ccp_wantoptions[0].bsd_compress = 1;
+ ccp_wantoptions[0].bsd_bits = rbits;
+ } else
+ ccp_wantoptions[0].bsd_compress = 0;
+ if (abits > 0) {
+ ccp_allowoptions[0].bsd_compress = 1;
+ ccp_allowoptions[0].bsd_bits = abits;
+ } else
+ ccp_allowoptions[0].bsd_compress = 0;
+ return 1;
+}
+
+static int
+setnobsdcomp()
+{
+ ccp_wantoptions[0].bsd_compress = 0;
+ ccp_allowoptions[0].bsd_compress = 0;
+ return 1;
+}
+
+static int
+setipparam(argv)
+ char **argv;
+{
+ ipparam = strdup(*argv);
+ if (ipparam == NULL)
+ novm("ipparam string");
+
+ return 1;
+}
+
+static int
+setpapcrypt()
+{
+ cryptpap = 1;
+ return 1;
+}
+
+#ifdef _linux_
+static int setidle (argv)
+ char **argv;
+{
+ return int_option(*argv, &idle_time_limit);
+}
+#endif
OpenPOWER on IntegriCloud