2 * main.c - Point-to-Point Protocol main module
4 * Copyright (c) 1989 Carnegie Mellon University.
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.
21 static char rcsid[] = "$Id: main.c,v 1.32 1996/04/04 03:59:33 paulus Exp $";
35 #include <sys/param.h>
36 #include <sys/types.h>
39 #include <sys/resource.h>
41 #include <sys/socket.h>
52 #include "pathnames.h"
53 #include "patchlevel.h"
57 #endif /* IPX_CHANGE */
60 * If REQ_SYSOPTIONS is defined to 1, pppd will not run unless
61 * /etc/ppp/options exists.
63 #ifndef REQ_SYSOPTIONS
64 #define REQ_SYSOPTIONS 1
68 char ifname[IFNAMSIZ]; /* Interface name */
69 int ifunit; /* Interface unit number */
71 char *progname; /* Name of this program */
72 char hostname[MAXNAMELEN]; /* Our hostname */
73 static char pidfilename[MAXPATHLEN]; /* name of pid file */
74 static char default_devnam[MAXPATHLEN]; /* name of default device */
75 static pid_t pid; /* Our pid */
76 static uid_t uid; /* Our real user-id */
78 int ttyfd = -1; /* Serial port file descriptor */
80 int phase; /* where the link is at */
84 u_char outpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for outgoing packet */
85 u_char inpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for incoming packet */
87 int hungup; /* terminal has been hung up */
88 static int n_children; /* # child processes still running */
90 int baud_rate; /* Actual bits/second for serial device */
92 static int locked; /* lock() has succeeded */
94 char *no_ppp_msg = "Sorry - this system lacks PPP kernel support\n";
96 /* Prototypes for procedures local to this file. */
98 static void cleanup __P((void));
99 static void close_tty __P((void));
100 static void get_input __P((void));
101 static void connect_time_expired __P((caddr_t));
102 static void calltimeout __P((void));
103 static struct timeval *timeleft __P((struct timeval *));
104 static void hup __P((int));
105 static void term __P((int));
106 static void chld __P((int));
107 static void toggle_debug __P((int));
108 static void open_ccp __P((int));
109 static void bad_signal __P((int));
110 static void holdoff_end __P((void *));
111 static int device_script __P((char *, int, int));
112 static void reap_kids __P((void));
113 static void pr_log __P((void *, char *, ...));
115 extern char *ttyname __P((int));
116 extern char *getlogin __P((void));
120 #define O_NONBLOCK O_NDELAY
124 * PPP Data Link Layer "protocol" table.
125 * One entry per supported protocol.
126 * The last entry must be NULL.
128 struct protent *protocols[] = {
145 int i, nonblock, fdflags;
152 struct protent *protp;
157 strcpy(default_devnam, devnam);
159 if (gethostname(hostname, MAXNAMELEN) < 0 ) {
160 perror("couldn't get hostname");
163 hostname[MAXNAMELEN-1] = 0;
168 * Initialize to the standard option set, then parse, in order,
169 * the system options file, the user's options file, and the command
172 for (i = 0; (protp = protocols[i]) != NULL; ++i)
177 if (!options_from_file(_PATH_SYSOPTIONS, REQ_SYSOPTIONS, 0) ||
178 !options_for_tty() ||
179 !options_from_user() ||
180 !parse_args(argc-1, argv+1))
183 if (!ppp_available()) {
184 fprintf(stderr, no_ppp_msg);
189 * Check that the options given are valid and consistent.
192 auth_check_options();
193 for (i = 0; (protp = protocols[i]) != NULL; ++i)
194 if (protp->check_options != NULL)
195 (*protp->check_options)();
196 if (demand && connector == 0) {
197 fprintf(stderr, "%s: connect script required for demand-dialling\n",
203 * If the user has specified the default device name explicitly,
204 * pretend they hadn't.
206 if (!default_device && strcmp(devnam, default_devnam) == 0)
210 * Initialize system-dependent stuff and magic number package.
216 * Detach ourselves from the terminal, if required,
217 * and identify who is running us.
219 if (!default_device && !nodetach && daemon(0, 0) < 0) {
220 perror("Couldn't detach from controlling terminal");
227 if (pw != NULL && pw->pw_name != NULL)
232 syslog(LOG_NOTICE, "pppd %s.%d started by %s, uid %d",
233 VERSION, PATCHLEVEL, p, uid);
236 * Compute mask of all interesting signals and install signal handlers
237 * for each. Only one signal handler may be active at a time. Therefore,
238 * all other signals should be masked when any handler is executing.
241 sigaddset(&mask, SIGHUP);
242 sigaddset(&mask, SIGINT);
243 sigaddset(&mask, SIGTERM);
244 sigaddset(&mask, SIGCHLD);
246 #define SIGNAL(s, handler) { \
247 sa.sa_handler = handler; \
248 if (sigaction(s, &sa, NULL) < 0) { \
249 syslog(LOG_ERR, "Couldn't establish signal handler (%d): %m", s); \
256 SIGNAL(SIGHUP, hup); /* Hangup */
257 SIGNAL(SIGINT, term); /* Interrupt */
258 SIGNAL(SIGTERM, term); /* Terminate */
259 SIGNAL(SIGCHLD, chld);
261 SIGNAL(SIGUSR1, toggle_debug); /* Toggle debug flag */
262 SIGNAL(SIGUSR2, open_ccp); /* Reopen CCP */
265 * Install a handler for other signals which would otherwise
266 * cause pppd to exit without cleaning up.
268 SIGNAL(SIGABRT, bad_signal);
269 SIGNAL(SIGALRM, bad_signal);
270 SIGNAL(SIGFPE, bad_signal);
271 SIGNAL(SIGILL, bad_signal);
272 SIGNAL(SIGPIPE, bad_signal);
273 SIGNAL(SIGQUIT, bad_signal);
274 SIGNAL(SIGSEGV, bad_signal);
276 SIGNAL(SIGBUS, bad_signal);
279 SIGNAL(SIGEMT, bad_signal);
282 SIGNAL(SIGPOLL, bad_signal);
285 SIGNAL(SIGPROF, bad_signal);
288 SIGNAL(SIGSYS, bad_signal);
291 SIGNAL(SIGTRAP, bad_signal);
294 SIGNAL(SIGVTALRM, bad_signal);
297 SIGNAL(SIGXCPU, bad_signal);
300 SIGNAL(SIGXFSZ, bad_signal);
304 * If we're doing dial-on-demand, set up the interface now.
308 * Open the loopback channel and set it up to be the ppp interface.
312 syslog(LOG_INFO, "Using interface ppp%d", ifunit);
313 (void) sprintf(ifname, "ppp%d", ifunit);
315 /* write pid to file */
316 (void) sprintf(pidfilename, "%s%s.pid", _PATH_VARRUN, ifname);
317 if ((pidfile = fopen(pidfilename, "w")) != NULL) {
318 fprintf(pidfile, "%d\n", pid);
319 (void) fclose(pidfile);
321 syslog(LOG_ERR, "Failed to create pid file %s: %m", pidfilename);
326 * Configure the interface and mark it up, etc.
335 * Don't do anything until we see some activity.
337 phase = PHASE_DORMANT;
341 wait_loop_output(timeleft(&timo));
348 if (get_loop_output())
354 * Now we want to bring up the link.
357 syslog(LOG_INFO, "Starting link");
361 * Lock the device if we've been asked to.
363 if (lockflag && !default_device) {
364 if (lock(devnam) < 0)
370 * Open the serial device and set it up to be the ppp interface.
371 * If we're dialling out, or we don't want to use the modem lines,
372 * we open it in non-blocking mode, but then we need to clear
373 * the non-blocking I/O bit.
375 nonblock = (connector || !modem)? O_NONBLOCK: 0;
376 if ((ttyfd = open(devnam, nonblock | O_RDWR, 0)) < 0) {
377 syslog(LOG_ERR, "Failed to open %s: %m", devnam);
381 if ((fdflags = fcntl(ttyfd, F_GETFL)) == -1
382 || fcntl(ttyfd, F_SETFL, fdflags & ~O_NONBLOCK) < 0)
384 "Couldn't reset non-blocking mode on device: %m");
389 /* run connection script */
390 if (connector && connector[0]) {
391 MAINDEBUG((LOG_INFO, "Connecting with <%s>", connector));
393 /* set line speed, flow control, etc.; set CLOCAL for now */
394 set_up_tty(ttyfd, 1);
396 /* drop dtr to hang up in case modem is off hook */
397 if (!default_device && modem) {
398 setdtr(ttyfd, FALSE);
403 if (device_script(connector, ttyfd, ttyfd) < 0) {
404 syslog(LOG_ERR, "Connect script failed");
405 setdtr(ttyfd, FALSE);
409 syslog(LOG_INFO, "Serial connection established.");
410 sleep(1); /* give it time to set up its terminal */
413 /* set line speed, flow control, etc.; clear CLOCAL if modem option */
414 set_up_tty(ttyfd, 0);
416 /* run welcome script, if any */
417 if (welcomer && welcomer[0]) {
418 if (device_script(welcomer, ttyfd, ttyfd) < 0)
419 syslog(LOG_WARNING, "Welcome script failed");
422 /* set up the serial device as a ppp interface */
423 establish_ppp(ttyfd);
427 syslog(LOG_INFO, "Using interface ppp%d", ifunit);
428 (void) sprintf(ifname, "ppp%d", ifunit);
430 /* write pid to file */
431 (void) sprintf(pidfilename, "%s%s.pid", _PATH_VARRUN, ifname);
432 if ((pidfile = fopen(pidfilename, "w")) != NULL) {
433 fprintf(pidfile, "%d\n", pid);
434 (void) fclose(pidfile);
436 syslog(LOG_ERR, "Failed to create pid file %s: %m",
443 * Set a timeout to close the connection once the maximum
444 * connect time has expired.
447 TIMEOUT(connect_time_expired, 0, maxconnect);
450 * Start opening the connection and wait for
451 * incoming events (reply, timeout, etc.).
453 syslog(LOG_NOTICE, "Connect: %s <--> %s", ifname, devnam);
455 lcp_open(0); /* Start protocol */
456 for (phase = PHASE_ESTABLISH; phase != PHASE_DEAD; ) {
457 wait_input(timeleft(&timo));
461 lcp_close(0, "User request");
462 phase = PHASE_TERMINATE;
466 if (phase == PHASE_NETWORK) {
467 ccp_fsm[0].flags = OPT_RESTART; /* clears OPT_SILENT */
472 reap_kids(); /* Don't leave dead kids lying around */
476 * If we may want to bring the link up again, transfer
477 * the ppp unit back to the loopback. Set the
478 * real serial device back to its normal mode of operation.
483 disestablish_ppp(ttyfd);
486 * Run disconnector script, if requested.
487 * XXX we may not be able to do this if the line has hung up!
489 if (disconnector && !hungup) {
490 set_up_tty(ttyfd, 1);
491 if (device_script(disconnector, ttyfd, ttyfd) < 0) {
492 syslog(LOG_WARNING, "disconnect script failed");
494 syslog(LOG_INFO, "Serial link disconnected.");
506 if (unlink(pidfilename) < 0 && errno != ENOENT)
507 syslog(LOG_WARNING, "unable to delete pid file: %m");
517 phase = PHASE_HOLDOFF;
518 TIMEOUT(holdoff_end, NULL, holdoff);
520 wait_time(timeleft(&timo));
526 phase = PHASE_DORMANT; /* allow signal to end holdoff */
529 } while (phase == PHASE_HOLDOFF);
537 * holdoff_end - called via a timeout when the holdoff period ends.
543 phase = PHASE_DORMANT;
547 * get_input - called when incoming data is available.
555 struct protent *protp;
557 p = inpacket_buf; /* point to beginning of packet buffer */
559 len = read_packet(inpacket_buf);
564 syslog(LOG_NOTICE, "Modem hangup");
566 lcp_lowerdown(0); /* serial link is no longer available */
571 if (debug /*&& (debugflags & DBG_INPACKET)*/)
572 log_packet(p, len, "rcvd ");
574 if (len < PPP_HDRLEN) {
575 MAINDEBUG((LOG_INFO, "io(): Received short packet."));
579 p += 2; /* Skip address and control */
580 GETSHORT(protocol, p);
584 * Toss all non-LCP packets unless LCP is OPEN.
586 if (protocol != PPP_LCP && lcp_fsm[0].state != OPENED) {
588 "io(): Received non-LCP packet when LCP not open."));
593 * Upcall the proper protocol input routine.
595 for (i = 0; (protp = protocols[i]) != NULL; ++i) {
596 if (protp->protocol == protocol && protp->enabled_flag) {
597 (*protp->input)(0, p, len);
600 if (protocol == (protp->protocol & ~0x8000) && protp->enabled_flag
601 && protp->datainput != NULL) {
602 (*protp->datainput)(0, p, len);
608 syslog(LOG_WARNING, "Unsupported protocol (0x%x) received", protocol);
609 lcp_sprotrej(0, p - PPP_HDRLEN, len + PPP_HDRLEN);
614 * quit - Clean up state and exit (with an error indication).
623 * die - like quit, except we can specify an exit status.
630 syslog(LOG_INFO, "Exit.");
635 * connect_time_expired - log a message and close the connection.
638 connect_time_expired(arg)
641 syslog(LOG_INFO, "Connect time expired");
643 phase = PHASE_TERMINATE;
644 lcp_close(0, "Connect time expired"); /* Close connection */
648 * cleanup - restore anything which needs to be restored before we exit
659 if (pidfilename[0] != 0 && unlink(pidfilename) < 0 && errno != ENOENT)
660 syslog(LOG_WARNING, "unable to delete pid file: %m");
668 * close_tty - restore the terminal device and close it.
673 disestablish_ppp(ttyfd);
675 /* drop dtr to hang up */
677 setdtr(ttyfd, FALSE);
679 * This sleep is in case the serial port has CLOCAL set by default,
680 * and consequently will reassert DTR when we close the device.
693 struct timeval c_time; /* time at which to call routine */
694 caddr_t c_arg; /* argument to routine */
695 void (*c_func)(); /* routine */
696 struct callout *c_next;
699 static struct callout *callout = NULL; /* Callout list */
700 static struct timeval timenow; /* Current time */
703 * timeout - Schedule a timeout.
705 * Note that this timeout takes the number of seconds, NOT hz (as in
709 timeout(func, arg, time)
714 struct callout *newp, *p, **pp;
716 MAINDEBUG((LOG_DEBUG, "Timeout %lx:%lx in %d seconds.",
717 (long) func, (long) arg, time));
722 if ((newp = (struct callout *) malloc(sizeof(struct callout))) == NULL) {
723 syslog(LOG_ERR, "Out of memory in timeout()!");
728 gettimeofday(&timenow, NULL);
729 newp->c_time.tv_sec = timenow.tv_sec + time;
730 newp->c_time.tv_usec = timenow.tv_usec;
733 * Find correct place and link it in.
735 for (pp = &callout; (p = *pp); pp = &p->c_next)
736 if (newp->c_time.tv_sec < p->c_time.tv_sec
737 || (newp->c_time.tv_sec == p->c_time.tv_sec
738 && newp->c_time.tv_usec < p->c_time.tv_sec))
746 * untimeout - Unschedule a timeout.
753 struct callout **copp, *freep;
755 MAINDEBUG((LOG_DEBUG, "Untimeout %lx:%lx.", (long) func, (long) arg));
758 * Find first matching timeout and remove it from the list.
760 for (copp = &callout; (freep = *copp); copp = &freep->c_next)
761 if (freep->c_func == func && freep->c_arg == arg) {
762 *copp = freep->c_next;
763 (void) free((char *) freep);
770 * calltimeout - Call any timeout routines which are now due.
777 while (callout != NULL) {
780 if (gettimeofday(&timenow, NULL) < 0) {
781 syslog(LOG_ERR, "Failed to get time of day: %m");
784 if (!(p->c_time.tv_sec < timenow.tv_sec
785 || (p->c_time.tv_sec == timenow.tv_sec
786 && p->c_time.tv_usec <= timenow.tv_usec)))
787 break; /* no, it's not time yet */
790 (*p->c_func)(p->c_arg);
798 * timeleft - return the length of time until the next timeout is due.
800 static struct timeval *
807 gettimeofday(&timenow, NULL);
808 tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec;
809 tvp->tv_usec = callout->c_time.tv_usec - timenow.tv_usec;
810 if (tvp->tv_usec < 0) {
811 tvp->tv_usec += 1000000;
815 tvp->tv_sec = tvp->tv_usec = 0;
822 * hup - Catch SIGHUP signal.
824 * Indicates that the physical layer has been disconnected.
825 * We don't rely on this indication; if the user has sent this
826 * signal, we just take the link down.
832 syslog(LOG_INFO, "Hangup (SIGHUP)");
838 * term - Catch SIGTERM signal and SIGINT signal (^C/del).
840 * Indicates that we should initiate a graceful disconnect and exit.
847 syslog(LOG_INFO, "Terminating on signal %d.", sig);
848 persist = 0; /* don't try to restart */
854 * chld - Catch SIGCHLD signal.
855 * Calls reap_kids to get status for any dead kids.
866 * toggle_debug - Catch SIGUSR1 signal.
881 * open_ccp - Catch SIGUSR2 signal.
883 * Try to (re)negotiate compression.
895 * bad_signal - We've caught a fatal signal. Clean up state and exit.
901 syslog(LOG_ERR, "Fatal signal %d", sig);
907 * device_script - run a program to connect or disconnect the
911 device_script(program, in, out)
922 syslog(LOG_ERR, "Failed to create child process: %m");
930 errfd = open(_PATH_CONNERRS, O_WRONLY | O_APPEND | O_CREAT, 0644);
935 execl("/bin/sh", "sh", "-c", program, (char *)0);
936 syslog(LOG_ERR, "could not exec /bin/sh: %m");
941 while (waitpid(pid, &status, 0) < 0) {
944 syslog(LOG_ERR, "error waiting for (dis)connection process: %m");
948 return (status == 0 ? 0 : -1);
953 * run-program - execute a program with given arguments,
954 * but don't wait for it.
955 * If the program can't be executed, logs an error unless
956 * must_exist is 0 and the program file doesn't exist.
959 run_program(prog, args, must_exist)
969 syslog(LOG_ERR, "Failed to create child process for %s: %m", prog);
975 /* Leave the current location */
976 (void) setsid(); /* No controlling tty. */
977 (void) umask (S_IRWXG|S_IRWXO);
978 (void) chdir ("/"); /* no current directory. */
982 /* Ensure that nothing of our device environment is inherited. */
987 close (ttyfd); /* tty interface to the ppp device */
989 /* Don't pass handles to the PPP device, even by accident. */
990 new_fd = open (_PATH_DEVNULL, O_RDWR);
993 dup2 (new_fd, 0); /* stdin <- /dev/null */
996 dup2 (0, 1); /* stdout -> /dev/null */
997 dup2 (0, 2); /* stderr -> /dev/null */
1001 /* Force the priority back to zero if pppd is running higher. */
1002 if (setpriority (PRIO_PROCESS, 0, 0) < 0)
1003 syslog (LOG_WARNING, "can't reset priority to 0: %m");
1006 /* SysV recommends a second fork at this point. */
1008 /* run the program; give it a null environment */
1010 execve(prog, args, nullenv);
1011 if (must_exist || errno != ENOENT)
1012 syslog(LOG_WARNING, "Can't execute %s: %m", prog);
1015 MAINDEBUG((LOG_DEBUG, "Script %s started; pid = %d", prog, pid));
1022 * reap_kids - get status from any dead child processes,
1023 * and log a message for abnormal terminations.
1030 if (n_children == 0)
1032 if ((pid = waitpid(-1, &status, WNOHANG)) == -1) {
1033 if (errno != ECHILD)
1034 syslog(LOG_ERR, "Error waiting for child process: %m");
1039 if (WIFSIGNALED(status)) {
1040 syslog(LOG_WARNING, "Child process %d terminated with signal %d",
1041 pid, WTERMSIG(status));
1048 * log_packet - format a packet and log it.
1051 char line[256]; /* line to be logged accumulated here */
1055 log_packet(p, len, prefix)
1060 strcpy(line, prefix);
1061 linep = line + strlen(line);
1062 format_packet(p, len, pr_log, NULL);
1064 syslog(LOG_DEBUG, "%s", line);
1068 * format_packet - make a readable representation of a packet,
1069 * calling `printer(arg, format, ...)' to output it.
1072 format_packet(p, len, printer, arg)
1075 void (*printer) __P((void *, char *, ...));
1081 struct protent *protp;
1083 if (len >= PPP_HDRLEN && p[0] == PPP_ALLSTATIONS && p[1] == PPP_UI) {
1087 for (i = 0; (protp = protocols[i]) != NULL; ++i)
1088 if (proto == protp->protocol)
1090 if (protp != NULL) {
1091 printer(arg, "[%s", protp->name);
1092 n = (*protp->printpkt)(p, len, printer, arg);
1097 printer(arg, "[proto=0x%x]", proto);
1101 for (; len > 0; --len) {
1103 printer(arg, " %.2x", x);
1111 pr_log(void *arg, char *fmt, ...)
1117 va_start(pvar, fmt);
1118 vsprintf(buf, fmt, pvar);
1122 if (linep + n + 1 > line + sizeof(line)) {
1123 syslog(LOG_DEBUG, "%s", line);
1130 #else /* __STDC__ */
1131 #include <varargs.h>
1134 pr_log(arg, fmt, va_alist)
1144 vsprintf(buf, fmt, pvar);
1148 if (linep + n + 1 > line + sizeof(line)) {
1149 syslog(LOG_DEBUG, "%s", line);
1158 * print_string - print a readable representation of a string using
1162 print_string(p, len, printer, arg)
1165 void (*printer) __P((void *, char *, ...));
1171 for (; len > 0; --len) {
1173 if (' ' <= c && c <= '~')
1174 printer(arg, "%c", c);
1176 printer(arg, "\\%.3o", c);
1182 * novm - log an error message saying we ran out of memory, and die.
1188 syslog(LOG_ERR, "Virtual memory exhausted allocating %s\n", msg);