signals.c
author viric@llimona
Fri, 14 Sep 2007 22:26:58 +0200
changeset 12 6a372f8b4b8a
parent 7 af8d59476914
child 21 a82c88322eb5
permissions -rw-r--r--
Ignore, license and version.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 7
diff changeset
     1
/*
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 7
diff changeset
     2
    stdin mix - a mixer/multiplexer for stdin to processes
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 7
diff changeset
     3
    Copyright (C) 2007  LluĂ­s Batlle i Rossell
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 7
diff changeset
     4
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 7
diff changeset
     5
    Please find the license in the provided COPYING file.
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 7
diff changeset
     6
*/
7
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
     7
#include <signal.h>
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
     8
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
     9
#include "main.h"
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    10
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    11
static int child;
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    12
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    13
static void forward_signals_to_child_handler(int val)
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    14
{
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    15
    kill(child, val);
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    16
}
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    17
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    18
int install_signal_forwarders(int _child)
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    19
{
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    20
  struct sigaction act;
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    21
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    22
  child = _child;
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    23
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    24
  act.sa_handler = forward_signals_to_child_handler;
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    25
  /* Reset the mask */
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    26
  memset(&act.sa_mask,0,sizeof(act.sa_mask));
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    27
  act.sa_flags = 0;
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    28
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    29
  sigaction(SIGTERM, &act, 0);
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    30
  sigaction(SIGINT, &act, 0);
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    31
}