CTWM
Toggle main menu visibility
Loading...
Searching...
No Matches
/usr/src/RPM/BUILD/ctwm-4.1.0/signals.c
Go to the documentation of this file.
1
/*
2
* Signal handlers
3
*/
4
5
#include "
ctwm.h
"
6
7
#include <signal.h>
8
#include <stdio.h>
9
#include <stdlib.h>
10
#include <unistd.h>
11
12
#include "
ctwm_shutdown.h
"
13
#include "
signals.h
"
14
15
16
/* Our backends */
17
static
void
sh_restart
(
int
signum);
18
static
void
sh_shutdown
(
int
signum);
19
20
21
// Internal flags for which signals have called us
22
static
bool
sig_restart
=
false
;
23
static
bool
sig_shutdown
=
false
;
24
25
// External flag for whether some signal handler has set a flag that
26
// needs to trigger an action.
27
bool
SignalFlag
=
false
;
28
29
30
/**
31
* Setup signal handlers (run during startup)
32
*/
33
void
34
setup_signal_handlers
(
void
)
35
{
36
// INT/QUIT/TERM: shutdown
37
// XXX Wildly unsafe handler; to be reworked
38
signal(SIGINT,
sh_shutdown
);
39
signal(SIGQUIT,
sh_shutdown
);
40
signal(SIGTERM,
sh_shutdown
);
41
42
// SIGHUP: restart
43
signal(SIGHUP,
sh_restart
);
44
45
// We don't use alarm(), but if we get the stray signal we shouldn't
46
// die...
47
signal(SIGALRM, SIG_IGN);
48
49
// This should be set by default, but just in case; explicitly don't
50
// leave zombies.
51
signal(SIGCHLD, SIG_IGN);
52
53
return
;
54
}
55
56
57
/**
58
* Handle stuff set by a signal flag. Could be a Restart, could be a
59
* Shutdown...
60
*/
61
void
62
handle_signal_flag
(Time t)
63
{
64
// Restarting?
65
if
(
sig_restart
) {
66
// In case it fails, don't loop
67
sig_restart
=
false
;
68
69
// Handle
70
DoRestart
(t);
71
72
// Shouldn't return, but exec() might fail...
73
return
;
74
}
75
76
// Shutting down?
77
if
(
sig_shutdown
) {
78
// Doit
79
DoShutdown
();
80
81
// Can't return!
82
fprintf(stderr,
"%s: DoShutdown() shouldn't return!\n"
,
ProgramName
);
83
exit(1);
84
}
85
86
// ???
87
fprintf(stderr,
"%s: Internal error: unexpected signal flag.\n"
,
88
ProgramName
);
89
return
;
90
}
91
92
93
94
/*
95
* Internal backend bits
96
*/
97
98
/**
99
* Set flag to restart. Backend for SIGHUP.
100
*/
101
static
void
102
sh_restart
(
int
signum)
103
{
104
// Signal handler; stdio isn't async-signal-safe, write(2) is
105
const
char
srf[] =
": signal received, setting restart flag\n"
;
106
write(2,
ProgramName
,
ProgramNameLen
);
107
write(2, srf,
sizeof
(srf));
108
109
SignalFlag
=
sig_restart
=
true
;
110
}
111
112
/**
113
* Set flag to shutdown. Backend for SIGTERM etc.
114
*/
115
static
void
116
sh_shutdown
(
int
signum)
117
{
118
// Signal handler; stdio isn't async-signal-safe, write(2) is
119
const
char
srf[] =
": signal received, setting shutdown flag\n"
;
120
write(2,
ProgramName
,
ProgramNameLen
);
121
write(2, srf,
sizeof
(srf));
122
123
SignalFlag
=
sig_shutdown
=
true
;
124
}
125
ctwm.h
ProgramName
char * ProgramName
Definition
ctwm_main.c:146
SignalFlag
bool SignalFlag
Some signal flag has been set.
Definition
signals.c:27
ProgramNameLen
size_t ProgramNameLen
Definition
ctwm_main.c:147
DoShutdown
void DoShutdown(void)
Cleanup and exit ctwm.
Definition
ctwm_shutdown.c:215
DoRestart
void DoRestart(Time t)
exec() ourself to restart.
Definition
ctwm_shutdown.c:251
ctwm_shutdown.h
sh_shutdown
static void sh_shutdown(int signum)
Set flag to shutdown.
Definition
signals.c:116
setup_signal_handlers
void setup_signal_handlers(void)
Setup signal handlers (run during startup).
Definition
signals.c:34
sh_restart
static void sh_restart(int signum)
Set flag to restart.
Definition
signals.c:102
sig_shutdown
static bool sig_shutdown
Definition
signals.c:23
sig_restart
static bool sig_restart
Definition
signals.c:22
handle_signal_flag
void handle_signal_flag(Time t)
Handle stuff set by a signal flag.
Definition
signals.c:62
signals.h
signals.c
Generated by
1.18.0