home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Mint / mntlib25.zoo / sigactio.c < prev    next >
C/C++ Source or Header  |  1992-09-17  |  2KB  |  97 lines

  1. /* sigaction() for MiNT; placed in the public domain */
  2.  
  3. #include <errno.h>
  4. #include <osbind.h>
  5. #include <mintbind.h>
  6. #include <signal.h>
  7.  
  8. /* vector of signal handlers (for TOS, or for MiNT with -mshort) */
  9. extern __Sigfunc _sig_handler[NSIG];
  10.  
  11. #ifdef __MSHORT__
  12. typedef void __CDECL (*__KerSigfunc) __PROTO((long));
  13. __EXTERN void __CDECL _trampoline __PROTO((long sig));
  14. #else
  15. typedef void __CDECL (*__KerSigfunc) __PROTO((int));
  16. #endif
  17.  
  18. int
  19. sigaction(sig, act, oact)
  20.     int sig;
  21.     const struct sigaction *act;
  22.     struct sigaction *oact;
  23. {
  24.     long r;
  25.     extern int __mint;
  26.     __Sigfunc oldfunc;
  27.  
  28.     if (__mint >= 95) {
  29.         struct ksigact {
  30.             __KerSigfunc    sa_handler;    /* pointer to signal handler */
  31.             long        sa_mask;    /* additional signals masked during delivery */
  32.             union {
  33.                 short    kernel;
  34.                 int        posix;
  35.             } sa_flags;        /* signal specific flags, kernel */
  36.         } temp;
  37.         
  38. #ifdef __MSHORT__
  39. /* NOTE: MiNT passes 32 bit numbers for signals, so we want our
  40.  * own signal dispatcher to switch these to 16 bit ints
  41.  */
  42.         if (sig < 0 || sig >= NSIG) {
  43.             errno = ERANGE;
  44.             return -1;
  45.         }
  46.         oldfunc = _sig_handler[sig];
  47.         if (act) {
  48.             temp = *(struct ksigact *)act;
  49.             _sig_handler[sig] = (__Sigfunc)temp.sa_handler;
  50.             if (_sig_handler[sig] != SIG_DFL && _sig_handler[sig] != SIG_IGN) {
  51.                 temp.sa_handler = _trampoline;
  52.             }
  53.             act = (struct sigaction *)&temp;
  54.         }
  55. #else
  56.         if (act) {
  57.             temp = *(struct ksigact *)act;    /* dept. of sleaze */
  58.             temp.sa_flags.kernel = temp.sa_flags.posix;
  59.             act = (struct sigaction *)&temp;
  60.         }
  61. #endif
  62.         r = Psigaction(sig, act, oact);
  63. #ifdef __MSHORT__
  64.         if (oact && oact->sa_handler == (__Sigfunc) _trampoline)
  65.             oact->sa_handler = oldfunc;
  66. #else
  67.         if (oact)
  68.             oact->sa_flags = ((struct ksigact *)oact)->sa_flags.kernel;
  69. #endif
  70.         if (r < 0) {
  71.             errno = (int) -r;
  72.             return -1;
  73.         }
  74.     }
  75.     else {
  76.         if (act)
  77.             oldfunc = signal(sig, act->sa_handler);
  78.         else {
  79.             long omask;
  80.  
  81.             omask = sigblock(sig);
  82.             oldfunc = signal(sig, SIG_DFL);
  83.             signal(sig, oldfunc);    /* need to put it back */
  84.             sigsetmask(omask);    /* may remask sig (this is what we want) */
  85.         }
  86.         if (oldfunc == SIG_ERR)
  87.             return -1;
  88.         if (oact) {
  89.             oact->sa_handler = oldfunc;
  90.             /* we could do something useful with sa_mask when __mint */
  91.             oact->sa_flags = 0;
  92.             oact->sa_mask = 0;
  93.         }
  94.     }
  95.     return 0;
  96. }
  97.