summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-07-21 08:42:17 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:29:52 -0500
commita78558321a994dd02713c04ed3626b6d20d57cc7 (patch)
tree49e9e0265a077d37c3e215abd214971a1e67e320
parentf3f9e09d6de796d501b81d8af105310adb1023fc (diff)
downloadsamba-a78558321a994dd02713c04ed3626b6d20d57cc7.tar.gz
samba-a78558321a994dd02713c04ed3626b6d20d57cc7.tar.bz2
samba-a78558321a994dd02713c04ed3626b6d20d57cc7.zip
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)
-rw-r--r--source4/build/smb_build/makefile.pm8
-rw-r--r--source4/lib/socket_wrapper/socket_wrapper.c20
-rwxr-xr-xsource4/script/tests/selftest.sh2
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