summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/lib/if_nameindex.c
diff options
context:
space:
mode:
authorMystery Man <unknown@mandriva.org>2003-05-06 13:11:49 +0000
committerMystery Man <unknown@mandriva.org>2003-05-06 13:11:49 +0000
commit3f5d21d90abbd16f16ab69aec1e1a1853a93fd18 (patch)
tree3d9f5a32303a8d97b4b457949e64bb42b4850ea9 /mdk-stage1/dietlibc/lib/if_nameindex.c
parent327bd24f8e4291bd1882de1990dd7339f781a9cb (diff)
downloaddrakx-backup-do-not-use-R9_0-AMD64.tar
drakx-backup-do-not-use-R9_0-AMD64.tar.gz
drakx-backup-do-not-use-R9_0-AMD64.tar.bz2
drakx-backup-do-not-use-R9_0-AMD64.tar.xz
drakx-backup-do-not-use-R9_0-AMD64.zip
This commit was manufactured by cvs2svn to create tag 'R9_0-AMD64'.R9_0-AMD64
Diffstat (limited to 'mdk-stage1/dietlibc/lib/if_nameindex.c')
-rw-r--r--mdk-stage1/dietlibc/lib/if_nameindex.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/lib/if_nameindex.c b/mdk-stage1/dietlibc/lib/if_nameindex.c
new file mode 100644
index 000000000..fc0e1c0ff
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/if_nameindex.c
@@ -0,0 +1,40 @@
+#include <net/if.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+
+struct if_nameindex* if_nameindex(void) {
+ struct ifconf ic;
+ int fd,len,i;
+ struct if_nameindex* x,* y;
+ char *dest;
+ fd=socket(AF_INET6,SOCK_DGRAM,0);
+ if (fd<0) fd=socket(AF_INET,SOCK_DGRAM,0);
+ ic.ifc_buf=0;
+ ic.ifc_len=0;
+ if (ioctl(fd,SIOCGIFCONF,&ic)<0) {
+b0rken:
+ close(fd);
+ return 0;
+ }
+ ic.ifc_buf=alloca((size_t)ic.ifc_len);
+ if (ioctl(fd,SIOCGIFCONF,&ic)<0) goto b0rken;
+ len=(ic.ifc_len/sizeof(struct ifreq));
+ x=(struct if_nameindex*)malloc((len+1)*sizeof(struct if_nameindex)+len*IFNAMSIZ);
+ if (!x) goto b0rken;
+ dest=(char*)(x+len+1);
+ y=x;
+ for (i=0; i<len; ++i) {
+ struct ifreq* ir=(struct ifreq*)&ic.ifc_req[i];
+ y->if_name=dest;
+ memcpy(dest,ir->ifr_name,IFNAMSIZ);
+ if (ioctl(fd,SIOCGIFINDEX,ir)==-1) continue;
+ y->if_index=ir->ifr_ifindex;
+ dest+=IFNAMSIZ;
+ ++y;
+ }
+ y->if_name=0; y->if_index=0;
+ return x;
+}