summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-02-09 03:18:04 +0100
committerLennart Poettering <lennart@poettering.net>2012-02-09 03:18:04 +0100
commit353e12c2f4a9e96a47eb80b80d2ffb7bc1d44a1b (patch)
tree0bd79a2c40d8d60892666affbbb89690f29c672e
parent12ac304714996c3c3308d014b301d0d42d16c117 (diff)
service: ignore SIGPIPE by defaultv41
-rw-r--r--NEWS5
-rw-r--r--TODO2
-rw-r--r--man/systemd.exec.xml11
-rw-r--r--src/dbus-execute.c1
-rw-r--r--src/dbus-execute.h3
-rw-r--r--src/execute.c14
-rw-r--r--src/execute.h2
-rw-r--r--src/load-fragment-gperf.gperf.m41
-rw-r--r--src/service.c1
-rw-r--r--units/console-shell.service.m41
-rw-r--r--units/emergency.service1
-rw-r--r--units/fedora/prefdm.service1
-rw-r--r--units/getty@.service.m41
-rw-r--r--units/serial-getty@.service.m41
14 files changed, 40 insertions, 5 deletions
diff --git a/NEWS b/NEWS
index e95ac637e..7dcac85fe 100644
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,11 @@ CHANGES WITH 41:
* We now limit the set of capabilities of systemd-journald.
+ * We now set SIGPIPE to ignore by default, since it only is
+ useful in shell pipelines, and has little use in general
+ code. This can be disabled with IgnoreSIPIPE=no in unit
+ files.
+
Contributions from: Benjamin Franzke, Kay Sievers, Lennart
Poettering, Michael Olbrich, Michal Schmidt, Tom Gundersen,
William Douglas
diff --git a/TODO b/TODO
index 42d577ba7..ed857f836 100644
--- a/TODO
+++ b/TODO
@@ -21,6 +21,8 @@ Bugfixes:
Features:
+* add interface to allow immediate rotation of the journal, and even flushing.
+
* don't log coredumps of PID 1 into the journal
* if a journal file is corrupt, rotate it and create a new one
diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index 8c363a069..ac0f89fb8 100644
--- a/man/systemd.exec.xml
+++ b/man/systemd.exec.xml
@@ -1075,6 +1075,17 @@
this service.</para></listitem>
</varlistentry>
+ <varlistentry>
+ <term><varname>IgnoreSIGPIPE=</varname></term>
+
+ <listitem><para>Takes a boolean
+ argument. If true causes SIGPIPE to be
+ ignored in the executed
+ process. Defaults to true, since
+ SIGPIPE generally is useful only in
+ shell pipelines.</para></listitem>
+ </varlistentry>
+
</variablelist>
</refsect1>
diff --git a/src/dbus-execute.c b/src/dbus-execute.c
index c5abcf674..1fd2b2133 100644
--- a/src/dbus-execute.c
+++ b/src/dbus-execute.c
@@ -417,5 +417,6 @@ const BusProperty bus_exec_context_properties[] = {
{ "UtmpIdentifier", bus_property_append_string, "s", offsetof(ExecContext, utmp_id), true },
{ "ControlGroupModify", bus_property_append_bool, "b", offsetof(ExecContext, control_group_modify) },
{ "ControlGroupPersistent", bus_property_append_tristate_false, "b", offsetof(ExecContext, control_group_persistent) },
+ { "IgnoreSIGPIPE", bus_property_append_bool, "b", offsetof(ExecContext, ignore_sigpipe ) },
{ NULL, }
};
diff --git a/src/dbus-execute.h b/src/dbus-execute.h
index 0aea99e33..03cd69d12 100644
--- a/src/dbus-execute.h
+++ b/src/dbus-execute.h
@@ -95,7 +95,8 @@
" <property name=\"UtmpIdentifier\" type=\"s\" access=\"read\"/>\n" \
" <property name=\"ControlGroupModify\" type=\"b\" access=\"read\"/>\n" \
" <property name=\"ControlGroupPersistent\" type=\"b\" access=\"read\"/>\n" \
- " <property name=\"PrivateNetwork\" type=\"b\" access=\"read\"/>\n"
+ " <property name=\"PrivateNetwork\" type=\"b\" access=\"read\"/>\n" \
+ " <property name=\"IgnoreSIGPIPE\" type=\"b\" access=\"read\"/>\n"
#define BUS_EXEC_COMMAND_INTERFACE(name) \
" <property name=\"" name "\" type=\"a(sasbttuii)\" access=\"read\"/>\n"
diff --git a/src/execute.c b/src/execute.c
index 536877d68..dab485682 100644
--- a/src/execute.c
+++ b/src/execute.c
@@ -1038,8 +1038,11 @@ int exec_spawn(ExecCommand *command,
default_signals(SIGNALS_CRASH_HANDLER,
SIGNALS_IGNORE, -1);
- if (sigemptyset(&ss) < 0 ||
- sigprocmask(SIG_SETMASK, &ss, NULL) < 0) {
+ if (context->ignore_sigpipe)
+ ignore_signals(SIGPIPE, -1);
+
+ assert_se(sigemptyset(&ss) == 0);
+ if (sigprocmask(SIG_SETMASK, &ss, NULL) < 0) {
err = -errno;
r = EXIT_SIGNAL_MASK;
goto fail_child;
@@ -1528,6 +1531,7 @@ void exec_context_init(ExecContext *c) {
c->kill_signal = SIGTERM;
c->send_sigkill = true;
c->control_group_persistent = -1;
+ c->ignore_sigpipe = true;
}
void exec_context_done(ExecContext *c) {
@@ -1876,10 +1880,12 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
fprintf(f,
"%sKillMode: %s\n"
"%sKillSignal: SIG%s\n"
- "%sSendSIGKILL: %s\n",
+ "%sSendSIGKILL: %s\n"
+ "%sIgnoreSIGPIPE: %s\n",
prefix, kill_mode_to_string(c->kill_mode),
prefix, signal_to_string(c->kill_signal),
- prefix, yes_no(c->send_sigkill));
+ prefix, yes_no(c->send_sigkill),
+ prefix, yes_no(c->ignore_sigpipe));
if (c->utmp_id)
fprintf(f,
diff --git a/src/execute.h b/src/execute.h
index ed90c6e3e..0d7e7dd65 100644
--- a/src/execute.h
+++ b/src/execute.h
@@ -128,6 +128,8 @@ struct ExecContext {
bool tty_vhangup;
bool tty_vt_disallocate;
+ bool ignore_sigpipe;
+
/* Since resolving these names might might involve socket
* connections and we don't want to deadlock ourselves these
* names are resolved on execution only and in the child
diff --git a/src/load-fragment-gperf.gperf.m4 b/src/load-fragment-gperf.gperf.m4
index 9191f9064..9708ff828 100644
--- a/src/load-fragment-gperf.gperf.m4
+++ b/src/load-fragment-gperf.gperf.m4
@@ -85,6 +85,7 @@ $1.PAMName, config_parse_unit_string_printf, 0,
$1.KillMode, config_parse_kill_mode, 0, offsetof($1, exec_context.kill_mode)
$1.KillSignal, config_parse_kill_signal, 0, offsetof($1, exec_context.kill_signal)
$1.SendSIGKILL, config_parse_bool, 0, offsetof($1, exec_context.send_sigkill)
+$1.IgnoreSIGPIPE, config_parse_bool, 0, offsetof($1, exec_context.ignore_sigpipe)
$1.UtmpIdentifier, config_parse_unit_string_printf, 0, offsetof($1, exec_context.utmp_id)
$1.ControlGroupModify, config_parse_bool, 0, offsetof($1, exec_context.control_group_modify)
$1.ControlGroupPersistent, config_parse_tristate, 0, offsetof($1, exec_context.control_group_persistent)'
diff --git a/src/service.c b/src/service.c
index a190a73b4..9ccb1b6bc 100644
--- a/src/service.c
+++ b/src/service.c
@@ -894,6 +894,7 @@ static int service_load_sysv_path(Service *s, const char *path) {
s->remain_after_exit = !s->pid_file;
s->guess_main_pid = false;
s->restart = SERVICE_RESTART_NO;
+ s->exec_context.ignore_sigpipe = false;
if (UNIT(s)->manager->sysv_console)
s->exec_context.std_output = EXEC_OUTPUT_JOURNAL_AND_CONSOLE;
diff --git a/units/console-shell.service.m4 b/units/console-shell.service.m4
index 02adc8403..fef9e1b17 100644
--- a/units/console-shell.service.m4
+++ b/units/console-shell.service.m4
@@ -37,6 +37,7 @@ StandardInput=tty-force
StandardOutput=inherit
StandardError=inherit
KillMode=process
+IgnoreSIGPIPE=no
# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
# terminates cleanly.
diff --git a/units/emergency.service b/units/emergency.service
index 4847f4f0c..234bafcc8 100644
--- a/units/emergency.service
+++ b/units/emergency.service
@@ -24,6 +24,7 @@ StandardInput=tty-force
StandardOutput=inherit
StandardError=inherit
KillMode=process
+IgnoreSIGPIPE=no
# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
# terminates cleanly.
diff --git a/units/fedora/prefdm.service b/units/fedora/prefdm.service
index 17ed4cd78..77a0e9ad7 100644
--- a/units/fedora/prefdm.service
+++ b/units/fedora/prefdm.service
@@ -18,3 +18,4 @@ After=getty@tty1.service plymouth-quit.service
ExecStart=/etc/X11/prefdm -nodaemon
Restart=always
RestartSec=0
+IgnoreSIGPIPE=no
diff --git a/units/getty@.service.m4 b/units/getty@.service.m4
index d2a145dac..a02838d78 100644
--- a/units/getty@.service.m4
+++ b/units/getty@.service.m4
@@ -44,6 +44,7 @@ TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
+IgnoreSIGPIPE=no
# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
diff --git a/units/serial-getty@.service.m4 b/units/serial-getty@.service.m4
index e5f0ca6c6..fc8b57b93 100644
--- a/units/serial-getty@.service.m4
+++ b/units/serial-getty@.service.m4
@@ -43,6 +43,7 @@ TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
KillMode=process
+IgnoreSIGPIPE=no
# Some login implementations ignore SIGTERM, so we send SIGHUP
# instead, to ensure that login terminates cleanly.