Added configure check for the unix domain sockaddr length.
diff --git a/configure b/configure
index c5c464f..3baf0a2 100755
--- a/configure
+++ b/configure
@@ -5987,14 +5987,51 @@
fi
-echo $ac_n "checking "whether we need to define __i386__"""... $ac_c" 1>&6
-echo "configure:5992: checking "whether we need to define __i386__"" >&5
-if eval "test \"`echo '$''{'ac_cv_cpp_def_i386'+set}'`\" = set"; then
+echo $ac_n "checking "for sun_len in struct sockaddr_un"""... $ac_c" 1>&6
+echo "configure:5992: checking "for sun_len in struct sockaddr_un"" >&5
+if eval "test \"`echo '$''{'ac_cv_c_sun_len'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 5997 "configure"
#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+int main() {
+static struct sockaddr_un addr; addr.sun_len = 1
+; return 0; }
+EOF
+if { (eval echo configure:6006: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_sun_len="yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_sun_len="no"
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_sun_len" 1>&6
+if test "$ac_cv_c_sun_len" = "yes"
+then
+ cat >> confdefs.h <<\EOF
+#define HAVE_SOCKADDR_SUN_LEN 1
+EOF
+
+fi
+
+
+echo $ac_n "checking "whether we need to define __i386__"""... $ac_c" 1>&6
+echo "configure:6029: checking "whether we need to define __i386__"" >&5
+if eval "test \"`echo '$''{'ac_cv_cpp_def_i386'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 6034 "configure"
+#include "confdefs.h"
#if (defined(i386) || defined(__i386)) && !defined(__i386__)
yes
#endif
diff --git a/configure.in b/configure.in
index ba6346c..429d0ef 100644
--- a/configure.in
+++ b/configure.in
@@ -891,6 +891,18 @@
AC_DEFINE(HAVE_MSGHDR_ACCRIGHTS)
fi
+dnl *** Check for the sun_len member in struct sockaddr_un
+
+AC_CACHE_CHECK("for sun_len in struct sockaddr_un", ac_cv_c_sun_len,
+ AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>], [static struct sockaddr_un addr; addr.sun_len = 1],
+ ac_cv_c_sun_len="yes", ac_cv_c_sun_len="no"))
+if test "$ac_cv_c_sun_len" = "yes"
+then
+ AC_DEFINE(HAVE_SOCKADDR_SUN_LEN)
+fi
+
dnl *** check for the need to define __i386__
AC_CACHE_CHECK("whether we need to define __i386__",ac_cv_cpp_def_i386,
diff --git a/include/config.h.in b/include/config.h.in
index e74c0d5..b2d3ed6 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -53,6 +53,9 @@
/* Define if struct msghdr contains msg_accrights */
#undef HAVE_MSGHDR_ACCRIGHTS
+/* Define if struct sockaddr_un has the member sun_len */
+#undef HAVE_SOCKADDR_SUN_LEN
+
/* Define if you have the Xxf86dga library (-lXxf86dga). */
#undef HAVE_LIBXXF86DGA
diff --git a/scheduler/client.c b/scheduler/client.c
index d801aff..bd097f8 100644
--- a/scheduler/client.c
+++ b/scheduler/client.c
@@ -340,7 +340,7 @@
{
struct sockaddr_un addr;
struct stat st;
- int s;
+ int s, slen;
if (chdir( serverdir ) == -1)
{
@@ -366,7 +366,11 @@
if ((s = socket( AF_UNIX, SOCK_STREAM, 0 )) == -1) fatal_perror( "socket" );
addr.sun_family = AF_UNIX;
strcpy( addr.sun_path, SOCKETNAME );
- if (connect( s, &addr, sizeof(addr.sun_family) + strlen(addr.sun_path) ) == -1)
+ slen = sizeof(addr) - sizeof(addr.sun_path) + strlen(addr.sun_path) + 1;
+#ifdef HAVE_SOCKADDR_SUN_LEN
+ addr.sun_len = slen;
+#endif
+ if (connect( s, (struct sockaddr *)&addr, slen ) == -1)
{
close( s );
return -2;
diff --git a/server/request.c b/server/request.c
index b7a5161..3fb7f7b 100644
--- a/server/request.c
+++ b/server/request.c
@@ -345,13 +345,17 @@
void open_master_socket(void)
{
struct sockaddr_un addr;
- int fd;
+ int fd, slen;
create_server_dir();
if ((fd = socket( AF_UNIX, SOCK_STREAM, 0 )) == -1) fatal_perror( "socket" );
addr.sun_family = AF_UNIX;
- strcpy( addr.sun_path, "socket" );
- if (bind( fd, &addr, sizeof(addr.sun_family) + strlen(addr.sun_path) ) == -1)
+ strcpy( addr.sun_path, SOCKETNAME );
+ slen = sizeof(addr) - sizeof(addr.sun_path) + strlen(addr.sun_path) + 1;
+#ifdef HAVE_SOCKADDR_SUN_LEN
+ addr.sun_len = slen;
+#endif
+ if (bind( fd, (struct sockaddr *)&addr, slen ) == -1)
{
if ((errno == EEXIST) || (errno == EADDRINUSE))
fatal_error( "another server is already running\n" );
@@ -360,7 +364,7 @@
}
atexit( socket_cleanup );
- chmod( "socket", 0600 ); /* make sure no other user can connect */
+ chmod( SOCKETNAME, 0600 ); /* make sure no other user can connect */
if (listen( fd, 5 ) == -1) fatal_perror( "listen" );
if (!(master_socket = alloc_object( &master_socket_ops, fd )))