Skip to content
Snippets Groups Projects
Commit 2633b602 authored by Kirk Webb's avatar Kirk Webb
Browse files

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.
parent 5385adfd
No related branches found
No related tags found
No related merge requests found
...@@ -93,8 +93,11 @@ int main(int argc, char **argv) { ...@@ -93,8 +93,11 @@ int main(int argc, char **argv) {
for (;;) { for (;;) {
if (!opts->first) { if (!opts->first) {
sleep(mopts.interval); sleep(mopts.interval);
} }
do_update(); get_load();
get_min_tty_idle();
get_packet_counts();
send_pkt();
if (opts->once) { if (opts->once) {
break; break;
} }
...@@ -107,13 +110,6 @@ int main(int argc, char **argv) { ...@@ -107,13 +110,6 @@ int main(int argc, char **argv) {
return exitcode; return exitcode;
} }
void do_update (void) {
get_load();
get_min_tty_idle();
get_packet_counts();
send_pkt();
}
int parse_args(int argc, char **argv) { int parse_args(int argc, char **argv) {
char ch; char ch;
...@@ -227,6 +223,9 @@ int init_slothd(void) { ...@@ -227,6 +223,9 @@ int init_slothd(void) {
*/ */
opts->ttys[opts->numttys] = strdup("/dev/ptmx"); opts->ttys[opts->numttys] = strdup("/dev/ptmx");
opts->numttys++; opts->numttys++;
/* Open socket for SIOCGHWADDR ioctl */
pkt->ifd = socket(PF_INET, SOCK_DGRAM, 0);
#endif #endif
while (opts->numttys < MAXTTYS && (dptr = readdir(devs))) { while (opts->numttys < MAXTTYS && (dptr = readdir(devs))) {
if (strstr(dptr->d_name, "tty") || strstr(dptr->d_name, "pty")) { if (strstr(dptr->d_name, "tty") || strstr(dptr->d_name, "pty")) {
...@@ -440,35 +439,11 @@ void get_packet_counts(void) { ...@@ -440,35 +439,11 @@ void get_packet_counts(void) {
return; 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) { int get_counters(char *buf, void *data) {
SLOTHD_PACKET *pkt = (SLOTHD_PACKET*)data; SLOTHD_PACKET *pkt = (SLOTHD_PACKET*)data;
#ifdef __linux__ #ifdef __linux__
int sfd = socket(PF_INET, SOCK_DGRAM, 0);
struct ifreq ifr; struct ifreq ifr;
bzero(&ifr, sizeof(struct ifreq)); bzero(&ifr, sizeof(struct ifreq));
#endif #endif
...@@ -494,7 +469,7 @@ int get_counters(char *buf, void *data) { ...@@ -494,7 +469,7 @@ int get_counters(char *buf, void *data) {
} }
#ifdef __linux__ #ifdef __linux__
strcpy(ifr.ifr_name, pkt->ifaces[pkt->ifcnt].ifname); 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"); perror("error getting HWADDR");
return -1; return -1;
} }
...@@ -505,7 +480,6 @@ int get_counters(char *buf, void *data) { ...@@ -505,7 +480,6 @@ int get_counters(char *buf, void *data) {
if (opts->debug) { if (opts->debug) {
printf("macaddr: %s\n", pkt->ifaces[pkt->ifcnt].addr); printf("macaddr: %s\n", pkt->ifaces[pkt->ifcnt].addr);
} }
close(sfd);
#endif #endif
pkt->ifcnt++; pkt->ifcnt++;
} }
......
...@@ -68,6 +68,9 @@ typedef struct { ...@@ -68,6 +68,9 @@ typedef struct {
double loadavg[3]; double loadavg[3];
int ifcnt; int ifcnt;
int sd; int sd;
#ifdef __linux__
int ifd; /* IOCTL file descriptor */
#endif
struct sockaddr_in servaddr; struct sockaddr_in servaddr;
struct { struct {
u_long ipkts; u_long ipkts;
...@@ -91,7 +94,6 @@ typedef struct { ...@@ -91,7 +94,6 @@ typedef struct {
int parse_args(int, char**); int parse_args(int, char**);
int init_slothd(void); int init_slothd(void);
void do_update(void);
void get_min_tty_idle(void); void get_min_tty_idle(void);
void utmp_enum_terms(void); void utmp_enum_terms(void);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment