sd_path_lookup, sd_path_lookup_strv — Query well-known file system paths
#include <systemd/sd-path.h>
enum {SD_PATH_TEMPORARY
,SD_PATH_TEMPORARY_LARGE
,SD_PATH_SYSTEM_BINARIES
,SD_PATH_SYSTEM_INCLUDE
,SD_PATH_SYSTEM_LIBRARY_PRIVATE
,SD_PATH_SYSTEM_LIBRARY_ARCH
,SD_PATH_SYSTEM_SHARED
,SD_PATH_SYSTEM_CONFIGURATION_FACTORY
,SD_PATH_SYSTEM_STATE_FACTORY
,SD_PATH_SYSTEM_CONFIGURATION
,SD_PATH_SYSTEM_RUNTIME
,SD_PATH_SYSTEM_RUNTIME_LOGS
,SD_PATH_SYSTEM_STATE_PRIVATE
,SD_PATH_SYSTEM_STATE_LOGS
,SD_PATH_SYSTEM_STATE_CACHE
,SD_PATH_SYSTEM_STATE_SPOOL
,SD_PATH_USER_BINARIES
,SD_PATH_USER_LIBRARY_PRIVATE
,SD_PATH_USER_LIBRARY_ARCH
,SD_PATH_USER_SHARED
,SD_PATH_USER_CONFIGURATION
,SD_PATH_USER_RUNTIME
,SD_PATH_USER_STATE_PRIVATE
,SD_PATH_USER_STATE_CACHE
,SD_PATH_USER
,SD_PATH_USER_DOCUMENTS
,SD_PATH_USER_MUSIC
,SD_PATH_USER_PICTURES
,SD_PATH_USER_VIDEOS
,SD_PATH_USER_DOWNLOAD
,SD_PATH_USER_PUBLIC
,SD_PATH_USER_TEMPLATES
,SD_PATH_USER_DESKTOP
,SD_PATH_SEARCH_BINARIES
,SD_PATH_SEARCH_BINARIES_DEFAULT
,SD_PATH_SEARCH_LIBRARY_PRIVATE
,SD_PATH_SEARCH_LIBRARY_ARCH
,SD_PATH_SEARCH_SHARED
,SD_PATH_SEARCH_CONFIGURATION_FACTORY
,SD_PATH_SEARCH_STATE_FACTORY
,SD_PATH_SEARCH_CONFIGURATION
,SD_PATH_SYSTEMD_UTIL
,SD_PATH_SYSTEMD_SYSTEM_UNIT
,SD_PATH_SYSTEMD_SYSTEM_PRESET
,SD_PATH_SYSTEMD_USER_UNIT
,SD_PATH_SYSTEMD_USER_PRESET
,SD_PATH_SYSTEMD_SYSTEM_CONF
,SD_PATH_SYSTEMD_USER_CONF
,SD_PATH_SYSTEMD_SEARCH_SYSTEM_UNIT
,SD_PATH_SYSTEMD_SEARCH_USER_UNIT
,SD_PATH_SYSTEMD_SYSTEM_GENERATOR
,SD_PATH_SYSTEMD_USER_GENERATOR
,SD_PATH_SYSTEMD_SEARCH_SYSTEM_GENERATOR
,SD_PATH_SYSTEMD_SEARCH_USER_GENERATOR
,SD_PATH_SYSTEMD_SLEEP
,SD_PATH_SYSTEMD_SHUTDOWN
,SD_PATH_TMPFILES
,SD_PATH_SYSUSERS
,SD_PATH_SYSCTL
,SD_PATH_BINFMT
,SD_PATH_MODULES_LOAD
,SD_PATH_CATALOG
,SD_PATH_SYSTEMD_SEARCH_NETWORK
,SD_PATH_SYSTEMD_SYSTEM_ENVIRONMENT_GENERATOR
,SD_PATH_SYSTEMD_USER_ENVIRONMENT_GENERATOR
,SD_PATH_SYSTEMD_SEARCH_SYSTEM_ENVIRONMENT_GENERATOR
,SD_PATH_SYSTEMD_SEARCH_USER_ENVIRONMENT_GENERATOR
, };
int sd_path_lookup( | uint64_t type, |
const char *suffix, | |
char **paths) ; |
int sd_path_lookup_strv( | uint64_t type, |
const char *suffix, | |
char ***paths) ; |
sd_path_lookup()
and sd_bus_path_lookup_strv()
return a
single path or set of file system paths specified by the argument type
. In case of
sd_path_lookup()
a single NUL
-terminated string is returned.
When type
specifies a set of paths, they are concatenated using
":
" as a separator (as is traditionally done for e.g. $PATH
or
$LD_LIBRARY_PATH
). In case of sd_path_lookup_strv()
a
NULL
-terminated array of strings is returned (strv). If suffix
suffix
is given, it is concatenated to each of the paths after a slash
("/
"). All returned paths are absolute.
For paths which refer to user directories, the relevant XDG standard is followed, with support for
environment variables like $XDG_DOCUMENTS_DIR
, $XDG_DESKTOP_DIR
,
..., and explicit configuration in /etc/xdg/user-dirs.conf
or
${XDG_CONFIG_HOME}/user-dirs.dirs
. See
XDG Base Directory Specification for details.
systemd-path(1) is
a wrapper around sd_path_lookup()
and allows the same set of paths to be queried.
On success, sd_path_lookup()
and sd_path_lookup_strv()
return a non-negative integer. On failure, a negative errno-style error number is returned by either
function.
The returned string or string array (strv) must be free(3)'d by the caller.
/* SPDX-License-Identifier: MIT-0 */ #include <stdio.h> #include <stdlib.h> #include <systemd/sd-path.h> int main(void) { int r; char *t; r = sd_path_lookup(SD_PATH_USER_DOCUMENTS, NULL, &t); if (r < 0) return EXIT_FAILURE; printf("~/Documents: %s\n", t); free(t); return EXIT_SUCCESS; }
Note that the default answer of $HOME/Documents
may be
overridden by user-dirs.conf
or
$XDG_DOCUMENTS_DIR
.
Functions described here are available as a shared
library, which can be compiled against and linked to with the
libsystemd
pkg-config(1)
file.
The code described here uses
getenv(3),
which is declared to be not multi-thread-safe. This means that the code calling the functions described
here must not call
setenv(3)
from a parallel thread. It is recommended to only do calls to setenv()
from an early phase of the program when no other threads have been started.