[systemd-commits] 6 commits - src/core src/shared src/systemctl

Michal Schmidt michich at kemper.freedesktop.org
Wed Jun 13 12:31:57 PDT 2012


 src/core/unit.c           |   10 -
 src/shared/unit-name.c    |   13 +
 src/shared/unit-name.h    |    2 
 src/systemctl/systemctl.c |  335 +++++++++++++++++++++++++++++-----------------
 4 files changed, 234 insertions(+), 126 deletions(-)

New commits:
commit 48899192a7b28b6a338cc8ec18aa35ccd8867acb
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Wed Jun 13 18:22:08 2012 +0200

    unit-name: introduce unit_dbus_path_from_name()
    
    Use the same function in core and in systemctl.
    get_unit_path() in systemctl becomes unnecessary.

diff --git a/src/core/unit.c b/src/core/unit.c
index f53bdd5..4cffc57 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -1835,20 +1835,12 @@ int set_unit_path(const char *p) {
 }
 
 char *unit_dbus_path(Unit *u) {
-        char *p, *e;
-
         assert(u);
 
         if (!u->id)
                 return NULL;
 
-        if (!(e = bus_path_escape(u->id)))
-                return NULL;
-
-        p = strappend("/org/freedesktop/systemd1/unit/", e);
-        free(e);
-
-        return p;
+        return unit_dbus_path_from_name(u->id);
 }
 
 int unit_add_cgroup(Unit *u, CGroupBonding *b) {
diff --git a/src/shared/unit-name.c b/src/shared/unit-name.c
index 1440d2f..91f464e 100644
--- a/src/shared/unit-name.c
+++ b/src/shared/unit-name.c
@@ -458,3 +458,16 @@ char *unit_name_path_unescape(const char *f) {
 
         return e;
 }
+
+char *unit_dbus_path_from_name(const char *name) {
+        char *e, *p;
+
+        e = bus_path_escape(name);
+        if (!e)
+                return NULL;
+
+        p = strappend("/org/freedesktop/systemd1/unit/", e);
+        free(e);
+
+        return p;
+}
diff --git a/src/shared/unit-name.h b/src/shared/unit-name.h
index 4dfb9fa..7aab2e5 100644
--- a/src/shared/unit-name.h
+++ b/src/shared/unit-name.h
@@ -54,4 +54,6 @@ char *unit_name_from_path(const char *path, const char *suffix);
 char *unit_name_from_path_instance(const char *prefix, const char *path, const char *suffix);
 char *unit_name_to_path(const char *name);
 
+char *unit_dbus_path_from_name(const char *name);
+
 #endif
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 223e862..ae61130 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -1500,75 +1500,6 @@ finish:
         return r;
 }
 
