home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / mint / mntlib16.lzh / MNTLIB16 / KILL.C < prev    next >
C/C++ Source or Header  |  1993-08-03  |  2KB  |  95 lines

  1. /* kill() for MiNT */
  2.  
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <osbind.h>
  6. #include <signal.h>
  7. #include <unistd.h>
  8. #include "mintbind.h"
  9.  
  10. extern int __mint;
  11.  
  12. /* vector of signal handlers (for TOS) */
  13. extern __Sigfunc _sig_handler[];    /* in signal.c */
  14.  
  15. /* vector giving which signals are currently blocked from delivery (for TOS) */
  16. extern long _sigmask;            /* in signal.c */
  17.  
  18. /* which signals are pending? */
  19. extern long _sigpending;
  20.  
  21. int
  22. kill(pid, sig)
  23.     int pid, sig;
  24. {
  25.     long r;
  26.     __Sigfunc hndle;
  27.  
  28.     if (pid < 0) {
  29.         errno = ERANGE;
  30.         return -1;
  31.     }
  32.  
  33.     if (__mint) {
  34.         r = Pkill(pid, sig);
  35.         if (r < 0) {
  36.             errno = -r;
  37.             return -1;
  38.         }
  39.     } else {
  40.         if (sig < 0 || sig >= NSIG || (pid && pid != getpid())) {
  41.             errno = ERANGE;
  42.             return -1;
  43.         }
  44.         hndle = _sig_handler[sig];
  45.         if (hndle == SIG_IGN)
  46.             return 0;
  47.     /* check here for masked signals */
  48.         else if (sig != SIGKILL && (_sigmask & (1L << sig)))
  49.             _sigpending |= (1L << sig);
  50.         else {
  51.             _sigpending &= ~(1L << sig);
  52.             if (hndle == SIG_DFL) {
  53.                 switch (sig) {
  54.                 case SIGCONT:
  55.                 case SIGCHLD:
  56.                     return 0;
  57.                 default:
  58.                     exit(sig << 8);
  59.                 }
  60.             } else {
  61.                 (*hndle)(sig);
  62.             }
  63.         }
  64.     }
  65.     return 0;
  66. }
  67.  
  68. int
  69. killpg(pgrp, sig)
  70.     int pgrp, sig;
  71. {
  72.     long r;
  73.  
  74.     if (__mint == 0) {
  75.         if (pgrp == 0 || pgrp == getpgrp())
  76.             return kill(getpid(), sig);
  77.         errno = EINVAL;
  78.         return -1;
  79.     }
  80.     if (pgrp < 0) {
  81.         errno = ERANGE;
  82.         return -1;
  83.     }
  84.     r = Pkill(-pgrp, sig);
  85.     if (__mint < 7) {    /* compensate for a bug in MiNT 0.6 */
  86.         (void)Syield();
  87.     }
  88.     if (r < 0) {
  89.         errno = -r;
  90.         return -1;
  91.     }
  92.     return 0;
  93. }
  94.  
  95.