[Date Prev][Date Next] [Chronological] [Thread] [Top]

OpenLDAP, Linux/Alpha, and signals



OpenLDAP needs two signals to work correctly.  As the
glibc implementation of pthreads uses SIGUSR1 and SIGUSR2,
an #ifdef HAVE_LINUX_THREADS chooses SIGSTKFLT and SIGUNUSED
for Linux platforms in slapd and slurpd.

Unfortunately, for various practical and historical reasons,
Linux/Alpha does not have the same signum.h as Linux/Intel,
and in fact Linux/Alpha has neither SIGSTKFLT nor SIGUNUSED.
This obviously causes problems, and slurpd and slapd don't
compile.

As a quick hack, I changed SIGSTKFLT and SIGUNUSED to
SIGSYS and SIGINFO, and the build completes successfully and
slapd seems to work.  (Which is to say, I can import
a simple LDIF and talk to a running slapd via Netscape's
Java LDAP SDK.)  I have not tested slurpd.

The reason I chose SIGSYS and SIGINFO is because they are
present on Linux/Alpha but not Linux/Intel.  I am guessing
they are safe to use because if Linux/Intel doesn't have
them, they're probably not used by any Linux system libraries,
which tend to be Intel-centric and ported to the Alpha.
However, I don't KNOW this for certain.

This affects slapd and slurpd, and perhaps ldapd as well,
though I have not attempted to build ldapd.

There seem to be three ways to fix this:
	* add a feature to autoconf that selects two
	  signals to use depending on the architecture
	  when HAVE_LINUX_THREADS is #defined
	* try and find two unused signals that exist
	  on both Linux/Alpha and Linux/Intel (and
	  Linux/Sparc, and MkLinux, et al as well...?)
	* get the kernel folk to add SIGUSR3 and SIGUSR4
	  to all platform kernel versions  :)


I'm glad to help resolve this any way I can, but I have little
(read: practically no) experience with autoconf.


Attached is the /usr/include/signum.h from my Linux/Alpha box
if it will help anyone.  The "executive summary":

Signals present on Linux/Intel but not on Linux/Alpha:
#define SIGIOT          6       /* IOT trap (4.2 BSD).  */
#define SIGPOLL         SIGIO   /* Pollable event occurred (System V).  */
#define SIGSTKFLT       16      /* ??? */
#define SIGPWR          30      /* Power failure restart (System V).  */
#define SIGUNUSED       31

Signals present on Linux/Alpha but not on Linux/Intel:
#define SIGEMT           7
#define SIGSYS          12
#define SIGINFO         29

 
Dan Morrill
Computer Scientist
GE Corporate R&D
******************
My views are my own, and may not reflect those of my employer.
/* Signal number definitions.  Linux/Alpha version.
Copyright (C) 1996, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB.  If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.  */

#ifdef  _SIGNAL_H

/* Fake signal functions.  */
#define SIG_ERR ((__sighandler_t) -1) /* Error return.  */
#define SIG_DFL ((__sighandler_t) 0) /* Default action.  */
#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal.  */

/*
 * Linux/AXP has different signal numbers that Linux/i386: I'm trying
 * to make it OSF/1 binary compatible, at least for normal binaries.
 */
#define SIGHUP           1
#define SIGINT           2
#define SIGQUIT          3
#define SIGILL           4
#define SIGTRAP          5
#define SIGABRT          6
#define SIGEMT           7
#define SIGFPE           8
#define SIGKILL          9
#define SIGBUS          10
#define SIGSEGV         11
#define SIGSYS          12
#define SIGPIPE         13
#define SIGALRM         14
#define SIGTERM         15
#define SIGURG          16
#define SIGSTOP         17
#define SIGTSTP         18
#define SIGCONT         19
#define SIGCHLD         20
#define SIGCLD          SIGCHLD
#define SIGTTIN         21
#define SIGTTOU         22
#define SIGIO           23
#define SIGXCPU         24
#define SIGXFSZ         25
#define SIGVTALRM       26
#define SIGPROF         27
#define SIGWINCH        28
#define SIGINFO         29
#define SIGUSR1         30
#define SIGUSR2         31

#define SIGPOLL SIGIO
#define SIGPWR  SIGINFO
#define SIGIOT  SIGABRT

#define _NSIG           32      /* Biggest signal number + 1.  */

#endif  /* <signal.h> included.  */