]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
path: show various systemd directories and search paths too
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 24 Mar 2020 15:04:50 +0000 (16:04 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 27 Mar 2020 19:12:45 +0000 (20:12 +0100)
So far we had various ad hoc APIs to query search paths:
systemd-analyze unit-paths, lookup_paths_log(), the pkgconfig file,
debug logs emitted by systemd-analyze cat-config.
But answering a simple question "what is the search path for tmpfiles,
sysusers, .network files, ..." is surprisingly hard.

I think we should have an api that makes it easy to query this. Pkgconfig is
not bad, but it is primarily a development tool, so it's not available in many
context. Also it can't provide support for paths which are influenced by
environment variables, and I'd like to be able to answer the question "what is
the search path for ..., assuming that VAR_FOO=... is set?".

Extending sd-path to support more of our internal paths seems to be most
flexible solution. We already have systemd-path which provides a nice
way to query, and we can add stuff like optional descriptions later on.
We we essentially get a nice programmatic and commmandline apis for the price
of one.

man/sd_path_lookup.xml
src/libsystemd/sd-path/sd-path.c
src/path/path.c
src/systemd/sd-path.h

index c14ccf0e8c4671a53eab8b92572244195b03d23d..81812bc003d91a275b89b309e6d72f8d5ffb6339 100644 (file)
         <constant>SD_PATH_SEARCH_CONFIGURATION_FACTORY</constant>,
         <constant>SD_PATH_SEARCH_STATE_FACTORY</constant>,
         <constant>SD_PATH_SEARCH_CONFIGURATION</constant>,
+
+        <constant>SD_PATH_SYSTEMD_UTIL_DIR</constant>,
+        <constant>SD_PATH_SYSTEMD_SYSTEM_UNIT_DIR</constant>,
+        <constant>SD_PATH_SYSTEMD_SYSTEM_PRESET_DIR</constant>,
+        <constant>SD_PATH_SYSTEMD_USER_UNIT_DIR</constant>,
+        <constant>SD_PATH_SYSTEMD_USER_PRESET_DIR</constant>,
+        <constant>SD_PATH_SYSTEMD_SYSTEM_CONF_DIR</constant>,
+        <constant>SD_PATH_SYSTEMD_USER_CONF_DIR</constant>,
+        <constant>SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH</constant>,
+        <constant>SD_PATH_SYSTEMD_USER_UNIT_PATH</constant>,
+        <constant>SD_PATH_SYSTEMD_SYSTEM_GENERATOR_DIR</constant>,
+        <constant>SD_PATH_SYSTEMD_USER_GENERATOR_DIR</constant>,
+        <constant>SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH</constant>,
+        <constant>SD_PATH_SYSTEMD_USER_GENERATOR_PATH</constant>,
+        <constant>SD_PATH_SYSTEMD_SLEEP_DIR</constant>,
+        <constant>SD_PATH_SYSTEMD_SHUTDOWN_DIR</constant>,
+
+        <constant>SD_PATH_TMPFILES_DIR</constant>,
+        <constant>SD_PATH_SYSUSERS_DIR</constant>,
+        <constant>SD_PATH_SYSCTL_DIR</constant>,
+        <constant>SD_PATH_BINFMT_DIR</constant>,
+        <constant>SD_PATH_MODULES_LOAD_DIR</constant>,
+        <constant>SD_PATH_CATALOG_DIR</constant>,
 };</funcsynopsisinfo>
 
       <funcprototype>
index 8bdc2435a3c316d415bb4940042c7a5021492869..edc32fbd879ad6f5b0b62b1d341d12142a5d42ba 100644 (file)
@@ -7,6 +7,7 @@
 #include "fd-util.h"
 #include "fileio.h"
 #include "fs-util.h"
+#include "path-lookup.h"
 #include "path-util.h"
 #include "string-util.h"
 #include "strv.h"
