X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Foptions.c;h=2132568880ee99b5e819ee9ea42e9fff9385edc2;hp=198628e94f481c606a485b7a6e4d4b511a1a15ca;hb=0778428fb47eab559d510f3e4a4a1e00070cb605;hpb=1f9a12c002462a78035fcb366ae17c90669123d0 diff --git a/pppd/options.c b/pppd/options.c index 198628e..2132568 100644 --- a/pppd/options.c +++ b/pppd/options.c @@ -18,9 +18,10 @@ */ #ifndef lint -static char rcsid[] = "$Id: options.c,v 1.26 1995/12/18 03:49:06 paulus Exp $"; +static char rcsid[] = "$Id: options.c,v 1.30 1996/04/04 04:00:24 paulus Exp $"; #endif +#include #include #include #include @@ -34,6 +35,7 @@ static char rcsid[] = "$Id: options.c,v 1.26 1995/12/18 03:49:06 paulus Exp $"; #include #include #include +#include #include "pppd.h" #include "pathnames.h" @@ -44,6 +46,7 @@ static char rcsid[] = "$Id: options.c,v 1.26 1995/12/18 03:49:06 paulus Exp $"; #include "upap.h" #include "chap.h" #include "ccp.h" +#include "bpf_compile.h" #ifdef IPX_CHANGE #include "ipxcp.h" @@ -77,6 +80,7 @@ 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 *welcomer = NULL; /* Script to run after phys link estab. */ int maxconnect = 0; /* Maximum connect time */ char user[MAXNAMELEN]; /* Username for PAP */ char passwd[MAXSECRETLEN]; /* Password for PAP */ @@ -91,17 +95,19 @@ 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 */ +int demand = 0; /* do dial-on-demand */ 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 +int idle_time_limit = 0; /* Disconnect if idle for this many seconds */ +int holdoff = 30; /* # seconds to pause before reconnecting */ +struct bpf_program pass_filter;/* Filter program for packets to pass */ +struct bpf_program active_filter; /* Filter program for link-active pkts */ /* * Prototypes */ +static int setdevname __P((char *)); +static int setipaddr __P((char *)); static int setdebug __P((void)); static int setkdebug __P((char **)); static int setpassive __P((void)); @@ -128,6 +134,7 @@ static int nomru __P((void)); static int nopcomp __P((void)); static int setconnector __P((char **)); static int setdisconnector __P((char **)); +static int setwelcomer __P((char **)); static int setmaxconnect __P((char **)); static int setdomain __P((char **)); static int setnetmask __P((char **)); @@ -169,12 +176,20 @@ static int setipcpaccl __P((void)); static int setipcpaccr __P((void)); static int setlcpechointv __P((char **)); static int setlcpechofails __P((char **)); +static int noccp __P((void)); static int setbsdcomp __P((char **)); static int setnobsdcomp __P((void)); +static int setdeflate __P((char **)); +static int setnodeflate __P((void)); +static int setdemand __P((void)); static int setpred1comp __P((void)); static int setnopred1comp __P((void)); static int setipparam __P((char **)); static int setpapcrypt __P((void)); +static int setidle __P((char **)); +static int setholdoff __P((char **)); +static int setpassfilter __P((char **)); +static int setactivefilter __P((char **)); #ifdef IPX_CHANGE static int setipxproto __P((void)); @@ -209,31 +224,46 @@ static struct cmd { int num_args; int (*cmd_func)(); } cmds[] = { - {"-all", 0, noopt}, /* Don't request/allow any options */ + {"-all", 0, noopt}, /* Don't request/allow any options (useless) */ + {"noaccomp", 0, noaccomp}, /* Disable Address/Control compression */ {"-ac", 0, noaccomp}, /* Disable Address/Control compress */ + {"default-asyncmap", 0, noasyncmap}, /* Disable asyncmap negoatiation */ {"-am", 0, noasyncmap}, /* Disable asyncmap negotiation */ {"-as", 1, setasyncmap}, /* set the desired async map */ {"-d", 0, setdebug}, /* Increase debugging level */ + {"nodetach", 0, setnodetach}, /* Don't detach from controlling tty */ {"-detach", 0, setnodetach}, /* don't fork */ + {"noip", 0, noip}, /* Disable IP and IPCP */ {"-ip", 0, noip}, /* Disable IP and IPCP */ + {"nomagic", 0, nomagicnumber}, /* Disable magic number negotiation */ {"-mn", 0, nomagicnumber}, /* Disable magic number negotiation */ + {"default-mru", 0, nomru}, /* Disable MRU negotiation */ {"-mru", 0, nomru}, /* Disable mru negotiation */ {"-p", 0, setpassive}, /* Set passive mode */ + {"nopcomp", 0, nopcomp}, /* Disable protocol field compression */ {"-pc", 0, nopcomp}, /* Disable protocol field compress */ {"+ua", 1, setupapfile}, /* Get PAP user and password from file */ + {"require-pap", 0, reqpap}, /* Require PAP authentication from peer */ {"+pap", 0, reqpap}, /* Require PAP auth from peer */ + {"refuse-pap", 0, nopap}, /* Don't agree to auth to peer with PAP */ {"-pap", 0, nopap}, /* Don't allow UPAP authentication with peer */ + {"require-chap", 0, reqchap}, /* Require CHAP authentication from peer */ {"+chap", 0, reqchap}, /* Require CHAP authentication from peer */ + {"refuse-chap", 0, nochap}, /* Don't agree to auth to peer with CHAP */ {"-chap", 0, nochap}, /* Don't allow CHAP authentication with peer */ + {"novj", 0, setnovj}, /* Disable VJ compression */ {"-vj", 0, setnovj}, /* disable VJ compression */ + {"novjccomp", 0, setnovjccomp}, /* disable VJ connection-ID compression */ {"-vjccomp", 0, setnovjccomp}, /* disable VJ connection-ID compression */ {"vj-max-slots", 1, setvjslots}, /* Set maximum VJ header slots */ {"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. */ + {"welcome", 1, setwelcomer},/* Script to welcome client */ {"maxconnect", 1, setmaxconnect}, /* specify a maximum connect time */ {"crtscts", 0, setcrtscts}, /* set h/w flow control */ + {"nocrtscts", 0, setnocrtscts}, /* clear h/w flow control */ {"-crtscts", 0, setnocrtscts}, /* clear h/w flow control */ {"xonxoff", 0, setxonxoff}, /* set s/w flow control */ {"debug", 0, setdebug}, /* Increase debugging level */ @@ -254,10 +284,13 @@ static struct cmd { {"auth", 0, setauth}, /* Require authentication from peer */ {"file", 1, readfile}, /* Take options from a file */ {"defaultroute", 0, setdefaultroute}, /* Add default route */ + {"nodefaultroute", 0, setnodefaultroute}, /* disable defaultroute option */ {"-defaultroute", 0, setnodefaultroute}, /* disable defaultroute option */ {"proxyarp", 0, setproxyarp}, /* Add proxy ARP entry */ + {"noproxyarp", 0, setnoproxyarp}, /* disable proxyarp option */ {"-proxyarp", 0, setnoproxyarp}, /* disable proxyarp option */ {"persist", 0, setpersist}, /* Keep on reopening connection after close */ + {"demand", 0, setdemand}, /* Dial on demand */ {"login", 0, setdologin}, /* Use system password database for UPAP */ {"noipdefault", 0, setnoipdflt}, /* Don't use name for default IP adrs */ {"lcp-echo-failure", 1, setlcpechofails}, /* consecutive echo failures */ @@ -278,12 +311,23 @@ static struct cmd { {"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 */ + {"noccp", 0, noccp}, /* Disable CCP negotiation */ + {"-ccp", 0, noccp}, /* Disable CCP negotiation */ {"bsdcomp", 1, setbsdcomp}, /* request BSD-Compress */ + {"nobsdcomp", 0, setnobsdcomp}, /* don't allow BSD-Compress */ {"-bsdcomp", 0, setnobsdcomp}, /* don't allow BSD-Compress */ + {"deflate", 1, setdeflate}, /* request Deflate compression */ + {"nodeflate", 0, setnodeflate}, /* don't allow Deflate compression */ + {"-deflate", 0, setnodeflate}, /* don't allow Deflate compression */ {"predictor1", 0, setpred1comp}, /* request Predictor-1 */ + {"nopredictor1", 0, setnopred1comp},/* don't allow Predictor-1 */ {"-predictor1", 0, setnopred1comp}, /* don't allow Predictor-1 */ {"ipparam", 1, setipparam}, /* set ip script parameter */ {"papcrypt", 0, setpapcrypt}, /* PAP passwords encrypted */ + {"idle", 1, setidle}, /* idle time limit (seconds) */ + {"holdoff", 1, setholdoff}, /* set holdoff time (seconds) */ + {"pass-filter", 1, setpassfilter}, /* set filter for packets to pass */ + {"active-filter", 1, setactivefilter}, /* set filter for active pkts */ #ifdef IPX_CHANGE {"ipx-network", 1, setipxnetwork}, /* IPX network number */ @@ -300,14 +344,12 @@ static struct cmd { #if 0 {"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 */ -#ifdef _linux_ - {"idle-disconnect", 1, setidle}, /* seconds for disconnect of idle IP */ -#endif - #ifdef USE_MS_DNS {"ms-dns", 1, setdnsaddr}, /* DNS address(es) for the peer's use */ #endif @@ -349,7 +391,7 @@ parse_args(argc, argv) int argc; char **argv; { - char *arg, *val; + char *arg; struct cmd *cmdp; int ret; @@ -507,21 +549,22 @@ options_from_user() int options_for_tty() { - char *dev, *path; + char *dev, *path, *p; int ret; - dev = strrchr(devnam, '/'); - if (dev == NULL) - dev = devnam; - else - ++dev; + dev = devnam; + if (strncmp(dev, "/dev/", 5) == 0) + dev += 5; if (strcmp(dev, "tty") == 0) return 1; /* don't look for /etc/ppp/options.tty */ path = malloc(strlen(_PATH_TTYOPT) + strlen(dev) + 1); if (path == NULL) novm("tty init file name"); strcpy(path, _PATH_TTYOPT); - strcat(path, dev); + /* Turn slashes into dots, for Solaris case (e.g. /dev/term/a) */ + for (p = path + strlen(path); *dev != 0; ++dev) + *p++ = (*dev == '/'? '.': *dev); + *p = 0; ret = options_from_file(path, 0, 0); free(path); return ret; @@ -561,7 +604,6 @@ readable(fd) * Quotes, white-space and \ may be escaped with \. * \ is ignored. */ - int getword(f, word, newlinep, filename) FILE *f; @@ -1170,7 +1212,7 @@ setconnector(argv) { connector = strdup(*argv); if (connector == NULL) - novm("connector string"); + novm("connect script"); return (1); } @@ -1184,7 +1226,21 @@ setdisconnector(argv) { disconnector = strdup(*argv); if (disconnector == NULL) - novm("disconnector string"); + novm("disconnect script"); + + return (1); +} + +/* + * setwelcomer - Set a program to welcome a client after connection + */ +static int +setwelcomer(argv) + char **argv; +{ + welcomer = strdup(*argv); + if (welcomer == NULL) + novm("welcome script"); return (1); } @@ -1295,12 +1351,11 @@ setspeed(arg) /* * setdevname - Set the device name. */ -int +static int setdevname(cp) char *cp; { struct stat statbuf; - char *tty, *ttyname(); char dev[MAXPATHLEN]; if (strncmp("/dev/", cp, 5) != 0) { @@ -1331,7 +1386,7 @@ setdevname(cp) /* * setipaddr - Set the IP address */ -int +static int setipaddr(arg) char *arg; { @@ -1433,36 +1488,6 @@ setipcpaccr() } -/* - * setipdefault - default our local IP address based on our hostname. - */ -void -setipdefault() -{ - struct hostent *hp; - u_int32_t local; - ipcp_options *wo = &ipcp_wantoptions[0]; - - /* - * If local IP address already given, don't bother. - */ - if (wo->ouraddr != 0 || disable_defaultip) - return; - - /* - * Look up our hostname (possibly with domain name appended) - * 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 = *(u_int32_t *)hp->h_addr; - if (local != 0 && !bad_ip_adrs(local)) - wo->ouraddr = local; -} - - /* * setnetmask - set the netmask to be used on the interface. */ @@ -1512,6 +1537,13 @@ setnodetach() return (1); } +static int +setdemand() +{ + demand = 1; + return 1; +} + static int setmodem() { @@ -1747,6 +1779,13 @@ setchapintv(argv) return int_option(*argv, &chap[0].chal_interval); } +static int +noccp() +{ + ccp_protent.enabled_flag = 0; + return 1; +} + static int setbsdcomp(argv) char **argv; @@ -1792,6 +1831,52 @@ setnobsdcomp() return 1; } +static int +setdeflate(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 deflate option\n", + progname); + return 0; + } + if (rbits != 0 && (rbits < DEFLATE_MIN_SIZE || rbits > DEFLATE_MAX_SIZE) + || abits != 0 && (abits < DEFLATE_MIN_SIZE + || abits > DEFLATE_MAX_SIZE)) { + fprintf(stderr, "%s: deflate option values must be 0 or %d .. %d\n", + progname, DEFLATE_MIN_SIZE, DEFLATE_MAX_SIZE); + return 0; + } + if (rbits > 0) { + ccp_wantoptions[0].deflate = 1; + ccp_wantoptions[0].deflate_size = rbits; + } else + ccp_wantoptions[0].deflate = 0; + if (abits > 0) { + ccp_allowoptions[0].deflate = 1; + ccp_allowoptions[0].deflate_size = abits; + } else + ccp_allowoptions[0].deflate = 0; + return 1; +} + +static int +setnodeflate() +{ + ccp_wantoptions[0].deflate = 0; + ccp_allowoptions[0].deflate = 0; + return 1; +} + static int setpred1comp() { @@ -1826,14 +1911,41 @@ setpapcrypt() return 1; } -#ifdef _linux_ -static int setidle (argv) +static int +setidle(argv) char **argv; { return int_option(*argv, &idle_time_limit); } -#endif +static int +setholdoff(argv) + char **argv; +{ + return int_option(*argv, &holdoff); +} + +static int +setpassfilter(argv) + char **argv; +{ + if (bpf_compile(&pass_filter, *argv, 1) == 0) + return 1; + fprintf(stderr, "%s: error in pass-filter expression: %s\n", + progname, bpf_geterr()); + return 0; +} + +static int +setactivefilter(argv) + char **argv; +{ + if (bpf_compile(&active_filter, *argv, 1) == 0) + return 1; + fprintf(stderr, "%s: error in active-filter expression: %s\n", + progname, bpf_geterr()); + return 0; +} #ifdef IPX_CHANGE static int