php_signal.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 7 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1997-2018 The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 3.01 of the PHP license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available through the world-wide-web at the following url: |
  10. | http://www.php.net/license/3_01.txt |
  11. | If you did not receive a copy of the PHP license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@php.net so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Author: Jason Greene <jason@inetgurus.net> |
  16. +----------------------------------------------------------------------+
  17. */
  18. #include "TSRM.h"
  19. #include "php_signal.h"
  20. #include "Zend/zend.h"
  21. #include "Zend/zend_signal.h"
  22. /* php_signal using sigaction is derived from Advanced Programing
  23. * in the Unix Environment by W. Richard Stevens p 298. */
  24. Sigfunc *php_signal4(int signo, Sigfunc *func, int restart, int mask_all)
  25. {
  26. struct sigaction act,oact;
  27. #ifdef HAVE_STRUCT_SIGINFO_T
  28. act.sa_sigaction = func;
  29. #else
  30. act.sa_handler = func;
  31. #endif
  32. if (mask_all) {
  33. sigfillset(&act.sa_mask);
  34. } else {
  35. sigemptyset(&act.sa_mask);
  36. }
  37. act.sa_flags = 0;
  38. #ifdef HAVE_STRUCT_SIGINFO_T
  39. act.sa_flags |= SA_SIGINFO;
  40. #endif
  41. if (signo == SIGALRM || (! restart)) {
  42. #ifdef SA_INTERRUPT
  43. act.sa_flags |= SA_INTERRUPT; /* SunOS */
  44. #endif
  45. } else {
  46. #ifdef SA_RESTART
  47. act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
  48. #endif
  49. }
  50. if (zend_sigaction(signo, &act, &oact) < 0) {
  51. return (Sigfunc*)SIG_ERR;
  52. }
  53. #ifdef HAVE_STRUCT_SIGINFO_T
  54. return oact.sa_sigaction;
  55. #else
  56. return oact.sa_handler;
  57. #endif
  58. }
  59. Sigfunc *php_signal(int signo, Sigfunc *func, int restart)
  60. {
  61. return php_signal4(signo, func, restart, 0);
  62. }
  63. /*
  64. * Local variables:
  65. * tab-width: 4
  66. * c-basic-offset: 4
  67. * End:
  68. * vim600: noet sw=4 ts=4 fdm=marker
  69. * vim<600: noet sw=4 ts=4
  70. */