openenvutils/commandshell/shell/inc/signals.h
changeset 0 2e3d3ce01487
equal deleted inserted replaced
-1:000000000000 0:2e3d3ce01487
       
     1 /*
       
     2  * signals.h - header file for signals handling code
       
     3  *
       
     4  * This file is part of zsh, the Z shell.
       
     5  *
       
     6  * Copyright (c) 1992-1997 Paul Falstad
       
     7  * All rights reserved.
       
     8  *
       
     9  * Permission is hereby granted, without written agreement and without
       
    10  * license or royalty fees, to use, copy, modify, and distribute this
       
    11  * software and to distribute modified versions of this software for any
       
    12  * purpose, provided that the above copyright notice and the following
       
    13  * two paragraphs appear in all copies of this software.
       
    14  *
       
    15  * In no event shall Paul Falstad or the Zsh Development Group be liable
       
    16  * to any party for direct, indirect, special, incidental, or consequential
       
    17  * damages arising out of the use of this software and its documentation,
       
    18  * even if Paul Falstad and the Zsh Development Group have been advised of
       
    19  * the possibility of such damage.
       
    20  *
       
    21  * Paul Falstad and the Zsh Development Group specifically disclaim any
       
    22  * warranties, including, but not limited to, the implied warranties of
       
    23  * merchantability and fitness for a particular purpose.  The software
       
    24  * provided hereunder is on an "as is" basis, and Paul Falstad and the
       
    25  * Zsh Development Group have no obligation to provide maintenance,
       
    26  * support, updates, enhancements, or modifications.
       
    27  *
       
    28  */
       
    29 
       
    30 #define SIGNAL_HANDTYPE RETSIGTYPE (*)_((int))
       
    31 
       
    32 #ifndef HAVE_KILLPG
       
    33 # define killpg(pgrp,sig) kill(-(pgrp),sig)
       
    34 #endif
       
    35 
       
    36 #define SIGZERR   (SIGCOUNT+1)
       
    37 #define SIGDEBUG  (SIGCOUNT+2)
       
    38 #define VSIGCOUNT (SIGCOUNT+3)
       
    39 #define SIGEXIT    0
       
    40 
       
    41 #ifdef SV_BSDSIG
       
    42 # define SV_INTERRUPT SV_BSDSIG
       
    43 #endif
       
    44 
       
    45 /* If not a POSIX machine, then we create our *
       
    46  * own POSIX style signal sets functions.     */
       
    47 #ifndef POSIX_SIGNALS
       
    48 # define sigemptyset(s)    (*(s) = 0)
       
    49 # if NSIG == 32
       
    50 #  define sigfillset(s)    (*(s) = ~(sigset_t)0, 0)
       
    51 # else
       
    52 #  define sigfillset(s)    (*(s) = (1 << NSIG) - 1, 0)
       
    53 # endif
       
    54 # define sigaddset(s,n)    (*(s) |=  (1 << ((n) - 1)), 0)
       
    55 # define sigdelset(s,n)    (*(s) &= ~(1 << ((n) - 1)), 0)
       
    56 # define sigismember(s,n)  ((*(s) & (1 << ((n) - 1))) != 0)
       
    57 #endif   /* ifndef POSIX_SIGNALS */
       
    58  
       
    59 #define child_block()      signal_block(sigchld_mask)
       
    60 #define child_unblock()    signal_unblock(sigchld_mask)
       
    61 
       
    62 /* ignore a signal */
       
    63 #define signal_ignore(S)   signal(S, SIG_IGN)
       
    64 
       
    65 /* return a signal to it default action */
       
    66 #define signal_default(S)  signal(S, SIG_DFL)
       
    67 
       
    68 /* Use a circular queue to save signals caught during    *
       
    69  * critical sections of code.  You call queue_signals to *
       
    70  * start queueing, and unqueue_signals to process the    *
       
    71  * queue and stop queueing.  Since the kernel doesn't    *
       
    72  * queue signals, it is probably overkill for zsh to do  *
       
    73  * this, but it shouldn't hurt anything to do it anyway. */
       
    74 
       
    75 #define MAX_QUEUE_SIZE 128
       
    76 
       
    77 #define queue_signals()    (queueing_enabled++)
       
    78 
       
    79 #define run_queued_signals() do { \
       
    80     while (queue_front != queue_rear) {      /* while signals in queue */ \
       
    81 	sigset_t oset; \
       
    82 	queue_front = (queue_front + 1) % MAX_QUEUE_SIZE; \
       
    83 	oset = signal_setmask(signal_mask_queue[queue_front]); \
       
    84 	zhandler(signal_queue[queue_front]);  /* handle queued signal   */ \
       
    85 	signal_setmask(oset); \
       
    86     } \
       
    87 } while (0)
       
    88 
       
    89 #define unqueue_signals()  do { \
       
    90     DPUTS(!queueing_enabled, "BUG: unqueue_signals called but not queueing"); \
       
    91     if (!--queueing_enabled) run_queued_signals(); \
       
    92 } while (0)
       
    93 
       
    94 #define queue_signal_level() queueing_enabled
       
    95 
       
    96 #define dont_queue_signals() do { \
       
    97     queueing_enabled = 0; \
       
    98     run_queued_signals(); \
       
    99 } while (0)
       
   100 
       
   101 #define restore_queue_signals(q) (queueing_enabled = (q))
       
   102 
       
   103 /* Make some signal functions faster. */
       
   104 
       
   105 #ifdef POSIX_SIGNALS
       
   106 #define signal_block(S) \
       
   107     ((dummy_sigset1 = (S)), \
       
   108      sigprocmask(33, &dummy_sigset1, &dummy_sigset2), \
       
   109      dummy_sigset2)
       
   110 #else
       
   111 # ifdef BSD_SIGNALS
       
   112 #define signal_block(S) sigblock(S)
       
   113 # else
       
   114 extern sigset_t signal_block _((sigset_t));
       
   115 # endif  /* BSD_SIGNALS   */
       
   116 #endif   /* POSIX_SIGNALS */
       
   117 
       
   118 #ifdef POSIX_SIGNALS
       
   119 #define signal_unblock(S) \
       
   120     ((dummy_sigset1 = (S)), \
       
   121      sigprocmask(34, &dummy_sigset1, &dummy_sigset2), \
       
   122      dummy_sigset2)
       
   123 #else
       
   124 extern sigset_t signal_unblock _((sigset_t));
       
   125 #endif   /* POSIX_SIGNALS */