2 * Copyright (c) 1990,1993 Regents of The University of Michigan.
3 * Copyright (c) 1999-2000 Adrian Sun.
4 * All Rights Reserved. See COPYRIGHT.
15 #include <sys/types.h>
16 #include <sys/socket.h>
17 #include <sys/ioctl.h>
18 #include <netinet/in.h>
19 #include <netinet/tcp.h>
22 #include <net/route.h>
28 #include <sys/sockio.h>
31 #include <atalk/util.h>
33 /* allocation size for interface list. */
36 /* we leave all of the ioctl's to the application */
37 static int addname(char **list, int *i, const char *name)
40 /* if we've run out of room, allocate some more. just return
41 * the present list if we can't. */
43 if ((list[*i] = strdup(name)) == NULL)
47 list[*i] = NULL; /* zero out the next entry */
52 static int getifaces(const int sockfd, char ***list)
54 #ifdef HAVE_IFNAMEINDEX
55 struct if_nameindex *ifstart, *ifs;
59 ifs = ifstart = if_nameindex();
61 new = (char **) malloc((sizeof(ifs)/sizeof(struct if_nameindex) + 1) * sizeof(char *));
62 while (ifs && ifs->if_name) {
63 /* just bail if there's a problem */
64 if (addname(new, &i, ifs->if_name) < 0)
69 if_freenameindex(ifstart);
75 struct ifreq ifrs[ 64 ], *ifr, *nextifr;
82 memset( &ifc, 0, sizeof( struct ifconf ));
83 ifc.ifc_len = sizeof( ifrs );
84 memset( ifrs, 0, sizeof( ifrs ));
85 ifc.ifc_buf = (caddr_t)ifrs;
86 if ( ioctl( sockfd, SIOCGIFCONF, &ifc ) < 0 ) {
90 new = (char **) malloc((ifc.ifc_len/sizeof(struct ifreq) + 1) * sizeof(char *));
91 for ( ifr = ifc.ifc_req; ifc.ifc_len >= (int) sizeof( struct ifreq );
92 ifc.ifc_len -= ifrsize, ifr = nextifr ) {
94 ifrsize = sizeof(ifr->ifr_name) +
95 (ifr->ifr_addr.sa_len > sizeof(struct sockaddr)
96 ? ifr->ifr_addr.sa_len : sizeof(struct sockaddr));
98 ifrsize = sizeof( struct ifreq );
100 nextifr = (struct ifreq *)((caddr_t)ifr + ifrsize );
102 /* just bail if there's a problem */
103 if (addname(new, &i, ifr->ifr_name) < 0)
113 * Get interfaces from the kernel. we keep an extra null entry to signify
114 * the end of the interface list.
116 char **getifacelist(void)
118 char **list = NULL; /* FIXME */
121 if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
124 if ((i = getifaces(fd, &list)) == 0) {
135 /* go through and free the interface list */
136 void freeifacelist(char **ifacelist)
138 char *value, **list = ifacelist;
143 while ((value = *list++)) {