From: Eric W. Biederman Date: Fri, 15 Jul 2011 14:26:59 +0000 (+0000) Subject: iproute2: Auto-detect the presence of setns in libc X-Git-Tag: v3.0.0~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e8a07f543e6f48f0d0479e3dd4796c18f733e12;p=thirdparty%2Fiproute2.git iproute2: Auto-detect the presence of setns in libc If libc has setns present use that version instead of rolling the syscall wrapper by hand. Dan McGee found the following compile error: gcc -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall -I../include -DRESOLVE_HOSTNAMES -DLIBDIR=\"/usr/lib/\" -c -o ipnetns.o ipnetns.c ipnetns.c:31:12: error: static declaration of ‘setns’ follows non-static declaration /usr/include/bits/sched.h:93:12: note: previous declaration of ‘setns’ was here make[1]: *** [ipnetns.o] Error 1 Reported-by: Dan McGee Tested-by: Dan McGee Signed-off-by: Eric W. Biederman --- diff --git a/configure b/configure index 0795df851..f5c3d4057 100755 --- a/configure +++ b/configure @@ -158,6 +158,27 @@ check_ipt_lib_dir() echo "not found!" } +check_setns() +{ +cat >/tmp/setnstest.c < +int main(int argc, char **argv) +{ + (void)setns(0,0); + return 0; +} +EOF +gcc -I$INCLUDE -o /tmp/setnstest /tmp/setnstest.c >/dev/null 2>&1 +if [ $? -eq 0 ] +then + echo "IP_CONFIG_SETNS:=y" >>Config + echo "yes" +else + echo "no" +fi +rm -f /tmp/setnstest.c /tmp/setnstest +} + echo "# Generated config based on" $INCLUDE >Config echo "TC schedulers" @@ -173,3 +194,6 @@ check_ipt echo -n "iptables modules directory: " check_ipt_lib_dir + +echo -n "libc has setns: " +check_setns diff --git a/ip/Makefile b/ip/Makefile index 2ee4e7c06..8d039934a 100644 --- a/ip/Makefile +++ b/ip/Makefile @@ -7,6 +7,12 @@ IPOBJ=ip.o ipaddress.o ipaddrlabel.o iproute.o iprule.o ipnetns.o \ RTMONOBJ=rtmon.o +include ../Config + +ifeq ($(IP_CONFIG_SETNS),y) + CFLAGS += -DHAVE_SETNS +endif + ALLOBJ=$(IPOBJ) $(RTMONOBJ) SCRIPTS=ifcfg rtpr routel routef TARGETS=ip rtmon diff --git a/ip/ipnetns.c b/ip/ipnetns.c index db7007cfd..dff3497aa 100644 --- a/ip/ipnetns.c +++ b/ip/ipnetns.c @@ -28,6 +28,7 @@ #define MNT_DETACH 0x00000002 /* Just detach from the tree */ #endif /* MNT_DETACH */ +#ifndef HAVE_SETNS static int setns(int fd, int nstype) { #ifdef __NR_setns @@ -37,6 +38,7 @@ static int setns(int fd, int nstype) return -1; #endif } +#endif /* HAVE_SETNS */ static int touch(const char *path, mode_t mode)