Skip to content

Commit 9c5bb20

Browse files
committed
path: show various systemd directories and search paths too
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.
1 parent ce7eb6a commit 9c5bb20

File tree

4 files changed

+167
-0
lines changed

4 files changed

+167
-0
lines changed

man/sd_path_lookup.xml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,29 @@
7575
<constant>SD_PATH_SEARCH_CONFIGURATION_FACTORY</constant>,
7676
<constant>SD_PATH_SEARCH_STATE_FACTORY</constant>,
7777
<constant>SD_PATH_SEARCH_CONFIGURATION</constant>,
78+
79+
<constant>SD_PATH_SYSTEMD_UTIL_DIR</constant>,
80+
<constant>SD_PATH_SYSTEMD_SYSTEM_UNIT_DIR</constant>,
81+
<constant>SD_PATH_SYSTEMD_SYSTEM_PRESET_DIR</constant>,
82+
<constant>SD_PATH_SYSTEMD_USER_UNIT_DIR</constant>,
83+
<constant>SD_PATH_SYSTEMD_USER_PRESET_DIR</constant>,
84+
<constant>SD_PATH_SYSTEMD_SYSTEM_CONF_DIR</constant>,
85+
<constant>SD_PATH_SYSTEMD_USER_CONF_DIR</constant>,
86+
<constant>SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH</constant>,
87+
<constant>SD_PATH_SYSTEMD_USER_UNIT_PATH</constant>,
88+
<constant>SD_PATH_SYSTEMD_SYSTEM_GENERATOR_DIR</constant>,
89+
<constant>SD_PATH_SYSTEMD_USER_GENERATOR_DIR</constant>,
90+
<constant>SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH</constant>,
91+
<constant>SD_PATH_SYSTEMD_USER_GENERATOR_PATH</constant>,
92+
<constant>SD_PATH_SYSTEMD_SLEEP_DIR</constant>,
93+
<constant>SD_PATH_SYSTEMD_SHUTDOWN_DIR</constant>,
94+
95+
<constant>SD_PATH_TMPFILES_DIR</constant>,
96+
<constant>SD_PATH_SYSUSERS_DIR</constant>,
97+
<constant>SD_PATH_SYSCTL_DIR</constant>,
98+
<constant>SD_PATH_BINFMT_DIR</constant>,
99+
<constant>SD_PATH_MODULES_LOAD_DIR</constant>,
100+
<constant>SD_PATH_CATALOG_DIR</constant>,
78101
};</funcsynopsisinfo>
79102

80103
<funcprototype>

