Updated, see:
https://github.com/oldk1331/fricas/commit/6af9de34eaab919ebb650e2bf00ac012f61a4aeb.patch
Or see at the end of this mail.
- Qian
======
From 6af9de34eaab919ebb650e2bf00ac012f61a4aeb Mon Sep 17 00:00:00 2001
Subject: [PATCH] Use sockaddr_un on POSIX systems
---
config/
fricas_c_macros.h.in | 6 ++++++
configure | 32 ++++++++++++++++++++++++++++----
configure.ac | 10 +++++++++-
src/include/com.h | 6 ++++--
src/lib/sockio-c.c | 29 +++++++++++++++++------------
5 files changed, 64 insertions(+), 19 deletions(-)
diff --git a/config/
fricas_c_macros.h.in b/config/
fricas_c_macros.h.in
index 6fbbd1728..edc984226 100644
--- a/config/
fricas_c_macros.h.in
+++ b/config/
fricas_c_macros.h.in
@@ -91,6 +91,9 @@
/* Define to 1 if you have the <signal.h> header file. */
#undef HAVE_SIGNAL_H
+/* Host has sockaddr_un */
+#undef HAVE_SOCKADDR_UN
+
/* Host has SO_NOSIGPIPE */
#undef HAVE_SO_NOSIGPIPE
@@ -115,6 +118,9 @@
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
+/* Define to 1 if you have the <sys/un.h> header file. */
+#undef HAVE_SYS_UN_H
+
/* Define to 1 if you have the <sys/wait.h> header file. */
#undef HAVE_SYS_WAIT_H
diff --git a/configure b/configure
index 16d4948fa..c80def0b8 100755
--- a/configure
+++ b/configure
@@ -5089,12 +5089,13 @@ done
fricas_c_runtime_extra="-lwsock32"
;;
*)
- for ac_header in sys/socket.h
+ for ac_header in sys/socket.h sys/un.h
do :
- ac_fn_c_check_header_mongrel "$LINENO" "sys/socket.h"
"ac_cv_header_sys_socket_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_socket_h" = xyes; then :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header"
"$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
-#define HAVE_SYS_SOCKET_H 1
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fricas_host_has_socket=yes
fi
@@ -5175,6 +5176,29 @@ rm -f core conftest.err conftest.$ac_objext
conftest.$ac_ext
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+#include <sys/socket.h>
+#include <sys/un.h>
+
+int
+main ()
+{
+
+struct sockaddr_un uaddr;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+$as_echo "#define HAVE_SOCKADDR_UN 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
#include <sys/stat.h>
#include <sys/types.h>
diff --git a/
configure.ac b/
configure.ac
index 46225a668..cfc74ef1c 100644
--- a/
configure.ac
+++ b/
configure.ac
@@ -555,7 +555,7 @@ case $host in
fricas_c_runtime_extra="-lwsock32"
;;
*)
- AC_CHECK_HEADERS([sys/socket.h],
+ AC_CHECK_HEADERS([sys/socket.h sys/un.h],
[fricas_host_has_socket=yes],
[])
;;
@@ -584,6 +584,14 @@ int code = EPIPE;
],
[AC_DEFINE([HAVE_EPIPE], [1], [Host has EPIPE])],[])
+AC_TRY_COMPILE([
+#include <sys/socket.h>
+#include <sys/un.h>
+ ], [
+struct sockaddr_un uaddr;
+ ],
+ [AC_DEFINE([HAVE_SOCKADDR_UN], [1], [Host has sockaddr_un])],[])
+
AC_TRY_COMPILE([
#include <sys/stat.h>
#include <sys/types.h>
diff --git a/src/include/com.h b/src/include/com.h
index 4faeb2c1c..470018b9c 100644
--- a/src/include/com.h
+++ b/src/include/com.h
@@ -39,6 +39,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
#else
# include <sys/types.h>
# include <sys/socket.h>
+# include <sys/un.h>
# include <netinet/in.h>
#endif
@@ -68,9 +69,10 @@ typedef struct {
int frame; /* spad interpreter frame (for interpreter
windows) */
fricas_socket remote; /* file descriptor of remote socket */
union {
- struct sockaddr u_addr;
+ #ifdef HAVE_SOCKADDR_UN
+ struct sockaddr_un u_addr;
+ #endif
struct sockaddr_in i_addr;
- char pad[32];
} addr;
char *host_name; /* name of foreign host if type == AF_INET */
} Sock;
diff --git a/src/lib/sockio-c.c b/src/lib/sockio-c.c
index 5878cfb11..fb9e70593 100644
--- a/src/lib/sockio-c.c
+++ b/src/lib/sockio-c.c
@@ -751,14 +751,15 @@ connect_to_local_server(char *server_name, int
purpose, int time_out)
free(sock);
return NULL;
}
+#ifndef HAVE_SOCKADDR_UN
+ return NULL;
+#else
/* connect socket using name specified in command line */
- sock->addr.u_addr.sa_family = FRICAS_AF_LOCAL;
- strcpy(sock->addr.pad +
- ((char *)(&(sock->addr.u_addr.sa_data))
- -(char *)(&(sock->addr.u_addr))), name);
+ struct sockaddr_un *uaddr = &(sock->addr.u_addr);
+ uaddr->sun_family = FRICAS_AF_LOCAL;
+ strncpy(uaddr->sun_path, name, sizeof(uaddr->sun_path) - 1);
for(i=0; i<max_con; i++) {
- code = connect(sock->socket, &sock->addr.u_addr,
- sizeof(sock->addr.pad));
+ code = connect(sock->socket, uaddr, sizeof(*uaddr));
if (code == -1) {
if (
/* @@@ Why we need this */
@@ -785,6 +786,7 @@ connect_to_local_server(char *server_name, int
purpose, int time_out)
/* fprintf(stderr, "Got int form socket\n"); */
sock->remote = get_int(sock);
return sock;
+#endif
}
/* act as terminal session for sock connected to stdin and stdout of
another
@@ -917,6 +919,10 @@ open_server(char *server_name)
listen(server[0].socket,5);
} */
/* Next create the local domain socket */
+#ifndef HAVE_SOCKADDR_UN
+ server[1].socket = 0;
+ return -1;
+#else
server[1].socket = fricas_communication_link(FRICAS_AF_LOCAL);
if (is_invalid_socket(&server[1])) {
perror("opening local server socket");
@@ -924,12 +930,10 @@ open_server(char *server_name)
return -2;
} else {
Sock * sock = &(server[1]);
- sock->addr.u_addr.sa_family = FRICAS_AF_LOCAL;
- strcpy(sock->addr.pad +
- ((char *)(&(sock->addr.u_addr.sa_data))
- -(char *)(&(sock->addr.u_addr))), name);
- if (bind(sock->socket, &(sock->addr.u_addr),
- sizeof(sock->addr.pad))) {
+ struct sockaddr_un * uaddr = &(sock->addr.u_addr);
+ uaddr->sun_family = FRICAS_AF_LOCAL;
+ strncpy(uaddr->sun_path, name, sizeof(uaddr->sun_path) - 1);
+ if (bind(sock->socket, uaddr, sizeof(*uaddr))) {
perror("binding local server socket");
server[1].socket = 0;
return -2;
@@ -950,6 +954,7 @@ open_server(char *server_name)