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:
parent
f3f9e09d6d
commit
a78558321a
@ -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__
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user