Merge pull request #11143 from keszybz/enable-symlink
Runtime mask symlink confusion fix
This commit is contained in:
commit
2d41e9b7a0
|
@ -1485,7 +1485,7 @@ static const char *migrate_callback(CGroupMask mask, void *userdata) {
|
|||
return unit_get_realized_cgroup_path(userdata, mask);
|
||||
}
|
||||
|
||||
char *unit_default_cgroup_path(Unit *u) {
|
||||
char *unit_default_cgroup_path(const Unit *u) {
|
||||
_cleanup_free_ char *escaped = NULL, *slice = NULL;
|
||||
int r;
|
||||
|
||||
|
|
|
@ -164,7 +164,7 @@ void unit_invalidate_cgroup_members_masks(Unit *u);
|
|||
void unit_add_to_cgroup_realize_queue(Unit *u);
|
||||
|
||||
const char *unit_get_realized_cgroup_path(Unit *u, CGroupMask mask);
|
||||
char *unit_default_cgroup_path(Unit *u);
|
||||
char *unit_default_cgroup_path(const Unit *u);
|
||||
int unit_set_cgroup_path(Unit *u, const char *path);
|
||||
int unit_pick_cgroup_path(Unit *u);
|
||||
|
||||
|
|
|
@ -12,25 +12,25 @@
|
|||
#include "unit.h"
|
||||
#include "user-util.h"
|
||||
|
||||
static int specifier_prefix_and_instance(char specifier, void *data, void *userdata, char **ret) {
|
||||
Unit *u = userdata;
|
||||
static int specifier_prefix_and_instance(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const Unit *u = userdata;
|
||||
|
||||
assert(u);
|
||||
|
||||
return unit_name_to_prefix_and_instance(u->id, ret);
|
||||
}
|
||||
|
||||
static int specifier_prefix(char specifier, void *data, void *userdata, char **ret) {
|
||||
Unit *u = userdata;
|
||||
static int specifier_prefix(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const Unit *u = userdata;
|
||||
|
||||
assert(u);
|
||||
|
||||
return unit_name_to_prefix(u->id, ret);
|
||||
}
|
||||
|
||||
static int specifier_prefix_unescaped(char specifier, void *data, void *userdata, char **ret) {
|
||||
static int specifier_prefix_unescaped(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
Unit *u = userdata;
|
||||
const Unit *u = userdata;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
|
@ -42,16 +42,16 @@ static int specifier_prefix_unescaped(char specifier, void *data, void *userdata
|
|||
return unit_name_unescape(p, ret);
|
||||
}
|
||||
|
||||
static int specifier_instance_unescaped(char specifier, void *data, void *userdata, char **ret) {
|
||||
Unit *u = userdata;
|
||||
static int specifier_instance_unescaped(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const Unit *u = userdata;
|
||||
|
||||
assert(u);
|
||||
|
||||
return unit_name_unescape(strempty(u->instance), ret);
|
||||
}
|
||||
|
||||
static int specifier_last_component(char specifier, void *data, void *userdata, char **ret) {
|
||||
Unit *u = userdata;
|
||||
static int specifier_last_component(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const Unit *u = userdata;
|
||||
_cleanup_free_ char *prefix = NULL;
|
||||
char *dash;
|
||||
int r;
|
||||
|
@ -70,7 +70,7 @@ static int specifier_last_component(char specifier, void *data, void *userdata,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int specifier_last_component_unescaped(char specifier, void *data, void *userdata, char **ret) {
|
||||
static int specifier_last_component_unescaped(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
int r;
|
||||
|
||||
|
@ -81,8 +81,8 @@ static int specifier_last_component_unescaped(char specifier, void *data, void *
|
|||
return unit_name_unescape(p, ret);
|
||||
}
|
||||
|
||||
static int specifier_filename(char specifier, void *data, void *userdata, char **ret) {
|
||||
Unit *u = userdata;
|
||||
static int specifier_filename(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const Unit *u = userdata;
|
||||
|
||||
assert(u);
|
||||
|
||||
|
@ -92,12 +92,12 @@ static int specifier_filename(char specifier, void *data, void *userdata, char *
|
|||
return unit_name_to_path(u->id, ret);
|
||||
}
|
||||
|
||||
static void bad_specifier(Unit *u, char specifier) {
|
||||
static void bad_specifier(const Unit *u, char specifier) {
|
||||
log_unit_warning(u, "Specifier '%%%c' used in unit configuration, which is deprecated. Please update your unit file, as it does not work as intended.", specifier);
|
||||
}
|
||||
|
||||
static int specifier_cgroup(char specifier, void *data, void *userdata, char **ret) {
|
||||
Unit *u = userdata;
|
||||
static int specifier_cgroup(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const Unit *u = userdata;
|
||||
char *n;
|
||||
|
||||
assert(u);
|
||||
|
@ -115,8 +115,8 @@ static int specifier_cgroup(char specifier, void *data, void *userdata, char **r
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int specifier_cgroup_root(char specifier, void *data, void *userdata, char **ret) {
|
||||
Unit *u = userdata;
|
||||
static int specifier_cgroup_root(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const Unit *u = userdata;
|
||||
char *n;
|
||||
|
||||
assert(u);
|
||||
|
@ -131,8 +131,8 @@ static int specifier_cgroup_root(char specifier, void *data, void *userdata, cha
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int specifier_cgroup_slice(char specifier, void *data, void *userdata, char **ret) {
|
||||
Unit *u = userdata;
|
||||
static int specifier_cgroup_slice(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const Unit *u = userdata;
|
||||
char *n;
|
||||
|
||||
assert(u);
|
||||
|
@ -140,7 +140,7 @@ static int specifier_cgroup_slice(char specifier, void *data, void *userdata, ch
|
|||
bad_specifier(u, specifier);
|
||||
|
||||
if (UNIT_ISSET(u->slice)) {
|
||||
Unit *slice;
|
||||
const Unit *slice;
|
||||
|
||||
slice = UNIT_DEREF(u->slice);
|
||||
|
||||
|
@ -157,8 +157,8 @@ static int specifier_cgroup_slice(char specifier, void *data, void *userdata, ch
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int specifier_special_directory(char specifier, void *data, void *userdata, char **ret) {
|
||||
Unit *u = userdata;
|
||||
static int specifier_special_directory(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const Unit *u = userdata;
|
||||
char *n = NULL;
|
||||
|
||||
assert(u);
|
||||
|
|
|
@ -132,7 +132,7 @@ int unit_new_for_name(Manager *m, size_t size, const char *name, Unit **ret) {
|
|||
return r;
|
||||
}
|
||||
|
||||
bool unit_has_name(Unit *u, const char *name) {
|
||||
bool unit_has_name(const Unit *u, const char *name) {
|
||||
assert(u);
|
||||
assert(name);
|
||||
|
||||
|
|
|
@ -648,7 +648,7 @@ int unit_set_default_slice(Unit *u);
|
|||
|
||||
const char *unit_description(Unit *u) _pure_;
|
||||
|
||||
bool unit_has_name(Unit *u, const char *name);
|
||||
bool unit_has_name(const Unit *u, const char *name);
|
||||
|
||||
UnitActiveState unit_active_state(Unit *u);
|
||||
|
||||
|
|
|
@ -141,7 +141,7 @@ static int dnssd_service_load(Manager *manager, const char *filename) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int specifier_dnssd_host_name(char specifier, void *data, void *userdata, char **ret) {
|
||||
static int specifier_dnssd_host_name(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
DnssdService *s = (DnssdService *) userdata;
|
||||
char *n;
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
#include "unit-name.h"
|
||||
#include "user-util.h"
|
||||
|
||||
static int specifier_prefix_and_instance(char specifier, void *data, void *userdata, char **ret) {
|
||||
static int specifier_prefix_and_instance(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const UnitFileInstallInfo *i = userdata;
|
||||
_cleanup_free_ char *prefix = NULL;
|
||||
int r;
|
||||
|
@ -38,7 +38,7 @@ static int specifier_prefix_and_instance(char specifier, void *data, void *userd
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int specifier_name(char specifier, void *data, void *userdata, char **ret) {
|
||||
static int specifier_name(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const UnitFileInstallInfo *i = userdata;
|
||||
char *ans;
|
||||
|
||||
|
@ -54,7 +54,7 @@ static int specifier_name(char specifier, void *data, void *userdata, char **ret
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int specifier_prefix(char specifier, void *data, void *userdata, char **ret) {
|
||||
static int specifier_prefix(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const UnitFileInstallInfo *i = userdata;
|
||||
|
||||
assert(i);
|
||||
|
@ -62,7 +62,7 @@ static int specifier_prefix(char specifier, void *data, void *userdata, char **r
|
|||
return unit_name_to_prefix(i->name, ret);
|
||||
}
|
||||
|
||||
static int specifier_instance(char specifier, void *data, void *userdata, char **ret) {
|
||||
static int specifier_instance(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const UnitFileInstallInfo *i = userdata;
|
||||
char *instance;
|
||||
int r;
|
||||
|
@ -83,7 +83,7 @@ static int specifier_instance(char specifier, void *data, void *userdata, char *
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int specifier_last_component(char specifier, void *data, void *userdata, char **ret) {
|
||||
static int specifier_last_component(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
_cleanup_free_ char *prefix = NULL;
|
||||
char *dash;
|
||||
int r;
|
||||
|
@ -104,8 +104,7 @@ static int specifier_last_component(char specifier, void *data, void *userdata,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int install_full_printf(UnitFileInstallInfo *i, const char *format, char **ret) {
|
||||
|
||||
int install_full_printf(const UnitFileInstallInfo *i, const char *format, char **ret) {
|
||||
/* This is similar to unit_full_printf() but does not support
|
||||
* anything path-related.
|
||||
*
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
|
||||
#include "install.h"
|
||||
|
||||
int install_full_printf(UnitFileInstallInfo *i, const char *format, char **ret);
|
||||
int install_full_printf(const UnitFileInstallInfo *i, const char *format, char **ret);
|
||||
|
|
|
@ -68,7 +68,7 @@ typedef struct {
|
|||
size_t n_rules;
|
||||
} Presets;
|
||||
|
||||
static inline bool unit_file_install_info_has_rules(UnitFileInstallInfo *i) {
|
||||
static inline bool unit_file_install_info_has_rules(const UnitFileInstallInfo *i) {
|
||||
assert(i);
|
||||
|
||||
return !strv_isempty(i->aliases) ||
|
||||
|
@ -76,7 +76,7 @@ static inline bool unit_file_install_info_has_rules(UnitFileInstallInfo *i) {
|
|||
!strv_isempty(i->required_by);
|
||||
}
|
||||
|
||||
static inline bool unit_file_install_info_has_also(UnitFileInstallInfo *i) {
|
||||
static inline bool unit_file_install_info_has_also(const UnitFileInstallInfo *i) {
|
||||
assert(i);
|
||||
|
||||
return !strv_isempty(i->also);
|
||||
|
@ -477,8 +477,10 @@ static int create_symlink(
|
|||
if (!dirname)
|
||||
return -ENOMEM;
|
||||
|
||||
if (chroot_symlinks_same(paths->root_dir, dirname, dest, old_path))
|
||||
if (chroot_symlinks_same(paths->root_dir, dirname, dest, old_path)) {
|
||||
log_debug("Symlink %s → %s already exists", new_path, dest);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!force) {
|
||||
unit_file_changes_add(changes, n_changes, -EEXIST, new_path, dest);
|
||||
|
@ -711,8 +713,9 @@ static int is_symlink_with_known_name(const UnitFileInstallInfo *i, const char *
|
|||
|
||||
static int find_symlinks_fd(
|
||||
const char *root_dir,
|
||||
UnitFileInstallInfo *i,
|
||||
const UnitFileInstallInfo *i,
|
||||
bool match_aliases,
|
||||
bool ignore_same_name,
|
||||
int fd,
|
||||
const char *path,
|
||||
const char *config_path,
|
||||
|
@ -759,7 +762,7 @@ static int find_symlinks_fd(
|
|||
}
|
||||
|
||||
/* This will close nfd, regardless whether it succeeds or not */
|
||||
q = find_symlinks_fd(root_dir, i, match_aliases, nfd,
|
||||
q = find_symlinks_fd(root_dir, i, match_aliases, ignore_same_name, nfd,
|
||||
p, config_path, same_name_link);
|
||||
if (q > 0)
|
||||
return 1;
|
||||
|
@ -768,7 +771,7 @@ static int find_symlinks_fd(
|
|||
|
||||
} else if (de->d_type == DT_LNK) {
|
||||
_cleanup_free_ char *p = NULL, *dest = NULL;
|
||||
bool found_path, found_dest, b = false;
|
||||
bool found_path = false, found_dest, b = false;
|
||||
int q;
|
||||
|
||||
/* Acquire symlink name */
|
||||
|
@ -794,23 +797,20 @@ static int find_symlinks_fd(
|
|||
if (!x)
|
||||
return -ENOMEM;
|
||||
|
||||
free(dest);
|
||||
dest = x;
|
||||
free_and_replace(dest, x);
|
||||
}
|
||||
|
||||
/* Check if the symlink itself matches what we
|
||||
* are looking for */
|
||||
if (path_is_absolute(i->name))
|
||||
found_path = path_equal(p, i->name);
|
||||
else
|
||||
found_path = streq(de->d_name, i->name);
|
||||
assert(unit_name_is_valid(i->name, UNIT_NAME_ANY));
|
||||
if (!ignore_same_name)
|
||||
/* Check if the symlink itself matches what we are looking for.
|
||||
*
|
||||
* If ignore_same_name is specified, we are in one of the directories which
|
||||
* have lower priority than the unit file, and even if a file or symlink with
|
||||
* this name was found, we should ignore it. */
|
||||
found_path = streq(de->d_name, i->name);
|
||||
|
||||
/* Check if what the symlink points to
|
||||
* matches what we are looking for */
|
||||
if (path_is_absolute(i->name))
|
||||
found_dest = path_equal(dest, i->name);
|
||||
else
|
||||
found_dest = streq(basename(dest), i->name);
|
||||
/* Check if what the symlink points to matches what we are looking for */
|
||||
found_dest = streq(basename(dest), i->name);
|
||||
|
||||
if (found_path && found_dest) {
|
||||
_cleanup_free_ char *t = NULL;
|
||||
|
@ -845,8 +845,9 @@ static int find_symlinks_fd(
|
|||
|
||||
static int find_symlinks(
|
||||
const char *root_dir,
|
||||
UnitFileInstallInfo *i,
|
||||
const UnitFileInstallInfo *i,
|
||||
bool match_name,
|
||||
bool ignore_same_name,
|
||||
const char *config_path,
|
||||
bool *same_name_link) {
|
||||
|
||||
|
@ -864,29 +865,34 @@ static int find_symlinks(
|
|||
}
|
||||
|
||||
/* This takes possession of fd and closes it */
|
||||
return find_symlinks_fd(root_dir, i, match_name, fd,
|
||||
return find_symlinks_fd(root_dir, i, match_name, ignore_same_name, fd,
|
||||
config_path, config_path, same_name_link);
|
||||
}
|
||||
|
||||
static int find_symlinks_in_scope(
|
||||
UnitFileScope scope,
|
||||
const LookupPaths *paths,
|
||||
UnitFileInstallInfo *i,
|
||||
const UnitFileInstallInfo *i,
|
||||
bool match_name,
|
||||
UnitFileState *state) {
|
||||
|
||||
bool same_name_link_runtime = false, same_name_link_config = false;
|
||||
bool enabled_in_runtime = false, enabled_at_all = false;
|
||||
bool ignore_same_name = false;
|
||||
char **p;
|
||||
int r;
|
||||
|
||||
assert(paths);
|
||||
assert(i);
|
||||
|
||||
/* As we iterate over the list of search paths in paths->search_path, we may encounter "same name"
|
||||
* symlinks. The ones which are "below" (i.e. have lower priority) than the unit file itself are
|
||||
* efectively masked, so we should ignore them. */
|
||||
|
||||
STRV_FOREACH(p, paths->search_path) {
|
||||
bool same_name_link = false;
|
||||
|
||||
r = find_symlinks(paths->root_dir, i, match_name, *p, &same_name_link);
|
||||
r = find_symlinks(paths->root_dir, i, match_name, ignore_same_name, *p, &same_name_link);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r > 0) {
|
||||
|
@ -923,6 +929,11 @@ static int find_symlinks_in_scope(
|
|||
same_name_link_runtime = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if next iteration will be "below" the unit file (either a regular file
|
||||
* or a symlink), and hence should be ignored */
|
||||
if (!ignore_same_name && path_startswith(i->path, *p))
|
||||
ignore_same_name = true;
|
||||
}
|
||||
|
||||
if (enabled_in_runtime) {
|
||||
|
@ -987,7 +998,7 @@ static UnitFileInstallInfo *install_info_find(InstallContext *c, const char *nam
|
|||
}
|
||||
|
||||
static int install_info_may_process(
|
||||
UnitFileInstallInfo *i,
|
||||
const UnitFileInstallInfo *i,
|
||||
const LookupPaths *paths,
|
||||
UnitFileChange **changes,
|
||||
size_t *n_changes) {
|
||||
|
@ -2665,7 +2676,11 @@ int unit_file_lookup_state(
|
|||
r = install_info_discover(scope, &c, paths, name, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS,
|
||||
&i, NULL, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
return log_debug_errno(r, "Failed to discover unit %s: %m", name);
|
||||
|
||||
assert(IN_SET(i->type, UNIT_FILE_TYPE_REGULAR, UNIT_FILE_TYPE_MASKED));
|
||||
log_debug("Found unit %s at %s (%s)", name, strna(i->path),
|
||||
i->type == UNIT_FILE_TYPE_REGULAR ? "regular file" : "mask");
|
||||
|
||||
/* Shortcut things, if the caller just wants to know if this unit exists. */
|
||||
if (!ret)
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
* and "%" used for escaping. */
|
||||
#define POSSIBLE_SPECIFIERS ALPHANUMERICAL "%"
|
||||
|
||||
int specifier_printf(const char *text, const Specifier table[], void *userdata, char **_ret) {
|
||||
int specifier_printf(const char *text, const Specifier table[], const void *userdata, char **_ret) {
|
||||
size_t l, allocated = 0;
|
||||
_cleanup_free_ char *ret = NULL;
|
||||
char *t;
|
||||
|
@ -102,7 +102,7 @@ int specifier_printf(const char *text, const Specifier table[], void *userdata,
|
|||
|
||||
/* Generic handler for simple string replacements */
|
||||
|
||||
int specifier_string(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_string(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
char *n;
|
||||
|
||||
n = strdup(strempty(data));
|
||||
|
@ -113,7 +113,7 @@ int specifier_string(char specifier, void *data, void *userdata, char **ret) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int specifier_machine_id(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_machine_id(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
sd_id128_t id;
|
||||
char *n;
|
||||
int r;
|
||||
|
@ -130,7 +130,7 @@ int specifier_machine_id(char specifier, void *data, void *userdata, char **ret)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int specifier_boot_id(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_boot_id(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
sd_id128_t id;
|
||||
char *n;
|
||||
int r;
|
||||
|
@ -147,7 +147,7 @@ int specifier_boot_id(char specifier, void *data, void *userdata, char **ret) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int specifier_host_name(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_host_name(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
char *n;
|
||||
|
||||
n = gethostname_malloc();
|
||||
|
@ -158,7 +158,7 @@ int specifier_host_name(char specifier, void *data, void *userdata, char **ret)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int specifier_kernel_release(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_kernel_release(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
struct utsname uts;
|
||||
char *n;
|
||||
int r;
|
||||
|
@ -175,7 +175,7 @@ int specifier_kernel_release(char specifier, void *data, void *userdata, char **
|
|||
return 0;
|
||||
}
|
||||
|
||||
int specifier_group_name(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_group_name(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
char *t;
|
||||
|
||||
t = gid_to_name(getgid());
|
||||
|
@ -186,14 +186,14 @@ int specifier_group_name(char specifier, void *data, void *userdata, char **ret)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int specifier_group_id(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_group_id(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
if (asprintf(ret, UID_FMT, getgid()) < 0)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int specifier_user_name(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_user_name(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
char *t;
|
||||
|
||||
/* If we are UID 0 (root), this will not result in NSS, otherwise it might. This is good, as we want to be able
|
||||
|
@ -211,7 +211,7 @@ int specifier_user_name(char specifier, void *data, void *userdata, char **ret)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int specifier_user_id(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_user_id(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
|
||||
if (asprintf(ret, UID_FMT, getuid()) < 0)
|
||||
return -ENOMEM;
|
||||
|
@ -219,7 +219,7 @@ int specifier_user_id(char specifier, void *data, void *userdata, char **ret) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int specifier_user_home(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_user_home(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
|
||||
/* On PID 1 (which runs as root) this will not result in NSS,
|
||||
* which is good. See above */
|
||||
|
@ -227,7 +227,7 @@ int specifier_user_home(char specifier, void *data, void *userdata, char **ret)
|
|||
return get_home_dir(ret);
|
||||
}
|
||||
|
||||
int specifier_user_shell(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_user_shell(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
|
||||
/* On PID 1 (which runs as root) this will not result in NSS,
|
||||
* which is good. See above */
|
||||
|
@ -235,7 +235,7 @@ int specifier_user_shell(char specifier, void *data, void *userdata, char **ret)
|
|||
return get_shell(ret);
|
||||
}
|
||||
|
||||
int specifier_tmp_dir(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_tmp_dir(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const char *p;
|
||||
char *copy;
|
||||
int r;
|
||||
|
@ -252,7 +252,7 @@ int specifier_tmp_dir(char specifier, void *data, void *userdata, char **ret) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int specifier_var_tmp_dir(char specifier, void *data, void *userdata, char **ret) {
|
||||
int specifier_var_tmp_dir(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
const char *p;
|
||||
char *copy;
|
||||
int r;
|
||||
|
|
|
@ -3,32 +3,32 @@
|
|||
|
||||
#include "string-util.h"
|
||||
|
||||
typedef int (*SpecifierCallback)(char specifier, void *data, void *userdata, char **ret);
|
||||
typedef int (*SpecifierCallback)(char specifier, const void *data, const void *userdata, char **ret);
|
||||
|
||||
typedef struct Specifier {
|
||||
const char specifier;
|
||||
const SpecifierCallback lookup;
|
||||
void *data;
|
||||
const void *data;
|
||||
} Specifier;
|
||||
|
||||
int specifier_printf(const char *text, const Specifier table[], void *userdata, char **ret);
|
||||
int specifier_printf(const char *text, const Specifier table[], const void *userdata, char **ret);
|
||||
|
||||
int specifier_string(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_string(char specifier, const void *data, const void *userdata, char **ret);
|
||||
|
||||
int specifier_machine_id(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_boot_id(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_host_name(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_kernel_release(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_machine_id(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_boot_id(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_host_name(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_kernel_release(char specifier, const void *data, const void *userdata, char **ret);
|
||||
|
||||
int specifier_group_name(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_group_id(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_user_name(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_user_id(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_user_home(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_user_shell(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_group_name(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_group_id(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_user_name(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_user_id(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_user_home(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_user_shell(char specifier, const void *data, const void *userdata, char **ret);
|
||||
|
||||
int specifier_tmp_dir(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_var_tmp_dir(char specifier, void *data, void *userdata, char **ret);
|
||||
int specifier_tmp_dir(char specifier, const void *data, const void *userdata, char **ret);
|
||||
int specifier_var_tmp_dir(char specifier, const void *data, const void *userdata, char **ret);
|
||||
|
||||
static inline char* specifier_escape(const char *string) {
|
||||
return strreplace(string, "%", "%%");
|
||||
|
|
|
@ -180,8 +180,8 @@ STATIC_DESTRUCTOR_REGISTER(arg_include_prefixes, freep);
|
|||
STATIC_DESTRUCTOR_REGISTER(arg_exclude_prefixes, freep);
|
||||
STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
|
||||
|
||||
static int specifier_machine_id_safe(char specifier, void *data, void *userdata, char **ret);
|
||||
static int specifier_directory(char specifier, void *data, void *userdata, char **ret);
|
||||
static int specifier_machine_id_safe(char specifier, const void *data, const void *userdata, char **ret);
|
||||
static int specifier_directory(char specifier, const void *data, const void *userdata, char **ret);
|
||||
|
||||
static const Specifier specifier_table[] = {
|
||||
{ 'm', specifier_machine_id_safe, NULL },
|
||||
|
@ -204,7 +204,7 @@ static const Specifier specifier_table[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
static int specifier_machine_id_safe(char specifier, void *data, void *userdata, char **ret) {
|
||||
static int specifier_machine_id_safe(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
int r;
|
||||
|
||||
/* If /etc/machine_id is missing or empty (e.g. in a chroot environment)
|
||||
|
@ -218,7 +218,7 @@ static int specifier_machine_id_safe(char specifier, void *data, void *userdata,
|
|||
return r;
|
||||
}
|
||||
|
||||
static int specifier_directory(char specifier, void *data, void *userdata, char **ret) {
|
||||
static int specifier_directory(char specifier, const void *data, const void *userdata, char **ret) {
|
||||
struct table_entry {
|
||||
uint64_t type;
|
||||
const char *suffix;
|
||||
|
|
Loading…
Reference in a new issue