X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fmain.c;h=0fbef8681e5bd1ec6d95b15b737289c24727598d;hb=91d19fa519feae5392a359c435790a1a55999fb8;hp=ba5e6aeb3fb3f43c36a01a1ce0d9ae3cfb419b0e;hpb=f409b9f7b070fc7e0d1839f09d813503d7224df6;p=ppp.git diff --git a/pppd/main.c b/pppd/main.c index ba5e6ae..0fbef86 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -18,7 +18,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: main.c,v 1.66 1999/03/24 05:05:24 paulus Exp $"; +static char rcsid[] = "$Id: main.c,v 1.69 1999/03/30 06:01:24 paulus Exp $"; #endif #include @@ -110,6 +110,7 @@ u_char outpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for outgoing packet */ u_char inpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for incoming packet */ static int n_children; /* # child processes still running */ +static int got_sigchld; /* set if we have received a SIGCHLD */ static int locked; /* lock() has succeeded */ @@ -322,8 +323,6 @@ main(argc, argv) log_to_fd = 1; /* default to stdout */ script_setenv("DEVICE", devnam); - slprintf(numbuf, sizeof(numbuf), "%d", baud_rate); - script_setenv("SPEED", numbuf); /* * Initialize system-dependent stuff and magic number package. @@ -482,7 +481,8 @@ main(argc, argv) } if (get_loop_output()) break; - reap_kids(0); + if (got_sigchld) + reap_kids(0); } remove_fd(fd_loop); if (kill_link && !persist) @@ -532,10 +532,10 @@ main(argc, argv) for (;;) { /* If the user specified the device name, become the user before opening it. */ - if (!devnam_info.priv) + if (!devnam_info.priv && !default_device) seteuid(uid); ttyfd = open(devnam, O_NONBLOCK | O_RDWR, 0); - if (!devnam_info.priv) + if (!devnam_info.priv && !default_device) seteuid(0); if (ttyfd >= 0) break; @@ -642,6 +642,9 @@ main(argc, argv) close(i); } + slprintf(numbuf, sizeof(numbuf), "%d", baud_rate); + script_setenv("SPEED", numbuf); + /* run welcome script, if any */ if (welcomer && welcomer[0]) { if (device_script(welcomer, ttyfd, ttyfd, 0) < 0) @@ -710,7 +713,8 @@ main(argc, argv) } open_ccp_flag = 0; } - reap_kids(0); /* Don't leave dead kids lying around */ + if (got_sigchld) + reap_kids(0); /* Don't leave dead kids lying around */ } /* @@ -799,7 +803,8 @@ main(argc, argv) kill_link = 0; phase = PHASE_DORMANT; /* allow signal to end holdoff */ } - reap_kids(0); + if (got_sigchld) + reap_kids(0); } while (phase == PHASE_HOLDOFF); if (!persist) break; @@ -1197,12 +1202,13 @@ term(sig) /* * chld - Catch SIGCHLD signal. - * Calls reap_kids to get status for any dead kids. + * Sets a flag so we will call reap_kids in the mainline. */ static void chld(sig) int sig; { + got_sigchld = 1; if (waiting) siglongjmp(sigjmp, 1); } @@ -1314,12 +1320,13 @@ device_script(program, in, out, dont_wait) if (out == 0) out = dup(out); dup2(in, 0); - if (in != out) + if (in > 2) close(in); } if (out != 1) { dup2(out, 1); - close(out); + if (out > 2) + close(out); } if (real_ttyfd > 2) close(real_ttyfd); @@ -1512,6 +1519,7 @@ reap_kids(waitfor) int pid, status; struct subprocess *chp, **prevp; + got_sigchld = 0; if (n_children == 0) return; while ((pid = waitpid(-1, &status, (waitfor? 0: WNOHANG))) != -1 @@ -2379,8 +2387,16 @@ charshunt(ifd, ofd, record_file) nibuf = nobuf = 0; ibufp = obufp = NULL; pty_readable = stdin_readable = 1; - gettimeofday(&lasttime, NULL); nfds = (ofd > pty_master? ofd: pty_master) + 1; + if (recordf != NULL) { + gettimeofday(&lasttime, NULL); + putc(7, recordf); /* put start marker */ + putc(lasttime.tv_sec >> 24, recordf); + putc(lasttime.tv_sec >> 16, recordf); + putc(lasttime.tv_sec >> 8, recordf); + putc(lasttime.tv_sec, recordf); + lasttime.tv_usec = 0; + } while (nibuf != 0 || nobuf != 0 || pty_readable || stdin_readable) { FD_ZERO(&ready); @@ -2496,8 +2512,8 @@ record_write(f, code, buf, nb, tp) int diff; gettimeofday(&now, NULL); - diff = (now.tv_sec - tp->tv_sec) * 10 - + (now.tv_usec - tp->tv_usec) / 100000; + now.tv_usec /= 100000; /* actually 1/10 s, not usec now */ + diff = (now.tv_sec - tp->tv_sec) * 10 + (now.tv_usec - tp->tv_usec); if (diff > 0) { if (diff > 255) { putc(5, f);