]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/util/getiface.c
Support for using $u username variable in AFP volume definitions
[netatalk.git] / libatalk / util / getiface.c
index be054c99ea1c2b8f7c09f278bbc00530d0c6be8d..bf79fff7f49e62f63983583aeb0b2b7cb4934d0c 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-
-#ifdef HAVE_STDINT_H
 #include <stdint.h>
-#endif
-
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/ioctl.h>
 #define IFACE_NUM 5
 
 /* we leave all of the ioctl's to the application */
-static int addname(char **list, int *i, int *length, const char *name) 
+static int addname(char **list, int *i, const char *name) 
 
 {
     /* if we've run out of room, allocate some more. just return
      * the present list if we can't. */
-     if (*i >= *length) {
-      char **new = realloc(list, sizeof(char **)*(*length + IFACE_NUM));
-       
-      if (!new) /* just break if we can't allocate anything */
-       return -1;
-
-      /* copy the old list */
-      memcpy(new, list, *length);
-      list = new;
-      
-      *length += IFACE_NUM;
-    }
      
     if ((list[*i] = strdup(name)) == NULL)
       return -1;
@@ -65,32 +49,34 @@ static int addname(char **list, int *i, int *length, const char *name)
 }
 
 
-static int getifaces(const int sockfd, char **list, int *length)
+static int getifaces(const int sockfd, char ***list)
 {
 #ifdef HAVE_IFNAMEINDEX
       struct if_nameindex *ifstart, *ifs;
       int i = 0;
+         char **new;
   
-      if (!list || *length < 1) 
-       return 0;
-
       ifs = ifstart = if_nameindex();
+
+         new = (char **) malloc((sizeof(ifs)/sizeof(struct if_nameindex) + 1) * sizeof(char *));
       while (ifs && ifs->if_name) {
        /* just bail if there's a problem */
-       if (addname(list, &i, length, ifs->if_name) < 0)
+       if (addname(new, &i, ifs->if_name) < 0)
          break;
        ifs++;
       }
 
       if_freenameindex(ifstart);
+         *list = new;
       return i;
 
 #else
     struct ifconf      ifc;
     struct ifreq       ifrs[ 64 ], *ifr, *nextifr;
     int                        ifrsize, i = 0;
+       char **new;
 
-    if (!list || *length < 1)
+    if (!list)
       return 0;
 
     memset( &ifc, 0, sizeof( struct ifconf ));
@@ -101,7 +87,8 @@ static int getifaces(const int sockfd, char **list, int *length)
        return 0;
     }
 
-    for ( ifr = ifc.ifc_req; ifc.ifc_len >= sizeof( struct ifreq );
+       new = (char **) malloc((ifc.ifc_len/sizeof(struct ifreq) + 1) * sizeof(char *));
+    for ( ifr = ifc.ifc_req; ifc.ifc_len >= (int) sizeof( struct ifreq );
            ifc.ifc_len -= ifrsize, ifr = nextifr ) {
 #ifdef BSD4_4
        ifrsize = sizeof(ifr->ifr_name) +
@@ -113,9 +100,10 @@ static int getifaces(const int sockfd, char **list, int *length)
        nextifr = (struct ifreq *)((caddr_t)ifr + ifrsize );
 
        /* just bail if there's a problem */
-       if (addname(list, &i, length, ifr->ifr_name) < 0)
+       if (addname(new, &i, ifr->ifr_name) < 0)
          break;
     }
+       *list = new;
     return i;
 #endif
 }
@@ -125,29 +113,21 @@ static int getifaces(const int sockfd, char **list, int *length)
  * Get interfaces from the kernel. we keep an extra null entry to signify
  * the end of the interface list. 
  */
-char **getifacelist()
+char **getifacelist(void)
 {
-  char **list = (char **) malloc(sizeof(char **)*(IFACE_NUM + 1));
-  char **new;
-  int length = IFACE_NUM, i, fd;
+  char **list = NULL; /* FIXME */
+  int  i, fd;
 
-  if (!list)
-    return NULL;
-      
   if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
     return NULL;
 
-  if ((i = getifaces(fd, list, &length)) == 0) {
+  if ((i = getifaces(fd, &list)) == 0) {
     free(list);
     close(fd);
     return NULL;
   }
   close(fd);
 
-  if ((i < length) && 
-      (new = (char **) realloc(list, sizeof(char **)*(i + 1))))
-    return new;
-
   return list;
 }