MERGE_BOOL(blockdev_read_only);
}
-void udev_config_set_default_children_max(UdevConfig *config) {
+static void udev_config_set_default_children_max(UdevConfig *config) {
uint64_t cpu_limit, mem_limit, cpu_count = 1;
int r;
log_debug("Set children_max to %u", config->children_max);
}
+void manager_set_children_max(Manager *manager, unsigned n) {
+ assert(manager);
+
+ manager->config_by_control.children_max = n;
+ /* When 0 is specified, determine the maximum based on the system resources. */
+ udev_config_set_default_children_max(&manager->config_by_control);
+ manager->config.children_max = manager->config_by_control.children_max;
+
+ notify_ready(manager);
+}
+
+void manager_set_log_level(Manager *manager, int log_level) {
+ assert(manager);
+ assert(LOG_PRI(log_level) == log_level);
+
+ int old = log_get_max_level();
+
+ log_set_max_level(log_level);
+ manager->config.log_level = manager->config_by_control.log_level = log_level;
+
+ if (log_level != old)
+ manager_kill_workers(manager, /* force = */ false);
+}
+
static void manager_adjust_config(UdevConfig *config) {
assert(config);
udev_config_set_default_children_max(config);
}
+static int manager_set_environment_one(Manager *manager, const char *s) {
+ int r;
+
+ assert(manager);
+ assert(s);
+
+ _cleanup_free_ char *key = NULL, *value = NULL;
+ r = split_pair(s, "=", &key, &value);
+ if (r < 0)
+ return r;
+
+ if (isempty(value)) {
+ _cleanup_free_ char *old_key = NULL, *old_value = NULL;
+ old_value = hashmap_remove2(manager->properties, key, (void**) &old_key);
+ return !!old_value;
+ }
+
+ if (streq_ptr(value, hashmap_get(manager->properties, key)))
+ return 0;
+
+ _cleanup_free_ char *old_key = NULL, *old_value = NULL;
+ old_value = hashmap_get2(manager->properties, key, (void**) &old_key);
+
+ r = hashmap_ensure_replace(&manager->properties, &string_hash_ops, key, value);
+ if (r < 0) {
+ assert(!old_key);
+ assert(!old_value);
+ return r;
+ }
+
+ TAKE_PTR(key);
+ TAKE_PTR(value);
+ return 1;
+}
+
+void manager_set_environment(Manager *manager, char * const *v) {
+ bool changed = false;
+ int r;
+
+ assert(manager);
+
+ STRV_FOREACH(s, v) {
+ r = manager_set_environment_one(manager, *s);
+ if (r < 0)
+ log_debug_errno(r, "Failed to update environment '%s', ignoring: %m", *s);
+ changed = changed || r > 0;
+ }
+
+ if (changed)
+ manager_kill_workers(manager, /* force = */ false);
+}
+
int manager_load(Manager *manager, int argc, char *argv[]) {
int r;
.resolve_name_timing = _RESOLVE_NAME_TIMING_INVALID, \
}
+void manager_set_children_max(Manager *manager, unsigned n);
+void manager_set_log_level(Manager *manager, int log_level);
+void manager_set_environment(Manager *manager, char * const *v);
+
int manager_load(Manager *manager, int argc, char *argv[]);
UdevReloadFlags manager_reload_config(Manager *manager);
-void udev_config_set_default_children_max(UdevConfig *c);
return 0;
}
-static void manager_kill_workers(Manager *manager, bool force) {
+void manager_kill_workers(Manager *manager, bool force) {
Worker *worker;
assert(manager);
manager_kill_workers(manager, true);
}
-static void notify_ready(Manager *manager) {
+void notify_ready(Manager *manager) {
int r;
assert(manager);
/* receive the udevd message from userspace */
static int on_ctrl_msg(UdevCtrl *uctrl, UdevCtrlMessageType type, const UdevCtrlMessageValue *value, void *userdata) {
Manager *manager = ASSERT_PTR(userdata);
- int r;
assert(value);
log_debug("Received udev control message (SET_LOG_LEVEL), setting log_level=%i", value->intval);
- r = log_get_max_level();
- if (r == value->intval)
- break;
-
- log_set_max_level(value->intval);
- manager->config.log_level = manager->config_by_control.log_level = value->intval;
- manager_kill_workers(manager, false);
+ manager_set_log_level(manager, value->intval);
break;
case UDEV_CTRL_STOP_EXEC_QUEUE:
log_debug("Received udev control message (STOP_EXEC_QUEUE)");
manager_reload(manager, /* force = */ true);
break;
case UDEV_CTRL_SET_ENV: {
- _unused_ _cleanup_free_ char *old_val = NULL, *old_key = NULL;
- _cleanup_free_ char *key = NULL, *val = NULL;
const char *eq;
eq = strchr(value->buf, '=');
return 1;
}
- key = strndup(value->buf, eq - value->buf);
- if (!key) {
- log_oom();
- return 1;
- }
-
- old_val = hashmap_remove2(manager->properties, key, (void **) &old_key);
-
- r = hashmap_ensure_allocated(&manager->properties, &string_hash_ops);
- if (r < 0) {
- log_oom();
- return 1;
- }
-
- eq++;
- if (isempty(eq))
- log_debug("Received udev control message (ENV), unsetting '%s'", key);
- else {
- val = strdup(eq);
- if (!val) {
- log_oom();
- return 1;
- }
-
- log_debug("Received udev control message (ENV), setting '%s=%s'", key, val);
-
- r = hashmap_put(manager->properties, key, val);
- if (r < 0) {
- log_oom();
- return 1;
- }
- }
-
- key = val = NULL;
- manager_kill_workers(manager, false);
+ log_debug("Received udev control message(SET_ENV, %s)", value->buf);
+ manager_set_environment(manager, STRV_MAKE(value->buf));
break;
}
case UDEV_CTRL_SET_CHILDREN_MAX:
}
log_debug("Received udev control message (SET_MAX_CHILDREN), setting children_max=%i", value->intval);
- manager->config_by_control.children_max = value->intval;
-
- /* When 0 is specified, determine the maximum based on the system resources. */
- udev_config_set_default_children_max(&manager->config_by_control);
- manager->config.children_max = manager->config_by_control.children_max;
- notify_ready(manager);
+ manager_set_children_max(manager, value->intval);
break;
case UDEV_CTRL_PING:
log_debug("Received udev control message (PING)");
int manager_init(Manager *manager);
int manager_main(Manager *manager);
+void notify_ready(Manager *manager);
+
+void manager_kill_workers(Manager *manager, bool force);
+
bool devpath_conflict(const char *a, const char *b);