AUTOMAKE_OPTIONS = foreign
-include_HEADERS = @libgen_header@ @stdint_header@ @syslog_header@
-EXTRA_HEADERS = libgen.h stdint.h syslog.h
+include_HEADERS = @libgen_header@ @stdint_header@ @syslog_header@ @semaphore_header@
+EXTRA_HEADERS = libgen.h stdint.h syslog.h semaphore.h
lib_LIBRARIES = libcompat.a
libcompat_a_SOURCES =
-EXTRA_libcompat_a_SOURCES = syslog.c
-libcompat_a_LIBADD = @syslog_object@
-libcompat_a_DEPENDENCIES = @syslog_object@
+EXTRA_libcompat_a_SOURCES = syslog.c semaphore.c
+libcompat_a_LIBADD = @syslog_object@ @semaphore_object@
+libcompat_a_DEPENDENCIES = @syslog_object@ @semaphore_object@
RANLIB = @RANLIB@
VERSION = @VERSION@
libgen_header = @libgen_header@
+semaphore_header = @semaphore_header@
+semaphore_object = @semaphore_object@
stdint_header = @stdint_header@
syslog_header = @syslog_header@
syslog_object = @syslog_object@
AUTOMAKE_OPTIONS = foreign
-include_HEADERS = @libgen_header@ @stdint_header@ @syslog_header@
-EXTRA_HEADERS = libgen.h stdint.h syslog.h
+include_HEADERS = @libgen_header@ @stdint_header@ @syslog_header@ @semaphore_header@
+EXTRA_HEADERS = libgen.h stdint.h syslog.h semaphore.h
lib_LIBRARIES = libcompat.a
libcompat_a_SOURCES =
-EXTRA_libcompat_a_SOURCES = syslog.c
-libcompat_a_LIBADD = @syslog_object@
-libcompat_a_DEPENDENCIES = @syslog_object@
+EXTRA_libcompat_a_SOURCES = syslog.c semaphore.c
+libcompat_a_LIBADD = @syslog_object@ @semaphore_object@
+libcompat_a_DEPENDENCIES = @syslog_object@ @semaphore_object@
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs
CONFIG_CLEAN_FILES =
TAR = gtar
GZIP_ENV = --best
-DEP_FILES = .deps/syslog.P
+DEP_FILES = .deps/semaphore.P .deps/syslog.P
SOURCES = $(libcompat_a_SOURCES) $(EXTRA_libcompat_a_SOURCES)
OBJECTS = $(libcompat_a_OBJECTS)
fi
-PACKAGE=config
+PACKAGE=compat
-VERSION=0.3
+VERSION=0.4
if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
{ echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+echo $ac_n "checking whether _POSIX_SEMAPHORES works""... $ac_c" 1>&6
+echo "configure:1370: checking whether _POSIX_SEMAPHORES works" >&5
+if test "$cross_compiling" = yes; then
+ { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1375 "configure"
+#include "confdefs.h"
+#define _POSIX_C_SOURCE 199309L
+#include <unistd.h>
+#include <fcntl.h>
+#include <semaphore.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int main() {
+ int retVal;
+ sem_t *sem;
+
+ sem = sem_open("/foobar", O_CREAT, S_IRWXU, 0);
+ if ((sem_t *) -1 == sem || NULL == sem) {
+ retVal = EXIT_FAILURE;
+ } else {
+ retVal = EXIT_SUCCESS;
+ sem_close(sem);
+ sem_unlink("/foobar");
+ }
+ exit(retVal);
+}
+
+EOF
+if { (eval echo configure:1401: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ echo "$ac_t"""yes"" 1>&6
+ semaphore_header=
+ semaphore_object=
+
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ echo "$ac_t"""no"" 1>&6
+ semaphore_header=semaphore.h
+ semaphore_object=semaphore.o
+
+fi
+rm -fr conftest*
+fi
+
+
+
+
+
trap '' 1 2 15
cat > confcache <<\EOF
s%@stdint_header@%$stdint_header%g
s%@syslog_header@%$syslog_header%g
s%@syslog_object@%$syslog_object%g
+s%@semaphore_header@%$semaphore_header%g
+s%@semaphore_object@%$semaphore_object%g
CEOF
EOF
dnl Process this file with autoconf to produce a configure script.
AC_INIT(syslog.c)
AC_CONFIG_AUX_DIR(config)
-AM_INIT_AUTOMAKE(config, 0.3)
+AM_INIT_AUTOMAKE(compat, 0.4)
AM_MAINTAINER_MODE
dnl Checks for programs.
dnl Checks for typedefs, structures, and compiler characteristics.
dnl Checks for library functions.
+AC_MSG_CHECKING([whether _POSIX_SEMAPHORES works])
+AC_TRY_RUN(
+#define _POSIX_C_SOURCE 199309L
+#include <unistd.h>
+#include <fcntl.h>
+#include <semaphore.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int main() {
+ int retVal;
+ sem_t *sem;
+
+ sem = sem_open("/foobar", O_CREAT, S_IRWXU, 0);
+ if ((sem_t *) -1 == sem || NULL == sem) {
+ retVal = EXIT_FAILURE;
+ } else {
+ retVal = EXIT_SUCCESS;
+ sem_close(sem);
+ sem_unlink("/foobar");
+ }
+ exit(retVal);
+}
+,
+ AC_MSG_RESULT("yes")
+ semaphore_header=
+ semaphore_object=
+,
+ AC_MSG_RESULT("no")
+ semaphore_header=semaphore.h
+ semaphore_object=semaphore.o
+)
+
+AC_SUBST(semaphore_header)
+AC_SUBST(semaphore_object)
+
AC_OUTPUT(Makefile examples/Makefile)
RANLIB = @RANLIB@
VERSION = @VERSION@
libgen_header = @libgen_header@
+semaphore_header = @semaphore_header@
+semaphore_object = @semaphore_object@
stdint_header = @stdint_header@
syslog_header = @syslog_header@
syslog_object = @syslog_object@
--- /dev/null
+static char *rcsId = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/compat/semaphore.c,v 1.1 2002-08-20 12:27:50 hadaq Exp $";
+
+
+#define _XOPEN_SOURCE
+#include <unistd.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#if !(defined(__Lynx__) || (defined(__linux) && __GNUC_MINOR__ < 91))
+union semun {
+ int val;
+ struct semid_ds *buf;
+ unsigned short *array;
+};
+
+#endif
+
+#include "semaphore.h"
+
+static char *name2Path(char *path, char *name)
+{
+ char *prefix;
+
+ if (NULL == (prefix = getenv("OUR_SEMAPHORE_PREFIX"))) {
+ prefix = "";
+ }
+ if (strlen(prefix) + strlen(name) + 1 > _POSIX_PATH_MAX) {
+ errno = ENAMETOOLONG;
+ path = NULL;
+ } else {
+ strcpy(path, prefix);
+ strcat(path, name);
+ }
+ return path;
+}
+
+sem_t *SEMAPHORE_sem_open(char *name, int oflags, mode_t mode, unsigned int value)
+{
+ int *sem;
+ char path[_POSIX_PATH_MAX];
+ key_t key;
+ int semflg;
+ int fd;
+ union semun arg;
+
+ if (NULL == name2Path(path, name)) {
+ return (sem_t *) -1;
+ }
+ if (0 > (fd = open(path, oflags, mode))) {
+ return (sem_t *) -1;
+ }
+ if ((key_t) - 1 == (key = ftok(path, 'A'))) {
+ close(fd);
+ return (sem_t *) -1;
+ }
+ close(fd);
+
+ if (NULL == (sem = malloc(sizeof(int)))) {
+ return (sem_t *) -1;
+ }
+ semflg = mode; /* BUGBUG This depends on ipc modes having
+ the same */
+ /* semantics as file modes */
+ if ((oflags & O_CREAT) != 0) {
+ semflg |= IPC_CREAT;
+ }
+ if ((oflags & O_EXCL) != 0) {
+ semflg |= IPC_EXCL;
+ }
+ if (semget(key, 1, 0) != -1) { /* semaphore existst already */
+ if (0 > (*sem = semget(key, 1, semflg))) {
+ free(sem);
+ return (sem_t *) -1;
+ }
+ } else {
+ arg.val = value;
+ if (0 > (*sem = semget(key, 1, semflg))
+ || 0 > semctl(*sem, 0, SETVAL, arg)
+ ) {
+ free(sem);
+ return (sem_t *) -1;
+ }
+ }
+ return sem;
+}
+
+int SEMAPHORE_sem_close(sem_t *sem)
+{
+ free(sem);
+ return 0;
+}
+
+int SEMAPHORE_sem_unlink(char *name)
+{
+ int retVal;
+ sem_t semS, *sem = &semS;
+ char path[_POSIX_PATH_MAX];
+ key_t key;
+ union semun arg;
+
+ retVal = 0;
+
+ arg.val = 0;
+ if (
+ NULL == name2Path(path, name)
+ || (key_t) - 1 == (key = ftok(path, 'A'))
+ || 0 > (*sem = semget(key, 1, 0))
+ || 0 > semctl(*sem, 0, IPC_RMID, arg)
+ ) {
+ retVal = -1;
+ }
+ if (-1 == unlink(path)) {
+ retVal = -1;
+ }
+ return retVal;
+}
+
+int SEMAPHORE_sem_wait(sem_t *sem)
+{
+ static struct sembuf waitOpS =
+ {0, -1, 0}, *waitOp = &waitOpS;
+
+ return semop(*sem, waitOp, 1);
+}
+
+int SEMAPHORE_sem_trywait(sem_t *sem)
+{
+ static struct sembuf trywaitOpS =
+ {0, -1, IPC_NOWAIT}, *trywaitOp = &trywaitOpS;
+
+ return semop(*sem, trywaitOp, 1);
+}
+
+int SEMAPHORE_sem_post(sem_t *sem)
+{
+ static struct sembuf postOpS =
+ {0, +1, 0}, *postOp = &postOpS;
+
+ return semop(*sem, postOp, 1);
+}
--- /dev/null
+#ifndef OUR_SEMAPHORE_H
+#define OUR_SEMAPHORE_H
+
+#include <sys/types.h>
+
+typedef int sem_t;
+
+#define sem_open SEMAPHORE_sem_open
+#define sem_close SEMAPHORE_sem_close
+#define sem_unlink SEMAPHORE_sem_unlink
+#define sem_wait SEMAPHORE_sem_wait
+#define sem_trywait SEMAPHORE_sem_trywait
+#define sem_post SEMAPHORE_sem_post
+
+sem_t *SEMAPHORE_sem_open(char *name, int oflags, mode_t mode, unsigned int value);
+int SEMAPHORE_sem_close(sem_t * sem);
+int SEMAPHORE_sem_unlink(char *name);
+int SEMAPHORE_sem_wait(sem_t * sem);
+int SEMAPHORE_sem_trywait(sem_t * sem);
+int SEMAPHORE_sem_post(sem_t * sem);
+
+#endif