signals.c
author viric@llimona
Mon, 08 Oct 2007 12:59:27 +0200
changeset 79 7d316733d4b1
parent 74 cb3184566c6e
child 82 5cbe47923060
permissions -rw-r--r--
Added filterdes.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12
6a372f8b4b8a Ignore, license and version.
viric@llimona
parents: 7
diff changeset
     1
/*
53
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     2
    Terminal Mixer - multi-point multi-user access to terminal applications
12
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>
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents: 12
diff changeset
     8
#include <string.h>
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
     9
#include <unistd.h>
47
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    10
#include <sys/types.h>
7
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    11
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    12
#include "main.h"
47
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    13
#include "handlers.h"
7
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    14
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    15
static int child;
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    16
static char old_alarm_handler_set;
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    17
static struct sigaction old_alarm_handler;
7
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    18
66
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 60
diff changeset
    19
static int timeout_timed_out; 
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 60
diff changeset
    20
7
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    21
static void forward_signals_to_child_handler(int val)
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    22
{
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    23
    kill(child, val);
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    24
}
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    25
47
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    26
static void update_window_size(int val)
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    27
{
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    28
    char *xterm_str;
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    29
    int len;
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    30
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    31
    pass_winsize_to_slave();
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    32
47
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    33
    kill(child, val);
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    34
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    35
    /* Resend the xterm string */
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    36
    xterm_str = get_xterm_resize_string();
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    37
    len = strlen(xterm_str);
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    38
    if (command_line.s_param.serve_unix)
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    39
        s_unix_send_to_connected(xterm_str, len);
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    40
    if (command_line.s_param.serve_tcp)
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    41
        s_tcp_send_to_connected(xterm_str, len);
49
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 47
diff changeset
    42
#ifdef linux
47
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    43
    if (command_line.s_param.serve_eth)
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    44
        s_eth_send_to_connected(xterm_str, len);
49
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 47
diff changeset
    45
#endif /* linux */
47
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    46
}
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    47
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents: 12
diff changeset
    48
void install_signal_forwarders(int _child)
7
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    49
{
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    50
    struct sigaction act;
7
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    51
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    52
    child = _child;
7
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    53
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    54
    act.sa_handler = forward_signals_to_child_handler;
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    55
    sigemptyset(&act.sa_mask);
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    56
    act.sa_flags = 0;
7
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    57
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    58
    sigaction(SIGTERM, &act, 0);
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    59
    sigaction(SIGINT, &act, 0);
47
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 21
diff changeset
    60
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    61
    act.sa_handler = update_window_size;
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    62
    sigaction(SIGWINCH, &act, 0);
7
af8d59476914 Added signal passing.
viric@llimona
parents:
diff changeset
    63
}
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    64
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    65
static void alarm_handler(int x)
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    66
{
66
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 60
diff changeset
    67
    timeout_timed_out = 1;
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    68
}
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    69
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    70
void program_timeout(int secs)
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    71
{
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    72
    struct sigaction act;
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    73
    struct sigaction *old;
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    74
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    75
    sigemptyset(&act.sa_mask);
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    76
    act.sa_flags = 0;
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    77
    act.sa_handler = alarm_handler;
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    78
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    79
    if (old_alarm_handler_set)
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    80
        old = 0;
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    81
    else
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    82
        old = &old_alarm_handler;
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    83
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    84
    sigaction(SIGALRM, &act, old);
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    85
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    86
    old_alarm_handler_set = 1;
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    87
    timeout_timed_out = 0;
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    88
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    89
    alarm(secs);
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    90
}
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    91
66
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 60
diff changeset
    92
int did_timeout_happen()
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 60
diff changeset
    93
{
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 60
diff changeset
    94
    return timeout_timed_out;
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 60
diff changeset
    95
}
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 60
diff changeset
    96
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    97
void unprogram_timeout()
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    98
{
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
    99
    alarm(0);
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
   100
66
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 60
diff changeset
   101
    timeout_timed_out = 0;
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 60
diff changeset
   102
60
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
   103
    if (old_alarm_handler_set)
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
   104
    {
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
   105
        sigaction(SIGALRM, &old_alarm_handler, 0);
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
   106
        old_alarm_handler_set = 0;
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
   107
    }
18c24be2b1a6 Better ethernet protocol.
viric@llimona
parents: 53
diff changeset
   108
}
71
c209487034d7 True nohup-like behaviour. Programs ignore to SIGHUP.
viric@llimona
parents: 66
diff changeset
   109
c209487034d7 True nohup-like behaviour. Programs ignore to SIGHUP.
viric@llimona
parents: 66
diff changeset
   110
void ignore_sighup()
c209487034d7 True nohup-like behaviour. Programs ignore to SIGHUP.
viric@llimona
parents: 66
diff changeset
   111
{
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
   112
    struct sigaction act;
71
c209487034d7 True nohup-like behaviour. Programs ignore to SIGHUP.
viric@llimona
parents: 66
diff changeset
   113
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
   114
    act.sa_handler = SIG_IGN;
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
   115
    sigemptyset(&act.sa_mask);
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
   116
    act.sa_flags = 0;
71
c209487034d7 True nohup-like behaviour. Programs ignore to SIGHUP.
viric@llimona
parents: 66
diff changeset
   117
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
   118
    sigaction(SIGHUP, &act, 0);
71
c209487034d7 True nohup-like behaviour. Programs ignore to SIGHUP.
viric@llimona
parents: 66
diff changeset
   119
}