From 22030429fc680959d4d222f20b0756b82eb56d4c Mon Sep 17 00:00:00 2001 From: Michael Meffie Date: Thu, 31 Mar 2016 16:37:42 -0400 Subject: [PATCH] procmgmt: wrappers for softsig handlers Provide procmgmt wrappers for Windows environments which match the opr_softsig functions. This allows builds of the windows servers continue to use the existing process management signal handling functions, without introducing additional conditional compilation in the server code. Change-Id: I0ac287bde294996fb7f32c19370f2992a0af2a58 Reviewed-on: https://gerrit.openafs.org/12236 Tested-by: BuildBot Reviewed-by: Benjamin Kaduk --- src/procmgmt/Makefile.in | 10 ++++++- src/procmgmt/NTMakefile | 3 +- src/procmgmt/afsprocmgmt.def | 2 ++ src/procmgmt/procmgmt_nt.c | 38 ++++++++++++++++++++++++ src/procmgmt/procmgmt_softsig.h | 51 +++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 src/procmgmt/procmgmt_softsig.h diff --git a/src/procmgmt/Makefile.in b/src/procmgmt/Makefile.in index 167c5cb9a..1c14a2c55 100644 --- a/src/procmgmt/Makefile.in +++ b/src/procmgmt/Makefile.in @@ -10,7 +10,8 @@ include @TOP_OBJDIR@/src/config/Makefile.config include @TOP_OBJDIR@/src/config/Makefile.lwp -all: ${TOP_LIBDIR}/libprocmgmt.a ${TOP_INCDIR}/afs/procmgmt.h +all: ${TOP_LIBDIR}/libprocmgmt.a ${TOP_INCDIR}/afs/procmgmt.h \ + ${TOP_INCDIR}/afs/procmgmt_softsig.h buildtools: ${TOP_INCDIR}/afs/procmgmt.h @@ -20,6 +21,9 @@ ${TOP_LIBDIR}/libprocmgmt.a: libprocmgmt.a ${TOP_INCDIR}/afs/procmgmt.h: ${srcdir}/procmgmt.h ${INSTALL_DATA} $? $@ +${TOP_INCDIR}/afs/procmgmt_softsig.h: ${srcdir}/procmgmt_softsig.h + ${INSTALL_DATA} $? $@ + # # Build targets # @@ -39,6 +43,8 @@ install: libprocmgmt.a ${INSTALL_DATA} libprocmgmt.a ${DESTDIR}${libdir}/afs/libprocmgmt.a ${INSTALL_DATA} ${srcdir}/procmgmt.h \ ${DESTDIR}${includedir}/afs/procmgmt.h + ${INSTALL_DATA} ${srcdir}/procmgmt_softsig.h \ + ${DESTDIR}${includedir}/afs/procmgmt_softsig.h dest: libprocmgmt.a ${INSTALL} -d ${DEST}/lib/afs @@ -46,6 +52,8 @@ dest: libprocmgmt.a ${INSTALL_DATA} libprocmgmt.a ${DEST}/lib/afs/libprocmgmt.a ${INSTALL_DATA} ${srcdir}/procmgmt.h \ ${DEST}/include/afs/procmgmt.h + ${INSTALL_DATA} ${srcdir}/procmgmt_softsig.h \ + ${DEST}/include/afs/procmgmt_softsig.h # # Misc targets diff --git a/src/procmgmt/NTMakefile b/src/procmgmt/NTMakefile index a93c8643e..35125a806 100644 --- a/src/procmgmt/NTMakefile +++ b/src/procmgmt/NTMakefile @@ -13,7 +13,8 @@ RELDIR=procmgmt ############################################################################ -INCFILES = $(DESTDIR)\include\afs\procmgmt.h +INCFILES = $(DESTDIR)\include\afs\procmgmt.h \ + $(DESTDIR)\include\afs\procmgmt_softsig.h $(INCFILES):$$(@F) $(COPY) $** $(DESTDIR)\include\afs\. diff --git a/src/procmgmt/afsprocmgmt.def b/src/procmgmt/afsprocmgmt.def index c3ff7ad45..fb6a7c0c6 100644 --- a/src/procmgmt/afsprocmgmt.def +++ b/src/procmgmt/afsprocmgmt.def @@ -8,3 +8,5 @@ EXPORTS pmgt_ProcessWaitPid @7 pmgt_spawnData @8 DATA pmgt_spawnDataLen @9 DATA + pmgt_SignalInit @10 + pmgt_SignalRegister @11 diff --git a/src/procmgmt/procmgmt_nt.c b/src/procmgmt/procmgmt_nt.c index bc34bfb3c..d0ce77c35 100644 --- a/src/procmgmt/procmgmt_nt.c +++ b/src/procmgmt/procmgmt_nt.c @@ -359,6 +359,44 @@ void (__cdecl * pmgt_SignalSet(int signo, void (__cdecl * dispP) (int))) (int) { } } +/*! + * Initialize signal handling. + * + * \note The signature of this routine matches the opr softsig + * registration function opr_softsig_Init() used on + * unix. Since this process management library is + * initialized by DllMain when the library is loaded, + * this routine is currently a no op. + */ +int pmgt_SignalInit(void) +{ + /* no op */ + return 0; +} + +/*! + * Register a signal a handler. + * + * This routine is a variant of the original pmgt_SignalSet + * which returns a status code instead of the previously registered + * handler. + * + * \note The signature of this routine matches the opr softsig + * registration function opr_softsig_Register() used on + * unix. + */ +int pmgt_SignalRegister(int signo, void (__cdecl *handler)(int)) +{ + struct sigaction sa; + + sa.sa_handler = pmgt_SignalSet(signo, handler); + if (sa.sa_handler == SIG_ERR) { + return EINVAL; + } else { + return 0; + } +} + /* * pmgt_SignalRaiseLocal() -- Raise a signal in this process (C raise() diff --git a/src/procmgmt/procmgmt_softsig.h b/src/procmgmt/procmgmt_softsig.h new file mode 100644 index 000000000..01d519822 --- /dev/null +++ b/src/procmgmt/procmgmt_softsig.h @@ -0,0 +1,51 @@ +/* + * Copyright 2015, Sine Nomine Associates + * All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS + * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef OPENAFS_PROCMGMT_SOFTSIG_H +#define OPENAFS_PROCMGMT_SOFTSIG_H + +#ifdef AFS_NT40_ENV + +/* + * Windows implementation of the pthread soft signal processing. + * + * Similar to the replacment of signal, kill, etc, in procmgmt.h, + * this header replaces the opr softsig function names with the + * process management library names, to avoid sprinkling ifdefs + * in the code base. This header should been included after + * opr/softsig.h. + * + */ + +#define opr_softsig_Init() pmgt_SignalInit() +extern int pmgt_SignalInit(void); + +#define opr_softsig_Register(sig, handler) pmgt_SignalRegister(sig, handler) +extern int pmgt_SignalRegister(int sig, void (__cdecl *handler)(int)); + +#endif /* AFS_NT40_ENV */ +#endif /* OPENAFS_PROCMGMT_SOFTSIG_H */ -- 2.39.5