From a78558321a994dd02713c04ed3626b6d20d57cc7 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 21 Jul 2005 08:42:17 +0000 Subject: r8671: use much shorter names for the selftest directory and socket wrapper code. I'm afraid this is needed by irix 6.4 which silently truncates names in unix domain sockets in recvfrom() to 16 chars. My apologies for having to move to such short names :-( (This used to be commit f9693e313da67e1347a607db5d3ebbf36e02a77a) --- source4/build/smb_build/makefile.pm | 8 ++++---- source4/lib/socket_wrapper/socket_wrapper.c | 20 ++++++++++++++++---- source4/script/tests/selftest.sh | 2 +- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/source4/build/smb_build/makefile.pm b/source4/build/smb_build/makefile.pm index 3e776f39f6..8a157d8032 100644 --- a/source4/build/smb_build/makefile.pm +++ b/source4/build/smb_build/makefile.pm @@ -148,17 +148,17 @@ basics: idl proto_exists HEIMDAL_EXTERNAL test: @DEFAULT_TEST_TARGET@ test-swrap: all - ./script/tests/selftest.sh @selftest_prefix@/prefix-test all SOCKET_WRAPPER + ./script/tests/selftest.sh @selftest_prefix@/st all SOCKET_WRAPPER test-noswrap: all - ./script/tests/selftest.sh @selftest_prefix@/prefix-test all + ./script/tests/selftest.sh @selftest_prefix@/st all quicktest: all - ./script/tests/selftest.sh @selftest_prefix@/prefix-test quick SOCKET_WRAPPER + ./script/tests/selftest.sh @selftest_prefix@/st quick SOCKET_WRAPPER valgrindtest: all SMBD_VALGRIND="xterm -n smbd -e valgrind -q --db-attach=yes --num-callers=30" \ - ./script/tests/selftest.sh @selftest_prefix@/prefix-test quick SOCKET_WRAPPER + ./script/tests/selftest.sh @selftest_prefix@/st quick SOCKET_WRAPPER __EOD__ } diff --git a/source4/lib/socket_wrapper/socket_wrapper.c b/source4/lib/socket_wrapper/socket_wrapper.c index 940883a45f..d0d08d22b9 100644 --- a/source4/lib/socket_wrapper/socket_wrapper.c +++ b/source4/lib/socket_wrapper/socket_wrapper.c @@ -57,6 +57,14 @@ #define real_close close #endif +/* we need to use a very terse format here as IRIX 6.4 silently + truncates names to 16 chars, so if we use a longer name then we + can't tell which port a packet came from with recvfrom() + + with this format we have 8 chars left for the directory name +*/ +#define SOCKET_FORMAT "%u_%u" + static struct sockaddr *sockaddr_dup(const void *data, socklen_t len) { struct sockaddr *ret = (struct sockaddr *)malloc(len); @@ -102,7 +110,7 @@ static int convert_un_in(const struct sockaddr_un *un, struct sockaddr_in *in, s p = strrchr(un->sun_path, '/'); if (p) p++; else p = un->sun_path; - if (sscanf(p, "sock_ip_%d_%u", &type, &prt) == 2) { + if (sscanf(p, SOCKET_FORMAT, &type, &prt) == 2) { in->sin_port = htons(prt); } in->sin_addr.s_addr = htonl(INADDR_LOOPBACK); @@ -119,12 +127,12 @@ static int convert_in_un(struct socket_info *si, const struct sockaddr_in *in, s /* handle auto-allocation of ephemeral ports */ prt = 5000; do { - snprintf(un->sun_path, sizeof(un->sun_path), "%s/sock_ip_%d_%u", + snprintf(un->sun_path, sizeof(un->sun_path), "%s/"SOCKET_FORMAT, getenv("SOCKET_WRAPPER_DIR"), type, ++prt); } while (stat(un->sun_path, &st) == 0 && prt < 10000); ((struct sockaddr_in *)si->myname)->sin_port = htons(prt); } - snprintf(un->sun_path, sizeof(un->sun_path), "%s/sock_ip_%d_%u", + snprintf(un->sun_path, sizeof(un->sun_path), "%s/"SOCKET_FORMAT, getenv("SOCKET_WRAPPER_DIR"), type, prt); return 0; } @@ -230,6 +238,8 @@ int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen) return real_accept(s, addr, addrlen); } + memset(&un_addr, 0, sizeof(un_addr)); + ret = real_accept(s, (struct sockaddr *)&un_addr, &un_addrlen); if (ret == -1) return ret; @@ -270,7 +280,7 @@ static int swrap_auto_bind(struct socket_info *si) for (i=0;i<1000;i++) { snprintf(un_addr.sun_path, sizeof(un_addr.sun_path), - "%s/sock_ip_%u_%u", getenv("SOCKET_WRAPPER_DIR"), + "%s/"SOCKET_FORMAT, getenv("SOCKET_WRAPPER_DIR"), SOCK_DGRAM, i + 10000); if (bind(si->fd, (struct sockaddr *)&un_addr, sizeof(un_addr)) == 0) { @@ -458,6 +468,8 @@ ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr return real_recvfrom(s, buf, len, flags, from, fromlen); } + /* irix 6.4 forgets to null terminate the sun_path string :-( */ + memset(&un_addr, 0, sizeof(un_addr)); ret = real_recvfrom(s, buf, len, flags, (struct sockaddr *)&un_addr, &un_addrlen); if (ret == -1) return ret; diff --git a/source4/script/tests/selftest.sh b/source4/script/tests/selftest.sh index 9b0c5f3a4a..3f1bea75f1 100755 --- a/source4/script/tests/selftest.sh +++ b/source4/script/tests/selftest.sh @@ -60,7 +60,7 @@ export SMBD_TEST_LOG DO_SOCKET_WRAPPER=$3 if [ x"$DO_SOCKET_WRAPPER" = x"SOCKET_WRAPPER" ];then - SOCKET_WRAPPER_DIR="$PREFIX/socket_wrapper_dir" + SOCKET_WRAPPER_DIR="$PREFIX/sw" export SOCKET_WRAPPER_DIR echo "SOCKET_WRAPPER_DIR=$SOCKET_WRAPPER_DIR" fi -- cgit