X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fmain.c;h=6ec72b44a7a550dc6994fb8edeae60c5d655c26d;hp=38af544d7ae0d261826d6c92381cd53054112164;hb=b6a1cbaee79a0e39e9b65cf0ec3b5735acc7fef6;hpb=8d2b8187352766197e43a8be3f350acc91a65381 diff --git a/pppd/main.c b/pppd/main.c index 38af544..6ec72b4 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -18,7 +18,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: main.c,v 1.23 1995/05/19 03:26:25 paulus Exp $"; +static char rcsid[] = "$Id: main.c,v 1.24 1995/06/12 11:22:49 paulus Exp $"; #endif #include @@ -306,10 +306,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); @@ -365,6 +365,7 @@ main(argc, argv) /* * 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; @@ -373,10 +374,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(); @@ -438,21 +438,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); } @@ -528,6 +528,8 @@ cleanup(status, arg) void close_fd() { + disestablish_ppp(); + /* drop dtr to hang up */ if (modem) setdtr(fd, FALSE); @@ -536,8 +538,6 @@ close_fd() syslog(LOG_WARNING, "Couldn't restore device fd flags: %m"); initfdflags = -1; - disestablish_ppp(); - restore_tty(); close(fd); @@ -760,6 +760,7 @@ device_script(program, in, out) { int pid; int status; + int errfd; pid = fork(); @@ -769,10 +770,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);