procmgmt: wrappers for softsig handlers 36/12236/2
authorMichael Meffie <mmeffie@sinenomine.net>
Thu, 31 Mar 2016 20:37:42 +0000 (16:37 -0400)
committerBenjamin Kaduk <kaduk@mit.edu>
Mon, 25 Apr 2016 03:55:56 +0000 (23:55 -0400)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/procmgmt/Makefile.in
src/procmgmt/NTMakefile
src/procmgmt/afsprocmgmt.def
src/procmgmt/procmgmt_nt.c
src/procmgmt/procmgmt_softsig.h [new file with mode: 0644]

index 167c5cb..1c14a2c 100644 (file)
@@ -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
index a93c864..35125a8 100644 (file)
@@ -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\.
index c3ff7ad..fb6a7c0 100644 (file)
@@ -8,3 +8,5 @@ EXPORTS
        pmgt_ProcessWaitPid             @7
        pmgt_spawnData                  @8  DATA
        pmgt_spawnDataLen               @9  DATA
+       pmgt_SignalInit                 @10
+       pmgt_SignalRegister             @11
index bc34bfb..d0ce77c 100644 (file)
@@ -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 (file)
index 0000000..01d5198
--- /dev/null
@@ -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 */