X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fmain.c;h=c18ea510582adc7f9365ad2497a7d9a39c4a2072;hb=fc0a76c87a123e65b4922008257f5878251f9323;hp=f1986ed68d0b7e4d00f81b956e2abbb263b79d7a;hpb=53aeb75a17f1118db121088269b38a097283126f;p=ppp.git diff --git a/pppd/main.c b/pppd/main.c index f1986ed..c18ea51 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -80,7 +80,6 @@ #include #include #include -#include #include #include #include @@ -121,7 +120,6 @@ #include "atcp.h" #endif -static const char rcsid[] = RCSID; /* interface vars */ char ifname[MAXIFNAMELEN]; /* Interface name */ @@ -181,7 +179,7 @@ int got_sighup; static sigset_t signals_handled; static int waiting; -static sigjmp_buf sigjmp; +static int sigpipe[2]; char **script_env; /* Env. variable values for scripts */ int s_env_nalloc; /* # words avail at script_env */ @@ -257,7 +255,6 @@ static void cleanup_db __P((void)); static void handle_events __P((void)); void print_link_stats __P((void)); -extern char *ttyname __P((int)); extern char *getlogin __P((void)); int main __P((int, char *[])); @@ -523,7 +520,7 @@ main(argc, argv) info("Starting link"); } - gettimeofday(&start_time, NULL); + get_time(&start_time); script_unsetenv("CONNECT_TIME"); script_unsetenv("BYTES_SENT"); script_unsetenv("BYTES_RCVD"); @@ -600,19 +597,21 @@ static void handle_events() { struct timeval timo; + unsigned char buf[16]; kill_link = open_ccp_flag = 0; - if (sigsetjmp(sigjmp, 1) == 0) { - sigprocmask(SIG_BLOCK, &signals_handled, NULL); - if (got_sighup || got_sigterm || got_sigusr2 || got_sigchld) { - sigprocmask(SIG_UNBLOCK, &signals_handled, NULL); - } else { - waiting = 1; - sigprocmask(SIG_UNBLOCK, &signals_handled, NULL); - wait_input(timeleft(&timo)); - } - } + + /* alert via signal pipe */ + waiting = 1; + /* flush signal pipe */ + for (; read(sigpipe[0], buf, sizeof(buf)) > 0; ); + add_fd(sigpipe[0]); + /* wait if necessary */ + if (!(got_sighup || got_sigterm || got_sigusr2 || got_sigchld)) + wait_input(timeleft(&timo)); waiting = 0; + remove_fd(sigpipe[0]); + calltimeout(); if (got_sighup) { info("Hangup (SIGHUP)"); @@ -647,6 +646,14 @@ setup_signals() { struct sigaction sa; + /* create pipe to wake up event handler from signal handler */ + if (pipe(sigpipe) < 0) + fatal("Couldn't create signal pipe: %m"); + fcntl(sigpipe[0], F_SETFD, fcntl(sigpipe[0], F_GETFD) | FD_CLOEXEC); + fcntl(sigpipe[1], F_SETFD, fcntl(sigpipe[1], F_GETFD) | FD_CLOEXEC); + fcntl(sigpipe[0], F_SETFL, fcntl(sigpipe[0], F_GETFL) | O_NONBLOCK); + fcntl(sigpipe[1], F_SETFL, fcntl(sigpipe[1], F_GETFL) | O_NONBLOCK); + /* * Compute mask of all interesting signals and install signal handlers * for each. Only one signal handler may be active at a time. Therefore, @@ -730,12 +737,16 @@ void set_ifunit(iskey) int iskey; { + char ifkey[32]; + if (req_ifname[0] != '\0') slprintf(ifname, sizeof(ifname), "%s", req_ifname); else slprintf(ifname, sizeof(ifname), "%s%d", PPP_DRV_NAME, ifunit); info("Using interface %s", ifname); script_setenv("IFNAME", ifname, iskey); + slprintf(ifkey, sizeof(ifkey), "%d", ifunit); + script_setenv("UNIT", ifkey, iskey); if (iskey) { create_pidfile(getpid()); /* write pid to file */ create_linkpidfile(getpid()); @@ -1217,7 +1228,7 @@ reset_link_stats(u) { if (!get_ppp_stats(u, &old_link_stats)) return; - gettimeofday(&start_time, NULL); + get_time(&start_time); } /* @@ -1231,7 +1242,7 @@ update_link_stats(u) char numbuf[32]; if (!get_ppp_stats(u, &link_stats) - || gettimeofday(&now, NULL) < 0) + || get_time(&now) < 0) return; link_connect_time = now.tv_sec - start_time.tv_sec; link_stats_valid = 1; @@ -1278,7 +1289,7 @@ timeout(func, arg, secs, usecs) fatal("Out of memory in timeout()!"); newp->c_arg = arg; newp->c_func = func; - gettimeofday(&timenow, NULL); + get_time(&timenow); newp->c_time.tv_sec = timenow.tv_sec + secs; newp->c_time.tv_usec = timenow.tv_usec + usecs; if (newp->c_time.tv_usec >= 1000000) { @@ -1332,7 +1343,7 @@ calltimeout() while (callout != NULL) { p = callout; - if (gettimeofday(&timenow, NULL) < 0) + if (get_time(&timenow) < 0) fatal("Failed to get time of day: %m"); if (!(p->c_time.tv_sec < timenow.tv_sec || (p->c_time.tv_sec == timenow.tv_sec @@ -1357,7 +1368,7 @@ timeleft(tvp) if (callout == NULL) return NULL; - gettimeofday(&timenow, NULL); + get_time(&timenow); tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec; tvp->tv_usec = callout->c_time.tv_usec - timenow.tv_usec; if (tvp->tv_usec < 0) { @@ -1433,7 +1444,7 @@ hup(sig) kill_my_pg(sig); notify(sigreceived, sig); if (waiting) - siglongjmp(sigjmp, 1); + write(sigpipe[1], &sig, sizeof(sig)); } @@ -1454,7 +1465,7 @@ term(sig) kill_my_pg(sig); notify(sigreceived, sig); if (waiting) - siglongjmp(sigjmp, 1); + write(sigpipe[1], &sig, sizeof(sig)); } @@ -1468,7 +1479,7 @@ chld(sig) { got_sigchld = 1; if (waiting) - siglongjmp(sigjmp, 1); + write(sigpipe[1], &sig, sizeof(sig)); } @@ -1503,7 +1514,7 @@ open_ccp(sig) { got_sigusr2 = 1; if (waiting) - siglongjmp(sigjmp, 1); + write(sigpipe[1], &sig, sizeof(sig)); } @@ -1567,7 +1578,8 @@ safe_fork(int infd, int outfd, int errfd) /* Executing in the child */ sys_close(); #ifdef USE_TDB - tdb_close(pppdb); + if (pppdb != NULL) + tdb_close(pppdb); #endif /* make sure infd, outfd and errfd won't get tromped on below */ @@ -1752,7 +1764,7 @@ update_script_environment() script_env[i] = newstring; else add_script_env(i, newstring); - } else { + } else if (p != NULL) { remove_script_env(i); } }