chiark / gitweb /
core: open up SendSIGHUP property for transient units
authorLennart Poettering <lennart@poettering.net>
Tue, 30 Jul 2013 00:28:22 +0000 (02:28 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 30 Jul 2013 00:54:56 +0000 (02:54 +0200)
man/systemd-run.xml
src/core/dbus-kill.c
src/core/dbus-kill.h
src/core/dbus-scope.c
src/core/dbus-service.c
src/run/run.c

index 707d88d..e1e8851 100644 (file)
@@ -160,6 +160,18 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
         </para>
         </listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><option>--send-sighup</option></term>
+
+        <listitem><para>When terminating the scope unit send a SIGHUP
+        immediately after SIGTERM. This is useful to indicate to
+        shells and shell-like processes that the connection has been
+        sewered. Also see <varname>SendSIGHUP=</varname> in
+        <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+        </para>
+        </listitem>
+      </varlistentry>
     </variablelist>
 
     <para>All command-line arguments after the first non-option
index e970ea3..beae7da 100644 (file)
 #include "dbus-kill.h"
 #include "dbus-common.h"
 
-DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_kill_append_mode, kill_mode, KillMode);
+static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_kill_append_mode, kill_mode, KillMode);
 
 const BusProperty bus_kill_context_properties[] = {
         { "KillMode",    bus_kill_append_mode,     "s", offsetof(KillContext, kill_mode)    },
         { "KillSignal",  bus_property_append_int,  "i", offsetof(KillContext, kill_signal)  },
         { "SendSIGKILL", bus_property_append_bool, "b", offsetof(KillContext, send_sigkill) },
         { "SendSIGHUP",  bus_property_append_bool, "b", offsetof(KillContext, send_sighup)  },
-        { NULL, }
+        {}
 };
+
+int bus_kill_context_set_transient_property(
+                Unit *u,
+                KillContext *c,
+                const char *name,
+                DBusMessageIter *i,
+                UnitSetPropertiesMode mode,
+                DBusError *error) {
+
+        assert(u);
+        assert(c);
+        assert(name);
+        assert(i);
+
+        if (streq(name, "SendSIGHUP")) {
+
+                if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_BOOLEAN)
+                        return -EINVAL;
+
+                if (mode != UNIT_CHECK) {
+                        dbus_bool_t b;
+                        dbus_message_iter_get_basic(i, &b);
+                        c->send_sighup = b;
+                }
+
+                return 1;
+
+        } else if (streq(name, "SendSIGKILL")) {
+
+                if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_BOOLEAN)
+                        return -EINVAL;
+
+                if (mode != UNIT_CHECK) {
+                        dbus_bool_t b;
+                        dbus_message_iter_get_basic(i, &b);
+                        c->send_sigkill = b;
+                }
+
+                return 1;
+
+        }
+
+        return 0;
+}
index 8c8bff5..7676d98 100644 (file)
@@ -34,4 +34,4 @@
 
 extern const BusProperty bus_kill_context_properties[];
 
-int bus_kill_append_mode(DBusMessageIter *i, const char *property, void *data);
+int bus_kill_context_set_transient_property(Unit *u, KillContext *c, const char *name, DBusMessageIter *i, UnitSetPropertiesMode mode, DBusError *error);
index 771820c..497e452 100644 (file)
@@ -170,6 +170,10 @@ int bus_scope_set_property(
                 r = bus_scope_set_transient_property(s, name, i, mode, error);
                 if (r != 0)
                         return r;
+
+                r = bus_kill_context_set_transient_property(u, &s->kill_context, name, i, mode, error);
+                if (r != 0)
+                        return r;
         }
 
         return 0;
index 1a44e1f..85b13f0 100644 (file)
@@ -324,6 +324,10 @@ int bus_service_set_property(
                 r = bus_service_set_transient_property(s, name, i, mode, error);
                 if (r != 0)
                         return r;
+
+                r = bus_kill_context_set_transient_property(u, &s->kill_context, name, i, mode, error);
+                if (r != 0)
+                        return r;
         }
 
         return 0;
index c1a0ffb..c5d314b 100644 (file)
@@ -35,6 +35,7 @@ static bool arg_remain_after_exit = false;
 static const char *arg_unit = NULL;
 static const char *arg_description = NULL;
 static const char *arg_slice = NULL;
+static bool arg_send_sighup = false;
 
 static int help(void) {
 
@@ -47,7 +48,8 @@ static int help(void) {
                "     --unit=UNIT          Run under the specified unit name\n"
                "     --description=TEXT   Description for unit\n"
                "     --slice=SLICE        Run in the specified slice\n"
-               "  -r --remain-after-exit  Leave service around until explicitly stopped\n",
+               "  -r --remain-after-exit  Leave service around until explicitly stopped\n"
+               "     --send-sighup        Send SIGHUP when terminating\n",
                program_invocation_short_name);
 
         return 0;
@@ -61,7 +63,8 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_SCOPE,
                 ARG_UNIT,
                 ARG_DESCRIPTION,
-                ARG_SLICE
+                ARG_SLICE,
+                ARG_SEND_SIGHUP,
         };
 
         static const struct option options[] = {
@@ -72,7 +75,8 @@ static int parse_argv(int argc, char *argv[]) {
                 { "unit",              required_argument, NULL, ARG_UNIT        },
                 { "description",       required_argument, NULL, ARG_DESCRIPTION },
                 { "slice",             required_argument, NULL, ARG_SLICE       },
-                { "remain-after-exit", required_argument, NULL, 'r'             },
+                { "remain-after-exit", no_argument,       NULL, 'r'             },
+                { "send-sighup",       no_argument,       NULL, ARG_SEND_SIGHUP },
                 { NULL,                0,                 NULL, 0               },
         };
 
@@ -114,6 +118,10 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_slice = optarg;
                         break;
 
+                case ARG_SEND_SIGHUP:
+                        arg_send_sighup = true;
+                        break;
+
                 case 'r':
                         arg_remain_after_exit = true;
                         break;
@@ -174,6 +182,10 @@ static int message_start_transient_unit_new(sd_bus *bus, const char *name, sd_bu
                         return r;
         }
 
+        r = sd_bus_message_append(m, "(sv)", "SendSIGHUP", "b", arg_send_sighup);
+        if (r < 0)
+                return r;
+
         *ret = m;
         m = NULL;