@@ -318,6 +319,76 @@ static int get_path(uint64_t type, char **buffer, const char **ret) {
 
         case SD_PATH_USER_DESKTOP:
                 return from_user_dir("XDG_DESKTOP_DIR", buffer, ret);
+
+        case SD_PATH_SYSTEMD_UTIL_DIR:
+                *ret = ROOTPREFIX "lib/systemd";
+                return 0;
+
+        case SD_PATH_SYSTEMD_SYSTEM_UNIT_DIR:
+                *ret = SYSTEM_DATA_UNIT_PATH;
+                return 0;
+
+        case SD_PATH_SYSTEMD_SYSTEM_PRESET_DIR:
+                *ret = ROOTPREFIX "lib/systemd/system-preset";
+                return 0;
+
+        case SD_PATH_SYSTEMD_USER_UNIT_DIR:
+                *ret = USER_DATA_UNIT_PATH;
+                return 0;
+
+        case SD_PATH_SYSTEMD_USER_PRESET_DIR:
+                *ret = ROOTPREFIX "lib/systemd/user-preset";
+                return 0;
+
+        case SD_PATH_SYSTEMD_SYSTEM_CONF_DIR:
+                *ret = SYSTEM_CONFIG_UNIT_PATH; // FIXME: _DIR vs. _PATH
+                return 0;
+
+        case SD_PATH_SYSTEMD_USER_CONF_DIR:
+                *ret = USER_CONFIG_UNIT_PATH; // FIXME: _DIR vs. _PATH
+                return 0;
+
+        case SD_PATH_SYSTEMD_SYSTEM_GENERATOR_DIR:
+                *ret = SYSTEM_GENERATOR_PATH; // FIXME: _DIR vs. _PATH
+                return 0;
+
+        case SD_PATH_SYSTEMD_USER_GENERATOR_DIR:
+                *ret = USER_GENERATOR_PATH; // FIXME: _DIR vs. _PATH
+                return 0;
+
+        case SD_PATH_SYSTEMD_SLEEP_DIR:
+                *ret = ROOTPREFIX "lib/systemd/system-sleep";
+                return 0;
+
+        case SD_PATH_SYSTEMD_SHUTDOWN_DIR:
+                *ret = ROOTPREFIX "lib/systemd/system-shutdown";
+                return 0;
+
+        /* FIXME: systemd.pc uses ${prefix}, but CONF_PATHS_NULSTR doesn't.
+         *        Should ${prefix} use in systemd.pc be removed? */
+        case SD_PATH_TMPFILES_DIR:
+                *ret = "/usr/lib/tmpfiles.d";
+                return 0;
+
+        case SD_PATH_SYSUSERS_DIR:
+                *ret = "/usr/lib/sysusers.d";
+                return 0;
+
+        case SD_PATH_SYSCTL_DIR:
+                *ret = "/usr/lib/sysctl.d";
+                return 0;
+
+        case SD_PATH_BINFMT_DIR:
+                *ret = "/usr/lib/binfmt.d";
+                return 0;
+
+        case SD_PATH_MODULES_LOAD_DIR:
+                *ret = "/usr/lib/modules-load.d";
+                return 0;
+
+        case SD_PATH_CATALOG_DIR:
+                *ret = "/usr/lib/systemd/catalog";
+                return 0;
         }
 
         return -EOPNOTSUPP;
