diff options
Diffstat (limited to 'src/systemctl')
-rw-r--r-- | src/systemctl/systemctl.c | 111 |
1 files changed, 57 insertions, 54 deletions
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 952be1d11f..f2da2ad604 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; |