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