home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / D / LIBC / LIBC-4.6 / LIBC-4 / libc-linux / sysdeps / linux / m68k / __sigact.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-24  |  834 b   |  41 lines

  1. #include <syscall.h>
  2. #include <signal.h>
  3. #include <errno.h>
  4.  
  5. extern void ___sig_restore();
  6. extern void ___masksig_restore();
  7.  
  8. int
  9. __sigaction(int sig,struct sigaction * new, struct sigaction * old)
  10. {
  11.     if (new) {
  12.         if (new->sa_flags & SA_NOMASK)
  13.             new->sa_restorer=___sig_restore;
  14.         else
  15.             new->sa_restorer=___masksig_restore;
  16.     }
  17.  
  18. #if defined(__PIC__) || defined (__pic__)
  19.     __asm__ volatile ("pushl %%ebx\n\t"
  20.               "movl %%edi,%%ebx\n\t"
  21.               "int $0x80\n\t"
  22.               "popl %%ebx"
  23.         :"=a" (sig)
  24.         :"0" (SYS_sigaction),"D" (sig),"c" (new),"d" (old));
  25. #else
  26.     __asm__("movel %1,d0\n\t"
  27.         "movel %2,d1\n\t"
  28.         "movel %3,d2\n\t"
  29.         "movel %4,d3\n\t"
  30.         "trap  #0\n\t"
  31.         "movel d0,%0"
  32.         : "=g" (sig)
  33.         :"i" (SYS_sigaction), "g" (sig), "g" (new), "g" (old)
  34.         : "d0", "d1", "d2", "d3");
  35. #endif
  36.     if (sig>=0)
  37.         return 0;
  38.     errno = -sig;
  39.     return -1;
  40. }
  41.