strv_free(i->supplementary_groups);
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) {
if (r == 0)
break;
- r = set_ensure_allocated(&info->system_call_filter, &string_hash_ops);
- if (r < 0)
- return r;
-
- r = set_put_strdup(info->system_call_filter, name);
+ r = set_put_strdup(&info->system_call_filter, name);
if (r < 0)
return r;
}
#if HAVE_SECCOMP
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;
int r;
if (STR_IN_SET(e, "newuname", "newfstat", "newstat", "newlstat", "sysctl"))
continue;
- r = set_ensure_allocated(&syscalls, &string_hash_ops);
- if (r < 0)
- return log_oom();
-
- r = set_put_strdup(syscalls, e);
+ r = set_put_strdup(&syscalls, e);
if (r < 0)
return log_error_errno(r, "Failed to add system call to list: %m");
}
(void) pager_open(arg_pager_flags);
if (strv_isempty(strv_skip(argv, 1))) {
- _cleanup_(set_free_freep) Set *kernel = NULL;
+ _cleanup_set_free_ Set *kernel = NULL;
int i, k;
k = load_kernel_syscalls(&kernel);
/* Is this a masking entry? */
if ((flags & CONF_FILES_FILTER_MASKED))
if (null_or_empty(&st)) {
+ assert(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)
return r;
}
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,
char, string_hash_func, string_compare_func, free,
char, free);
void string_hash_func(const char *p, struct siphash *state);
#define string_compare_func strcmp
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;
void path_hash_func(const char *p, struct siphash *state);
return 0;
}
-int set_put_strdup(Set *s, const char *p) {
+int set_put_strdup(Set **s, const char *p) {
char *c;
+ int r;
assert(s);
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;
c = strdup(p);
if (!c)
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;
char **i;
}
int set_consume(Set *s, void *value);
-int set_put_strdup(Set *s, const char *p);
-int set_put_strdupv(Set *s, char **l);
+int set_put_strdup(Set **s, const char *p);
+int set_put_strdupv(Set **s, char **l);
int set_put_strsplit(Set *s, const char *v, const char *separators, ExtractFlags flags);
#define SET_FOREACH(e, s, i) \
assert(paths);
- r = set_put_strdup(paths, path);
+ r = set_put_strdup(&paths, path);
if (r < 0)
return log_oom();
/* Remember that this device might just have disappeared */
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... */
}
/* Track devices currently used */
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();
}
/* 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. */
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)
return r;
}
if (r < 0)
return r;
- r = set_put_strdup(*set, subsystem);
+ r = set_put_strdup(set, subsystem);
if (r < 0)
return r;
if (r < 0)
return r;
- r = set_put_strdup(enumerator->match_sysname, sysname);
+ r = set_put_strdup(&enumerator->match_sysname, sysname);
if (r < 0)
return r;
if (r < 0)
return r;
- r = set_put_strdup(enumerator->match_tag, tag);
+ r = set_put_strdup(&enumerator->match_tag, tag);
if (r < 0)
return r;
if (r < 0)
return r;
- r = set_put_strdup(enumerator->match_parent, path);
+ r = set_put_strdup(&enumerator->match_parent, path);
if (r < 0)
return r;
ordered_hashmap_free_free_free(device->properties);
ordered_hashmap_free_free_free(device->properties_db);
hashmap_free_free_free(device->sysattr_values);
- set_free_free(device->sysattrs);
- set_free_free(device->tags);
- set_free_free(device->devlinks);
+ set_free(device->sysattrs);
+ set_free(device->tags);
+ set_free(device->devlinks);
return mfree(device);
}
if (!is_valid_tag(tag))
return -EINVAL;
- r = set_ensure_allocated(&device->tags, &string_hash_ops);
- if (r < 0)
- return r;
-
- r = set_put_strdup(device->tags, tag);
+ r = set_put_strdup(&device->tags, tag);
if (r < 0)
return r;
assert(device);
assert(devlink);
- r = set_ensure_allocated(&device->devlinks, &string_hash_ops);
- if (r < 0)
- return r;
-
- r = set_put_strdup(device->devlinks, devlink);
+ r = set_put_strdup(&device->devlinks, devlink);
if (r < 0)
return r;
if (!dir)
return -errno;
- r = set_ensure_allocated(&device->sysattrs, &string_hash_ops);
- if (r < 0)
- return r;
-
FOREACH_DIRENT_ALL(dent, dir, return -errno) {
_cleanup_free_ char *path = NULL;
struct stat statbuf;
if (!(statbuf.st_mode & S_IRUSR))
continue;
- r = set_put_strdup(device->sysattrs, dent->d_name);
+ r = set_put_strdup(&device->sysattrs, dent->d_name);
if (r < 0)
return r;
}
continue;
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)
return r;
}
return -ENOMEM;
STRV_FOREACH(i, ntas) {
- r = set_put_strdup(ns, *i);
+ r = set_put_strdup(&ns, *i);
if (r < 0)
return r;
}
* namespace.
*/
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;
int r;
assert(ret);
- controllers = set_new(&string_hash_ops);
- if (!controllers)
- return -ENOMEM;
-
f = fopen("/proc/self/cgroup", "re");
if (!f)
return errno == ENOENT ? -ESRCH : -errno;
if (STR_IN_SET(l, "", "name=systemd", "name=unified"))
continue;
- r = set_put_strdup(controllers, l);
+ r = set_put_strdup(&controllers, l);
if (r < 0)
return r;
}
uid_t uid_range,
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;
int r;
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);
if (!markers)
return -ENOMEM;
continue;
/* Filter out duplicates */
- if (set_get(unit_files, de->d_name))
+ if (set_contains(unit_files, de->d_name))
continue;
dirent_ensure_type(d, de);
if (r > 0)
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)
return log_debug_errno(r, "Failed to add unit name '%s' to set: %m", de->d_name);
_cleanup_(lookup_paths_free) LookupPaths paths = {};
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;
const char *where;
struct dirent *de;
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)) {
UnitFileState state;
continue;
/* Filter out duplicates */
- if (set_get(unit_files, de->d_name))
+ if (set_contains(unit_files, de->d_name))
continue;
dirent_ensure_type(d, de);
if (r > 0)
found_running = true;
- r = set_put_strdup(unit_files, de->d_name);
+ r = set_put_strdup(&unit_files, de->d_name);
if (r < 0)
return log_debug_errno(r, "Failed to add unit name '%s' to set: %m", de->d_name);
}
* unsigned. */
NULSTR_FOREACH(name, private_domains) {
-
if (dns_trust_anchor_knows_domain_positive(d, name))
continue;
- r = set_put_strdup(d->negative_by_name, name);
+ r = set_put_strdup(&d->negative_by_name, name);
if (r < 0)
return r;
}
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
"Invalid negative trust anchor domain: %s", *i);
- r = set_put_strdup(ns, *i);
+ r = set_put_strdup(&ns, *i);
if (r < 0)
return r;
}
if (!ns)
return -ENOMEM;
- r = set_put_strdupv(ns, ntas);
+ r = set_put_strdupv(&ns, ntas);
if (r < 0)
return r;
if (impl != main_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++) {
- r = set_ensure_allocated(&nodes, &string_hash_ops);
- if (r < 0)
- return log_oom();
-
- r = set_put_strdup(nodes, impl->children[i]->path);
+ r = set_put_strdup(&nodes, impl->children[i]->path);
if (r < 0)
return log_oom();
}
if (!d)
return;
- set_free_free(d->jobs);
+ set_free(d->jobs);
sd_bus_slot_unref(d->slot_disconnected);
sd_bus_slot_unref(d->slot_job_removed);
}
int bus_wait_for_jobs_add(BusWaitForJobs *d, const char *path) {
- int r;
-
assert(d);
- r = set_ensure_allocated(&d->jobs, &string_hash_ops);
- if (r < 0)
- return r;
-
- return set_put_strdup(d->jobs, path);
+ return set_put_strdup(&d->jobs, path);
}
int bus_wait_for_jobs_one(BusWaitForJobs *d, const char *path, bool quiet) {
const size_t highlight[2],
bool *ellipsized) {
- int ret;
- _cleanup_set_free_free_ Set *fields = NULL;
+ _cleanup_set_free_ Set *fields = NULL;
+ int r;
+
assert(mode >= 0);
assert(mode < _OUTPUT_MODE_MAX);
if (n_columns <= 0)
n_columns = columns();
- if (output_fields) {
- fields = set_new(&string_hash_ops);
- if (!fields)
- return log_oom();
-
- ret = set_put_strdupv(fields, output_fields);
- if (ret < 0)
- return ret;
- }
+ r = set_put_strdupv(&fields, output_fields);
+ if (r < 0)
+ return r;
- ret = output_funcs[mode](f, j, mode, n_columns, flags, fields, highlight);
+ r = output_funcs[mode](f, j, mode, n_columns, flags, fields, highlight);
- if (ellipsized && ret > 0)
+ if (ellipsized && r > 0)
*ellipsized = true;
- return ret;
+ return r;
}
static int maybe_print_begin_newline(FILE *f, OutputFlags *flags) {
}
if (!set_contains(done, path)) {
- r = set_put_strdup(todo, path);
+ r = set_put_strdup(&todo, path);
if (r < 0)
return r;
}
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)
return r;
}
/* The unit always has its own name if it's not a template. */
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)
return r;
}
if (!streq(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)
return r;
static bool arg_verbose = 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;
int r, ret = 0;
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
_cleanup_(sd_device_monitor_unrefp) sd_device_monitor *m = 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;
bool settle = false, ping = false;
int c, r;
}
if (settle) {
- settle_set = set_new(&string_hash_ops);
+ settle_set = set_new(&string_hash_ops_free);
if (!settle_set)
return log_oom();
default:
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)
return r;