Merge pull request #15635 from keszybz/set-put-strdup
Let set_put_strdup() allocate the set and related changes
This commit is contained in:
commit
5cea17a177
|
@ -141,7 +141,7 @@ static void security_info_free(struct security_info *i) {
|
||||||
strv_free(i->supplementary_groups);
|
strv_free(i->supplementary_groups);
|
||||||
strv_free(i->system_call_architectures);
|
strv_free(i->system_call_architectures);
|
||||||
|
|
||||||
set_free_free(i->system_call_filter);
|
set_free(i->system_call_filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool security_info_runs_privileged(const struct security_info *i) {
|
static bool security_info_runs_privileged(const struct security_info *i) {
|
||||||
|
@ -1728,11 +1728,7 @@ static int property_read_system_call_filter(
|
||||||
if (r == 0)
|
if (r == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
r = set_ensure_allocated(&info->system_call_filter, &string_hash_ops);
|
r = set_put_strdup(&info->system_call_filter, name);
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = set_put_strdup(info->system_call_filter, name);
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1655,7 +1655,7 @@ static int dump_exit_status(int argc, char *argv[], void *userdata) {
|
||||||
#if HAVE_SECCOMP
|
#if HAVE_SECCOMP
|
||||||
|
|
||||||
static int load_kernel_syscalls(Set **ret) {
|
static int load_kernel_syscalls(Set **ret) {
|
||||||
_cleanup_(set_free_freep) Set *syscalls = NULL;
|
_cleanup_set_free_ Set *syscalls = NULL;
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -1691,11 +1691,7 @@ static int load_kernel_syscalls(Set **ret) {
|
||||||
if (STR_IN_SET(e, "newuname", "newfstat", "newstat", "newlstat", "sysctl"))
|
if (STR_IN_SET(e, "newuname", "newfstat", "newstat", "newlstat", "sysctl"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
r = set_ensure_allocated(&syscalls, &string_hash_ops);
|
r = set_put_strdup(&syscalls, e);
|
||||||
if (r < 0)
|
|
||||||
return log_oom();
|
|
||||||
|
|
||||||
r = set_put_strdup(syscalls, e);
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to add system call to list: %m");
|
return log_error_errno(r, "Failed to add system call to list: %m");
|
||||||
}
|
}
|
||||||
|
@ -1735,7 +1731,7 @@ static int dump_syscall_filters(int argc, char *argv[], void *userdata) {
|
||||||
(void) pager_open(arg_pager_flags);
|
(void) pager_open(arg_pager_flags);
|
||||||
|
|
||||||
if (strv_isempty(strv_skip(argv, 1))) {
|
if (strv_isempty(strv_skip(argv, 1))) {
|
||||||
_cleanup_(set_free_freep) Set *kernel = NULL;
|
_cleanup_set_free_ Set *kernel = NULL;
|
||||||
int i, k;
|
int i, k;
|
||||||
|
|
||||||
k = load_kernel_syscalls(&kernel);
|
k = load_kernel_syscalls(&kernel);
|
||||||
|
|
|
@ -77,8 +77,10 @@ static int files_add(
|
||||||
/* Is this a masking entry? */
|
/* Is this a masking entry? */
|
||||||
if ((flags & CONF_FILES_FILTER_MASKED))
|
if ((flags & CONF_FILES_FILTER_MASKED))
|
||||||
if (null_or_empty(&st)) {
|
if (null_or_empty(&st)) {
|
||||||
|
assert(masked);
|
||||||
|
|
||||||
/* Mark this one as masked */
|
/* Mark this one as masked */
|
||||||
r = set_put_strdup(masked, de->d_name);
|
r = set_put_strdup(&masked, de->d_name);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ void string_hash_func(const char *p, struct siphash *state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_HASH_OPS(string_hash_ops, char, string_hash_func, string_compare_func);
|
DEFINE_HASH_OPS(string_hash_ops, char, string_hash_func, string_compare_func);
|
||||||
|
DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(string_hash_ops_free,
|
||||||
|
char, string_hash_func, string_compare_func, free);
|
||||||
DEFINE_HASH_OPS_FULL(string_hash_ops_free_free,
|
DEFINE_HASH_OPS_FULL(string_hash_ops_free_free,
|
||||||
char, string_hash_func, string_compare_func, free,
|
char, string_hash_func, string_compare_func, free,
|
||||||
char, free);
|
char, free);
|
||||||
|
|
|
@ -76,6 +76,7 @@ struct hash_ops {
|
||||||
void string_hash_func(const char *p, struct siphash *state);
|
void string_hash_func(const char *p, struct siphash *state);
|
||||||
#define string_compare_func strcmp
|
#define string_compare_func strcmp
|
||||||
extern const struct hash_ops string_hash_ops;
|
extern const struct hash_ops string_hash_ops;
|
||||||
|
extern const struct hash_ops string_hash_ops_free;
|
||||||
extern const struct hash_ops string_hash_ops_free_free;
|
extern const struct hash_ops string_hash_ops_free_free;
|
||||||
|
|
||||||
void path_hash_func(const char *p, struct siphash *state);
|
void path_hash_func(const char *p, struct siphash *state);
|
||||||
|
|
|
@ -1775,41 +1775,54 @@ int hashmap_put_strdup(Hashmap **h, const char *k, const char *v) {
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
_cleanup_free_ char *kdup = NULL, *vdup = NULL;
|
_cleanup_free_ char *kdup = NULL, *vdup = NULL;
|
||||||
|
|
||||||
kdup = strdup(k);
|
kdup = strdup(k);
|
||||||
vdup = strdup(v);
|
if (!kdup)
|
||||||
if (!kdup || !vdup)
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if (v) {
|
||||||
|
vdup = strdup(v);
|
||||||
|
if (!vdup)
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
r = hashmap_put(*h, kdup, vdup);
|
r = hashmap_put(*h, kdup, vdup);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
if (r == -EEXIST && streq(v, hashmap_get(*h, kdup)))
|
if (r == -EEXIST && streq_ptr(v, hashmap_get(*h, kdup)))
|
||||||
return 0;
|
return 0;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(r > 0); /* 0 would mean vdup is already in the hashmap, which cannot be */
|
/* 0 with non-null vdup would mean vdup is already in the hashmap, which cannot be */
|
||||||
kdup = vdup = NULL;
|
assert(vdup == NULL || r > 0);
|
||||||
|
if (r > 0)
|
||||||
|
kdup = vdup = NULL;
|
||||||
|
|
||||||
return 0;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int set_put_strdup(Set *s, const char *p) {
|
int set_put_strdup(Set **s, const char *p) {
|
||||||
char *c;
|
char *c;
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(s);
|
assert(s);
|
||||||
assert(p);
|
assert(p);
|
||||||
|
|
||||||
if (set_contains(s, (char*) p))
|
r = set_ensure_allocated(s, &string_hash_ops_free);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
if (set_contains(*s, (char*) p))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
c = strdup(p);
|
c = strdup(p);
|
||||||
if (!c)
|
if (!c)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
return set_consume(s, c);
|
return set_consume(*s, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
int set_put_strdupv(Set *s, char **l) {
|
int set_put_strdupv(Set **s, char **l) {
|
||||||
int n = 0, r;
|
int n = 0, r;
|
||||||
char **i;
|
char **i;
|
||||||
|
|
||||||
|
|
|
@ -113,8 +113,8 @@ static inline char **set_get_strv(Set *s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int set_consume(Set *s, void *value);
|
int set_consume(Set *s, void *value);
|
||||||
int set_put_strdup(Set *s, const char *p);
|
int set_put_strdup(Set **s, const char *p);
|
||||||
int set_put_strdupv(Set *s, char **l);
|
int set_put_strdupv(Set **s, char **l);
|
||||||
int set_put_strsplit(Set *s, const char *v, const char *separators, ExtractFlags flags);
|
int set_put_strsplit(Set *s, const char *v, const char *separators, ExtractFlags flags);
|
||||||
|
|
||||||
#define SET_FOREACH(e, s, i) \
|
#define SET_FOREACH(e, s, i) \
|
||||||
|
|
|
@ -458,7 +458,7 @@ static int on_path(const char *path, void *userdata) {
|
||||||
|
|
||||||
assert(paths);
|
assert(paths);
|
||||||
|
|
||||||
r = set_put_strdup(paths, path);
|
r = set_put_strdup(&paths, path);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
|
|
|
@ -1724,7 +1724,7 @@ int bus_unit_queue_job(
|
||||||
|
|
||||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||||
_cleanup_free_ char *job_path = NULL, *unit_path = NULL;
|
_cleanup_free_ char *job_path = NULL, *unit_path = NULL;
|
||||||
_cleanup_(set_freep) Set *affected = NULL;
|
_cleanup_set_free_ Set *affected = NULL;
|
||||||
Iterator i;
|
Iterator i;
|
||||||
Job *j, *a;
|
Job *j, *a;
|
||||||
int r;
|
int r;
|
||||||
|
|
|
@ -1878,7 +1878,7 @@ static int mount_process_proc_self_mountinfo(Manager *m) {
|
||||||
|
|
||||||
/* Remember that this device might just have disappeared */
|
/* Remember that this device might just have disappeared */
|
||||||
if (set_ensure_allocated(&gone, &path_hash_ops) < 0 ||
|
if (set_ensure_allocated(&gone, &path_hash_ops) < 0 ||
|
||||||
set_put_strdup(gone, mount->parameters_proc_self_mountinfo.what) < 0)
|
set_put_strdup(&gone, mount->parameters_proc_self_mountinfo.what) < 0)
|
||||||
log_oom(); /* we don't care too much about OOM here... */
|
log_oom(); /* we don't care too much about OOM here... */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1933,7 +1933,7 @@ static int mount_process_proc_self_mountinfo(Manager *m) {
|
||||||
/* Track devices currently used */
|
/* Track devices currently used */
|
||||||
|
|
||||||
if (set_ensure_allocated(&around, &path_hash_ops) < 0 ||
|
if (set_ensure_allocated(&around, &path_hash_ops) < 0 ||
|
||||||
set_put_strdup(around, mount->parameters_proc_self_mountinfo.what) < 0)
|
set_put_strdup(&around, mount->parameters_proc_self_mountinfo.what) < 0)
|
||||||
log_oom();
|
log_oom();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4709,7 +4709,7 @@ int unit_write_setting(Unit *u, UnitWriteFlags flags, const char *name, const ch
|
||||||
/* Make sure the drop-in dir is registered in our path cache. This way we don't need to stupidly
|
/* Make sure the drop-in dir is registered in our path cache. This way we don't need to stupidly
|
||||||
* recreate the cache after every drop-in we write. */
|
* recreate the cache after every drop-in we write. */
|
||||||
if (u->manager->unit_path_cache) {
|
if (u->manager->unit_path_cache) {
|
||||||
r = set_put_strdup(u->manager->unit_path_cache, p);
|
r = set_put_strdup(&u->manager->unit_path_cache, p);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,14 +71,14 @@ static sd_device_enumerator *device_enumerator_free(sd_device_enumerator *enumer
|
||||||
sd_device_unref(enumerator->devices[i]);
|
sd_device_unref(enumerator->devices[i]);
|
||||||
|
|
||||||
free(enumerator->devices);
|
free(enumerator->devices);
|
||||||
set_free_free(enumerator->match_subsystem);
|
set_free(enumerator->match_subsystem);
|
||||||
set_free_free(enumerator->nomatch_subsystem);
|
set_free(enumerator->nomatch_subsystem);
|
||||||
hashmap_free_free_free(enumerator->match_sysattr);
|
hashmap_free(enumerator->match_sysattr);
|
||||||
hashmap_free_free_free(enumerator->nomatch_sysattr);
|
hashmap_free(enumerator->nomatch_sysattr);
|
||||||
hashmap_free_free_free(enumerator->match_property);
|
hashmap_free(enumerator->match_property);
|
||||||
set_free_free(enumerator->match_sysname);
|
set_free(enumerator->match_sysname);
|
||||||
set_free_free(enumerator->match_tag);
|
set_free(enumerator->match_tag);
|
||||||
set_free_free(enumerator->match_parent);
|
set_free(enumerator->match_parent);
|
||||||
|
|
||||||
return mfree(enumerator);
|
return mfree(enumerator);
|
||||||
}
|
}
|
||||||
|
@ -97,89 +97,49 @@ _public_ int sd_device_enumerator_add_match_subsystem(sd_device_enumerator *enum
|
||||||
else
|
else
|
||||||
set = &enumerator->nomatch_subsystem;
|
set = &enumerator->nomatch_subsystem;
|
||||||
|
|
||||||
r = set_ensure_allocated(set, NULL);
|
r = set_put_strdup(set, subsystem);
|
||||||
if (r < 0)
|
if (r <= 0)
|
||||||
return r;
|
|
||||||
|
|
||||||
r = set_put_strdup(*set, subsystem);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
enumerator->scan_uptodate = false;
|
enumerator->scan_uptodate = false;
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
_public_ int sd_device_enumerator_add_match_sysattr(sd_device_enumerator *enumerator, const char *_sysattr, const char *_value, int match) {
|
_public_ int sd_device_enumerator_add_match_sysattr(sd_device_enumerator *enumerator, const char *sysattr, const char *value, int match) {
|
||||||
_cleanup_free_ char *sysattr = NULL, *value = NULL;
|
|
||||||
Hashmap **hashmap;
|
Hashmap **hashmap;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert_return(enumerator, -EINVAL);
|
assert_return(enumerator, -EINVAL);
|
||||||
assert_return(_sysattr, -EINVAL);
|
assert_return(sysattr, -EINVAL);
|
||||||
|
|
||||||
if (match)
|
if (match)
|
||||||
hashmap = &enumerator->match_sysattr;
|
hashmap = &enumerator->match_sysattr;
|
||||||
else
|
else
|
||||||
hashmap = &enumerator->nomatch_sysattr;
|
hashmap = &enumerator->nomatch_sysattr;
|
||||||
|
|
||||||
r = hashmap_ensure_allocated(hashmap, NULL);
|
r = hashmap_put_strdup(hashmap, sysattr, value);
|
||||||
if (r < 0)
|
if (r <= 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
sysattr = strdup(_sysattr);
|
|
||||||
if (!sysattr)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
if (_value) {
|
|
||||||
value = strdup(_value);
|
|
||||||
if (!value)
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = hashmap_put(*hashmap, sysattr, value);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
sysattr = NULL;
|
|
||||||
value = NULL;
|
|
||||||
|
|
||||||
enumerator->scan_uptodate = false;
|
enumerator->scan_uptodate = false;
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
_public_ int sd_device_enumerator_add_match_property(sd_device_enumerator *enumerator, const char *_property, const char *_value) {
|
_public_ int sd_device_enumerator_add_match_property(sd_device_enumerator *enumerator, const char *property, const char *value) {
|
||||||
_cleanup_free_ char *property = NULL, *value = NULL;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert_return(enumerator, -EINVAL);
|
assert_return(enumerator, -EINVAL);
|
||||||
assert_return(_property, -EINVAL);
|
assert_return(property, -EINVAL);
|
||||||
|
|
||||||
r = hashmap_ensure_allocated(&enumerator->match_property, NULL);
|
r = hashmap_put_strdup(&enumerator->match_property, property, value);
|
||||||
if (r < 0)
|
if (r <= 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
property = strdup(_property);
|
|
||||||
if (!property)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
if (_value) {
|
|
||||||
value = strdup(_value);
|
|
||||||
if (!value)
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = hashmap_put(enumerator->match_property, property, value);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
property = NULL;
|
|
||||||
value = NULL;
|
|
||||||
|
|
||||||
enumerator->scan_uptodate = false;
|
enumerator->scan_uptodate = false;
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
_public_ int sd_device_enumerator_add_match_sysname(sd_device_enumerator *enumerator, const char *sysname) {
|
_public_ int sd_device_enumerator_add_match_sysname(sd_device_enumerator *enumerator, const char *sysname) {
|
||||||
|
@ -188,17 +148,13 @@ _public_ int sd_device_enumerator_add_match_sysname(sd_device_enumerator *enumer
|
||||||
assert_return(enumerator, -EINVAL);
|
assert_return(enumerator, -EINVAL);
|
||||||
assert_return(sysname, -EINVAL);
|
assert_return(sysname, -EINVAL);
|
||||||
|
|
||||||
r = set_ensure_allocated(&enumerator->match_sysname, NULL);
|
r = set_put_strdup(&enumerator->match_sysname, sysname);
|
||||||
if (r < 0)
|
if (r <= 0)
|
||||||
return r;
|
|
||||||
|
|
||||||
r = set_put_strdup(enumerator->match_sysname, sysname);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
enumerator->scan_uptodate = false;
|
enumerator->scan_uptodate = false;
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
_public_ int sd_device_enumerator_add_match_tag(sd_device_enumerator *enumerator, const char *tag) {
|
_public_ int sd_device_enumerator_add_match_tag(sd_device_enumerator *enumerator, const char *tag) {
|
||||||
|
@ -207,52 +163,41 @@ _public_ int sd_device_enumerator_add_match_tag(sd_device_enumerator *enumerator
|
||||||
assert_return(enumerator, -EINVAL);
|
assert_return(enumerator, -EINVAL);
|
||||||
assert_return(tag, -EINVAL);
|
assert_return(tag, -EINVAL);
|
||||||
|
|
||||||
r = set_ensure_allocated(&enumerator->match_tag, NULL);
|
r = set_put_strdup(&enumerator->match_tag, tag);
|
||||||
if (r < 0)
|
if (r <= 0)
|
||||||
return r;
|
|
||||||
|
|
||||||
r = set_put_strdup(enumerator->match_tag, tag);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
enumerator->scan_uptodate = false;
|
enumerator->scan_uptodate = false;
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
|
||||||
|
|
||||||
static void device_enumerator_clear_match_parent(sd_device_enumerator *enumerator) {
|
|
||||||
if (!enumerator)
|
|
||||||
return;
|
|
||||||
|
|
||||||
set_clear_free(enumerator->match_parent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int device_enumerator_add_match_parent_incremental(sd_device_enumerator *enumerator, sd_device *parent) {
|
int device_enumerator_add_match_parent_incremental(sd_device_enumerator *enumerator, sd_device *parent) {
|
||||||
const char *path;
|
const char *path;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert_return(enumerator, -EINVAL);
|
assert(enumerator);
|
||||||
assert_return(parent, -EINVAL);
|
assert(parent);
|
||||||
|
|
||||||
r = sd_device_get_syspath(parent, &path);
|
r = sd_device_get_syspath(parent, &path);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
r = set_ensure_allocated(&enumerator->match_parent, NULL);
|
r = set_put_strdup(&enumerator->match_parent, path);
|
||||||
if (r < 0)
|
if (r <= 0)
|
||||||
return r;
|
|
||||||
|
|
||||||
r = set_put_strdup(enumerator->match_parent, path);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
enumerator->scan_uptodate = false;
|
enumerator->scan_uptodate = false;
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
_public_ int sd_device_enumerator_add_match_parent(sd_device_enumerator *enumerator, sd_device *parent) {
|
_public_ int sd_device_enumerator_add_match_parent(sd_device_enumerator *enumerator, sd_device *parent) {
|
||||||
device_enumerator_clear_match_parent(enumerator);
|
assert_return(enumerator, -EINVAL);
|
||||||
|
assert_return(parent, -EINVAL);
|
||||||
|
|
||||||
|
set_clear(enumerator->match_parent);
|
||||||
|
|
||||||
return device_enumerator_add_match_parent_incremental(enumerator, parent);
|
return device_enumerator_add_match_parent_incremental(enumerator, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,7 +208,7 @@ _public_ int sd_device_enumerator_allow_uninitialized(sd_device_enumerator *enum
|
||||||
|
|
||||||
enumerator->scan_uptodate = false;
|
enumerator->scan_uptodate = false;
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator) {
|
int device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator) {
|
||||||
|
@ -273,7 +218,7 @@ int device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator)
|
||||||
|
|
||||||
enumerator->scan_uptodate = false;
|
enumerator->scan_uptodate = false;
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int device_compare(sd_device * const *_a, sd_device * const *_b) {
|
static int device_compare(sd_device * const *_a, sd_device * const *_b) {
|
||||||
|
|
|
@ -68,9 +68,9 @@ static sd_device *device_free(sd_device *device) {
|
||||||
ordered_hashmap_free_free_free(device->properties);
|
ordered_hashmap_free_free_free(device->properties);
|
||||||
ordered_hashmap_free_free_free(device->properties_db);
|
ordered_hashmap_free_free_free(device->properties_db);
|
||||||
hashmap_free_free_free(device->sysattr_values);
|
hashmap_free_free_free(device->sysattr_values);
|
||||||
set_free_free(device->sysattrs);
|
set_free(device->sysattrs);
|
||||||
set_free_free(device->tags);
|
set_free(device->tags);
|
||||||
set_free_free(device->devlinks);
|
set_free(device->devlinks);
|
||||||
|
|
||||||
return mfree(device);
|
return mfree(device);
|
||||||
}
|
}
|
||||||
|
@ -1078,11 +1078,7 @@ int device_add_tag(sd_device *device, const char *tag) {
|
||||||
if (!is_valid_tag(tag))
|
if (!is_valid_tag(tag))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
r = set_ensure_allocated(&device->tags, &string_hash_ops);
|
r = set_put_strdup(&device->tags, tag);
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = set_put_strdup(device->tags, tag);
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
@ -1098,11 +1094,7 @@ int device_add_devlink(sd_device *device, const char *devlink) {
|
||||||
assert(device);
|
assert(device);
|
||||||
assert(devlink);
|
assert(devlink);
|
||||||
|
|
||||||
r = set_ensure_allocated(&device->devlinks, &string_hash_ops);
|
r = set_put_strdup(&device->devlinks, devlink);
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = set_put_strdup(device->devlinks, devlink);
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
@ -1591,10 +1583,6 @@ static int device_sysattrs_read_all(sd_device *device) {
|
||||||
if (!dir)
|
if (!dir)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
r = set_ensure_allocated(&device->sysattrs, &string_hash_ops);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
FOREACH_DIRENT_ALL(dent, dir, return -errno) {
|
FOREACH_DIRENT_ALL(dent, dir, return -errno) {
|
||||||
_cleanup_free_ char *path = NULL;
|
_cleanup_free_ char *path = NULL;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
|
@ -1613,7 +1601,7 @@ static int device_sysattrs_read_all(sd_device *device) {
|
||||||
if (!(statbuf.st_mode & S_IRUSR))
|
if (!(statbuf.st_mode & S_IRUSR))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
r = set_put_strdup(device->sysattrs, dent->d_name);
|
r = set_put_strdup(&device->sysattrs, dent->d_name);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -206,7 +206,7 @@ int devnode_acl_all(const char *seat,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
log_device_debug(d, "Found udev node %s for seat %s", node, seat);
|
log_device_debug(d, "Found udev node %s for seat %s", node, seat);
|
||||||
r = set_put_strdup(nodes, node);
|
r = set_put_strdup(&nodes, node);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -498,7 +498,7 @@ int bus_link_method_set_dnssec_negative_trust_anchors(sd_bus_message *message, v
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
STRV_FOREACH(i, ntas) {
|
STRV_FOREACH(i, ntas) {
|
||||||
r = set_put_strdup(ns, *i);
|
r = set_put_strdup(&ns, *i);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,16 +199,12 @@ int create_subcgroup(pid_t pid, bool keep_unit, CGroupUnified unified_requested)
|
||||||
* namespace.
|
* namespace.
|
||||||
*/
|
*/
|
||||||
static int get_process_controllers(Set **ret) {
|
static int get_process_controllers(Set **ret) {
|
||||||
_cleanup_set_free_free_ Set *controllers = NULL;
|
_cleanup_set_free_ Set *controllers = NULL;
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(ret);
|
assert(ret);
|
||||||
|
|
||||||
controllers = set_new(&string_hash_ops);
|
|
||||||
if (!controllers)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
f = fopen("/proc/self/cgroup", "re");
|
f = fopen("/proc/self/cgroup", "re");
|
||||||
if (!f)
|
if (!f)
|
||||||
return errno == ENOENT ? -ESRCH : -errno;
|
return errno == ENOENT ? -ESRCH : -errno;
|
||||||
|
@ -237,7 +233,7 @@ static int get_process_controllers(Set **ret) {
|
||||||
if (STR_IN_SET(l, "", "name=systemd", "name=unified"))
|
if (STR_IN_SET(l, "", "name=systemd", "name=unified"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
r = set_put_strdup(controllers, l);
|
r = set_put_strdup(&controllers, l);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -303,7 +299,7 @@ static int mount_legacy_cgns_supported(
|
||||||
uid_t uid_range,
|
uid_t uid_range,
|
||||||
const char *selinux_apifs_context) {
|
const char *selinux_apifs_context) {
|
||||||
|
|
||||||
_cleanup_set_free_free_ Set *controllers = NULL;
|
_cleanup_set_free_ Set *controllers = NULL;
|
||||||
const char *cgroup_root = "/sys/fs/cgroup", *c;
|
const char *cgroup_root = "/sys/fs/cgroup", *c;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
|
|
@ -1156,10 +1156,6 @@ int portable_detach(
|
||||||
return log_debug_errno(errno, "Failed to open '%s' directory: %m", where);
|
return log_debug_errno(errno, "Failed to open '%s' directory: %m", where);
|
||||||
}
|
}
|
||||||
|
|
||||||
unit_files = set_new(&string_hash_ops);
|
|
||||||
if (!unit_files)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
markers = set_new(&path_hash_ops);
|
markers = set_new(&path_hash_ops);
|
||||||
if (!markers)
|
if (!markers)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -1172,7 +1168,7 @@ int portable_detach(
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Filter out duplicates */
|
/* Filter out duplicates */
|
||||||
if (set_get(unit_files, de->d_name))
|
if (set_contains(unit_files, de->d_name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
dirent_ensure_type(d, de);
|
dirent_ensure_type(d, de);
|
||||||
|
@ -1197,7 +1193,7 @@ int portable_detach(
|
||||||
if (r > 0)
|
if (r > 0)
|
||||||
return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS, "Unit file '%s' is active, can't detach.", de->d_name);
|
return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS, "Unit file '%s' is active, can't detach.", de->d_name);
|
||||||
|
|
||||||
r = set_put_strdup(unit_files, de->d_name);
|
r = set_put_strdup(&unit_files, de->d_name);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_debug_errno(r, "Failed to add unit name '%s' to set: %m", de->d_name);
|
return log_debug_errno(r, "Failed to add unit name '%s' to set: %m", de->d_name);
|
||||||
|
|
||||||
|
@ -1310,7 +1306,7 @@ static int portable_get_state_internal(
|
||||||
|
|
||||||
_cleanup_(lookup_paths_free) LookupPaths paths = {};
|
_cleanup_(lookup_paths_free) LookupPaths paths = {};
|
||||||
bool found_enabled = false, found_running = false;
|
bool found_enabled = false, found_running = false;
|
||||||
_cleanup_set_free_free_ Set *unit_files = NULL;
|
_cleanup_set_free_ Set *unit_files = NULL;
|
||||||
_cleanup_closedir_ DIR *d = NULL;
|
_cleanup_closedir_ DIR *d = NULL;
|
||||||
const char *where;
|
const char *where;
|
||||||
struct dirent *de;
|
struct dirent *de;
|
||||||
|
@ -1336,10 +1332,6 @@ static int portable_get_state_internal(
|
||||||
return log_debug_errno(errno, "Failed to open '%s' directory: %m", where);
|
return log_debug_errno(errno, "Failed to open '%s' directory: %m", where);
|
||||||
}
|
}
|
||||||
|
|
||||||
unit_files = set_new(&string_hash_ops);
|
|
||||||
if (!unit_files)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
FOREACH_DIRENT(de, d, return log_debug_errno(errno, "Failed to enumerate '%s' directory: %m", where)) {
|
FOREACH_DIRENT(de, d, return log_debug_errno(errno, "Failed to enumerate '%s' directory: %m", where)) {
|
||||||
UnitFileState state;
|
UnitFileState state;
|
||||||
|
|
||||||
|
@ -1347,7 +1339,7 @@ static int portable_get_state_internal(
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Filter out duplicates */
|
/* Filter out duplicates */
|
||||||
if (set_get(unit_files, de->d_name))
|
if (set_contains(unit_files, de->d_name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
dirent_ensure_type(d, de);
|
dirent_ensure_type(d, de);
|
||||||
|
@ -1372,7 +1364,7 @@ static int portable_get_state_internal(
|
||||||
if (r > 0)
|
if (r > 0)
|
||||||
found_running = true;
|
found_running = true;
|
||||||
|
|
||||||
r = set_put_strdup(unit_files, de->d_name);
|
r = set_put_strdup(&unit_files, de->d_name);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_debug_errno(r, "Failed to add unit name '%s' to set: %m", de->d_name);
|
return log_debug_errno(r, "Failed to add unit name '%s' to set: %m", de->d_name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,11 +184,10 @@ static int dns_trust_anchor_add_builtin_negative(DnsTrustAnchor *d) {
|
||||||
* unsigned. */
|
* unsigned. */
|
||||||
|
|
||||||
NULSTR_FOREACH(name, private_domains) {
|
NULSTR_FOREACH(name, private_domains) {
|
||||||
|
|
||||||
if (dns_trust_anchor_knows_domain_positive(d, name))
|
if (dns_trust_anchor_knows_domain_positive(d, name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
r = set_put_strdup(d->negative_by_name, name);
|
r = set_put_strdup(&d->negative_by_name, name);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -629,7 +629,7 @@ int bus_link_method_set_dnssec_negative_trust_anchors(sd_bus_message *message, v
|
||||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
|
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
|
||||||
"Invalid negative trust anchor domain: %s", *i);
|
"Invalid negative trust anchor domain: %s", *i);
|
||||||
|
|
||||||
r = set_put_strdup(ns, *i);
|
r = set_put_strdup(&ns, *i);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -493,7 +493,7 @@ static int link_update_dnssec_negative_trust_anchors(Link *l) {
|
||||||
if (!ns)
|
if (!ns)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
r = set_put_strdupv(ns, ntas);
|
r = set_put_strdupv(&ns, ntas);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|
|
@ -1695,14 +1695,10 @@ int bus_introspect_implementations(
|
||||||
if (impl != main_impl)
|
if (impl != main_impl)
|
||||||
bus_introspect_implementation(&intro, impl);
|
bus_introspect_implementation(&intro, impl);
|
||||||
|
|
||||||
_cleanup_set_free_free_ Set *nodes = NULL;
|
_cleanup_set_free_ Set *nodes = NULL;
|
||||||
|
|
||||||
for (size_t i = 0; impl->children && impl->children[i]; i++) {
|
for (size_t i = 0; impl->children && impl->children[i]; i++) {
|
||||||
r = set_ensure_allocated(&nodes, &string_hash_ops);
|
r = set_put_strdup(&nodes, impl->children[i]->path);
|
||||||
if (r < 0)
|
|
||||||
return log_oom();
|
|
||||||
|
|
||||||
r = set_put_strdup(nodes, impl->children[i]->path);
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ void bus_wait_for_jobs_free(BusWaitForJobs *d) {
|
||||||
if (!d)
|
if (!d)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
set_free_free(d->jobs);
|
set_free(d->jobs);
|
||||||
|
|
||||||
sd_bus_slot_unref(d->slot_disconnected);
|
sd_bus_slot_unref(d->slot_disconnected);
|
||||||
sd_bus_slot_unref(d->slot_job_removed);
|
sd_bus_slot_unref(d->slot_job_removed);
|
||||||
|
@ -315,15 +315,9 @@ int bus_wait_for_jobs(BusWaitForJobs *d, bool quiet, const char* const* extra_ar
|
||||||
}
|
}
|
||||||
|
|
||||||
int bus_wait_for_jobs_add(BusWaitForJobs *d, const char *path) {
|
int bus_wait_for_jobs_add(BusWaitForJobs *d, const char *path) {
|
||||||
int r;
|
|
||||||
|
|
||||||
assert(d);
|
assert(d);
|
||||||
|
|
||||||
r = set_ensure_allocated(&d->jobs, &string_hash_ops);
|
return set_put_strdup(&d->jobs, path);
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
return set_put_strdup(d->jobs, path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int bus_wait_for_jobs_one(BusWaitForJobs *d, const char *path, bool quiet) {
|
int bus_wait_for_jobs_one(BusWaitForJobs *d, const char *path, bool quiet) {
|
||||||
|
|
|
@ -121,8 +121,8 @@ static int parse_fieldv(const void *data, size_t length, const ParseFieldVec *fi
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int field_set_test(Set *fields, const char *name, size_t n) {
|
static int field_set_test(const Set *fields, const char *name, size_t n) {
|
||||||
char *s = NULL;
|
char *s;
|
||||||
|
|
||||||
if (!fields)
|
if (!fields)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -369,7 +369,7 @@ static int output_short(
|
||||||
OutputMode mode,
|
OutputMode mode,
|
||||||
unsigned n_columns,
|
unsigned n_columns,
|
||||||
OutputFlags flags,
|
OutputFlags flags,
|
||||||
Set *output_fields,
|
const Set *output_fields,
|
||||||
const size_t highlight[2]) {
|
const size_t highlight[2]) {
|
||||||
|
|
||||||
int r;
|
int r;
|
||||||
|
@ -533,7 +533,7 @@ static int output_verbose(
|
||||||
OutputMode mode,
|
OutputMode mode,
|
||||||
unsigned n_columns,
|
unsigned n_columns,
|
||||||
OutputFlags flags,
|
OutputFlags flags,
|
||||||
Set *output_fields,
|
const Set *output_fields,
|
||||||
const size_t highlight[2]) {
|
const size_t highlight[2]) {
|
||||||
|
|
||||||
const void *data;
|
const void *data;
|
||||||
|
@ -652,7 +652,7 @@ static int output_export(
|
||||||
OutputMode mode,
|
OutputMode mode,
|
||||||
unsigned n_columns,
|
unsigned n_columns,
|
||||||
OutputFlags flags,
|
OutputFlags flags,
|
||||||
Set *output_fields,
|
const Set *output_fields,
|
||||||
const size_t highlight[2]) {
|
const size_t highlight[2]) {
|
||||||
|
|
||||||
sd_id128_t boot_id;
|
sd_id128_t boot_id;
|
||||||
|
@ -849,7 +849,7 @@ static int update_json_data(
|
||||||
static int update_json_data_split(
|
static int update_json_data_split(
|
||||||
Hashmap *h,
|
Hashmap *h,
|
||||||
OutputFlags flags,
|
OutputFlags flags,
|
||||||
Set *output_fields,
|
const Set *output_fields,
|
||||||
const void *data,
|
const void *data,
|
||||||
size_t size) {
|
size_t size) {
|
||||||
|
|
||||||
|
@ -870,7 +870,7 @@ static int update_json_data_split(
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
name = strndupa(data, eq - (const char*) data);
|
name = strndupa(data, eq - (const char*) data);
|
||||||
if (output_fields && !set_get(output_fields, name))
|
if (output_fields && !set_contains(output_fields, name))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return update_json_data(h, flags, name, eq + 1, size - (eq - (const char*) data) - 1);
|
return update_json_data(h, flags, name, eq + 1, size - (eq - (const char*) data) - 1);
|
||||||
|
@ -882,7 +882,7 @@ static int output_json(
|
||||||
OutputMode mode,
|
OutputMode mode,
|
||||||
unsigned n_columns,
|
unsigned n_columns,
|
||||||
OutputFlags flags,
|
OutputFlags flags,
|
||||||
Set *output_fields,
|
const Set *output_fields,
|
||||||
const size_t highlight[2]) {
|
const size_t highlight[2]) {
|
||||||
|
|
||||||
char sid[SD_ID128_STRING_MAX], usecbuf[DECIMAL_STR_MAX(usec_t)];
|
char sid[SD_ID128_STRING_MAX], usecbuf[DECIMAL_STR_MAX(usec_t)];
|
||||||
|
@ -1073,7 +1073,7 @@ static int output_cat(
|
||||||
OutputMode mode,
|
OutputMode mode,
|
||||||
unsigned n_columns,
|
unsigned n_columns,
|
||||||
OutputFlags flags,
|
OutputFlags flags,
|
||||||
Set *output_fields,
|
const Set *output_fields,
|
||||||
const size_t highlight[2]) {
|
const size_t highlight[2]) {
|
||||||
|
|
||||||
const char *field;
|
const char *field;
|
||||||
|
@ -1103,7 +1103,7 @@ static int (*output_funcs[_OUTPUT_MODE_MAX])(
|
||||||
OutputMode mode,
|
OutputMode mode,
|
||||||
unsigned n_columns,
|
unsigned n_columns,
|
||||||
OutputFlags flags,
|
OutputFlags flags,
|
||||||
Set *output_fields,
|
const Set *output_fields,
|
||||||
const size_t highlight[2]) = {
|
const size_t highlight[2]) = {
|
||||||
|
|
||||||
[OUTPUT_SHORT] = output_short,
|
[OUTPUT_SHORT] = output_short,
|
||||||
|
@ -1133,30 +1133,25 @@ int show_journal_entry(
|
||||||
const size_t highlight[2],
|
const size_t highlight[2],
|
||||||
bool *ellipsized) {
|
bool *ellipsized) {
|
||||||
|
|
||||||
int ret;
|
_cleanup_set_free_ Set *fields = NULL;
|
||||||
_cleanup_set_free_free_ Set *fields = NULL;
|
int r;
|
||||||
|
|
||||||
assert(mode >= 0);
|
assert(mode >= 0);
|
||||||
assert(mode < _OUTPUT_MODE_MAX);
|
assert(mode < _OUTPUT_MODE_MAX);
|
||||||
|
|
||||||
if (n_columns <= 0)
|
if (n_columns <= 0)
|
||||||
n_columns = columns();
|
n_columns = columns();
|
||||||
|
|
||||||
if (output_fields) {
|
r = set_put_strdupv(&fields, output_fields);
|
||||||
fields = set_new(&string_hash_ops);
|
if (r < 0)
|
||||||
if (!fields)
|
return r;
|
||||||
return log_oom();
|
|
||||||
|
|
||||||
ret = set_put_strdupv(fields, output_fields);
|
r = output_funcs[mode](f, j, mode, n_columns, flags, fields, highlight);
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = output_funcs[mode](f, j, mode, n_columns, flags, fields, highlight);
|
if (ellipsized && r > 0)
|
||||||
|
|
||||||
if (ellipsized && ret > 0)
|
|
||||||
*ellipsized = true;
|
*ellipsized = true;
|
||||||
|
|
||||||
return ret;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int maybe_print_begin_newline(FILE *f, OutputFlags *flags) {
|
static int maybe_print_begin_newline(FILE *f, OutputFlags *flags) {
|
||||||
|
|
|
@ -239,7 +239,7 @@ int bind_remount_recursive_with_mountinfo(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!set_contains(done, path)) {
|
if (!set_contains(done, path)) {
|
||||||
r = set_put_strdup(todo, path);
|
r = set_put_strdup(&todo, path);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -266,7 +266,7 @@ int bind_remount_recursive_with_mountinfo(
|
||||||
|
|
||||||
log_debug("Made top-level directory %s a mount point.", prefix);
|
log_debug("Made top-level directory %s a mount point.", prefix);
|
||||||
|
|
||||||
r = set_put_strdup(done, simplified);
|
r = set_put_strdup(&done, simplified);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -463,7 +463,7 @@ int unit_file_find_fragment(
|
||||||
|
|
||||||
/* The unit always has its own name if it's not a template. */
|
/* The unit always has its own name if it's not a template. */
|
||||||
if (IN_SET(name_type, UNIT_NAME_PLAIN, UNIT_NAME_INSTANCE)) {
|
if (IN_SET(name_type, UNIT_NAME_PLAIN, UNIT_NAME_INSTANCE)) {
|
||||||
r = set_put_strdup(names, unit_name);
|
r = set_put_strdup(&names, unit_name);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -493,7 +493,7 @@ int unit_file_find_fragment(
|
||||||
if (!streq(unit_name, *t))
|
if (!streq(unit_name, *t))
|
||||||
log_debug("%s: %s has alias %s", __func__, unit_name, *t);
|
log_debug("%s: %s has alias %s", __func__, unit_name, *t);
|
||||||
|
|
||||||
r = set_put_strdup(names, *t);
|
r = set_put_strdup(&names, *t);
|
||||||
}
|
}
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
|
@ -470,7 +470,7 @@ tests += [
|
||||||
'', 'timeout=90'],
|
'', 'timeout=90'],
|
||||||
|
|
||||||
[['src/test/test-set.c'],
|
[['src/test/test-set.c'],
|
||||||
[],
|
[libbasic],
|
||||||
[]],
|
[]],
|
||||||
|
|
||||||
[['src/test/test-ordered-set.c'],
|
[['src/test/test-ordered-set.c'],
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||||
|
|
||||||
#include "hashmap.h"
|
#include "hashmap.h"
|
||||||
|
#include "string-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
unsigned custom_counter = 0;
|
unsigned custom_counter = 0;
|
||||||
|
@ -109,6 +110,58 @@ static void test_iterated_cache(void) {
|
||||||
assert_se(iterated_cache_free(c) == NULL);
|
assert_se(iterated_cache_free(c) == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_hashmap_put_strdup(void) {
|
||||||
|
_cleanup_hashmap_free_ Hashmap *m = NULL;
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
/* We don't have ordered_hashmap_put_strdup() yet. If it is added,
|
||||||
|
* these tests should be moved to test-hashmap-plain.c. */
|
||||||
|
|
||||||
|
log_info("/* %s */", __func__);
|
||||||
|
|
||||||
|
assert_se(hashmap_put_strdup(&m, "foo", "bar") == 1);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "foo", "bar") == 0);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "foo", "BAR") == -EEXIST);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "foo", "bar") == 0);
|
||||||
|
assert_se(hashmap_contains(m, "foo"));
|
||||||
|
|
||||||
|
s = hashmap_get(m, "foo");
|
||||||
|
assert_se(streq(s, "bar"));
|
||||||
|
|
||||||
|
assert_se(hashmap_put_strdup(&m, "xxx", "bar") == 1);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "xxx", "bar") == 0);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "xxx", "BAR") == -EEXIST);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "xxx", "bar") == 0);
|
||||||
|
assert_se(hashmap_contains(m, "xxx"));
|
||||||
|
|
||||||
|
s = hashmap_get(m, "xxx");
|
||||||
|
assert_se(streq(s, "bar"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_hashmap_put_strdup_null(void) {
|
||||||
|
_cleanup_hashmap_free_ Hashmap *m = NULL;
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
log_info("/* %s */", __func__);
|
||||||
|
|
||||||
|
assert_se(hashmap_put_strdup(&m, "foo", "bar") == 1);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "foo", "bar") == 0);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "foo", NULL) == -EEXIST);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "foo", "bar") == 0);
|
||||||
|
assert_se(hashmap_contains(m, "foo"));
|
||||||
|
|
||||||
|
s = hashmap_get(m, "foo");
|
||||||
|
assert_se(streq(s, "bar"));
|
||||||
|
|
||||||
|
assert_se(hashmap_put_strdup(&m, "xxx", NULL) == 1);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "xxx", "bar") == -EEXIST);
|
||||||
|
assert_se(hashmap_put_strdup(&m, "xxx", NULL) == 0);
|
||||||
|
assert_se(hashmap_contains(m, "xxx"));
|
||||||
|
|
||||||
|
s = hashmap_get(m, "xxx");
|
||||||
|
assert_se(s == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, const char *argv[]) {
|
int main(int argc, const char *argv[]) {
|
||||||
/* This file tests in test-hashmap-plain.c, and tests in test-hashmap-ordered.c, which is generated
|
/* This file tests in test-hashmap-plain.c, and tests in test-hashmap-ordered.c, which is generated
|
||||||
* from test-hashmap-plain.c. Hashmap tests should be added to test-hashmap-plain.c, and here only if
|
* from test-hashmap-plain.c. Hashmap tests should be added to test-hashmap-plain.c, and here only if
|
||||||
|
@ -127,6 +180,8 @@ int main(int argc, const char *argv[]) {
|
||||||
test_trivial_compare_func();
|
test_trivial_compare_func();
|
||||||
test_string_compare_func();
|
test_string_compare_func();
|
||||||
test_iterated_cache();
|
test_iterated_cache();
|
||||||
|
test_hashmap_put_strdup();
|
||||||
|
test_hashmap_put_strdup_null();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ DEFINE_PRIVATE_HASH_OPS(test_hash_ops, struct test, test_hash, test_compare);
|
||||||
|
|
||||||
static void test_struct(void) {
|
static void test_struct(void) {
|
||||||
_cleanup_(prioq_freep) Prioq *q = NULL;
|
_cleanup_(prioq_freep) Prioq *q = NULL;
|
||||||
_cleanup_(set_freep) Set *s = NULL;
|
_cleanup_set_free_ Set *s = NULL;
|
||||||
unsigned previous = 0, i;
|
unsigned previous = 0, i;
|
||||||
struct test *t;
|
struct test *t;
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
#include "set.h"
|
#include "set.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
|
||||||
|
const bool mempool_use_allowed = VALGRIND;
|
||||||
|
|
||||||
static void test_set_steal_first(void) {
|
static void test_set_steal_first(void) {
|
||||||
_cleanup_set_free_ Set *m = NULL;
|
_cleanup_set_free_ Set *m = NULL;
|
||||||
int seen[3] = {};
|
int seen[3] = {};
|
||||||
|
@ -86,11 +88,32 @@ static void test_set_put(void) {
|
||||||
assert_se(strv_length(t) == 3);
|
assert_se(strv_length(t) == 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_set_put_strdup(void) {
|
||||||
|
_cleanup_set_free_ Set *m = NULL;
|
||||||
|
|
||||||
|
assert_se(set_put_strdup(&m, "aaa") == 1);
|
||||||
|
assert_se(set_put_strdup(&m, "aaa") == 0);
|
||||||
|
assert_se(set_put_strdup(&m, "bbb") == 1);
|
||||||
|
assert_se(set_put_strdup(&m, "bbb") == 0);
|
||||||
|
assert_se(set_put_strdup(&m, "aaa") == 0);
|
||||||
|
assert_se(set_size(m) == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_set_put_strdupv(void) {
|
||||||
|
_cleanup_set_free_ Set *m = NULL;
|
||||||
|
|
||||||
|
assert_se(set_put_strdupv(&m, STRV_MAKE("aaa", "aaa", "bbb", "bbb", "aaa")) == 2);
|
||||||
|
assert_se(set_put_strdupv(&m, STRV_MAKE("aaa", "aaa", "bbb", "bbb", "ccc")) == 1);
|
||||||
|
assert_se(set_size(m) == 3);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, const char *argv[]) {
|
int main(int argc, const char *argv[]) {
|
||||||
test_set_steal_first();
|
test_set_steal_first();
|
||||||
test_set_free_with_destructor();
|
test_set_free_with_destructor();
|
||||||
test_set_free_with_hash_ops();
|
test_set_free_with_hash_ops();
|
||||||
test_set_put();
|
test_set_put();
|
||||||
|
test_set_put_strdup();
|
||||||
|
test_set_put_strdupv();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
static bool arg_verbose = false;
|
static bool arg_verbose = false;
|
||||||
static bool arg_dry_run = false;
|
static bool arg_dry_run = false;
|
||||||
|
|
||||||
static int exec_list(sd_device_enumerator *e, const char *action, Set *settle_set) {
|
static int exec_list(sd_device_enumerator *e, const char *action, Set **settle_set) {
|
||||||
sd_device *d;
|
sd_device *d;
|
||||||
int r, ret = 0;
|
int r, ret = 0;
|
||||||
|
|
||||||
|
@ -172,7 +172,7 @@ int trigger_main(int argc, char *argv[], void *userdata) {
|
||||||
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
|
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
|
||||||
_cleanup_(sd_device_monitor_unrefp) sd_device_monitor *m = NULL;
|
_cleanup_(sd_device_monitor_unrefp) sd_device_monitor *m = NULL;
|
||||||
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
|
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
|
||||||
_cleanup_set_free_free_ Set *settle_set = NULL;
|
_cleanup_set_free_ Set *settle_set = NULL;
|
||||||
usec_t ping_timeout_usec = 5 * USEC_PER_SEC;
|
usec_t ping_timeout_usec = 5 * USEC_PER_SEC;
|
||||||
bool settle = false, ping = false;
|
bool settle = false, ping = false;
|
||||||
int c, r;
|
int c, r;
|
||||||
|
@ -342,7 +342,7 @@ int trigger_main(int argc, char *argv[], void *userdata) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settle) {
|
if (settle) {
|
||||||
settle_set = set_new(&string_hash_ops);
|
settle_set = set_new(&string_hash_ops_free);
|
||||||
if (!settle_set)
|
if (!settle_set)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
|
@ -377,7 +377,8 @@ int trigger_main(int argc, char *argv[], void *userdata) {
|
||||||
default:
|
default:
|
||||||
assert_not_reached("Unknown device type");
|
assert_not_reached("Unknown device type");
|
||||||
}
|
}
|
||||||
r = exec_list(e, action, settle_set);
|
|
||||||
|
r = exec_list(e, action, settle ? &settle_set : NULL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue