X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fmain.c;h=f4913ff28e7798c9b813640d092cfebde21f3a09;hp=69cc5c4ee6a3fdf052ce793b3d3851f847515c57;hb=79b0b24a753bc3f560ba85893cb51bbbecc429be;hpb=8ed8058b62ae72fba40f04c1dbd7f19e58ed500f diff --git a/pppd/main.c b/pppd/main.c index 69cc5c4..f4913ff 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -18,7 +18,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: main.c,v 1.21 1995/04/24 05:56:13 paulus Exp $"; +static char rcsid[] = "$Id: main.c,v 1.27 1995/08/16 01:39:08 paulus Exp $"; #endif #include @@ -65,8 +65,8 @@ int ifunit; /* Interface unit number */ char *progname; /* Name of this program */ char hostname[MAXNAMELEN]; /* Our hostname */ -static char pidfilename[MAXPATHLEN]; - +static char pidfilename[MAXPATHLEN]; /* name of pid file */ +static char default_devnam[MAXPATHLEN]; /* name of default device */ static pid_t pid; /* Our pid */ static pid_t pgrpid; /* Process Group ID */ static uid_t uid; /* Our real user-id */ @@ -87,12 +87,15 @@ static int n_children; /* # child processes still running */ int baud_rate; +char *no_ppp_msg = "Sorry - this system lacks PPP kernel support\n"; + /* prototypes */ static void hup __P((int)); static void term __P((int)); static void chld __P((int)); static void toggle_debug __P((int)); static void open_ccp __P((int)); +static void bad_signal __P((int)); static void get_input __P((void)); void establish_ppp __P((void)); @@ -160,6 +163,7 @@ main(argc, argv) p = ttyname(0); if (p) strcpy(devnam, p); + strcpy(default_devnam, devnam); if (gethostname(hostname, MAXNAMELEN) < 0 ) { perror("couldn't get hostname"); @@ -170,7 +174,7 @@ main(argc, argv) uid = getuid(); if (!ppp_available()) { - fprintf(stderr, "Sorry - PPP is not available on this system\n"); + fprintf(stderr, no_ppp_msg); exit(1); } @@ -192,6 +196,13 @@ main(argc, argv) check_auth_options(); setipdefault(); + /* + * If the user has specified the default device name explicitly, + * pretend they hadn't. + */ + if (!default_device && strcmp(devnam, default_devnam) == 0) + default_device = 1; + /* * Initialize system-dependent stuff and magic number package. */ @@ -244,8 +255,47 @@ main(argc, argv) SIGNAL(SIGTERM, term); /* Terminate */ SIGNAL(SIGCHLD, chld); - signal(SIGUSR1, toggle_debug); /* Toggle debug flag */ - signal(SIGUSR2, open_ccp); /* Reopen CCP */ + SIGNAL(SIGUSR1, toggle_debug); /* Toggle debug flag */ + SIGNAL(SIGUSR2, open_ccp); /* Reopen CCP */ + + /* + * Install a handler for other signals which would otherwise + * cause pppd to exit without cleaning up. + */ + SIGNAL(SIGABRT, bad_signal); + SIGNAL(SIGALRM, bad_signal); + SIGNAL(SIGFPE, bad_signal); + SIGNAL(SIGILL, bad_signal); + SIGNAL(SIGPIPE, bad_signal); + SIGNAL(SIGQUIT, bad_signal); + SIGNAL(SIGSEGV, bad_signal); +#ifdef SIGBUS + SIGNAL(SIGBUS, bad_signal); +#endif +#ifdef SIGEMT + SIGNAL(SIGEMT, bad_signal); +#endif +#ifdef SIGPOLL + SIGNAL(SIGPOLL, bad_signal); +#endif +#ifdef SIGPROF + SIGNAL(SIGPROF, bad_signal); +#endif +#ifdef SIGSYS + SIGNAL(SIGSYS, bad_signal); +#endif +#ifdef SIGTRAP + SIGNAL(SIGTRAP, bad_signal); +#endif +#ifdef SIGVTALRM + SIGNAL(SIGVTALRM, bad_signal); +#endif +#ifdef SIGXCPU + SIGNAL(SIGXCPU, bad_signal); +#endif +#ifdef SIGXFSZ + SIGNAL(SIGXFSZ, bad_signal); +#endif /* * Lock the device if we've been asked to. @@ -298,10 +348,10 @@ main(argc, argv) die(1); } - syslog(LOG_INFO, "Connected..."); + syslog(LOG_INFO, "Serial connection established."); sleep(1); /* give it time to set up its terminal */ } - + /* set line speed, flow control, etc.; clear CLOCAL if modem option */ set_up_tty(fd, 0); @@ -339,6 +389,7 @@ main(argc, argv) for (phase = PHASE_ESTABLISH; phase != PHASE_DEAD; ) { wait_input(timeleft(&timo)); calltimeout(); + get_input(); if (kill_link) { lcp_close(0); kill_link = 0; @@ -350,13 +401,13 @@ main(argc, argv) } open_ccp_flag = 0; } - get_input(); reap_kids(); /* Don't leave dead kids lying around */ } /* * Run disconnector script, if requested. * First we need to reset non-blocking mode. + * XXX we may not be able to do this if the line has hung up! */ if (initfdflags != -1 && fcntl(fd, F_SETFL, initfdflags) >= 0) initfdflags = -1; @@ -365,10 +416,9 @@ main(argc, argv) set_up_tty(fd, 1); if (device_script(disconnector, fd, fd) < 0) { syslog(LOG_WARNING, "disconnect script failed"); - die(1); + } else { + syslog(LOG_INFO, "Serial link disconnected."); } - - syslog(LOG_INFO, "Disconnected..."); } close_fd(); @@ -378,10 +428,7 @@ main(argc, argv) } while (persist); - if (lockflag && !default_device) - unlock(); - - exit(0); + die(0); } @@ -402,7 +449,7 @@ get_input() return; if (len == 0) { - MAINDEBUG((LOG_DEBUG, "End of file on fd!")); + syslog(LOG_NOTICE, "Modem hangup"); hungup = 1; lcp_lowerdown(0); /* serial link is no longer available */ phase = PHASE_DEAD; @@ -433,21 +480,21 @@ get_input() /* * Upcall the proper protocol input routine. */ - for (i = 0; i < sizeof (prottbl) / sizeof (struct protent); i++) + for (i = 0; i < sizeof (prottbl) / sizeof (struct protent); i++) { if (prottbl[i].protocol == protocol) { (*prottbl[i].input)(0, p, len); - break; - } else if (protocol == (prottbl[i].protocol & ~0x8000) - && prottbl[i].datainput != NULL) { + return; + } + if (protocol == (prottbl[i].protocol & ~0x8000) + && prottbl[i].datainput != NULL) { (*prottbl[i].datainput)(0, p, len); - break; + return; } - - if (i == sizeof (prottbl) / sizeof (struct protent)) { - if (debug) - syslog(LOG_WARNING, "Unknown protocol (0x%x) received", protocol); - lcp_sprotrej(0, p - PPP_HDRLEN, len + PPP_HDRLEN); } + + if (debug) + syslog(LOG_WARNING, "Unknown protocol (0x%x) received", protocol); + lcp_sprotrej(0, p - PPP_HDRLEN, len + PPP_HDRLEN); } @@ -477,12 +524,23 @@ demuxprotrej(unit, protocol) /* - * quit - Clean up state and exit. + * bad_signal - We've caught a fatal signal. Clean up state and exit. + */ +static void +bad_signal(sig) + int sig; +{ + syslog(LOG_ERR, "Fatal signal %d", sig); + die(1); +} + +/* + * quit - Clean up state and exit (with an error indication). */ void quit() { - die(0); + die(1); } /* @@ -523,6 +581,8 @@ cleanup(status, arg) void close_fd() { + disestablish_ppp(); + /* drop dtr to hang up */ if (modem) setdtr(fd, FALSE); @@ -531,8 +591,6 @@ close_fd() syslog(LOG_WARNING, "Couldn't restore device fd flags: %m"); initfdflags = -1; - disestablish_ppp(); - restore_tty(); close(fd); @@ -755,6 +813,7 @@ device_script(program, in, out) { int pid; int status; + int errfd; pid = fork(); @@ -764,10 +823,13 @@ device_script(program, in, out) } if (pid == 0) { - setuid(getuid()); - setgid(getgid()); dup2(in, 0); dup2(out, 1); + errfd = open(_PATH_CONNERRS, O_WRONLY | O_APPEND | O_CREAT, 0644); + if (errfd >= 0) + dup2(errfd, 2); + setuid(getuid()); + setgid(getgid()); execl("/bin/sh", "sh", "-c", program, (char *)0); syslog(LOG_ERR, "could not exec /bin/sh: %m"); _exit(99);