/* * options.c - handles option processing for PPP. * * Copyright (c) 1989 Carnegie Mellon University. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by Carnegie Mellon University. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint /* static char rcsid[] = "$Id$"; */ #endif #include #include #include #include #include /* #include */ #include #include #include #include #include #include #include #include #include #ifdef PPP_FILTER #include #include /* XXX: To get struct pcap */ #endif #include "pppd.h" #include "pathnames.h" #include "patchlevel.h" #include "fsm.h" #include "lcp.h" #include "ipcp.h" #include "upap.h" #include "chap.h" #include "ccp.h" #ifdef CBCP_SUPPORT #include "cbcp.h" #endif #ifdef IPX_CHANGE #include "ipxcp.h" #endif /* IPX_CHANGE */ #include #define FALSE 0 #define TRUE 1 #ifndef GIDSET_TYPE #define GIDSET_TYPE gid_t #endif #if 0 static int privileged_option; /* set iff the current option came from root */ static char *option_source; /* string saying where the option came from */ #endif /* * Option variables and default values. */ #ifdef PPP_FILTER int dflag = 0; /* Tell libpcap we want debugging */ #endif int debug = 1; /* Debug flag */ int kdebugflag = 1; /* Tell kernel to print debug messages */ int default_device = 1; /* Using /dev/tty or equivalent */ char devnam[MAXPATHLEN] = "/dev/sccppp"; /* Device name */ int crtscts = 0; /* Use hardware flow control */ int modem = 0; /* Use modem control lines */ int inspeed = B115200; /* 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[]={"TIMEOUT","3","ABORT","\nBUSY\r","ABORT","\nNO DIALTONE\r","ABORT","\nNO CARRIER\r","ABORT","\nNO ANSWER\r","ABORT","\nRINGING\r\n\r\nRINGING\r", "","\rAT","OK-+++\\c-OK","ATH0","TIMEOUT","30","OK","ATDT13","CONNECT",""}; /*char *connector[]={"TIMEOUT","3","ABORT","\nBUSY\r","ABORT","\nNO DIALTONE\r","ABORT","\nNO CARRIER\r","ABORT","\nNO ANSWER\r","ABORT","\nRINGING\r\n\r\nRINGING\r", "","\rAT","OK-+++\\c-OK","ATH0","TIMEOUT","30","OK","ATDT0202122","CONNECT","","ppp","","Username:","ppp","Password:","ppp"}; */ char **disconnector; /* Script to disestablish physical link */ char **welcomer; /* Script to run after phys link estab. */ int maxconnect = 0; /* Maximum connect time */ char user[MAXNAMELEN]="stb"; /* Username for PAP */ char passwd[MAXSECRETLEN]="stb"; /* Password for PAP */ int auth_required = 0; /* Peer is required to authenticate */ int defaultroute = 1; /* assign default route through interface */ int proxyarp = 0; /* Set up proxy ARP entry for peer */ int persist = 1; /* 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]="infotel"; /* Our name for authentication purposes */ char remote_name[MAXNAMELEN]; /* Peer's name for authentication */ int explicit_remote = 0; /* User specified explicit remote name */ int usehostname = 0; /* Use hostname for our_name */ int disable_defaultip = 1; /* 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 */ int idle_time_limit = 0; /* Disconnect if idle for this many seconds */ int holdoff = 30; /* # seconds to pause before reconnecting */ int refuse_pap = 0; /* Set to say we won't do PAP */ int refuse_chap = 1; /* Set to say we won't do CHAP */ #ifdef MSLANMAN int ms_lanman = 0; /* Nonzero if use LanMan password instead of NT */ /* Has meaning only with MS-CHAP challenges */ #endif struct option_info auth_req_info; struct option_info connector_info; struct option_info disconnector_info; struct option_info welcomer_info; struct option_info devnam_info; #ifdef PPP_FILTER struct bpf_program pass_filter;/* Filter program for packets to pass */ struct bpf_program active_filter; /* Filter program for link-active pkts */ pcap_t pc; /* Fake struct pcap so we can compile expr */ #endif /* * Prototypes */ #if 0 static int setdevname __P((char *, int)); static int setipaddr __P((char *)); static int setspeed __P((char *)); static int setdebug __P((char **)); static int setkdebug __P((char **)); static int setpassive __P((char **)); static int setsilent __P((char **)); static int noopt __P((char **)); static int setnovj __P((char **)); static int setnovjccomp __P((char **)); static int setvjslots __P((char **)); static int reqpap __P((char **)); static int nopap __P((char **)); #ifdef OLD_OPTIONS static int setupapfile __P((char **)); #endif static int nochap __P((char **)); static int reqchap __P((char **)); static int noaccomp __P((char **)); static int noasyncmap __P((char **)); static int noip __P((char **)); static int nomagicnumber __P((char **)); 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((char **)); static int nopcomp __P((char **)); 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 **)); static int setcrtscts __P((char **)); static int setnocrtscts __P((char **)); static int setxonxoff __P((char **)); static int setnodetach __P((char **)); static int setupdetach __P((char **)); static int setmodem __P((char **)); static int setlocal __P((char **)); static int setlock __P((char **)); static int setname __P((char **)); static int setuser __P((char **)); static int setremote __P((char **)); static int setauth __P((char **)); static int setnoauth __P((char **)); static int readfile __P((char **)); static int callfile __P((char **)); static int setdefaultroute __P((char **)); static int setnodefaultroute __P((char **)); static int setproxyarp __P((char **)); static int setnoproxyarp __P((char **)); static int setpersist __P((char **)); static int setnopersist __P((char **)); static int setdologin __P((char **)); static int setusehostname __P((char **)); static int setnoipdflt __P((char **)); 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((char **)); static int setipcpaccr __P((char **)); static int setlcpechointv __P((char **)); static int setlcpechofails __P((char **)); static int noccp __P((char **)); static int setbsdcomp __P((char **)); static int setnobsdcomp __P((char **)); static int setdeflate __P((char **)); static int setnodeflate __P((char **)); static int setnodeflatedraft __P((char **)); static int setdemand __P((char **)); static int setpred1comp __P((char **)); static int setnopred1comp __P((char **)); static int setipparam __P((char **)); static int setpapcrypt __P((char **)); static int setidle __P((char **)); static int setholdoff __P((char **)); static int setdnsaddr __P((char **)); static int resetipxproto __P((char **)); static int setwinsaddr __P((char **)); static int showversion __P((char **)); static int showhelp __P((char **)); #ifdef PPP_FILTER static int setpdebug __P((char **)); static int setpassfilter __P((char **)); static int setactivefilter __P((char **)); #endif #ifdef IPX_CHANGE static int setipxproto __P((char **)); static int setipxanet __P((char **)); static int setipxalcl __P((char **)); static int setipxarmt __P((char **)); static int setipxnetwork __P((char **)); static int setipxnode __P((char **)); static int setipxrouter __P((char **)); static int setipxname __P((char **)); static int setipxcptimeout __P((char **)); static int setipxcpterm __P((char **)); static int setipxcpconf __P((char **)); static int setipxcpfails __P((char **)); #endif /* IPX_CHANGE */ #ifdef MSLANMAN static int setmslanman __P((char **)); #endif static int number_option __P((char *, u_int32_t *, int)); static int int_option __P((char *, int *)); static int readable __P((int fd)); #endif /* * Valid arguments. */ /* * parse_args - parse a string of arguments from the command line. */ int parse_args(argc, argv) int argc; char **argv; { return 0; } /* * scan_args - scan the command line arguments to get the tty name, * if specified. */ /* * usage - print out a message telling how to use the program. */ void usage() { } /* * showhelp - print out usage message and exit. */ static int showhelp(argv) char **argv; { return 0; } /* * showversion - print out the version number and exit. */ static int showversion(argv) char **argv; { return 0; } void option_error __V((char *fmt, ...)) { } /* * readable - check if a file is readable by the real user. */ /*static int readable(fd) int fd; { uid_t uid; int ngroups, i; struct stat sbuf; GIDSET_TYPE groups[NGROUPS_MAX]; uid = getuid(); if (uid == 0) return 1; if (fstat(fd, &sbuf) != 0) return 0; if (sbuf.st_uid == uid) return sbuf.st_mode & S_IRUSR; if (sbuf.st_gid == getgid()) return sbuf.st_mode & S_IRGRP; ngroups = getgroups(NGROUPS_MAX, groups); for (i = 0; i < ngroups; ++i) if (sbuf.st_gid == groups[i]) return sbuf.st_mode & S_IRGRP; return sbuf.st_mode & S_IROTH; } */ /* * Read a word from a file. * Words are delimited by white-space or by quotes (" or '). * Quotes, white-space and \ may be escaped with \. * \ is ignored. */ /* * The following procedures parse options. */ /* * readfile - take commands from a file. */ /* * callfile - take commands from /etc/ppp/peers/. * Name may not contain /../, start with / or ../, or end in /.. */ /* * setdebug - Set debug (command line argument). */ /* * noopt - Disable all options. */ static int noopt(argv) char **argv; { BZERO((char *) &lcp_wantoptions[0], sizeof (struct lcp_options)); BZERO((char *) &lcp_allowoptions[0], sizeof (struct lcp_options)); BZERO((char *) &ipcp_wantoptions[0], sizeof (struct ipcp_options)); BZERO((char *) &ipcp_allowoptions[0], sizeof (struct ipcp_options)); #ifdef IPX_CHANGE BZERO((char *) &ipxcp_wantoptions[0], sizeof (struct ipxcp_options)); BZERO((char *) &ipxcp_allowoptions[0], sizeof (struct ipxcp_options)); #endif /* IPX_CHANGE */ return (1); }