X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fplugins%2Fpppoe%2Fdiscovery.c;h=b32b0c891dcd89c5fb46ebe402adc698f9a0611f;hb=HEAD;hp=a5c2c62fdc383738edf8d5edb65101a6cc5b3b98;hpb=fb3529ccfc1868e8563a2dcfbae7b386125fccbc;p=ppp.git diff --git a/pppd/plugins/pppoe/discovery.c b/pppd/plugins/pppoe/discovery.c index a5c2c62..86bda61 100644 --- a/pppd/plugins/pppoe/discovery.c +++ b/pppd/plugins/pppoe/discovery.c @@ -8,9 +8,6 @@ * ***********************************************************************/ -static char const RCSID[] = -"$Id: discovery.c,v 1.6 2008/06/15 04:35:50 paulus Exp $"; - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -44,6 +41,15 @@ static char const RCSID[] = #include +#ifdef PLUGIN +#define signaled(x) ppp_signaled(x) +#define get_time(x) ppp_get_time(x) +#else +int signaled(int signal); +int get_time(struct timeval *tv); + +#endif + /* Calculate time remaining until *exp, return 0 if now >= *exp */ static int time_left(struct timeval *diff, struct timeval *exp) { @@ -149,6 +155,10 @@ parsePADOTags(UINT16_t type, UINT16_t len, unsigned char *data, !strncmp((char *) data, conn->acName, len)) { pc->acNameOK = 1; } + /* save a copy of the AC name if we can */ + conn->actualACname = realloc(conn->actualACname, len + 1); + if (conn->actualACname) + strlcpy(conn->actualACname, (char *) data, len + 1); break; case TAG_SERVICE_NAME: pc->seenServiceName = 1; @@ -370,7 +380,7 @@ sendPADI(PPPoEConnection *conn) * Waits for a PADO packet and copies useful information ***********************************************************************/ void -waitForPADO(PPPoEConnection *conn, int timeout) +waitForPADO(PPPoEConnection *conn, int timeout, int waitWholeTimeoutForPADO) { fd_set readable; int r; @@ -404,7 +414,7 @@ waitForPADO(PPPoEConnection *conn, int timeout) while(1) { r = select(conn->discoverySocket+1, &readable, NULL, NULL, &tv); - if (r >= 0 || errno != EINTR || got_sigterm) break; + if (r >= 0 || errno != EINTR || signaled(SIGTERM)) break; } if (r < 0) { error("select (waitForPADO): %m"); @@ -471,7 +481,7 @@ waitForPADO(PPPoEConnection *conn, int timeout) conn->discoveryState = STATE_RECEIVED_PADO; } } - } while (pppoe_verbose >= 1 || conn->discoveryState != STATE_RECEIVED_PADO); + } while (waitWholeTimeoutForPADO || conn->discoveryState != STATE_RECEIVED_PADO); } /*********************************************************************** @@ -595,7 +605,7 @@ waitForPADS(PPPoEConnection *conn, int timeout) while(1) { r = select(conn->discoverySocket+1, &readable, NULL, NULL, &tv); - if (r >= 0 || errno != EINTR || got_sigterm) break; + if (r >= 0 || errno != EINTR || signaled(SIGTERM)) break; } if (r < 0) { error("select (waitForPADS): %m"); @@ -659,14 +669,14 @@ waitForPADS(PPPoEConnection *conn, int timeout) * Performs the PPPoE discovery phase 1 ***********************************************************************/ void -discovery1(PPPoEConnection *conn) +discovery1(PPPoEConnection *conn, int waitWholeTimeoutForPADO) { int padiAttempts = 0; int timeout = conn->discoveryTimeout; do { padiAttempts++; - if (got_sigterm || padiAttempts > conn->discoveryAttempts) { + if (signaled(SIGTERM) || padiAttempts > conn->discoveryAttempts) { warn("Timeout waiting for PADO packets"); close(conn->discoverySocket); conn->discoverySocket = -1; @@ -674,7 +684,7 @@ discovery1(PPPoEConnection *conn) } sendPADI(conn); conn->discoveryState = STATE_SENT_PADI; - waitForPADO(conn, timeout); + waitForPADO(conn, timeout, waitWholeTimeoutForPADO); timeout *= 2; } while (conn->discoveryState == STATE_SENT_PADI); @@ -697,7 +707,7 @@ discovery2(PPPoEConnection *conn) do { padrAttempts++; - if (got_sigterm || padrAttempts > conn->discoveryAttempts) { + if (signaled(SIGTERM) || padrAttempts > conn->discoveryAttempts) { warn("Timeout waiting for PADS packets"); close(conn->discoverySocket); conn->discoverySocket = -1;