/contrib/ntp/libntp/syssignal.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 133 lines · 114 code · 17 blank · 2 comment · 24 complexity · 3aae6710449b7bd99f3bc748f8f2da73 MD5 · raw file

  1. #ifdef HAVE_CONFIG_H
  2. # include <config.h>
  3. #endif
  4. #include <stdio.h>
  5. #include <sys/types.h>
  6. #include <signal.h>
  7. #include "ntp_syslog.h"
  8. #include "ntp_stdlib.h"
  9. #ifdef HAVE_SIGACTION
  10. void
  11. signal_no_reset(
  12. #if defined(__STDC__) || defined(HAVE_STDARG_H)
  13. int sig,
  14. void (*func) (int)
  15. #else
  16. sig, func
  17. #endif
  18. )
  19. #if defined(__STDC__) || defined(HAVE_STDARG_H)
  20. #else
  21. int sig;
  22. void (*func) P((int));
  23. #endif
  24. {
  25. int n;
  26. struct sigaction vec;
  27. vec.sa_handler = func;
  28. sigemptyset(&vec.sa_mask);
  29. #if 0
  30. #ifdef SA_RESTART
  31. vec.sa_flags = SA_RESTART;
  32. #else
  33. vec.sa_flags = 0;
  34. #endif
  35. #else
  36. vec.sa_flags = 0;
  37. #endif
  38. #ifdef SA_RESTART
  39. /* Added for PPS clocks on Solaris 7 which get EINTR errors */
  40. # ifdef SIGPOLL
  41. if (sig == SIGPOLL) vec.sa_flags = SA_RESTART;
  42. # endif
  43. # ifdef SIGIO
  44. if (sig == SIGIO) vec.sa_flags = SA_RESTART;
  45. # endif
  46. #endif
  47. while (1)
  48. {
  49. struct sigaction ovec;
  50. n = sigaction(sig, &vec, &ovec);
  51. if (n == -1 && errno == EINTR) continue;
  52. if (ovec.sa_flags
  53. #ifdef SA_RESTART
  54. && ovec.sa_flags != SA_RESTART
  55. #endif
  56. )
  57. msyslog(LOG_DEBUG, "signal_no_reset: signal %d had flags %x",
  58. sig, ovec.sa_flags);
  59. break;
  60. }
  61. if (n == -1) {
  62. perror("sigaction");
  63. exit(1);
  64. }
  65. }
  66. #elif HAVE_SIGVEC
  67. void
  68. signal_no_reset(
  69. int sig,
  70. RETSIGTYPE (*func) (int)
  71. )
  72. {
  73. struct sigvec sv;
  74. int n;
  75. bzero((char *) &sv, sizeof(sv));
  76. sv.sv_handler = func;
  77. n = sigvec(sig, &sv, (struct sigvec *)NULL);
  78. if (n == -1) {
  79. perror("sigvec");
  80. exit(1);
  81. }
  82. }
  83. #elif HAVE_SIGSET
  84. void
  85. signal_no_reset(
  86. int sig,
  87. RETSIGTYPE (*func) (int)
  88. )
  89. {
  90. int n;
  91. n = sigset(sig, func);
  92. if (n == -1) {
  93. perror("sigset");
  94. exit(1);
  95. }
  96. }
  97. #else
  98. /* Beware! This implementation resets the signal to SIG_DFL */
  99. void
  100. signal_no_reset(
  101. int sig,
  102. RETSIGTYPE (*func) (int)
  103. )
  104. {
  105. #ifdef SIG_ERR
  106. if (SIG_ERR == signal(sig, func)) {
  107. #else
  108. int n;
  109. n = signal(sig, func);
  110. if (n == -1) {
  111. #endif
  112. perror("signal");
  113. exit(1);
  114. }
  115. }
  116. #endif