src/libsystemd/sd-path/sd-path.c

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "fd-util.h"
88
#include "fileio.h"
99
#include "fs-util.h"
10+
#include "path-lookup.h"
1011
#include "path-util.h"
1112
#include "string-util.h"
1213
#include "strv.h"
@@ -318,6 +319,76 @@ static int get_path(uint64_t type, char **buffer, const char **ret) {
318319

319320
case SD_PATH_USER_DESKTOP:
320321
return from_user_dir("XDG_DESKTOP_DIR", buffer, ret);
322+
323+
case SD_PATH_SYSTEMD_UTIL_DIR:
324+
*ret = ROOTPREFIX "lib/systemd";
325+
return 0;
326+
327+
case SD_PATH_SYSTEMD_SYSTEM_UNIT_DIR:
328+
*ret = SYSTEM_DATA_UNIT_PATH;
329+
return 0;
330+
331+
case SD_PATH_SYSTEMD_SYSTEM_PRESET_DIR:
332+
*ret = ROOTPREFIX "lib/systemd/system-preset";
333+
return 0;
334+
335+
case SD_PATH_SYSTEMD_USER_UNIT_DIR:
336+
*ret = USER_DATA_UNIT_PATH;
337+
return 0;
338+
339+
case SD_PATH_SYSTEMD_USER_PRESET_DIR:
340+
*ret = ROOTPREFIX "lib/systemd/user-preset";
341+
return 0;
342+
343+
case SD_PATH_SYSTEMD_SYSTEM_CONF_DIR:
344+
*ret = SYSTEM_CONFIG_UNIT_PATH; // FIXME: _DIR vs. _PATH
345+
return 0;
346+
347+
case SD_PATH_SYSTEMD_USER_CONF_DIR:
348+
*ret = USER_CONFIG_UNIT_PATH; // FIXME: _DIR vs. _PATH
349+
return 0;
350+
351+
case SD_PATH_SYSTEMD_SYSTEM_GENERATOR_DIR:
352+
*ret = SYSTEM_GENERATOR_PATH; // FIXME: _DIR vs. _PATH
353+
return 0;
354+
355+
case SD_PATH_SYSTEMD_USER_GENERATOR_DIR:
356+
*ret = USER_GENERATOR_PATH; // FIXME: _DIR vs. _PATH
357+
return 0;
358+
359+
case SD_PATH_SYSTEMD_SLEEP_DIR:
360+
*ret = ROOTPREFIX "lib/systemd/system-sleep";
361+
return 0;
362+
363+
case SD_PATH_SYSTEMD_SHUTDOWN_DIR:
364+
*ret = ROOTPREFIX "lib/systemd/system-shutdown";
365+
return 0;
366+
367+
/* FIXME: systemd.pc uses ${prefix}, but CONF_PATHS_NULSTR doesn't.
368+
* Should ${prefix} use in systemd.pc be removed? */
369+
case SD_PATH_TMPFILES_DIR:
370+
*ret = "/usr/lib/tmpfiles.d";
371+
return 0;
372+
373+
case SD_PATH_SYSUSERS_DIR:
374+
*ret = "/usr/lib/sysusers.d";
375+
return 0;
376+
377+
case SD_PATH_SYSCTL_DIR:
378+
*ret = "/usr/lib/sysctl.d";
379+
return 0;
380+
381+
case SD_PATH_BINFMT_DIR:
382+
*ret = "/usr/lib/binfmt.d";
383+
return 0;
384+
385+
case SD_PATH_MODULES_LOAD_DIR:
386+
*ret = "/usr/lib/modules-load.d";
387+
return 0;
388+
389+
case SD_PATH_CATALOG_DIR:
390+
*ret = "/usr/lib/systemd/catalog";
391+
return 0;
321392
}
322393

