| From 04eec97b390621f2b3794b0d774b77429eb88cfd 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] 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..cf1c061 |
| --- /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 |