From 1ee70571e0cae37f155f59d4382bc7109138cf09 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Sat, 15 Aug 2020 17:29:25 -0700 Subject: [PATCH] apps/snmpnetstat: Stop using obsolete signal functions This was reported by Rosen Penev. See also https://github.com/net-snmp/net-snmp/pull/162. --- apps/snmpnetstat/if.c | 111 +++++++++++------------------------------- 1 file changed, 28 insertions(+), 83 deletions(-) mode change 100644 => 100755 apps/snmpnetstat/if.c diff --git a/apps/snmpnetstat/if.c b/apps/snmpnetstat/if.c old mode 100644 new mode 100755 index 16768151d..84b87b531 --- a/apps/snmpnetstat/if.c +++ b/apps/snmpnetstat/if.c @@ -64,8 +64,6 @@ #define NO 0 static void sidewaysintpr(u_int); -static void timerSet(int interval_seconds); -static void timerPause(void); struct _if_info { char name[128]; @@ -92,6 +90,34 @@ static void timerPause(void); }; +static struct timeval deadline; + +static void +timerSet(int interval_seconds) +{ + const struct timeval interval = { interval_seconds, 0 }; + + netsnmp_get_monotonic_clock(&deadline); + NETSNMP_TIMERADD(&deadline, &interval, &deadline); +} + +static void +timerPause(void) +{ + struct timeval now, delta; + + netsnmp_get_monotonic_clock(&now); + NETSNMP_TIMERSUB(&deadline, &now, &delta); + if (delta.tv_sec < 0) + return; +#ifdef WIN32 + Sleep(delta.tv_sec * 1000 + delta.tv_usec / 1000); +#else + if (select(0, NULL, NULL, NULL, &delta) < 0) + snmp_perror("select"); +#endif +} + /* * Retrieve the interface addressing information * XXX - This could also be extended to handle non-IP interfaces @@ -845,84 +871,3 @@ sidewaysintpr(unsigned int interval) goto loop; /*NOTREACHED*/ } - - -/* - * timerSet sets or resets the timer to fire in "interval" seconds. - * timerPause waits only if the timer has not fired. - * timing precision is not considered important. - */ - -#if (defined(WIN32) || defined(cygwin)) -static int sav_int; -static time_t timezup; -static void -timerSet(int interval_seconds) -{ - sav_int = interval_seconds; - timezup = time(0) + interval_seconds; -} - -/* - * you can do better than this ! - */ -static void -timerPause(void) -{ - time_t now; - while (time(&now) < timezup) -#ifdef WIN32 - Sleep(400); -#else - { - struct timeval tx; - tx.tv_sec = 0; - tx.tv_usec = 400 * 1000; /* 400 milliseconds */ - select(0, 0, 0, 0, &tx); - } -#endif -} - -#else - -/* - * Called if an interval expires before sidewaysintpr has completed a loop. - * Sets a flag to not wait for the alarm. - */ -RETSIGTYPE -catchalarm(int sig) -{ - signalled = YES; -} - -static void -timerSet(int interval_seconds) -{ -#ifdef HAVE_SIGSET - (void) sigset(SIGALRM, catchalarm); -#else - (void) signal(SIGALRM, catchalarm); -#endif - signalled = NO; - (void) alarm(interval_seconds); -} - -static void -timerPause(void) -{ -#ifdef HAVE_SIGHOLD - sighold(SIGALRM); - if (!signalled) { - sigpause(SIGALRM); - } -#else - int oldmask; - oldmask = sigblock(sigmask(SIGALRM)); - if (!signalled) { - sigpause(0); - } - sigsetmask(oldmask); -#endif -} - -#endif /* !WIN32 && !cygwin */