1 | /* |
---|
2 | * options.c - handles option processing for PPP. |
---|
3 | * |
---|
4 | * Copyright (c) 1989 Carnegie Mellon University. |
---|
5 | * All rights reserved. |
---|
6 | * |
---|
7 | * Redistribution and use in source and binary forms are permitted |
---|
8 | * provided that the above copyright notice and this paragraph are |
---|
9 | * duplicated in all such forms and that any documentation, |
---|
10 | * advertising materials, and other materials related to such |
---|
11 | * distribution and use acknowledge that the software was developed |
---|
12 | * by Carnegie Mellon University. The name of the |
---|
13 | * University may not be used to endorse or promote products derived |
---|
14 | * from this software without specific prior written permission. |
---|
15 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR |
---|
16 | * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED |
---|
17 | * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
---|
18 | */ |
---|
19 | |
---|
20 | #ifndef lint |
---|
21 | /* static char rcsid[] = "$Id$"; */ |
---|
22 | #endif |
---|
23 | |
---|
24 | #include <ctype.h> |
---|
25 | #include <stdio.h> |
---|
26 | #include <errno.h> |
---|
27 | #include <unistd.h> |
---|
28 | #include <limits.h> |
---|
29 | /* #include <stdlib.h> */ |
---|
30 | #include <termios.h> |
---|
31 | #include <syslog.h> |
---|
32 | #include <string.h> |
---|
33 | #include <netdb.h> |
---|
34 | #include <pwd.h> |
---|
35 | #include <sys/types.h> |
---|
36 | #include <sys/stat.h> |
---|
37 | #include <netinet/in.h> |
---|
38 | #include <arpa/inet.h> |
---|
39 | #ifdef PPP_FILTER |
---|
40 | #include <pcap.h> |
---|
41 | #include <pcap-int.h> /* XXX: To get struct pcap */ |
---|
42 | #endif |
---|
43 | |
---|
44 | #include "pppd.h" |
---|
45 | #include "pathnames.h" |
---|
46 | #include "patchlevel.h" |
---|
47 | #include "fsm.h" |
---|
48 | #include "lcp.h" |
---|
49 | #include "ipcp.h" |
---|
50 | #include "upap.h" |
---|
51 | #include "chap.h" |
---|
52 | #include "ccp.h" |
---|
53 | #ifdef CBCP_SUPPORT |
---|
54 | #include "cbcp.h" |
---|
55 | #endif |
---|
56 | |
---|
57 | #ifdef IPX_CHANGE |
---|
58 | #include "ipxcp.h" |
---|
59 | #endif /* IPX_CHANGE */ |
---|
60 | |
---|
61 | #include <net/ppp-comp.h> |
---|
62 | |
---|
63 | #define FALSE 0 |
---|
64 | #define TRUE 1 |
---|
65 | |
---|
66 | |
---|
67 | #ifndef GIDSET_TYPE |
---|
68 | #define GIDSET_TYPE gid_t |
---|
69 | #endif |
---|
70 | #if 0 |
---|
71 | static int privileged_option; /* set iff the current option came from root */ |
---|
72 | static char *option_source; /* string saying where the option came from */ |
---|
73 | #endif |
---|
74 | |
---|
75 | /* |
---|
76 | * Option variables and default values. |
---|
77 | */ |
---|
78 | #ifdef PPP_FILTER |
---|
79 | int dflag = 0; /* Tell libpcap we want debugging */ |
---|
80 | #endif |
---|
81 | int debug = 1; /* Debug flag */ |
---|
82 | int kdebugflag = 1; /* Tell kernel to print debug messages */ |
---|
83 | int default_device = 1; /* Using /dev/tty or equivalent */ |
---|
84 | char devnam[MAXPATHLEN] = "/dev/sccppp"; /* Device name */ |
---|
85 | int crtscts = 0; /* Use hardware flow control */ |
---|
86 | int modem = 0; /* Use modem control lines */ |
---|
87 | int inspeed = B115200; /* Input/Output speed requested */ |
---|
88 | u_int32_t netmask = 0; /* IP netmask to set on interface */ |
---|
89 | int lockflag = 0; /* Create lock file to lock the serial dev */ |
---|
90 | int nodetach = 0; /* Don't detach from controlling tty */ |
---|
91 | 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", |
---|
92 | "","\rAT","OK-+++\\c-OK","ATH0","TIMEOUT","30","OK","ATDT13","CONNECT",""}; |
---|
93 | /*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", |
---|
94 | "","\rAT","OK-+++\\c-OK","ATH0","TIMEOUT","30","OK","ATDT0202122","CONNECT","","ppp","","Username:","ppp","Password:","ppp"}; |
---|
95 | */ |
---|
96 | char **disconnector; /* Script to disestablish physical link */ |
---|
97 | char **welcomer; /* Script to run after phys link estab. */ |
---|
98 | int maxconnect = 0; /* Maximum connect time */ |
---|
99 | char user[MAXNAMELEN]="stb"; /* Username for PAP */ |
---|
100 | char passwd[MAXSECRETLEN]="stb"; /* Password for PAP */ |
---|
101 | int auth_required = 0; /* Peer is required to authenticate */ |
---|
102 | int defaultroute = 1; /* assign default route through interface */ |
---|
103 | int proxyarp = 0; /* Set up proxy ARP entry for peer */ |
---|
104 | int persist = 1; /* Reopen link after it goes down */ |
---|
105 | int uselogin = 0; /* Use /etc/passwd for checking PAP */ |
---|
106 | int lcp_echo_interval = 0; /* Interval between LCP echo-requests */ |
---|
107 | int lcp_echo_fails = 0; /* Tolerance to unanswered echo-requests */ |
---|
108 | char our_name[MAXNAMELEN]="infotel"; /* Our name for authentication purposes */ |
---|
109 | char remote_name[MAXNAMELEN]; /* Peer's name for authentication */ |
---|
110 | int explicit_remote = 0; /* User specified explicit remote name */ |
---|
111 | int usehostname = 0; /* Use hostname for our_name */ |
---|
112 | int disable_defaultip = 1; /* Don't use hostname for default IP adrs */ |
---|
113 | int demand = 0; /* do dial-on-demand */ |
---|
114 | char *ipparam = NULL; /* Extra parameter for ip up/down scripts */ |
---|
115 | int cryptpap; /* Passwords in pap-secrets are encrypted */ |
---|
116 | int idle_time_limit = 0; /* Disconnect if idle for this many seconds */ |
---|
117 | int holdoff = 30; /* # seconds to pause before reconnecting */ |
---|
118 | int refuse_pap = 0; /* Set to say we won't do PAP */ |
---|
119 | int refuse_chap = 1; /* Set to say we won't do CHAP */ |
---|
120 | |
---|
121 | #ifdef MSLANMAN |
---|
122 | int ms_lanman = 0; /* Nonzero if use LanMan password instead of NT */ |
---|
123 | /* Has meaning only with MS-CHAP challenges */ |
---|
124 | #endif |
---|
125 | |
---|
126 | struct option_info auth_req_info; |
---|
127 | struct option_info connector_info; |
---|
128 | struct option_info disconnector_info; |
---|
129 | struct option_info welcomer_info; |
---|
130 | struct option_info devnam_info; |
---|
131 | #ifdef PPP_FILTER |
---|
132 | struct bpf_program pass_filter;/* Filter program for packets to pass */ |
---|
133 | struct bpf_program active_filter; /* Filter program for link-active pkts */ |
---|
134 | pcap_t pc; /* Fake struct pcap so we can compile expr */ |
---|
135 | #endif |
---|
136 | |
---|
137 | /* |
---|
138 | * Prototypes |
---|
139 | */ |
---|
140 | #if 0 |
---|
141 | static int setdevname __P((char *, int)); |
---|
142 | static int setipaddr __P((char *)); |
---|
143 | static int setspeed __P((char *)); |
---|
144 | static int setdebug __P((char **)); |
---|
145 | static int setkdebug __P((char **)); |
---|
146 | static int setpassive __P((char **)); |
---|
147 | static int setsilent __P((char **)); |
---|
148 | static int noopt __P((char **)); |
---|
149 | static int setnovj __P((char **)); |
---|
150 | static int setnovjccomp __P((char **)); |
---|
151 | static int setvjslots __P((char **)); |
---|
152 | static int reqpap __P((char **)); |
---|
153 | static int nopap __P((char **)); |
---|
154 | #ifdef OLD_OPTIONS |
---|
155 | static int setupapfile __P((char **)); |
---|
156 | #endif |
---|
157 | static int nochap __P((char **)); |
---|
158 | static int reqchap __P((char **)); |
---|
159 | static int noaccomp __P((char **)); |
---|
160 | static int noasyncmap __P((char **)); |
---|
161 | static int noip __P((char **)); |
---|
162 | static int nomagicnumber __P((char **)); |
---|
163 | static int setasyncmap __P((char **)); |
---|
164 | static int setescape __P((char **)); |
---|
165 | static int setmru __P((char **)); |
---|
166 | static int setmtu __P((char **)); |
---|
167 | #ifdef CBCP_SUPPORT |
---|
168 | static int setcbcp __P((char **)); |
---|
169 | #endif |
---|
170 | static int nomru __P((char **)); |
---|
171 | static int nopcomp __P((char **)); |
---|
172 | static int setconnector __P((char **)); |
---|
173 | static int setdisconnector __P((char **)); |
---|
174 | static int setwelcomer __P((char **)); |
---|
175 | static int setmaxconnect __P((char **)); |
---|
176 | static int setdomain __P((char **)); |
---|
177 | static int setnetmask __P((char **)); |
---|
178 | static int setcrtscts __P((char **)); |
---|
179 | static int setnocrtscts __P((char **)); |
---|
180 | static int setxonxoff __P((char **)); |
---|
181 | static int setnodetach __P((char **)); |
---|
182 | static int setupdetach __P((char **)); |
---|
183 | static int setmodem __P((char **)); |
---|
184 | static int setlocal __P((char **)); |
---|
185 | static int setlock __P((char **)); |
---|
186 | static int setname __P((char **)); |
---|
187 | static int setuser __P((char **)); |
---|
188 | static int setremote __P((char **)); |
---|
189 | static int setauth __P((char **)); |
---|
190 | static int setnoauth __P((char **)); |
---|
191 | static int readfile __P((char **)); |
---|
192 | static int callfile __P((char **)); |
---|
193 | static int setdefaultroute __P((char **)); |
---|
194 | static int setnodefaultroute __P((char **)); |
---|
195 | static int setproxyarp __P((char **)); |
---|
196 | static int setnoproxyarp __P((char **)); |
---|
197 | static int setpersist __P((char **)); |
---|
198 | static int setnopersist __P((char **)); |
---|
199 | static int setdologin __P((char **)); |
---|
200 | static int setusehostname __P((char **)); |
---|
201 | static int setnoipdflt __P((char **)); |
---|
202 | static int setlcptimeout __P((char **)); |
---|
203 | static int setlcpterm __P((char **)); |
---|
204 | static int setlcpconf __P((char **)); |
---|
205 | static int setlcpfails __P((char **)); |
---|
206 | static int setipcptimeout __P((char **)); |
---|
207 | static int setipcpterm __P((char **)); |
---|
208 | static int setipcpconf __P((char **)); |
---|
209 | static int setipcpfails __P((char **)); |
---|
210 | static int setpaptimeout __P((char **)); |
---|
211 | static int setpapreqs __P((char **)); |
---|
212 | static int setpapreqtime __P((char **)); |
---|
213 | static int setchaptimeout __P((char **)); |
---|
214 | static int setchapchal __P((char **)); |
---|
215 | static int setchapintv __P((char **)); |
---|
216 | static int setipcpaccl __P((char **)); |
---|
217 | static int setipcpaccr __P((char **)); |
---|
218 | static int setlcpechointv __P((char **)); |
---|
219 | static int setlcpechofails __P((char **)); |
---|
220 | static int noccp __P((char **)); |
---|
221 | static int setbsdcomp __P((char **)); |
---|
222 | static int setnobsdcomp __P((char **)); |
---|
223 | static int setdeflate __P((char **)); |
---|
224 | static int setnodeflate __P((char **)); |
---|
225 | static int setnodeflatedraft __P((char **)); |
---|
226 | static int setdemand __P((char **)); |
---|
227 | static int setpred1comp __P((char **)); |
---|
228 | static int setnopred1comp __P((char **)); |
---|
229 | static int setipparam __P((char **)); |
---|
230 | static int setpapcrypt __P((char **)); |
---|
231 | static int setidle __P((char **)); |
---|
232 | static int setholdoff __P((char **)); |
---|
233 | static int setdnsaddr __P((char **)); |
---|
234 | static int resetipxproto __P((char **)); |
---|
235 | static int setwinsaddr __P((char **)); |
---|
236 | static int showversion __P((char **)); |
---|
237 | static int showhelp __P((char **)); |
---|
238 | |
---|
239 | #ifdef PPP_FILTER |
---|
240 | static int setpdebug __P((char **)); |
---|
241 | static int setpassfilter __P((char **)); |
---|
242 | static int setactivefilter __P((char **)); |
---|
243 | #endif |
---|
244 | |
---|
245 | #ifdef IPX_CHANGE |
---|
246 | static int setipxproto __P((char **)); |
---|
247 | static int setipxanet __P((char **)); |
---|
248 | static int setipxalcl __P((char **)); |
---|
249 | static int setipxarmt __P((char **)); |
---|
250 | static int setipxnetwork __P((char **)); |
---|
251 | static int setipxnode __P((char **)); |
---|
252 | static int setipxrouter __P((char **)); |
---|
253 | static int setipxname __P((char **)); |
---|
254 | static int setipxcptimeout __P((char **)); |
---|
255 | static int setipxcpterm __P((char **)); |
---|
256 | static int setipxcpconf __P((char **)); |
---|
257 | static int setipxcpfails __P((char **)); |
---|
258 | #endif /* IPX_CHANGE */ |
---|
259 | |
---|
260 | #ifdef MSLANMAN |
---|
261 | static int setmslanman __P((char **)); |
---|
262 | #endif |
---|
263 | |
---|
264 | static int number_option __P((char *, u_int32_t *, int)); |
---|
265 | static int int_option __P((char *, int *)); |
---|
266 | static int readable __P((int fd)); |
---|
267 | #endif |
---|
268 | |
---|
269 | /* |
---|
270 | * Valid arguments. |
---|
271 | */ |
---|
272 | |
---|
273 | /* |
---|
274 | * parse_args - parse a string of arguments from the command line. |
---|
275 | */ |
---|
276 | int |
---|
277 | parse_args(argc, argv) |
---|
278 | int argc; |
---|
279 | char **argv; |
---|
280 | { |
---|
281 | |
---|
282 | |
---|
283 | return 0; |
---|
284 | } |
---|
285 | |
---|
286 | /* |
---|
287 | * scan_args - scan the command line arguments to get the tty name, |
---|
288 | * if specified. |
---|
289 | */ |
---|
290 | |
---|
291 | /* |
---|
292 | * usage - print out a message telling how to use the program. |
---|
293 | */ |
---|
294 | void |
---|
295 | usage() |
---|
296 | { |
---|
297 | } |
---|
298 | |
---|
299 | /* |
---|
300 | * showhelp - print out usage message and exit. |
---|
301 | */ |
---|
302 | static int |
---|
303 | showhelp(argv) |
---|
304 | char **argv; |
---|
305 | { |
---|
306 | return 0; |
---|
307 | } |
---|
308 | |
---|
309 | /* |
---|
310 | * showversion - print out the version number and exit. |
---|
311 | */ |
---|
312 | static int |
---|
313 | showversion(argv) |
---|
314 | char **argv; |
---|
315 | { |
---|
316 | return 0; |
---|
317 | } |
---|
318 | |
---|
319 | void |
---|
320 | option_error __V((char *fmt, ...)) |
---|
321 | { |
---|
322 | } |
---|
323 | /* |
---|
324 | * readable - check if a file is readable by the real user. |
---|
325 | */ |
---|
326 | /*static int |
---|
327 | readable(fd) |
---|
328 | int fd; |
---|
329 | { |
---|
330 | uid_t uid; |
---|
331 | int ngroups, i; |
---|
332 | struct stat sbuf; |
---|
333 | GIDSET_TYPE groups[NGROUPS_MAX]; |
---|
334 | |
---|
335 | uid = getuid(); |
---|
336 | if (uid == 0) |
---|
337 | return 1; |
---|
338 | if (fstat(fd, &sbuf) != 0) |
---|
339 | return 0; |
---|
340 | if (sbuf.st_uid == uid) |
---|
341 | return sbuf.st_mode & S_IRUSR; |
---|
342 | if (sbuf.st_gid == getgid()) |
---|
343 | return sbuf.st_mode & S_IRGRP; |
---|
344 | ngroups = getgroups(NGROUPS_MAX, groups); |
---|
345 | for (i = 0; i < ngroups; ++i) |
---|
346 | if (sbuf.st_gid == groups[i]) |
---|
347 | return sbuf.st_mode & S_IRGRP; |
---|
348 | return sbuf.st_mode & S_IROTH; |
---|
349 | } |
---|
350 | */ |
---|
351 | /* |
---|
352 | * Read a word from a file. |
---|
353 | * Words are delimited by white-space or by quotes (" or '). |
---|
354 | * Quotes, white-space and \ may be escaped with \. |
---|
355 | * \<newline> is ignored. |
---|
356 | */ |
---|
357 | |
---|
358 | /* |
---|
359 | * The following procedures parse options. |
---|
360 | */ |
---|
361 | |
---|
362 | /* |
---|
363 | * readfile - take commands from a file. |
---|
364 | */ |
---|
365 | |
---|
366 | /* |
---|
367 | * callfile - take commands from /etc/ppp/peers/<name>. |
---|
368 | * Name may not contain /../, start with / or ../, or end in /.. |
---|
369 | */ |
---|
370 | /* |
---|
371 | * setdebug - Set debug (command line argument). |
---|
372 | */ |
---|
373 | |
---|
374 | |
---|
375 | /* |
---|
376 | * noopt - Disable all options. |
---|
377 | */ |
---|
378 | static int |
---|
379 | noopt(argv) |
---|
380 | char **argv; |
---|
381 | { |
---|
382 | BZERO((char *) &lcp_wantoptions[0], sizeof (struct lcp_options)); |
---|
383 | BZERO((char *) &lcp_allowoptions[0], sizeof (struct lcp_options)); |
---|
384 | BZERO((char *) &ipcp_wantoptions[0], sizeof (struct ipcp_options)); |
---|
385 | BZERO((char *) &ipcp_allowoptions[0], sizeof (struct ipcp_options)); |
---|
386 | |
---|
387 | #ifdef IPX_CHANGE |
---|
388 | BZERO((char *) &ipxcp_wantoptions[0], sizeof (struct ipxcp_options)); |
---|
389 | BZERO((char *) &ipxcp_allowoptions[0], sizeof (struct ipxcp_options)); |
---|
390 | #endif /* IPX_CHANGE */ |
---|
391 | |
---|
392 | return (1); |
---|
393 | } |
---|