-static int get_unit_path(
-                DBusConnection *bus,
-                const char *name,
-                char **unit_path) {
-
-        DBusError error;
-        DBusMessage *m = NULL, *reply = NULL;
-        char *path;
-        int r = 0;
-
-        assert(bus);
-        assert(name);
-        assert(unit_path);
-
-        dbus_error_init(&error);
-
-        m = dbus_message_new_method_call("org.freedesktop.systemd1",
-                                         "/org/freedesktop/systemd1",
-                                         "org.freedesktop.systemd1.Manager",
-                                         "GetUnit");
-        if (!m) {
-                log_error("Could not allocate message.");
-                r = -ENOMEM;
-                goto finish;
-        }
-
-        if (!dbus_message_append_args(m,
-                                      DBUS_TYPE_STRING, &name,
-                                      DBUS_TYPE_INVALID)) {
-                log_error("Could not append arguments to message.");
-                r = -ENOMEM;
-                goto finish;
-        }
-
-        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
-        if (!reply) {
-                if (streq(error.name, BUS_ERROR_NO_SUCH_UNIT))
-                        r = -EINVAL;
-                else {
-                        log_error("Failed to issue method call: %s", bus_error_message(&error));
-                        r = -EIO;
-                }
-                goto finish;
-        }
-
-        if (!dbus_message_get_args(reply, &error,
-                                   DBUS_TYPE_OBJECT_PATH, &path,
-                                   DBUS_TYPE_INVALID)) {
-                log_error("Failed to parse reply: %s", bus_error_message(&error));
-                r = -EIO;
-                goto finish;
-        }
-
-        *unit_path = strdup(path);
-        if (!(*unit_path)) {
-               log_error("Failed to duplicate unit path");
-               r = -ENOMEM;
-        }
-finish:
-        if (m)
-                dbus_message_unref(m);
-        if (reply)
-                dbus_message_unref(reply);
-
-        dbus_error_free(&error);
-
-        return r;
-}
-
 static int check_one_unit(DBusConnection *bus, char *name, bool quiet) {
         DBusMessage *m = NULL, *reply = NULL;
         DBusError error;
@@ -1701,8 +1632,11 @@ static void check_triggering_units(
 
         dbus_error_init(&error);
 
-        if (get_unit_path(bus, unit_name, &unit_path) < 0)
+        unit_path = unit_dbus_path_from_name(unit_name);
+        if (!unit_path) {
+                log_error("Could not allocate dbus path.");
                 goto finish;
+        }
 
         m = dbus_message_new_method_call("org.freedesktop.systemd1",
                                          unit_path,
@@ -3306,12 +3240,7 @@ static int show(DBusConnection *bus, char **args) {
 
                         /* Interpret as unit name */
 
-                        char *e, *p;
-                        e = bus_path_escape(*name);
-                        if (!e)
-                                return -ENOMEM;
-                        p = strappend("/org/freedesktop/systemd1/unit/", e);
-                        free(e);
+                        char *p = unit_dbus_path_from_name(*name);
                         if (!p)
                                 return -ENOMEM;
 

commit 1c291cf34cb22c8ca5ec0db122bd5e8bfabe9ac5
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Wed Jun 13 18:27:41 2012 +0200

    systemctl: warn about all active triggers, not just sockets

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 0e6b2ec..223e862 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -1685,7 +1685,7 @@ finish:
         return r;
 }
 
-static void check_listening_sockets(
+static void check_triggering_units(
                 DBusConnection *bus,
                 const char *unit_name) {
 
@@ -1748,20 +1748,17 @@ static void check_listening_sockets(
 
                 dbus_message_iter_get_basic(&sub, &service_trigger);
 
-                if (!endswith(service_trigger, ".socket"))
-                        goto next;
-
                 r = check_one_unit(bus, service_trigger, true);
                 if (r < 0)
                         goto finish;
                 if (r == 0) {
                         if (print_warning_label) {
-                                log_warning("There are listening sockets associated with %s :", unit_name);
+                                log_warning("Warning: Stopping %s, but it can still be activated by:", unit_name);
                                 print_warning_label = false;
                         }
-                        log_warning("%s", service_trigger);
+                        log_warning("  %s", service_trigger);
                 }
-next:
+
                 dbus_message_iter_next(&sub);
         }
 finish:
@@ -1856,9 +1853,10 @@ static int start_unit_one(
                 }
         }
 
-        /* When stopping unit check if we have some listening sockets active */
-        if (streq(method, "StopUnit") && !arg_quiet)
-                check_listening_sockets(bus, name);
+        /* When stopping a unit warn if it can still be triggered by
+         * another active unit (socket, path, timer) */
+        if (!arg_quiet && streq(method, "StopUnit"))
+                check_triggering_units(bus, name);
 
         r = 0;
 

commit 222d0348f97aa132cc24ed3a38f18463e9b0e8c9
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Wed Jun 13 17:47:51 2012 +0200

    systemctl: fix iteration in check_listening_sockets()

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 77fc80b..0e6b2ec 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -1762,8 +1762,7 @@ static void check_listening_sockets(
                         log_warning("%s", service_trigger);
                 }
 next:
-                dbus_message_iter_recurse(&iter, &sub);
-                iter = sub;
+                dbus_message_iter_next(&sub);
         }
 finish:
         if (m)

commit 31be1221a13a13fa1d5e82a44f07e2abfb8344c5
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Wed Jun 13 17:29:11 2012 +0200

    systemctl: remove is_socket_listening
    
    We can use the functionality of check_unit(). Factor out
    check_one_unit().

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index f2da2ad..77fc80b 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -1569,32 +1569,64 @@ finish:
         return r;
 }
 
-static int is_socket_listening(
-                DBusConnection *bus,
-                const char *socket_name) {
-
-        DBusError error;
+static int check_one_unit(DBusConnection *bus, char *name, bool quiet) {
         DBusMessage *m = NULL, *reply = NULL;
+        DBusError error;
         DBusMessageIter iter, sub;
-        char *socket_object_path = NULL;
-        const char *sub_state = NULL,
-                   *interface = "org.freedesktop.systemd1.Unit",
-                   *property = "SubState";
-        int r = 0;
+        const char
+                *interface = "org.freedesktop.systemd1.Unit",
+                *property = "ActiveState";
+        const char *path = NULL;
+        const char *state;
+        int r = 3; /* According to LSB: "program is not running" */
 
         assert(bus);
-        assert(socket_name);
+        assert(name);
 
         dbus_error_init(&error);
 
-        r = get_unit_path(bus, socket_name, &socket_object_path);
-        if (r < 0)
+        m = dbus_message_new_method_call(
+                              "org.freedesktop.systemd1",
+                              "/org/freedesktop/systemd1",
+                              "org.freedesktop.systemd1.Manager",
+                              "GetUnit");
+        if (!m) {
+                log_error("Could not allocate message.");
+                r = -ENOMEM;
                 goto finish;
+        }
 
-        m = dbus_message_new_method_call("org.freedesktop.systemd1",
-                                         socket_object_path,
-                                         "org.freedesktop.DBus.Properties",
-                                         "Get");
+        if (!dbus_message_append_args(m,
+                                      DBUS_TYPE_STRING, &name,
+                                      DBUS_TYPE_INVALID)) {
+                log_error("Could not append arguments to message.");
+                r = -ENOMEM;
+                goto finish;
+        }
+
+        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
+        if (!reply) {
+                /* Hmm, cannot figure out anything about this unit... */
+                if (!quiet)
+                        puts("unknown");
+
+                goto finish;
+        }
+
+        if (!dbus_message_get_args(reply, &error,
+                                   DBUS_TYPE_OBJECT_PATH, &path,
+                                   DBUS_TYPE_INVALID)) {
+                log_error("Failed to parse reply: %s", bus_error_message(&error));
+                r = -EIO;
+                goto finish;
+        }
+
+        dbus_message_unref(m);
+        m = dbus_message_new_method_call(
+                              "org.freedesktop.systemd1",
+                              path,
+                              "org.freedesktop.DBus.Properties",
+                              "Get");
         if (!m) {
                 log_error("Could not allocate message.");
                 r = -ENOMEM;
@@ -1610,6 +1642,7 @@ static int is_socket_listening(
                 goto finish;
         }
 
+        dbus_message_unref(reply);
         reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
         if (!reply) {
                 log_error("Failed to issue method call: %s", bus_error_message(&error));
@@ -1617,16 +1650,29 @@ static int is_socket_listening(
                 goto finish;
         }
 
-        dbus_message_iter_init(reply, &iter);
+        if (!dbus_message_iter_init(reply, &iter) ||
+            dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)  {
+                log_error("Failed to parse reply.");
+                r = -EIO;
+                goto finish;
+        }
+
         dbus_message_iter_recurse(&iter, &sub);
 
-        if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) {
-                log_error("Failed to parse reply: %s", bus_error_message(&error));
+        if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING)  {
+                log_error("Failed to parse reply.");
                 r = -EIO;
                 goto finish;
         }
-        dbus_message_iter_get_basic(&sub, &sub_state);
-        r = streq(sub_state, "listening");
+
+        dbus_message_iter_get_basic(&sub, &state);
+
+        if (!quiet)
+                puts(state);
+
+        if (streq(state, "active") || streq(state, "reloading"))
+                r = 0;
+
 finish:
         if (m)
                 dbus_message_unref(m);
@@ -1636,7 +1682,6 @@ finish:
 
         dbus_error_free(&error);
 
-        free(socket_object_path);
         return r;
 }
 
@@ -1647,8 +1692,8 @@ static void check_listening_sockets(
         DBusError error;
         DBusMessage *m = NULL, *reply = NULL;
         DBusMessageIter iter, sub;
-        const char *service_trigger = NULL,
-                   *interface = "org.freedesktop.systemd1.Unit",
+        char *service_trigger = NULL;
+        const char *interface = "org.freedesktop.systemd1.Unit",
                    *triggered_by_property = "TriggeredBy";
 
         char *unit_path = NULL;
@@ -1706,10 +1751,10 @@ static void check_listening_sockets(
                 if (!endswith(service_trigger, ".socket"))
                         goto next;
 
-                r = is_socket_listening(bus, service_trigger);
+                r = check_one_unit(bus, service_trigger, true);
                 if (r < 0)
                         goto finish;
-                if (r == 1) {
+                if (r == 0) {
                         if (print_warning_label) {
                                 log_warning("There are listening sockets associated with %s :", unit_name);
                                 print_warning_label = false;
@@ -2101,126 +2146,20 @@ static int start_special(DBusConnection *bus, char **args) {
 }
 
 static int check_unit(DBusConnection *bus, char **args) {
-        DBusMessage *m = NULL, *reply = NULL;
-        const char
-                *interface = "org.freedesktop.systemd1.Unit",
-                *property = "ActiveState";
-        int r = 3; /* According to LSB: "program is not running" */
-        DBusError error;
         char **name;
+        int r = 3; /* According to LSB: "program is not running" */
 
         assert(bus);
         assert(args);
 
-        dbus_error_init(&error);
-
         STRV_FOREACH(name, args+1) {
-                const char *path = NULL;
-                const char *state;
-                DBusMessageIter iter, sub;
-
-                if (!(m = dbus_message_new_method_call(
-                                      "org.freedesktop.systemd1",
-                                      "/org/freedesktop/systemd1",
-                                      "org.freedesktop.systemd1.Manager",
-                                      "GetUnit"))) {
-                        log_error("Could not allocate message.");
-                        r = -ENOMEM;
-                        goto finish;
-                }
-
-                if (!dbus_message_append_args(m,
-                                              DBUS_TYPE_STRING, name,
-                                              DBUS_TYPE_INVALID)) {
-                        log_error("Could not append arguments to message.");
-                        r = -ENOMEM;
-                        goto finish;
-                }
-
-                if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
-
-                        /* Hmm, cannot figure out anything about this unit... */
-                        if (!arg_quiet)
-                                puts("unknown");
-
-                        dbus_error_free(&error);
-                        dbus_message_unref(m);
-                        m = NULL;
-                        continue;
-                }
-
-                if (!dbus_message_get_args(reply, &error,
-                                           DBUS_TYPE_OBJECT_PATH, &path,
-                                           DBUS_TYPE_INVALID)) {
-                        log_error("Failed to parse reply: %s", bus_error_message(&error));
-                        r = -EIO;
-                        goto finish;
-                }
-
-                dbus_message_unref(m);
-                if (!(m = dbus_message_new_method_call(
-                                      "org.freedesktop.systemd1",
-                                      path,
-                                      "org.freedesktop.DBus.Properties",
-                                      "Get"))) {
-                        log_error("Could not allocate message.");
-                        r = -ENOMEM;
-                        goto finish;
-                }
-
-                if (!dbus_message_append_args(m,
-                                              DBUS_TYPE_STRING, &interface,
-                                              DBUS_TYPE_STRING, &property,
-                                              DBUS_TYPE_INVALID)) {
-                        log_error("Could not append arguments to message.");
-                        r = -ENOMEM;
-                        goto finish;
-                }
-
-                dbus_message_unref(reply);
-                if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
-                        log_error("Failed to issue method call: %s", bus_error_message(&error));
-                        r = -EIO;
-                        goto finish;
-                }
-
-                if (!dbus_message_iter_init(reply, &iter) ||
-                    dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)  {
-                        log_error("Failed to parse reply.");
-                        r = -EIO;
-                        goto finish;
-                }
-
-                dbus_message_iter_recurse(&iter, &sub);
-
-                if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING)  {
-                        log_error("Failed to parse reply.");
-                        r = -EIO;
-                        goto finish;
-                }
-
-                dbus_message_iter_get_basic(&sub, &state);
-
-                if (!arg_quiet)
-                        puts(state);
-
-                if (streq(state, "active") || streq(state, "reloading"))
+                int state = check_one_unit(bus, *name, arg_quiet);
+                if (state < 0)
+                        return state;
+                if (state == 0)
                         r = 0;
-
-                dbus_message_unref(m);
-                dbus_message_unref(reply);
-                m = reply = NULL;
         }
 
-finish:
-        if (m)
-                dbus_message_unref(m);
-
-        if (reply)
-                dbus_message_unref(reply);
-
-        dbus_error_free(&error);
-
         return r;
 }
 

commit e61a3135e99f349af949520e85d06e7fab4b5d9e
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Wed Jun 13 15:52:27 2012 +0200

    systemctl: style fixes for the previous patch
    
    Use the usual indentation, bracketing style, and no assignments in ifs.
    Since check_listening_sockets provides just optional hints for the user,
    don't pass its DBusErrors to the caller.

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 952be1d..f2da2ad 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -1502,20 +1502,19 @@ finish:
 
 static int get_unit_path(
                 DBusConnection *bus,
-                DBusError *error,
                 const char *name,
                 char **unit_path) {
 
+        DBusError error;
         DBusMessage *m = NULL, *reply = NULL;
+        char *path;
         int r = 0;
 
         assert(bus);
-        assert(error);
         assert(name);
         assert(unit_path);
 
-        *unit_path = NULL;
-
+        dbus_error_init(&error);
 
         m = dbus_message_new_method_call("org.freedesktop.systemd1",
                                          "/org/freedesktop/systemd1",
@@ -1528,34 +1527,33 @@ static int get_unit_path(
         }
 
         if (!dbus_message_append_args(m,
-                                DBUS_TYPE_STRING, &name,
-                                DBUS_TYPE_INVALID)) {
+                                      DBUS_TYPE_STRING, &name,
+                                      DBUS_TYPE_INVALID)) {
                 log_error("Could not append arguments to message.");
                 r = -ENOMEM;
                 goto finish;
         }
 
-        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
+        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
         if (!reply) {
-                if (streq(error->name, BUS_ERROR_NO_SUCH_UNIT)) {
-                        dbus_error_free(error);
+                if (streq(error.name, BUS_ERROR_NO_SUCH_UNIT))
                         r = -EINVAL;
-                } else {
-                        log_error("Failed to issue method call: %s", bus_error_message(error));
+                else {
+                        log_error("Failed to issue method call: %s", bus_error_message(&error));
                         r = -EIO;
                 }
                 goto finish;
         }
 
-        if (!dbus_message_get_args(reply, error,
-                                DBUS_TYPE_OBJECT_PATH, unit_path,
-                                DBUS_TYPE_INVALID)) {
-                log_error("Failed to parse reply: %s", bus_error_message(error));
+        if (!dbus_message_get_args(reply, &error,
+                                   DBUS_TYPE_OBJECT_PATH, &path,
+                                   DBUS_TYPE_INVALID)) {
+                log_error("Failed to parse reply: %s", bus_error_message(&error));
                 r = -EIO;
                 goto finish;
         }
 
-        *unit_path = strdup(*unit_path);
+        *unit_path = strdup(path);
         if (!(*unit_path)) {
                log_error("Failed to duplicate unit path");
                r = -ENOMEM;
@@ -1565,14 +1563,17 @@ finish:
                 dbus_message_unref(m);
         if (reply)
                 dbus_message_unref(reply);
+
+        dbus_error_free(&error);
+
         return r;
 }
 
 static int is_socket_listening(
                 DBusConnection *bus,
-                DBusError *error,
                 const char *socket_name) {
 
+        DBusError error;
         DBusMessage *m = NULL, *reply = NULL;
         DBusMessageIter iter, sub;
         char *socket_object_path = NULL;
@@ -1582,12 +1583,14 @@ static int is_socket_listening(
         int r = 0;
 
         assert(bus);
-        assert(error);
         assert(socket_name);
 
-        if ((r = get_unit_path(bus, error, socket_name, &socket_object_path)) < 0) {
+        dbus_error_init(&error);
+
+        r = get_unit_path(bus, socket_name, &socket_object_path);
+        if (r < 0)
                 goto finish;
-        }
+
         m = dbus_message_new_method_call("org.freedesktop.systemd1",
                                          socket_object_path,
                                          "org.freedesktop.DBus.Properties",
@@ -1599,17 +1602,17 @@ static int is_socket_listening(
         }
 
         if (!dbus_message_append_args(m,
-                                DBUS_TYPE_STRING, &interface,
-                                DBUS_TYPE_STRING, &property,
-                                DBUS_TYPE_INVALID)) {
+                                      DBUS_TYPE_STRING, &interface,
+                                      DBUS_TYPE_STRING, &property,
+                                      DBUS_TYPE_INVALID)) {
                 log_error("Could not append arguments to message.");
                 r = -ENOMEM;
                 goto finish;
         }
 
-        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
+        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
         if (!reply) {
-                log_error("Failed to issue method call: %s", bus_error_message(error));
+                log_error("Failed to issue method call: %s", bus_error_message(&error));
                 r = -EIO;
                 goto finish;
         }
@@ -1618,7 +1621,7 @@ static int is_socket_listening(
         dbus_message_iter_recurse(&iter, &sub);
 
         if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) {
-                log_error("Failed to parse reply: %s", bus_error_message(error));
+                log_error("Failed to parse reply: %s", bus_error_message(&error));
                 r = -EIO;
                 goto finish;
         }
@@ -1631,15 +1634,17 @@ finish:
         if (reply)
                 dbus_message_unref(reply);
 
+        dbus_error_free(&error);
+
         free(socket_object_path);
         return r;
 }
 
 static void check_listening_sockets(
                 DBusConnection *bus,
-                DBusError *error,
                 const char *unit_name) {
 
+        DBusError error;
         DBusMessage *m = NULL, *reply = NULL;
         DBusMessageIter iter, sub;
         const char *service_trigger = NULL,
@@ -1647,11 +1652,12 @@ static void check_listening_sockets(
                    *triggered_by_property = "TriggeredBy";
 
         char *unit_path = NULL;
-        int print_warning_label = 1;
+        bool print_warning_label = true;
+
+        dbus_error_init(&error);
 
-        if ((get_unit_path(bus, error, unit_name, &unit_path) < 0)) {
+        if (get_unit_path(bus, unit_name, &unit_path) < 0)
                 goto finish;
-        }
 
         m = dbus_message_new_method_call("org.freedesktop.systemd1",
                                          unit_path,
@@ -1663,22 +1669,22 @@ static void check_listening_sockets(
         }
 
         if (!dbus_message_append_args(m,
-                                DBUS_TYPE_STRING, &interface,
-                                DBUS_TYPE_STRING, &triggered_by_property,
-                                DBUS_TYPE_INVALID)) {
+                                      DBUS_TYPE_STRING, &interface,
+                                      DBUS_TYPE_STRING, &triggered_by_property,
+                                      DBUS_TYPE_INVALID)) {
                 log_error("Could not append arguments to message.");
                 goto finish;
         }
 
-        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
+        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
         if (!reply) {
-                log_error("Failed to issue method call: %s", bus_error_message(error));
+                log_error("Failed to issue method call: %s", bus_error_message(&error));
                 goto finish;
         }
 
         if (!dbus_message_iter_init(reply, &iter) ||
-                        dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
-                log_error("Failed to parse reply: %s", bus_error_message(error));
+            dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
+                log_error("Failed to parse reply: %s", bus_error_message(&error));
                 goto finish;
 
         }
@@ -1688,33 +1694,29 @@ static void check_listening_sockets(
         sub = iter;
 
         while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) {
-                int r = 0;
+                int r;
 
                 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) {
-                        log_error("Failed to parse reply: %s", bus_error_message(error));
+                        log_error("Failed to parse reply: %s", bus_error_message(&error));
                         goto finish;
                 }
 
                 dbus_message_iter_get_basic(&sub, &service_trigger);
 
-                if (endswith(service_trigger, ".socket")) {
-                        r = is_socket_listening(bus, error, service_trigger);
-                } else {
-                        dbus_message_iter_recurse(&iter, &sub);
-                        iter = sub;
-                        continue;
-                }
+                if (!endswith(service_trigger, ".socket"))
+                        goto next;
 
+                r = is_socket_listening(bus, service_trigger);
+                if (r < 0)
+                        goto finish;
                 if (r == 1) {
                         if (print_warning_label) {
                                 log_warning("There are listening sockets associated with %s :", unit_name);
-                                print_warning_label = 0;
+                                print_warning_label = false;
                         }
-                        log_warning("%s",service_trigger);
-                } else if (r < 0) {
-                        log_error("Failed to issue function call: %s", bus_error_message(error));
-                        goto finish;
+                        log_warning("%s", service_trigger);
                 }
+next:
                 dbus_message_iter_recurse(&iter, &sub);
                 iter = sub;
         }
@@ -1725,6 +1727,8 @@ finish:
         if (reply)
                 dbus_message_unref(reply);
 
+        dbus_error_free(&error);
+
         free(unit_path);
 }
 
@@ -1809,9 +1813,8 @@ static int start_unit_one(
         }
 
         /* When stopping unit check if we have some listening sockets active */
-        if (streq(method, "StopUnit") && !arg_quiet) {
-               check_listening_sockets(bus, error, name);
-        }
+        if (streq(method, "StopUnit") && !arg_quiet)
+                check_listening_sockets(bus, name);
 
         r = 0;
 

commit 701cdcb9ee846b3d1629b55a11c61a3343af4874
Author: Michal Sekletar <msekleta at redhat.com>
Date:   Wed Jun 13 14:14:13 2012 +0200

    systemctl will print warning when stopping unit
    
    systemctl now prints warning and list of sockets in listenning state which can
    trigger start of service which is about to be stopped

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 2fbfd7e..952be1d 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -1500,6 +1500,234 @@ finish:
         return r;
 }
 
+static int get_unit_path(
+                DBusConnection *bus,
+                DBusError *error,
+                const char *name,
+                char **unit_path) {
+
+        DBusMessage *m = NULL, *reply = NULL;
+        int r = 0;
+
+        assert(bus);
+        assert(error);
+        assert(name);
+        assert(unit_path);
+
+        *unit_path = NULL;
+
+
+        m = dbus_message_new_method_call("org.freedesktop.systemd1",
+                                         "/org/freedesktop/systemd1",
+                                         "org.freedesktop.systemd1.Manager",
+                                         "GetUnit");
+        if (!m) {
+                log_error("Could not allocate message.");
+                r = -ENOMEM;
+                goto finish;
+        }
+
+        if (!dbus_message_append_args(m,
+                                DBUS_TYPE_STRING, &name,
+                                DBUS_TYPE_INVALID)) {
+                log_error("Could not append arguments to message.");
+                r = -ENOMEM;
+                goto finish;
+        }
+
+        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
+        if (!reply) {
+                if (streq(error->name, BUS_ERROR_NO_SUCH_UNIT)) {
+                        dbus_error_free(error);
+                        r = -EINVAL;
+                } else {
+                        log_error("Failed to issue method call: %s", bus_error_message(error));
+                        r = -EIO;
+                }
+                goto finish;
+        }
+
+        if (!dbus_message_get_args(reply, error,
+                                DBUS_TYPE_OBJECT_PATH, unit_path,
+                                DBUS_TYPE_INVALID)) {
+                log_error("Failed to parse reply: %s", bus_error_message(error));
+                r = -EIO;
+                goto finish;
+        }
+
+        *unit_path = strdup(*unit_path);
+        if (!(*unit_path)) {
+               log_error("Failed to duplicate unit path");
+               r = -ENOMEM;
+        }
+finish:
+        if (m)
+                dbus_message_unref(m);
+        if (reply)
+                dbus_message_unref(reply);
+        return r;
+}
+
+static int is_socket_listening(
+                DBusConnection *bus,
+                DBusError *error,
+                const char *socket_name) {
+
+        DBusMessage *m = NULL, *reply = NULL;
+        DBusMessageIter iter, sub;
+        char *socket_object_path = NULL;
+        const char *sub_state = NULL,
+                   *interface = "org.freedesktop.systemd1.Unit",
+                   *property = "SubState";
+        int r = 0;
+
+        assert(bus);
+        assert(error);
+        assert(socket_name);
+
+        if ((r = get_unit_path(bus, error, socket_name, &socket_object_path)) < 0) {
+                goto finish;
+        }
+        m = dbus_message_new_method_call("org.freedesktop.systemd1",
+                                         socket_object_path,
+                                         "org.freedesktop.DBus.Properties",
+                                         "Get");
+        if (!m) {
+                log_error("Could not allocate message.");
+                r = -ENOMEM;
+                goto finish;
+        }
+
+        if (!dbus_message_append_args(m,
+                                DBUS_TYPE_STRING, &interface,
+                                DBUS_TYPE_STRING, &property,
+                                DBUS_TYPE_INVALID)) {
+                log_error("Could not append arguments to message.");
+                r = -ENOMEM;
+                goto finish;
+        }
+
+        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
+        if (!reply) {
+                log_error("Failed to issue method call: %s", bus_error_message(error));
+                r = -EIO;
+                goto finish;
+        }
+
+        dbus_message_iter_init(reply, &iter);
+        dbus_message_iter_recurse(&iter, &sub);
+
+        if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) {
+                log_error("Failed to parse reply: %s", bus_error_message(error));
+                r = -EIO;
+                goto finish;
+        }
+        dbus_message_iter_get_basic(&sub, &sub_state);
+        r = streq(sub_state, "listening");
+finish:
+        if (m)
+                dbus_message_unref(m);
+
+        if (reply)
+                dbus_message_unref(reply);
+
+        free(socket_object_path);
+        return r;
+}
+
+static void check_listening_sockets(
+                DBusConnection *bus,
+                DBusError *error,
+                const char *unit_name) {
+
+        DBusMessage *m = NULL, *reply = NULL;
+        DBusMessageIter iter, sub;
+        const char *service_trigger = NULL,
+                   *interface = "org.freedesktop.systemd1.Unit",
+                   *triggered_by_property = "TriggeredBy";
+
+        char *unit_path = NULL;
+        int print_warning_label = 1;
+
+        if ((get_unit_path(bus, error, unit_name, &unit_path) < 0)) {
+                goto finish;
+        }
+
+        m = dbus_message_new_method_call("org.freedesktop.systemd1",
+                                         unit_path,
+                                         "org.freedesktop.DBus.Properties",
+                                         "Get");
+        if (!m) {
+                log_error("Could not allocate message.");
+                goto finish;
+        }
+
+        if (!dbus_message_append_args(m,
+                                DBUS_TYPE_STRING, &interface,
+                                DBUS_TYPE_STRING, &triggered_by_property,
+                                DBUS_TYPE_INVALID)) {
+                log_error("Could not append arguments to message.");
+                goto finish;
+        }
+
+        reply = dbus_connection_send_with_reply_and_block(bus, m, -1, error);
+        if (!reply) {
+                log_error("Failed to issue method call: %s", bus_error_message(error));
+                goto finish;
+        }
+
+        if (!dbus_message_iter_init(reply, &iter) ||
+                        dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) {
+                log_error("Failed to parse reply: %s", bus_error_message(error));
+                goto finish;
+
+        }
+
+        dbus_message_iter_recurse(&iter, &sub);
+        dbus_message_iter_recurse(&sub, &iter);
+        sub = iter;
+
+        while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) {
+                int r = 0;
+
+                if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) {
+                        log_error("Failed to parse reply: %s", bus_error_message(error));
+                        goto finish;
+                }
+
+                dbus_message_iter_get_basic(&sub, &service_trigger);
+
+                if (endswith(service_trigger, ".socket")) {
+                        r = is_socket_listening(bus, error, service_trigger);
+                } else {
+                        dbus_message_iter_recurse(&iter, &sub);
+                        iter = sub;
+                        continue;
+                }
+
+                if (r == 1) {
+                        if (print_warning_label) {
+                                log_warning("There are listening sockets associated with %s :", unit_name);
+                                print_warning_label = 0;
+                        }
+                        log_warning("%s",service_trigger);
+                } else if (r < 0) {
+                        log_error("Failed to issue function call: %s", bus_error_message(error));
+                        goto finish;
+                }
+                dbus_message_iter_recurse(&iter, &sub);
+                iter = sub;
+        }
+finish:
+        if (m)
+                dbus_message_unref(m);
+
+        if (reply)
+                dbus_message_unref(reply);
+
+        free(unit_path);
+}
+
 static int start_unit_one(
                 DBusConnection *bus,
                 const char *method,
@@ -1580,6 +1808,11 @@ static int start_unit_one(
                 }
         }
 
+        /* When stopping unit check if we have some listening sockets active */
+        if (streq(method, "StopUnit") && !arg_quiet) {
+               check_listening_sockets(bus, error, name);
+        }
+
         r = 0;
 
 finish:



More information about the systemd-commits mailing list