From 2633b6026d8148a08c8fc31d2887d5457db720e0 Mon Sep 17 00:00:00 2001
From: Kirk Webb <kwebb@flux.utah.edu>
Date: Tue, 8 Oct 2002 00:03:01 +0000
Subject: [PATCH] The file descriptor leak is still present.  Note that closing
 the socket used for the SIOCGIFHWADDR ioctl in Linux did NOT deallocate the
 descriptor, nor was an error returned by close!  I changed the code to use a
 statically allocated socket - better anyway.

---
 sensors/slothd/slothd.c | 44 +++++++++--------------------------------
 sensors/slothd/slothd.h |  4 +++-
 2 files changed, 12 insertions(+), 36 deletions(-)

diff --git a/sensors/slothd/slothd.c b/sensors/slothd/slothd.c
index 704dd30e85..ab64998690 100644
--- a/sensors/slothd/slothd.c
+++ b/sensors/slothd/slothd.c
@@ -93,8 +93,11 @@ int main(int argc, char **argv) {
       for (;;) {
         if (!opts->first) {
           sleep(mopts.interval);
-        }          
-        do_update();
+        }
+        get_load();
+        get_min_tty_idle();
+        get_packet_counts();
+        send_pkt();
         if (opts->once) {
           break;
         }
@@ -107,13 +110,6 @@ int main(int argc, char **argv) {
   return exitcode;
 }
 
-void do_update (void) {
-  get_load();
-  get_min_tty_idle();
-  get_packet_counts();
-  send_pkt();
-}
-
 int parse_args(int argc, char **argv) {
 
   char ch;
@@ -227,6 +223,9 @@ int init_slothd(void) {
     */
     opts->ttys[opts->numttys] = strdup("/dev/ptmx");
     opts->numttys++;
+
+    /* Open socket for SIOCGHWADDR ioctl */
+    pkt->ifd = socket(PF_INET, SOCK_DGRAM, 0);
 #endif
     while (opts->numttys < MAXTTYS && (dptr = readdir(devs))) {
       if (strstr(dptr->d_name, "tty") || strstr(dptr->d_name, "pty")) {
@@ -440,35 +439,11 @@ void get_packet_counts(void) {
   return;
 }
 
-#ifdef comment
-int get_macaddrs(char *buf, void *data) {
-
-  int i=-1, j;
-  char *maddr;
-  SLOTHD_PACKET *pkt = (SLOTHD_PACKET*)data;
- 
-  if ((maddr = strstr(buf, "MAC="))) {
-    maddr += 4;
-    ++i;
-    for (j = 0; j < MACADDRLEN; j+=3, maddr+=2) {
-      pkt->ifaces[i].macaddr[j] = *maddr;
-      pkt->ifaces[i].macaddr[j+1] = *(maddr+1);
-      pkt->ifaces[i].macaddr[j+2] = ':';
-    }
-    pkt->ifaces[i].macaddr[MACADDRLEN-1] = '\0';
-  }
-  pkt->numaddrs = i+1;
-  return 0;
-}
-#endif /* comment */
-
 int get_counters(char *buf, void *data) {
 
   SLOTHD_PACKET *pkt = (SLOTHD_PACKET*)data;
 #ifdef __linux__
-  int sfd = socket(PF_INET, SOCK_DGRAM, 0);
   struct ifreq ifr;
-
   bzero(&ifr, sizeof(struct ifreq));
 #endif
 
@@ -494,7 +469,7 @@ int get_counters(char *buf, void *data) {
     }
 #ifdef __linux__
     strcpy(ifr.ifr_name, pkt->ifaces[pkt->ifcnt].ifname);
-    if (ioctl(sfd, SIOCGIFHWADDR, &ifr) < 0) {
+    if (ioctl(pkt->ifd, SIOCGIFHWADDR, &ifr) < 0) {
       perror("error getting HWADDR");
       return -1;
     }
@@ -505,7 +480,6 @@ int get_counters(char *buf, void *data) {
     if (opts->debug) {
       printf("macaddr: %s\n", pkt->ifaces[pkt->ifcnt].addr);
     }
-    close(sfd);
 #endif
     pkt->ifcnt++;
   }
diff --git a/sensors/slothd/slothd.h b/sensors/slothd/slothd.h
index 17458e569a..5c50203c78 100644
--- a/sensors/slothd/slothd.h
+++ b/sensors/slothd/slothd.h
@@ -68,6 +68,9 @@ typedef struct {
   double loadavg[3];
   int ifcnt;
   int sd;
+#ifdef __linux__
+  int ifd; /* IOCTL file descriptor */
+#endif
   struct sockaddr_in servaddr;
   struct {
     u_long ipkts;
@@ -91,7 +94,6 @@ typedef struct {
 
 int parse_args(int, char**);
 int init_slothd(void);
-void do_update(void);
 
 void get_min_tty_idle(void);
 void utmp_enum_terms(void);
-- 
GitLab