Back to index

courier  0.68.2
waitlib.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 1998 - 2005 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 #ifndef       INCLUDED_FROM_CONFIGURE
00007 #include      "waitlib.h"
00008 #endif
00009 #include      <signal.h>
00010 #include      <stdio.h>
00011 
00012 
00013 #if    HAVE_SIGPROCMASK
00014 
00015 #define HOLD_CHILDREN {\
00016        sigset_t ss; sigemptyset(&ss); sigaddset(&ss, SIGCHLD); \
00017        sigprocmask(SIG_BLOCK, &ss, NULL);\
00018        }
00019 
00020 #define RELEASE_CHILDREN {\
00021        sigset_t ss; sigemptyset(&ss); sigaddset(&ss, SIGCHLD); \
00022        sigprocmask(SIG_UNBLOCK, &ss, NULL);\
00023        }
00024 
00025 #else
00026 #if    HAVE_SIGHOLD
00027 
00028 #define       HOLD_CHILDREN sighold(SIGCHLD)
00029 #define       RELEASE_CHILDREN     sigrelse(SIGCHLD)
00030 
00031 #else
00032 
00033 #define       HOLD_CHILDREN sigblock(sigmask(SIGCHLD))
00034 #define       RELEASE_CHILDREN     sigsetmask(0)
00035 
00036 #endif
00037 #endif
00038 
00039 #if    USE_WAIT3
00040 
00041 void wait_block()
00042 {
00043        HOLD_CHILDREN;
00044 }
00045 
00046 void wait_clear(RETSIGTYPE (*func)(int))
00047 {
00048        RELEASE_CHILDREN;
00049 }
00050 
00051 void wait_restore()
00052 {
00053        signal(SIGCHLD, SIG_DFL);
00054        RELEASE_CHILDREN;
00055 }
00056 
00057 #else
00058 
00059 void wait_block()
00060 {
00061        signal(SIGCHLD, SIG_DFL);
00062 }
00063 
00064 void wait_clear(RETSIGTYPE (*func)(int))
00065 {
00066        signal(SIGCHLD, func);
00067 }
00068 
00069 void wait_restore()
00070 {
00071        signal(SIGCHLD, SIG_DFL);
00072 }
00073 
00074 #endif
00075 
00076 void wait_reap( void (*func)(pid_t, int), RETSIGTYPE (*handler)(int))
00077 {
00078 int    dummy;
00079 pid_t  p;
00080 
00081 #if    USE_WAIT3
00082 
00083        HOLD_CHILDREN;
00084 
00085        while ((p=wait3(&dummy, WNOHANG, 0)) > 0)
00086 #else
00087        if ((p=wait(&dummy)) > 0)
00088 #endif
00089        {
00090               (*func)(p, dummy);
00091        }
00092 
00093        signal(SIGCHLD, handler);
00094 
00095 #if    USE_WAIT3
00096        RELEASE_CHILDREN;
00097 #endif
00098 
00099 }
00100 
00101 void wait_forchild( void (*reap)(pid_t, int), RETSIGTYPE (*func)(int))
00102 {
00103 pid_t  p;
00104 int    wait_stat;
00105 
00106        signal(SIGCHLD, SIG_DFL);
00107        p=wait(&wait_stat);
00108        signal(SIGCHLD, func);
00109        (*reap)(p, wait_stat);
00110 }