1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00

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 f9693e313d)
This commit is contained in:
Andrew Tridgell 2005-07-21 08:42:17 +00:00 committed by Gerald (Jerry) Carter
parent f3f9e09d6d
commit a78558321a
3 changed files with 21 additions and 9 deletions

View File

@ -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__
}

View File

@ -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;

View File

@ -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