chiark / gitweb /
systemctl: make an always true assert static
[elogind.git] / src / systemctl / systemctl.c
index 1d119c991226214050f1afae6434e0a7a9f97a4e..561572cb35adee9139f37ad90dafca0ede4c053c 100644 (file)
@@ -82,6 +82,7 @@ static enum dependency {
         DEPENDENCY_REVERSE,
         DEPENDENCY_AFTER,
         DEPENDENCY_BEFORE,
+        _DEPENDENCY_MAX
 } arg_dependency = DEPENDENCY_FORWARD;
 static const char *arg_job_mode = "replace";
 static UnitFileScope arg_scope = UNIT_FILE_SYSTEM;
@@ -1152,7 +1153,7 @@ static int list_dependencies_print(const char *name, int level, unsigned int bra
 
                 for (i = level - 1; i >= 0; i--) {
                         len += 2;
-                        if(len > max_len - 3 && !arg_full) {
+                        if (len > max_len - 3 && !arg_full) {
                                 printf("%s...\n",max_len % 2 ? "" : " ");
                                 return 0;
                         }
@@ -1160,7 +1161,7 @@ static int list_dependencies_print(const char *name, int level, unsigned int bra
                 }
                 len += 2;
 
-                if(len > max_len - 3 && !arg_full) {
+                if (len > max_len - 3 && !arg_full) {
                         printf("%s...\n",max_len % 2 ? "" : " ");
                         return 0;
                 }
@@ -1174,7 +1175,7 @@ static int list_dependencies_print(const char *name, int level, unsigned int bra
         }
 
         n = ellipsize(name, max_len-len, 100);
-        if(!n)
+        if (!n)
                 return log_oom();
 
         printf("%s\n", n);
@@ -1183,7 +1184,7 @@ static int list_dependencies_print(const char *name, int level, unsigned int bra
 
 static int list_dependencies_get_dependencies(sd_bus *bus, const char *name, char ***deps) {
 
-        static const char *dependencies[] = {
+        static const char *dependencies[_DEPENDENCY_MAX] = {
                 [DEPENDENCY_FORWARD] = "Requires\0"
                                        "RequiresOverridable\0"
                                        "Requisite\0"
@@ -1206,7 +1207,7 @@ static int list_dependencies_get_dependencies(sd_bus *bus, const char *name, cha
         assert(bus);
         assert(name);
         assert(deps);
-        assert(arg_dependency < ELEMENTSOF(dependencies));
+        assert_cc(ELEMENTSOF(dependencies) == _DEPENDENCY_MAX);
 
         path = unit_dbus_path_from_name(name);
         if (!path)
@@ -1334,7 +1335,7 @@ static int list_dependencies_one(
 
                 if (arg_all || unit_name_to_type(*c) == UNIT_TARGET) {
                        r = list_dependencies_one(bus, *c, level + 1, &u, (branches << 1) | (c[1] == NULL ? 0 : 1));
-                       if(r < 0)
+                       if (r < 0)
                                return r;
                 }
         }
@@ -1814,7 +1815,7 @@ static int wait_for_jobs(sd_bus *bus, Set *s) {
                 return log_oom();
 
         while (!set_isempty(s)) {
-                for(;;) {
+                for (;;) {
                         r = sd_bus_process(bus, NULL);
                         if (r < 0)
                                 return r;
@@ -3604,16 +3605,13 @@ static int show_one(
         return r;
 }
 
-static int show_one_by_pid(
-                const char *verb,
+static int get_unit_dbus_path_by_pid(
                 sd_bus *bus,
                 uint32_t pid,
-                bool *new_line,
-                bool *ellipsized) {
+                char **unit) {
 
         _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
-        const char *path = NULL;
         int r;
 
         r = sd_bus_call_method(
@@ -3630,11 +3628,11 @@ static int show_one_by_pid(
                 return r;
         }
 
-        r = sd_bus_message_read(reply, "o", &path);
+        r = sd_bus_message_read(reply, "o", unit);
         if (r < 0)
                 return bus_log_parse_error(r);
 
-        return show_one(verb, bus, path, false, new_line, ellipsized);
+        return 0;
 }
 
 static int show_all(
@@ -3678,6 +3676,87 @@ static int show_all(
         return 0;
 }
 
+static int cat(sd_bus *bus, char **args) {
+        int r = 0;
+        char **name;
+
+        _cleanup_free_ char *unit = NULL, *n = NULL;
+
+        assert(bus);
+        assert(args);
+
+        pager_open_if_enabled();
+
+        STRV_FOREACH(name, args+1) {
+                _cleanup_free_ char *fragment_path = NULL;
+                _cleanup_strv_free_ char **dropin_paths = NULL;
+                sd_bus_error error;
+                char **path;
+
+                n = unit_name_mangle(*name);
+                if (!n)
+                        return log_oom();
+
+                unit = unit_dbus_path_from_name(n);
+                if (!unit)
+                        return log_oom();
+
+                if (need_daemon_reload(bus, n) > 0)
+                        log_warning("Unit file of %s changed on disk. Run 'systemctl%s daemon-reload'.",
+                                    n, arg_scope == UNIT_FILE_SYSTEM ? "" : " --user");
+
+                r = sd_bus_get_property_string(
+                                bus,
+                                "org.freedesktop.systemd1",
+                                unit,
+                                "org.freedesktop.systemd1.Unit",
+                                "FragmentPath",
+                                &error,
+                                &fragment_path);
+                if (r < 0) {
+                        log_warning("Failed to get FragmentPath: %s", bus_error_message(&error, r));
+                        continue;
+                }
+
+                r = sd_bus_get_property_strv(
+                                bus,
+                                "org.freedesktop.systemd1",
+                                unit,
+                                "org.freedesktop.systemd1.Unit",
+                                "DropInPaths",
+                                &error,
+                                &dropin_paths);
+                if (r < 0) {
+                        log_warning("Failed to get DropInPaths: %s", bus_error_message(&error, r));
+                        continue;
+                }
+
+                if (!isempty(fragment_path)) {
+                        fprintf(stdout, "# %s\n", fragment_path);
+                        fflush(stdout);
+                        r = sendfile_full(STDOUT_FILENO, fragment_path);
+                        if (r < 0) {
+                                log_warning("Failed to cat %s: %s", fragment_path, strerror(-r));
+                                continue;
+                        }
+                }
+
+                STRV_FOREACH(path, dropin_paths) {
+                        fprintf(stdout,   "%s# %s\n",
+                                isempty(fragment_path) && path == dropin_paths ? "" : "\n",
+                                *path);
+                        fflush(stdout);
+                        r = sendfile_full(STDOUT_FILENO, *path);
+                        if (r < 0) {
+                                log_warning("Failed to cat %s: %s", *path, strerror(-r));
+                                continue;
+                        }
+                }
+        }
+
+        return r;
+}
+
 static int show(sd_bus *bus, char **args) {
         int r, ret = 0;
         bool show_properties, show_status, new_line = false;
@@ -3702,41 +3781,34 @@ static int show(sd_bus *bus, char **args) {
                 ret = show_all(args[0], bus, false, &new_line, &ellipsized);
         else
                 STRV_FOREACH(name, args+1) {
+                        _cleanup_free_ char *unit = NULL;
                         uint32_t id;
 
                         if (safe_atou32(*name, &id) < 0) {
-                                _cleanup_free_ char *p = NULL, *n = NULL;
+                                _cleanup_free_ char *n = NULL;
                                 /* Interpret as unit name */
 
                                 n = unit_name_mangle(*name);
                                 if (!n)
                                         return log_oom();
 
-                                p = unit_dbus_path_from_name(n);
-                                if (!p)
+                                unit = unit_dbus_path_from_name(n);
+                                if (!unit)
                                         return log_oom();
 
-                                r = show_one(args[0], bus, p, show_properties, &new_line, &ellipsized);
-                                if (r != 0)
-                                        ret = r;
-
                         } else if (show_properties) {
-                                _cleanup_free_ char *p = NULL;
-
                                 /* Interpret as job id */
-                                if (asprintf(&p, "/org/freedesktop/systemd1/job/%u", id) < 0)
+                                if (asprintf(&unit, "/org/freedesktop/systemd1/job/%u", id) < 0)
                                         return log_oom();
 
-                                r = show_one(args[0], bus, p, show_properties, &new_line, &ellipsized);
-                                if (r != 0)
-                                        ret = r;
-
                         } else {
                                 /* Interpret as PID */
-                                r = show_one_by_pid(args[0], bus, id, &new_line, &ellipsized);
-                                if (r != 0)
+                                r = get_unit_dbus_path_by_pid(bus, id, &unit);
+                                if (r < 0)
                                         ret = r;
                         }
+
+                        show_one(args[0], bus, unit, show_properties, &new_line, &ellipsized);
                 }
 
         if (ellipsized && !arg_quiet)
@@ -4717,6 +4789,7 @@ static int systemctl_help(void) {
                "  status [NAME...|PID...]         Show runtime status of one or more units\n"
                "  show [NAME...|JOB...]           Show properties of one or more\n"
                "                                  units/jobs or the manager\n"
+               "  cat [NAME...]                   Show files and drop-ins of one or more units\n"
                "  set-property [NAME] [ASSIGNMENT...]\n"
                "                                  Sets one or more properties of a unit\n"
                "  help [NAME...|PID...]           Show manual for one or more units\n"
@@ -4841,7 +4914,7 @@ static int help_types(void) {
         const char *t;
 
         puts("Available unit types:");
-        for(i = 0; i < _UNIT_TYPE_MAX; i++) {
+        for (i = 0; i < _UNIT_TYPE_MAX; i++) {
                 t = unit_type_to_string(i);
                 if (t)
                         puts(t);
@@ -5700,6 +5773,7 @@ static int systemctl_main(sd_bus *bus, int argc, char *argv[], int bus_error) {
                 { "check",                 MORE,  2, check_unit_active },
                 { "is-failed",             MORE,  2, check_unit_failed },
                 { "show",                  MORE,  1, show              },
+                { "cat",                   MORE,  2, cat               },
                 { "status",                MORE,  1, show              },
                 { "help",                  MORE,  2, show              },
                 { "snapshot",              LESS,  2, snapshot          },