1*4882a593SmuzhiyunFrom 04eec97b390621f2b3794b0d774b77429eb88cfd Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Andrea Adami <andrea.adami@gmail.com> 3*4882a593SmuzhiyunDate: Wed, 2 May 2018 23:14:19 +0200 4*4882a593SmuzhiyunSubject: [PATCH] add if_nameindex from musl 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunTaken from musl, minimal changes. 7*4882a593Smuzhiyunklibc lacks struct and func 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunFix 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun ifdown.o: In function `ifdown': 12*4882a593Smuzhiyun ifdown.c (.text+0x30): undefined reference to `if_nameindex' 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunWhile there add klibc-specific guard and include sys/types.h 15*4882a593Smuzhiyunto fix : 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /kexec/if_nameindex.c:2: 18*4882a593Smuzhiyun /usr/lib/klibc/include/linux/types.h:22:0: 19*4882a593Smuzhiyun warning: "__bitwise" redefined 20*4882a593Smuzhiyun #define __bitwise __bitwise__ 21*4882a593Smuzhiyun 22*4882a593SmuzhiyunSigned-off-by: Andrea Adami <andrea.adami@gmail.com> 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun--- 25*4882a593Smuzhiyun kexec/Makefile | 2 +- 26*4882a593Smuzhiyun kexec/if_nameindex.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ 27*4882a593Smuzhiyun kexec/if_nameindex.h | 15 +++++++++++ 28*4882a593Smuzhiyun kexec/ifdown.c | 3 +++ 29*4882a593Smuzhiyun 4 files changed, 83 insertions(+), 1 deletion(-) 30*4882a593Smuzhiyun create mode 100644 kexec/if_nameindex.c 31*4882a593Smuzhiyun create mode 100644 kexec/if_nameindex.h 32*4882a593Smuzhiyun 33*4882a593Smuzhiyundiff --git a/kexec/Makefile b/kexec/Makefile 34*4882a593Smuzhiyunindex 4db84d8..fb7520b 100644 35*4882a593Smuzhiyun--- a/kexec/Makefile 36*4882a593Smuzhiyun+++ b/kexec/Makefile 37*4882a593Smuzhiyun@@ -11,7 +11,7 @@ KEXEC_SRCS = $(KEXEC_SRCS_base) 38*4882a593Smuzhiyun KEXEC_GENERATED_SRCS = 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun KEXEC_SRCS_base += kexec/kexec.c 41*4882a593Smuzhiyun-KEXEC_SRCS_base += kexec/ifdown.c 42*4882a593Smuzhiyun+KEXEC_SRCS_base += kexec/if_nameindex kexec/ifdown.c 43*4882a593Smuzhiyun KEXEC_SRCS_base += kexec/kexec-elf.c 44*4882a593Smuzhiyun KEXEC_SRCS_base += kexec/kexec-elf-exec.c 45*4882a593Smuzhiyun KEXEC_SRCS_base += kexec/kexec-elf-core.c 46*4882a593Smuzhiyundiff --git a/kexec/if_nameindex.c b/kexec/if_nameindex.c 47*4882a593Smuzhiyunnew file mode 100644 48*4882a593Smuzhiyunindex 0000000..e586e41 49*4882a593Smuzhiyun--- /dev/null 50*4882a593Smuzhiyun+++ b/kexec/if_nameindex.c 51*4882a593Smuzhiyun@@ -0,0 +1,64 @@ 52*4882a593Smuzhiyun+#define _GNU_SOURCE 53*4882a593Smuzhiyun+#ifdef __KLIBC__ 54*4882a593Smuzhiyun+#include <sys/types.h> 55*4882a593Smuzhiyun+#endif 56*4882a593Smuzhiyun+#include <netinet/in.h> 57*4882a593Smuzhiyun+#include <net/if.h> 58*4882a593Smuzhiyun+#include <stdlib.h> 59*4882a593Smuzhiyun+#include <sys/socket.h> 60*4882a593Smuzhiyun+#include <sys/ioctl.h> 61*4882a593Smuzhiyun+#include <errno.h> 62*4882a593Smuzhiyun+#include <sys/syscall.h> 63*4882a593Smuzhiyun+#include <stdio.h> 64*4882a593Smuzhiyun+#ifdef __KLIBC__ 65*4882a593Smuzhiyun+#include "if_nameindex.h" 66*4882a593Smuzhiyun+#endif 67*4882a593Smuzhiyun+ 68*4882a593Smuzhiyun+static void *do_nameindex(int s, size_t n) 69*4882a593Smuzhiyun+{ 70*4882a593Smuzhiyun+ size_t i, len, k; 71*4882a593Smuzhiyun+ struct ifconf conf; 72*4882a593Smuzhiyun+ struct if_nameindex *idx; 73*4882a593Smuzhiyun+ 74*4882a593Smuzhiyun+ idx = malloc(n * (sizeof(struct if_nameindex)+sizeof(struct ifreq))); 75*4882a593Smuzhiyun+ if (!idx) return 0; 76*4882a593Smuzhiyun+ 77*4882a593Smuzhiyun+ conf.ifc_buf = (void *)&idx[n]; 78*4882a593Smuzhiyun+ conf.ifc_len = len = n * sizeof(struct ifreq); 79*4882a593Smuzhiyun+ if (ioctl(s, SIOCGIFCONF, &conf) < 0) { 80*4882a593Smuzhiyun+ free(idx); 81*4882a593Smuzhiyun+ return 0; 82*4882a593Smuzhiyun+ } 83*4882a593Smuzhiyun+ if (conf.ifc_len == len) { 84*4882a593Smuzhiyun+ free(idx); 85*4882a593Smuzhiyun+ return (void *)-1; 86*4882a593Smuzhiyun+ } 87*4882a593Smuzhiyun+ 88*4882a593Smuzhiyun+ n = conf.ifc_len / sizeof(struct ifreq); 89*4882a593Smuzhiyun+ for (i=k=0; i<n; i++) { 90*4882a593Smuzhiyun+ if (ioctl(s, SIOCGIFINDEX, &conf.ifc_req[i]) < 0) { 91*4882a593Smuzhiyun+ k++; 92*4882a593Smuzhiyun+ continue; 93*4882a593Smuzhiyun+ } 94*4882a593Smuzhiyun+ idx[i-k].if_index = conf.ifc_req[i].ifr_ifindex; 95*4882a593Smuzhiyun+ idx[i-k].if_name = conf.ifc_req[i].ifr_name; 96*4882a593Smuzhiyun+ } 97*4882a593Smuzhiyun+ idx[i-k].if_name = 0; 98*4882a593Smuzhiyun+ idx[i-k].if_index = 0; 99*4882a593Smuzhiyun+ 100*4882a593Smuzhiyun+ return idx; 101*4882a593Smuzhiyun+} 102*4882a593Smuzhiyun+ 103*4882a593Smuzhiyun+struct if_nameindex *if_nameindex() 104*4882a593Smuzhiyun+{ 105*4882a593Smuzhiyun+ size_t n; 106*4882a593Smuzhiyun+ void *p = 0; 107*4882a593Smuzhiyun+ int s = socket(AF_UNIX, SOCK_DGRAM, 0); 108*4882a593Smuzhiyun+ if (s>=0) { 109*4882a593Smuzhiyun+ for (n=0; (p=do_nameindex(s, n)) == (void *)-1; n++); 110*4882a593Smuzhiyun+/* __syscall(SYS_close, s); */ 111*4882a593Smuzhiyun+ close(s); 112*4882a593Smuzhiyun+ } 113*4882a593Smuzhiyun+ errno = ENOBUFS; 114*4882a593Smuzhiyun+ return p; 115*4882a593Smuzhiyun+} 116*4882a593Smuzhiyundiff --git a/kexec/if_nameindex.h b/kexec/if_nameindex.h 117*4882a593Smuzhiyunnew file mode 100644 118*4882a593Smuzhiyunindex 0000000..cf1c061 119*4882a593Smuzhiyun--- /dev/null 120*4882a593Smuzhiyun+++ b/kexec/if_nameindex.h 121*4882a593Smuzhiyun@@ -0,0 +1,15 @@ 122*4882a593Smuzhiyun+#ifndef _NET_IF__NAMEINDEX_H 123*4882a593Smuzhiyun+#define _NET_IF_NAMEINDEX_H 124*4882a593Smuzhiyun+ 125*4882a593Smuzhiyun+struct if_nameindex 126*4882a593Smuzhiyun+{ 127*4882a593Smuzhiyun+ unsigned int if_index; 128*4882a593Smuzhiyun+ char *if_name; 129*4882a593Smuzhiyun+}; 130*4882a593Smuzhiyun+ 131*4882a593Smuzhiyun+unsigned int if_nametoindex (const char *); 132*4882a593Smuzhiyun+char *if_indextoname (unsigned int, char *); 133*4882a593Smuzhiyun+struct if_nameindex *if_nameindex (void); 134*4882a593Smuzhiyun+void if_freenameindex (struct if_nameindex *); 135*4882a593Smuzhiyun+ 136*4882a593Smuzhiyun+#endif 137*4882a593Smuzhiyundiff --git a/kexec/ifdown.c b/kexec/ifdown.c 138*4882a593Smuzhiyunindex 82c6141..cc3ca9f 100644 139*4882a593Smuzhiyun--- a/kexec/ifdown.c 140*4882a593Smuzhiyun+++ b/kexec/ifdown.c 141*4882a593Smuzhiyun@@ -18,6 +18,9 @@ char *v_ifdown = "@(#)ifdown.c 1.11 02-Jun-1998 miquels@cistron.nl"; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #include <netinet/in.h> 144*4882a593Smuzhiyun #include <net/if.h> 145*4882a593Smuzhiyun+#ifdef __KLIBC__ 146*4882a593Smuzhiyun+#include "if_nameindex.h" 147*4882a593Smuzhiyun+#endif 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* 150*4882a593Smuzhiyun * First, we find all shaper devices and down them. Then we 151