]> granicus.if.org Git - sudo/commitdiff
now do two passes to skip bogus interfaces (lo0, etc)
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 12 Aug 1994 03:42:27 +0000 (03:42 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 12 Aug 1994 03:42:27 +0000 (03:42 +0000)
sudo.c

diff --git a/sudo.c b/sudo.c
index 8bd60ec94f7b83830d716e1c60c7dc1f1624c1e9..cf4573f611cdaf287b6e08a8d425894374dbe5d2 100644 (file)
--- a/sudo.c
+++ b/sudo.c
@@ -585,8 +585,10 @@ static void load_interfaces()
 {
     struct ifconf ifconf;
     struct ifreq ifreq;
+    struct in_addr *inptr;
     char buf[BUFSIZ];
-    int sock, len, i;
+    int sock, len;
+    int i, j;
 
     sock = socket(AF_INET, SOCK_DGRAM, 0);
     if (sock < 0) {
@@ -607,31 +609,45 @@ static void load_interfaces()
     }
 
     /*
-     * malloc() space for interfaces array
+     * find out how many interfaces exist, skipping bogus ones.
      */
     len = num_interfaces = ifconf.ifc_len / sizeof(struct ifreq);
-    interfaces = (struct interface *) malloc(sizeof(struct interface) * len);
+    for (i = 0; i < len; i++) {
+       inptr = &(((struct sockaddr_in *)&ifconf.ifc_req[i].ifr_addr)->sin_addr);
+       if (inptr->s_addr == inet_addr("127.0.0.1") ||
+           inptr->s_addr == inet_addr("255.255.255.255") ||
+           inptr->s_addr == inet_addr("0.0.0.0"))
+           --num_interfaces;
+    }
+
+    /*
+     * malloc() space for interfaces array
+     */
+    interfaces = (struct interface *) malloc(sizeof(struct interface) *
+       num_interfaces);
     if (interfaces == NULL) {
        perror("malloc");
        (void) fprintf(stderr, "%s: cannot allocate memory!\n", Argv[0]);
        exit(1);
     }
 
-    /* XXX - do two passes.  one to build up num_interfaces, one to copy */
     /*
      * for each interface, get the ip address and netmask
      */
-    for (i = 0; i < len; i++) {
+    for (i = 0, j = 0; i < len; i++) {
+
+       inptr = &(((struct sockaddr_in *)&ifconf.ifc_req[i].ifr_addr)->sin_addr);
 
        /* get the ip address */
-       /* XXX check for 127.0.0.1, 255.255.255.255 and 0.0.0.0 */
-       (void) memcpy(&interfaces[i].addr,
-           &(((struct sockaddr_in *)&ifconf.ifc_req[i].ifr_addr)->sin_addr),
-           sizeof(struct in_addr));
+       if (inptr->s_addr == inet_addr("127.0.0.1") ||
+           inptr->s_addr == inet_addr("255.255.255.255") ||
+           inptr->s_addr == inet_addr("0.0.0.0"))
+           continue;
+
+       (void) memcpy(&interfaces[j].addr, inptr, sizeof(struct in_addr));
 
        /* get the netmask */
-/* #ifdef SIOCGIFNETMASK */
-#if 0
+#ifdef SIOCGIFNETMASK
        (void) strcpy(ifreq.ifr_name, ifconf.ifc_req[i].ifr_name);
        if (ioctl(sock, SIOCGIFNETMASK, (char *)(&ifreq)) < 0) {
            (void) free(interfaces);
@@ -639,16 +655,17 @@ static void load_interfaces()
            perror("");
            return;
        }
-       (void) memcpy(&interfaces[i].netmask,
+       (void) memcpy(&interfaces[j].netmask,
            &(((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr),
            sizeof(struct in_addr));
 #else
-       if (IN_CLASSC(interfaces[i].addr.s_addr))
-           interfaces[i].netmask.s_addr = htonl(IN_CLASSC_NET);
-       else if (IN_CLASSB(interfaces[i].addr.s_addr))
-           interfaces[i].netmask.s_addr = htonl(IN_CLASSB_NET);
+       if (IN_CLASSC(interfaces[j].addr.s_addr))
+           interfaces[j].netmask.s_addr = htonl(IN_CLASSC_NET);
+       else if (IN_CLASSB(interfaces[j].addr.s_addr))
+           interfaces[j].netmask.s_addr = htonl(IN_CLASSB_NET);
        else
-           interfaces[i].netmask.s_addr = htonl(IN_CLASSA_NET);
+           interfaces[j].netmask.s_addr = htonl(IN_CLASSA_NET);
 #endif /* SIOCGIFNETMASK */
+       ++j;
     }
 }