home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / lang / lsc30p4u.sit / unixsignal.c < prev   
Text File  |  1989-01-15  |  3KB  |  129 lines

  1. /*    (C) Copyright 1986. THINK Technologies, Inc.  All rights reserved. */    
  2.  
  3. /* This module implements an abbreviated version of signal() and its
  4.     related functions */
  5.  
  6. #ifndef    _unixh_
  7. #include "unix.h"
  8. #endif
  9.  
  10. extern int errno;
  11. extern int (*_key_int_sig_func_)();
  12. extern void abort();
  13.  
  14. static void *sigptr[_SIGMAX+1]; /* array of signal pointers, initially 0 */
  15. static char _initsigterm = 0;    /* flag for special SIGTERM set up */
  16.  
  17. #line 0 dosigterm
  18.  
  19. static void dosigterm()
  20. {register void (*calledfunc)() = sigptr[SIGTERM];
  21.  
  22.     /* if non-zero, call this procedure on exit from application */
  23.     
  24.     if (calledfunc)
  25.         (*calledfunc)(SIGTERM);
  26. }
  27.  
  28.  
  29. #line 0 signal
  30.  
  31. int (*signal(sig, func))()
  32. int sig;
  33. int (*func)();
  34. {
  35. int (*_last_sig_func_)();
  36.  
  37.     /*  SIGINT is presently supported as a special case for trapping ^c
  38.         and ^. (where ^ means the command (fan) key.  ^c and ^. are
  39.         therefore invisible to the application and are swallowed when the
  40.         interrupt procedure is called.  This was done so lots of unix
  41.         code would not get dragged in for those just using stdio. */
  42.  
  43.     switch (sig)
  44.     {
  45.     case SIGINT:
  46.     
  47.                 _last_sig_func_= _key_int_sig_func_;
  48.  
  49.                 /* see if user wants to cause an exit on SIGINT */
  50.  
  51.                 if ((long)func == SIG_DFL)
  52.                     _key_int_sig_func_ = (void*) abort;
  53.                 else
  54.                     if ((long)func == SIG_IGN)
  55.                         _key_int_sig_func_ = 0; /* eliminate any set function */
  56.                     else
  57.                         _key_int_sig_func_ = func; /* set up "catch" function */
  58.                 
  59.                 return (_last_sig_func_); /* return last catch function */    
  60.  
  61.     case SIGTERM:
  62.     
  63.                 /* enable sending a last signal on application termination */
  64.                 
  65.                 if (!_initsigterm)
  66.                 {
  67.                     _initsigterm = 1;
  68.                     _onexit(dosigterm);
  69.                 }
  70.     default:
  71.                 if ((sig > 0) && (sig <= _SIGMAX))
  72.                 {
  73.                     _last_sig_func_ = sigptr[sig];
  74.  
  75.                     /* see if user wants to cause an exit on signal */
  76.     
  77.                     if ((long)func == SIG_DFL)
  78.                         sigptr[sig] = (void*) abort;
  79.                     else
  80.                         if ((long)func == SIG_IGN)
  81.                             sigptr[sig] = 0; /* eliminate any set function */
  82.                         else
  83.                             sigptr[sig] = func; /* set up "catch" function */
  84.                     
  85.                     return (_last_sig_func_); /* return last catch function */    
  86.                 }
  87.                 
  88.                 if (sig == 0) return (0);
  89.                 
  90.                 /* signal value out of range */
  91.                 
  92.                 errno = EINVAL;
  93.                 return ((void*)-1);
  94.     }
  95. }
  96.  
  97. #line 0 kill
  98.  
  99. kill(pid, sig)
  100. int pid, sig;
  101. {
  102.     if ((sig > _SIGMAX) || (sig < 0))
  103.     {
  104.         /* signal value out of range */
  105.         errno = EINVAL;
  106.         return (-1);
  107.     }
  108.  
  109.     if ((pid == getpid()) || (pid <= 0))
  110.     {register void (*calledfunc)() = sigptr[sig];
  111.  
  112.         if (sig)
  113.         {
  114.             /* send a signal to ourself! */
  115.     
  116.             sigptr[sig] = (void*) SIG_DFL;
  117.             
  118.             if (calledfunc)
  119.                 (*calledfunc)(sig);
  120.         }
  121.         
  122.         return (0);
  123.     }
  124.  
  125.     errno = ESRCH;    /* no such process */
  126.     return (-1);
  127. }
  128.     
  129.