[systemd-commits] NEWS TODO man/systemd.exec.xml src/dbus-execute.c src/dbus-execute.h src/execute.c src/execute.h src/load-fragment-gperf.gperf.m4 src/service.c units/console-shell.service.m4 units/emergency.service units/fedora units/getty at .service.m4 units/serial-getty at .service.m4

Lennart Poettering lennart at kemper.freedesktop.org
Wed Feb 8 18:42:36 PST 2012


 NEWS                             |    5 +++++
 TODO                             |    2 ++
 man/systemd.exec.xml             |   11 +++++++++++
 src/dbus-execute.c               |    1 +
 src/dbus-execute.h               |    3 ++-
 src/execute.c                    |   14 ++++++++++----
 src/execute.h                    |    2 ++
 src/load-fragment-gperf.gperf.m4 |    1 +
 src/service.c                    |    1 +
 units/console-shell.service.m4   |    1 +
 units/emergency.service          |    1 +
 units/fedora/prefdm.service      |    1 +
 units/getty at .service.m4          |    1 +
 units/serial-getty at .service.m4   |    1 +
 14 files changed, 40 insertions(+), 5 deletions(-)

New commits:
commit 353e12c2f4a9e96a47eb80b80d2ffb7bc1d44a1b
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 9 03:18:04 2012 +0100

    service: ignore SIGPIPE by default

diff --git a/NEWS b/NEWS
index e95ac63..7dcac85 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 42d577b..ed857f8 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 8c363a0..ac0f89f 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 c5abcf6..1fd2b21 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 0aea99e..03cd69d 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 536877d..dab4856 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 ed90c6e..0d7e7dd 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 9191f90..9708ff8 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 a190a73..9ccb1b6 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 02adc84..fef9e1b 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 4847f4f..234bafc 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 17ed4cd..77a0e9a 100644
--- a/units/fedora/prefdm.service
+++ b/units/fedora/prefdm.service
@@ -18,3 +18,4 @@ After=getty at tty1.service plymouth-quit.service
 ExecStart=/etc/X11/prefdm -nodaemon
 Restart=always
 RestartSec=0
+IgnoreSIGPIPE=no
diff --git a/units/getty at .service.m4 b/units/getty at .service.m4
index d2a145d..a02838d 100644
--- a/units/getty at .service.m4
+++ b/units/getty at .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 at .service.m4 b/units/serial-getty at .service.m4
index e5f0ca6..fc8b57b 100644
--- a/units/serial-getty at .service.m4
+++ b/units/serial-getty at .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.



More information about the systemd-commits mailing list