@@ -450,6 +521,7 @@ static int search_from_environment(
 #endif
 
 static int get_search(uint64_t type, char ***list) {
+        int r;
 
         assert(list);
 
@@ -535,9 +607,34 @@ static int get_search(uint64_t type, char ***list) {
         case SD_PATH_SEARCH_BINARIES_DEFAULT:
                 return strv_from_nulstr(list, DEFAULT_PATH_NULSTR);
 
+        case SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH:
+        case SD_PATH_SYSTEMD_USER_UNIT_PATH: {
+                _cleanup_(lookup_paths_free) LookupPaths lp = {};
+                const UnitFileScope scope = type == SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH ?
+                                                    UNIT_FILE_SYSTEM : UNIT_FILE_USER;
+
+                r = lookup_paths_init(&lp, scope, 0, NULL);
+                if (r < 0)
+                        return r;
 
+                *list = TAKE_PTR(lp.search_path);
+                return 0;
         }
 
+        case SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH:
+        case SD_PATH_SYSTEMD_USER_GENERATOR_PATH: {
+                char **t;
+                const UnitFileScope scope = type == SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH ?
+                                                    UNIT_FILE_SYSTEM : UNIT_FILE_USER;
+
+                t = generator_binary_paths(scope);
+                if (!t)
+                        return -ENOMEM;
+
+                *list = t;
+                return 0;
+        }}
+
         return -EOPNOTSUPP;
 }
 
index 26252948c50f47b955063bec16329de9e755438e..aefdae1d515a272dfe7041f6c4c4dbe78e87ff17 100644 (file)
@@ -58,6 +58,29 @@ static const char* const path_table[_SD_PATH_MAX] = {
         [SD_PATH_SEARCH_CONFIGURATION_FACTORY]  = "search-configuration-factory",
         [SD_PATH_SEARCH_STATE_FACTORY]          = "search-state-factory",
         [SD_PATH_SEARCH_CONFIGURATION]          = "search-configuration",
+
+        [SD_PATH_SYSTEMD_UTIL_DIR]              = "systemd-util-dir",
+        [SD_PATH_SYSTEMD_SYSTEM_UNIT_DIR]       = "systemd-system-unit-dir",
+        [SD_PATH_SYSTEMD_SYSTEM_PRESET_DIR]     = "systemd-system-preset-dir",
+        [SD_PATH_SYSTEMD_USER_UNIT_DIR]         = "systemd-user-unit-dir",
+        [SD_PATH_SYSTEMD_USER_PRESET_DIR]       = "systemd-user-preset-dir",
+        [SD_PATH_SYSTEMD_SYSTEM_CONF_DIR]       = "systemd-system-conf-dir",
+        [SD_PATH_SYSTEMD_USER_CONF_DIR]         = "systemd-user-conf-dir",
+        [SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH]      = "systemd-system-unit-path",
+        [SD_PATH_SYSTEMD_USER_UNIT_PATH]        = "systemd-user-unit-path",
+        [SD_PATH_SYSTEMD_SYSTEM_GENERATOR_DIR]  = "systemd-system-generator-dir",
+        [SD_PATH_SYSTEMD_USER_GENERATOR_DIR]    = "systemd-user-generator-dir",
+        [SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH] = "systemd-system-generator-path",
+        [SD_PATH_SYSTEMD_USER_GENERATOR_PATH]   = "systemd-user-generator-path",
+        [SD_PATH_SYSTEMD_SLEEP_DIR]             = "systemd-sleep-dir",
+        [SD_PATH_SYSTEMD_SHUTDOWN_DIR]          = "systemd-shutdown-dir",
+
+        [SD_PATH_TMPFILES_DIR]                  = "tmpfiles-dir",
+        [SD_PATH_SYSUSERS_DIR]                  = "sysusers-dir",
+        [SD_PATH_SYSCTL_DIR]                    = "sysctl-dir",
+        [SD_PATH_BINFMT_DIR]                    = "binfmt-dir",
+        [SD_PATH_MODULES_LOAD_DIR]              = "modules-load-dir",
+        [SD_PATH_CATALOG_DIR]                   = "catalog-dir",
 };
 
 static int list_homes(void) {
index 2bb0b8524432ef561749b13feba577c4dd2d10e4..203f01dd9093e489dfa7cbe12385929247773d9a 100644 (file)
@@ -78,6 +78,30 @@ enum {
         SD_PATH_SEARCH_STATE_FACTORY,
         SD_PATH_SEARCH_CONFIGURATION,
 
+        /* Various systemd paths, generally mirroring systemd.pc */
+        SD_PATH_SYSTEMD_UTIL_DIR,
+        SD_PATH_SYSTEMD_SYSTEM_UNIT_DIR,
+        SD_PATH_SYSTEMD_SYSTEM_PRESET_DIR,
+        SD_PATH_SYSTEMD_USER_UNIT_DIR,
+        SD_PATH_SYSTEMD_USER_PRESET_DIR,
+        SD_PATH_SYSTEMD_SYSTEM_CONF_DIR,
+        SD_PATH_SYSTEMD_USER_CONF_DIR,
+        SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH,
+        SD_PATH_SYSTEMD_USER_UNIT_PATH,
+        SD_PATH_SYSTEMD_SYSTEM_GENERATOR_DIR,
+        SD_PATH_SYSTEMD_USER_GENERATOR_DIR,
+        SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH,
+        SD_PATH_SYSTEMD_USER_GENERATOR_PATH,
+        SD_PATH_SYSTEMD_SLEEP_DIR,
+        SD_PATH_SYSTEMD_SHUTDOWN_DIR,
+
+        SD_PATH_TMPFILES_DIR,
+        SD_PATH_SYSUSERS_DIR,
+        SD_PATH_SYSCTL_DIR,
+        SD_PATH_BINFMT_DIR,
+        SD_PATH_MODULES_LOAD_DIR,
+        SD_PATH_CATALOG_DIR,
+
         _SD_PATH_MAX,
 };