aboutsummaryrefslogtreecommitdiffstats
path: root/meta-initramfs/recipes-kernel/kexec/kexec-tools-klibc/0014-add-if_nameindex-from-musl.patch
blob: ad21266987e8ed5ceaddf1664f15cfc830f526f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
From b15e9610b4ab52c381e712241d50dea96d50d873 Mon Sep 17 00:00:00 2001
From: Andrea Adami <andrea.adami@gmail.com>
Date: Wed, 2 May 2018 23:14:19 +0200
Subject: [PATCH 14/14] add if_nameindex from musl

Taken from musl, minimal changes.
klibc lacks struct and func

Fix

 ifdown.o: In function `ifdown':
 ifdown.c (.text+0x30): undefined reference to `if_nameindex'

While there add klibc-specific guard and include sys/types.h
to fix :

 /kexec/if_nameindex.c:2:
 /usr/lib/klibc/include/linux/types.h:22:0:
 warning: "__bitwise" redefined
 #define __bitwise __bitwise__

Signed-off-by: Andrea Adami <andrea.adami@gmail.com>
---
 kexec/Makefile       |  2 +-
 kexec/if_nameindex.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 kexec/if_nameindex.h | 15 ++++++++++++
 kexec/ifdown.c       |  3 +++
 4 files changed, 83 insertions(+), 1 deletion(-)
 create mode 100644 kexec/if_nameindex.c
 create mode 100644 kexec/if_nameindex.h

diff --git a/kexec/Makefile b/kexec/Makefile
index 4db84d8..fb7520b 100644
--- a/kexec/Makefile
+++ b/kexec/Makefile
@@ -11,7 +11,7 @@ KEXEC_SRCS = $(KEXEC_SRCS_base)
 KEXEC_GENERATED_SRCS =
 
 KEXEC_SRCS_base += kexec/kexec.c
-KEXEC_SRCS_base += kexec/ifdown.c
+KEXEC_SRCS_base += kexec/if_nameindex kexec/ifdown.c
 KEXEC_SRCS_base += kexec/kexec-elf.c
 KEXEC_SRCS_base += kexec/kexec-elf-exec.c
 KEXEC_SRCS_base += kexec/kexec-elf-core.c
diff --git a/kexec/if_nameindex.c b/kexec/if_nameindex.c
new file mode 100644
index 0000000..e586e41
--- /dev/null
+++ b/kexec/if_nameindex.c
@@ -0,0 +1,64 @@
+#define _GNU_SOURCE
+#ifdef __KLIBC__
+#include <sys/types.h>
+#endif
+#include <netinet/in.h>
+#include <net/if.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <sys/syscall.h>
+#include <stdio.h>
+#ifdef __KLIBC__
+#include "if_nameindex.h"
+#endif
+
+static void *do_nameindex(int s, size_t n)
+{
+	size_t i, len, k;
+	struct ifconf conf;
+	struct if_nameindex *idx;
+
+	idx = malloc(n * (sizeof(struct if_nameindex)+sizeof(struct ifreq)));
+	if (!idx) return 0;
+
+	conf.ifc_buf = (void *)&idx[n];
+	conf.ifc_len = len = n * sizeof(struct ifreq);
+	if (ioctl(s, SIOCGIFCONF, &conf) < 0) {
+		free(idx);
+		return 0;
+	}
+	if (conf.ifc_len == len) {
+		free(idx);
+		return (void *)-1;
+	}
+
+	n = conf.ifc_len / sizeof(struct ifreq);
+	for (i=k=0; i<n; i++) {
+		if (ioctl(s, SIOCGIFINDEX, &conf.ifc_req[i]) < 0) {
+			k++;
+			continue;
+		}
+		idx[i-k].if_index = conf.ifc_req[i].ifr_ifindex;
+		idx[i-k].if_name = conf.ifc_req[i].ifr_name;
+	}
+	idx[i-k].if_name = 0;
+	idx[i-k].if_index = 0;
+
+	return idx;
+}
+
+struct if_nameindex *if_nameindex()
+{
+	size_t n;
+	void *p = 0;
+	int s = socket(AF_UNIX, SOCK_DGRAM, 0);
+	if (s>=0) {
+		for (n=0; (p=do_nameindex(s, n)) == (void *)-1; n++);
+/*		__syscall(SYS_close, s); */
+		close(s);
+	}
+	errno = ENOBUFS;
+	return p;
+}
diff --git a/kexec/if_nameindex.h b/kexec/if_nameindex.h
new file mode 100644
index 0000000..1725fbd
--- /dev/null
+++ b/kexec/if_nameindex.h
@@ -0,0 +1,15 @@
+#ifndef _NET_IF__NAMEINDEX_H
+#define _NET_IF_NAMEINDEX_H
+
+struct if_nameindex
+{
+    unsigned int if_index;
+    char *if_name;
+};
+
+unsigned int if_nametoindex (const char *);
+char *if_indextoname (unsigned int, char *);
+struct if_nameindex *if_nameindex (void);
+void if_freenameindex (struct if_nameindex *);
+
+#endif
diff --git a/kexec/ifdown.c b/kexec/ifdown.c
index 82c6141..cc3ca9f 100644
--- a/kexec/ifdown.c
+++ b/kexec/ifdown.c
@@ -18,6 +18,9 @@ char *v_ifdown = "@(#)ifdown.c  1.11  02-Jun-1998  miquels@cistron.nl";
 
 #include <netinet/in.h>
 #include <net/if.h>
+#ifdef __KLIBC__
+#include "if_nameindex.h"
+#endif
 
 /*
  *  First, we find all shaper devices and down them. Then we
-- 
2.7.4