OpenVAS Scanner  5.1.3
sighand.c File Reference
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <execinfo.h>
#include "log.h"
#include "sighand.h"
#include "utils.h"
#include "string.h"
#include <openvas/base/pidfile.h>
Include dependency graph for sighand.c:

Go to the source code of this file.

Functions

void let_em_die (int pid)
 
void make_em_die (int sig)
 
void sighand_chld (pid_t pid)
 
void sighand_segv (int given_signal)
 

Variables

void(*)(int) openvas_signal (int signum, void(*handler)(int))
 

Function Documentation

◆ let_em_die()

void let_em_die ( int  pid)

Definition at line 44 of file sighand.c.

Referenced by make_em_die().

45 {
46  int status;
47 
48  waitpid (pid, &status, WNOHANG);
49 }
Here is the caller graph for this function:

◆ make_em_die()

void make_em_die ( int  sig)

Definition at line 53 of file sighand.c.

References let_em_die().

54 {
55  /* number of times, the sig is sent at most */
56  int n = 3;
57 
58  /* leave if we are session leader */
59  if (getpgrp () != getpid ())
60  return;
61 
62  /* quickly send signals and check the result */
63  if (kill (0, sig) < 0)
64  return;
65  let_em_die (0);
66  if (kill (0, 0) < 0)
67  return;
68 
69  do
70  {
71  /* send the signal to everybody in the group */
72  if (kill (0, sig) < 0)
73  return;
74  sleep (1);
75  /* do not leave a zombie, hanging around if possible */
76  let_em_die (0);
77  }
78  while (--n > 0);
79 
80  if (kill (0, 0) < 0)
81  return;
82 
83  kill (0, SIGKILL);
84  sleep (1);
85  let_em_die (0);
86 }
void let_em_die(int pid)
Definition: sighand.c:44
Here is the call graph for this function:

◆ sighand_chld()

void sighand_chld ( pid_t  pid)

Definition at line 109 of file sighand.c.

110 {
111  int status;
112 
113  waitpid (pid, &status, WNOHANG);
114 }

◆ sighand_segv()

void sighand_segv ( int  given_signal)

Definition at line 145 of file sighand.c.

146 {
147  signal (SIGSEGV, _exit);
148  print_trace ();
149  make_em_die (SIGTERM);
150  /* Raise signal again, to exit with the correct return value,
151  * and to enable core dumping. */
152  openvas_signal (given_signal, SIG_DFL);
153  raise (given_signal);
154 }
void(*)(int) openvas_signal(int signum, void(*handler)(int))
Definition: sighand.c:92
void make_em_die(int sig)
Definition: sighand.c:53

Variable Documentation

◆ openvas_signal

void(*)(int) openvas_signal(int signum, void(*handler)(int))

Definition at line 92 of file sighand.c.

93 {
94  struct sigaction saNew, saOld;
95 
96  /* Init new handler */
97  sigfillset (&saNew.sa_mask);
98  sigdelset (&saNew.sa_mask, SIGALRM); /* make sleep() work */
99 
100  saNew.sa_flags = 0;
101  saNew.sa_handler = handler;
102 
103  sigaction (signum, &saNew, &saOld);
104  return saOld.sa_handler;
105 }