323394
return -EOPNOTSUPP;
@@ -450,6 +521,7 @@ static int search_from_environment(
450521
#endif
451522

452523
static int get_search(uint64_t type, char ***list) {
524+
int r;
453525

454526
assert(list);
455527

@@ -535,9 +607,34 @@ static int get_search(uint64_t type, char ***list) {
535607
case SD_PATH_SEARCH_BINARIES_DEFAULT:
536608
return strv_from_nulstr(list, DEFAULT_PATH_NULSTR);
537609

610+
case SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH:
611+
case SD_PATH_SYSTEMD_USER_UNIT_PATH: {
612+
_cleanup_(lookup_paths_free) LookupPaths lp = {};
613+
const UnitFileScope scope = type == SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH ?
614+
UNIT_FILE_SYSTEM : UNIT_FILE_USER;
615+
616+
r = lookup_paths_init(&lp, scope, 0, NULL);
617+
if (r < 0)
618+
return r;
538619

620+
*list = TAKE_PTR(lp.search_path);
621+
return 0;
539622
}
540623

624+
case SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH:
625+
case SD_PATH_SYSTEMD_USER_GENERATOR_PATH: {
626+
char **t;
627+
const UnitFileScope scope = type == SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH ?
628+
UNIT_FILE_SYSTEM : UNIT_FILE_USER;
629+
630+
t = generator_binary_paths(scope);
631+
if (!t)
632+
return -ENOMEM;
633+
634+
*list = t;
635+
return 0;
636+
}}
637+
541638
return -EOPNOTSUPP;
542639
}
543640

src/path/path.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,29 @@ static const char* const path_table[_SD_PATH_MAX] = {
5858
[SD_PATH_SEARCH_CONFIGURATION_FACTORY] = "search-configuration-factory",
5959
[SD_PATH_SEARCH_STATE_FACTORY] = "search-state-factory",
6060
[SD_PATH_SEARCH_CONFIGURATION] = "search-configuration",
61+
62+
[SD_PATH_SYSTEMD_UTIL_DIR] = "systemd-util-dir",
63+
[SD_PATH_SYSTEMD_SYSTEM_UNIT_DIR] = "systemd-system-unit-dir",
64+
[SD_PATH_SYSTEMD_SYSTEM_PRESET_DIR] = "systemd-system-preset-dir",
65+
[SD_PATH_SYSTEMD_USER_UNIT_DIR] = "systemd-user-unit-dir",
66+
[SD_PATH_SYSTEMD_USER_PRESET_DIR] = "systemd-user-preset-dir",
67+
[SD_PATH_SYSTEMD_SYSTEM_CONF_DIR] = "systemd-system-conf-dir",
68+
[SD_PATH_SYSTEMD_USER_CONF_DIR] = "systemd-user-conf-dir",
69+
[SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH] = "systemd-system-unit-path",
70+
[SD_PATH_SYSTEMD_USER_UNIT_PATH] = "systemd-user-unit-path",
71+
[SD_PATH_SYSTEMD_SYSTEM_GENERATOR_DIR] = "systemd-system-generator-dir",
72+
[SD_PATH_SYSTEMD_USER_GENERATOR_DIR] = "systemd-user-generator-dir",
73+
[SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH] = "systemd-system-generator-path",
74+
[SD_PATH_SYSTEMD_USER_GENERATOR_PATH] = "systemd-user-generator-path",
75+
[SD_PATH_SYSTEMD_SLEEP_DIR] = "systemd-sleep-dir",
76+
[SD_PATH_SYSTEMD_SHUTDOWN_DIR] = "systemd-shutdown-dir",
77+
78+
[SD_PATH_TMPFILES_DIR] = "tmpfiles-dir",
79+
[SD_PATH_SYSUSERS_DIR] = "sysusers-dir",
80+
[SD_PATH_SYSCTL_DIR] = "sysctl-dir",
81+
[SD_PATH_BINFMT_DIR] = "binfmt-dir",
82+
[SD_PATH_MODULES_LOAD_DIR] = "modules-load-dir",
83+
[SD_PATH_CATALOG_DIR] = "catalog-dir",
6184
};
6285

6386
static int list_homes(void) {

src/systemd/sd-path.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,30 @@ enum {
7878
SD_PATH_SEARCH_STATE_FACTORY,
7979
SD_PATH_SEARCH_CONFIGURATION,
8080

81+
/* Various systemd paths, generally mirroring systemd.pc */
82+
SD_PATH_SYSTEMD_UTIL_DIR,
83+
SD_PATH_SYSTEMD_SYSTEM_UNIT_DIR,
84+
SD_PATH_SYSTEMD_SYSTEM_PRESET_DIR,
85+
SD_PATH_SYSTEMD_USER_UNIT_DIR,
86+
SD_PATH_SYSTEMD_USER_PRESET_DIR,
87+
SD_PATH_SYSTEMD_SYSTEM_CONF_DIR,
88+
SD_PATH_SYSTEMD_USER_CONF_DIR,
89+
SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH,
90+
SD_PATH_SYSTEMD_USER_UNIT_PATH,
91+
SD_PATH_SYSTEMD_SYSTEM_GENERATOR_DIR,
92+
SD_PATH_SYSTEMD_USER_GENERATOR_DIR,
93+
SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH,
94+
SD_PATH_SYSTEMD_USER_GENERATOR_PATH,
95+
SD_PATH_SYSTEMD_SLEEP_DIR,
96+
SD_PATH_SYSTEMD_SHUTDOWN_DIR,
97+
98+
SD_PATH_TMPFILES_DIR,
99+
SD_PATH_SYSUSERS_DIR,
100+
SD_PATH_SYSCTL_DIR,
101+
SD_PATH_BINFMT_DIR,
102+
SD_PATH_MODULES_LOAD_DIR,
103+
SD_PATH_CATALOG_DIR,
104+
81105
_SD_PATH_MAX,
82106
};
83107

0 commit comments

Comments
 (0)