Hello, Here are some patches that I made to fix BSD support in Corosync:
- patch-fix-bsd-compilation: Just reuse some flags used for Darwin, and make sure we don't compile with -ldl (included in the libc on FreeBSD)
- patch-fix-semun-def-on-local: "#if define(semun)" doesn't seem to work on my system (FreeBSD 7.2 / Gcc 4.2.1). However, I'm not sure if it's the best way to fix this problem :/
- patch-fix-refcount-for-bsd: It's an adaptation of my patch for Whitetank: The refcount isn't decremented correctly on FreeBSD at the disconnection of a client. On Whitetank, it created SHM leaks. On Corosync, it seems that it makes the CPU usage goes to 100%.
- patch-pf-local: I'm not sure if it really helps fixing the BSD support, but it makes it more compliant with the instructions from the BSD man pages.
These patchs make Corosync tests work on my workstation. However I'm not yet able to make it fully work with our programs, so it may not be the last patches for BSD.
diff --git a/configure.ac b/configure.ac
index b87413e..7b73315 100644
--- configure.ac
+++ configure.ac
@@ -194,6 +194,7 @@ AC_ARG_WITH([socket-dir],
# OS detection
# THIS SECTION MUST DIE!
CP=cp
+SYS_BSD="0"
case "$host_os" in
*linux*)
AC_DEFINE_UNQUOTED([COROSYNC_LINUX], [1],
@@ -223,6 +224,12 @@ case "$host_os" in
[Number of chars in a file name])
;;
*bsd*)
+ AC_DEFINE_UNQUOTED([MAP_ANONYMOUS], [MAP_ANON],
+ [Shared memory define for Darwin platform])
+ AC_DEFINE_UNQUOTED([PATH_MAX], [4096],
+ [Number of chars in a path name including
nul])
+ AC_DEFINE_UNQUOTED([NAME_MAX], [255],
+ [Number of chars in a file name])
AC_DEFINE_UNQUOTED([COROSYNC_BSD], [1],
[Compiling for BSD platform])
OS_CFLAGS=""
@@ -230,6 +237,7 @@ case "$host_os" in
OS_LDFLAGS="-L/usr/local/lib"
OS_DYFLAGS="-export-dynamic"
DARWIN_OPTS=""
+ SYS_BSD="1"
;;
*solaris*)
AC_DEFINE_UNQUOTED([COROSYNC_SOLARIS], [1],
@@ -360,6 +368,9 @@ AC_SUBST([NSS_LDFLAGS])
AM_CONDITIONAL(BUILD_DARWIN, test -n "${DARWIN_OPTS}")
AC_SUBST([DARWIN_OPTS])
+AM_CONDITIONAL(BUILD_BSD, test "${SYS_BSD}" -gt 0)
+
+
AM_CONDITIONAL(BUILD_HTML_DOCS, test -n "${GROFF}")
AC_SUBST([LINT_FLAGS])
diff --git a/lib/Makefile.am b/lib/Makefile.am
index af3253d..9830d22 100644
--- lib/Makefile.am
+++ lib/Makefile.am
@@ -62,6 +62,12 @@ noinst_HEADERS = sa-confdb.h util.h \
../lcr/lcr_ifact.o:
$(MAKE) -C ../lcr lcr_ifact.o
+if BUILD_BSD
+ LDL = ""
+else
+ LDL = -ldl
+endif
+
if BUILD_DARWIN
libcoroipcc.so.$(SONAME): coroipcc.o
@@ -71,7 +77,7 @@ libcoroipcc.so.$(SONAME): coroipcc.o
libconfdb.so.$(SONAME): confdb.o sa-confdb.o libcoroipcc.so.$(SONAME)
$(CC) $(LDFLAGS) $(DARWIN_OPTS) coroipcc.o confdb.o \
- sa-confdb.o ../lcr/lcr_ifact.o -o $@ -ldl $(AM_LDFLAGS)
+ sa-confdb.o ../lcr/lcr_ifact.o -o $@ $(LDL) $(AM_LDFLAGS)
ln -sf libconfdb.so.$(SONAME) libconfdb.so
ln -sf libconfdb.so.$(SONAME) libconfdb.so.$(SOMAJOR)
@@ -94,7 +100,7 @@ libconfdb.so.$(SONAME): confdb.o sa-confdb.o
../lcr/lcr_ifact.o libcoroipcc.so.$
$(CC) -shared -o $@ \
-Wl,-soname=libconfdb.so.$(SOMAJOR) \
-Wl,-version-script=$(srcdir)/libconfdb.versions \
- $^ $(LDFLAGS) $(OS_DYFLAGS) -ldl $(AM_LDFLAGS)
+ $^ $(LDFLAGS) $(OS_DYFLAGS) $(LDL) $(AM_LDFLAGS)
ln -sf libconfdb.so.$(SONAME) libconfdb.so
ln -sf libconfdb.so.$(SONAME) libconfdb.so.$(SOMAJOR)
diff --git a/exec/coroipcs.c b/exec/coroipcs.c
index dcb4501..908e26d 100644
--- exec/coroipcs.c
+++ exec/coroipcs.c
@@ -1334,7 +1334,6 @@ int coroipcs_handler_dispatch (
res = 0;
break;
}
- coroipcs_refcount_dec (conn_info);
}
#if defined(COROSYNC_SOLARIS) || defined(COROSYNC_BSD) ||
defined(COROSYNC_DARWIN)
/* On many OS poll never return POLLHUP or POLLERR.
@@ -1342,9 +1341,11 @@ int coroipcs_handler_dispatch (
*/
if (res == 0) {
ipc_disconnect (conn_info);
+ coroipcs_refcount_dec (conn_info);
return (0);
}
#endif
+ coroipcs_refcount_dec (conn_info);
}
coroipcs_refcount_inc (conn_info);
diff --git a/exec/coroipcs.c b/exec/coroipcs.c
index b50bd5a..1103f08 100644
--- exec/coroipcs.c
+++ exec/coroipcs.c
@@ -99,12 +99,14 @@ struct zcb_mapped {
size_t size;
};
+#if !defined(semun) && !defined(COROSYNC_BSD)
union semun {
int val;
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
+#endif
enum conn_state {
CONN_STATE_THREAD_INACTIVE = 0,
diff --git a/lib/coroipcc.c b/lib/coroipcc.c
index 5f898dc..9bbcc52 100644
--- lib/coroipcc.c
+++ lib/coroipcc.c
@@ -251,7 +251,7 @@ priv_change_send (struct ipc_instance *ipc_instance)
return (0);
}
-#if !defined(semun)
+#if !defined(semun) && !defined(COROSYNC_BSD)
union semun {
int val;
struct semid_ds *buf;
diff --git a/exec/coroipcs.c b/exec/coroipcs.c
index 1103f08..3dca150 100644
--- exec/coroipcs.c
+++ exec/coroipcs.c
@@ -780,7 +780,7 @@ extern void coroipcs_ipc_init (
/*
* Create socket for IPC clients, name socket, listen for connections
*/
- server_fd = socket (PF_UNIX, SOCK_STREAM, 0);
+ server_fd = socket (PF_LOCAL, SOCK_STREAM, 0);
if (server_fd == -1) {
api->log_printf ("Cannot create client connections socket.\n");
api->fatal_error ("Can't create library listen socket");
@@ -795,7 +795,7 @@ extern void coroipcs_ipc_init (
memset (&un_addr, 0, sizeof (struct sockaddr_un));
un_addr.sun_family = AF_UNIX;
#if defined(COROSYNC_BSD) || defined(COROSYNC_DARWIN)
- un_addr.sun_len = sizeof(struct sockaddr_un);
+ un_addr.sun_len = SUN_LEN(&un_addr);
#endif
#if defined(COROSYNC_LINUX)
@@ -807,7 +807,7 @@ extern void coroipcs_ipc_init (
res = bind (server_fd, (struct sockaddr *)&un_addr,
COROSYNC_SUN_LEN(&un_addr));
if (res) {
- api->log_printf ("Could not bind AF_UNIX: %s.\n", strerror
(errno));
+ api->log_printf ("Could not bind AF_UNIX (%s): %s.\n",
un_addr.sun_path, strerror (errno));
api->fatal_error ("Could not bind to AF_UNIX socket\n");
}
listen (server_fd, SERVER_BACKLOG);
diff --git a/lib/coroipcc.c b/lib/coroipcc.c
index 9bbcc52..10fb6e6 100644
--- lib/coroipcc.c
+++ lib/coroipcc.c
@@ -522,16 +522,16 @@ coroipcc_service_connect (
res_setup.error = CS_ERR_LIBRARY;
- request_fd = socket (PF_UNIX, SOCK_STREAM, 0);
+ request_fd = socket (PF_LOCAL, SOCK_STREAM, 0);
if (request_fd == -1) {
return (CS_ERR_LIBRARY);
}
memset (&address, 0, sizeof (struct sockaddr_un));
+ address.sun_family = AF_UNIX;
#if defined(COROSYNC_BSD) || defined(COROSYNC_DARWIN)
- address.sun_len = sizeof(struct sockaddr_un);
+ address.sun_len = SUN_LEN(&address);
#endif
- address.sun_family = PF_UNIX;
#if defined(COROSYNC_LINUX)
sprintf (address.sun_path + 1, "%s", socket_name);
@@ -541,6 +541,9 @@ coroipcc_service_connect (
sys_res = connect (request_fd, (struct sockaddr *)&address,
COROSYNC_SUN_LEN(&address));
if (sys_res == -1) {
+#ifdef DEBUG
+ fprintf(stderr, "Coroipcc: Can't connect: %d : %s\n", errno,
strerror(errno));
+#endif
close (request_fd);
return (CS_ERR_TRY_AGAIN);
}
smime.p7s
Description: S/MIME Cryptographic Signature
_______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
