/* create a new FDB entry or get an existing one. */ int fdb_entry_new_static( Network *network, unsigned section, FdbEntry **ret) { _cleanup_(fdb_entry_freep) FdbEntry *fdb_entry = NULL; struct ether_addr *mac_addr = NULL; assert(network); assert(ret); /* search entry in hashmap first. */ if (section) { fdb_entry = hashmap_get(network->fdb_entries_by_section, UINT_TO_PTR(section)); if (fdb_entry) { *ret = TAKE_PTR(fdb_entry); return 0; } } if (network->n_static_fdb_entries >= STATIC_FDB_ENTRIES_PER_NETWORK_MAX) return -E2BIG; /* allocate space for MAC address. */ mac_addr = new0(struct ether_addr, 1); if (!mac_addr) return -ENOMEM; /* allocate space for and FDB entry. */ fdb_entry = new0(FdbEntry, 1); if (!fdb_entry) { /* free previously allocated space for mac_addr. */ free(mac_addr); return -ENOMEM; } /* init FDB structure. */ fdb_entry->network = network; fdb_entry->mac_addr = mac_addr; LIST_PREPEND(static_fdb_entries, network->static_fdb_entries, fdb_entry); network->n_static_fdb_entries++; if (section) { fdb_entry->section = section; hashmap_put(network->fdb_entries_by_section, UINT_TO_PTR(fdb_entry->section), fdb_entry); } /* return allocated FDB structure. */ *ret = TAKE_PTR(fdb_entry); return 0; }
static int acquire_control_dirs(UnitFileScope scope, char **persistent, char **runtime) { _cleanup_free_ char *a = NULL; int r; assert(persistent); assert(runtime); switch (scope) { case UNIT_FILE_SYSTEM: { _cleanup_free_ char *b = NULL; a = strdup("/etc/systemd/system.control"); if (!a) return -ENOMEM; b = strdup("/run/systemd/system.control"); if (!b) return -ENOMEM; *runtime = TAKE_PTR(b); break; } case UNIT_FILE_USER: r = xdg_user_config_dir(&a, "/systemd/user.control"); if (r < 0 && r != -ENXIO) return r; r = xdg_user_runtime_dir(runtime, "/systemd/user.control"); if (r < 0) { if (r != -ENXIO) return r; /* If XDG_RUNTIME_DIR is not set, don't consider this fatal, simply initialize the directory to * NULL */ *runtime = NULL; } break; case UNIT_FILE_GLOBAL: return -EOPNOTSUPP; default: assert_not_reached("Hmm, unexpected scope value."); } *persistent = TAKE_PTR(a); return 0; }
static int acquire_generator_dirs( UnitFileScope scope, const char *tempdir, char **generator, char **generator_early, char **generator_late) { _cleanup_free_ char *x = NULL, *y = NULL, *z = NULL; const char *prefix; assert(generator); assert(generator_early); assert(generator_late); assert(IN_SET(scope, UNIT_FILE_SYSTEM, UNIT_FILE_USER, UNIT_FILE_GLOBAL)); if (scope == UNIT_FILE_GLOBAL) return -EOPNOTSUPP; if (tempdir) prefix = tempdir; else if (scope == UNIT_FILE_SYSTEM) prefix = "/run/systemd"; else if (scope == UNIT_FILE_USER) { const char *e; e = getenv("XDG_RUNTIME_DIR"); if (!e) return -ENXIO; prefix = strjoina(e, "/systemd"); } x = strappend(prefix, "/generator"); if (!x) return -ENOMEM; y = strappend(prefix, "/generator.early"); if (!y) return -ENOMEM; z = strappend(prefix, "/generator.late"); if (!z) return -ENOMEM; *generator = TAKE_PTR(x); *generator_early = TAKE_PTR(y); *generator_late = TAKE_PTR(z); return 0; }
static int acquire_config_dirs(UnitFileScope scope, char **persistent, char **runtime) { _cleanup_free_ char *a = NULL, *b = NULL; int r; assert(persistent); assert(runtime); switch (scope) { case UNIT_FILE_SYSTEM: a = strdup(SYSTEM_CONFIG_UNIT_PATH); b = strdup("/run/systemd/system"); break; case UNIT_FILE_GLOBAL: a = strdup(USER_CONFIG_UNIT_PATH); b = strdup("/run/systemd/user"); break; case UNIT_FILE_USER: r = xdg_user_config_dir(&a, "/systemd/user"); if (r < 0 && r != -ENXIO) return r; r = xdg_user_runtime_dir(runtime, "/systemd/user"); if (r < 0) { if (r != -ENXIO) return r; /* If XDG_RUNTIME_DIR is not set, don't consider that fatal, simply initialize the runtime * directory to NULL */ *runtime = NULL; } *persistent = TAKE_PTR(a); return 0; default: assert_not_reached("Hmm, unexpected scope value."); } if (!a || !b) return -ENOMEM; *persistent = TAKE_PTR(a); *runtime = TAKE_PTR(b); return 0; }
static int prefix_new_static(Network *network, const char *filename, unsigned section_line, Prefix **ret) { _cleanup_(network_config_section_freep) NetworkConfigSection *n = NULL; _cleanup_(prefix_freep) Prefix *prefix = NULL; int r; assert(network); assert(ret); assert(!!filename == (section_line > 0)); if (filename) { r = network_config_section_new(filename, section_line, &n); if (r < 0) return r; if (section_line) { prefix = hashmap_get(network->prefixes_by_section, n); if (prefix) { *ret = TAKE_PTR(prefix); return 0; } } } r = prefix_new(&prefix); if (r < 0) return r; prefix->network = network; LIST_APPEND(prefixes, network->static_prefixes, prefix); network->n_static_prefixes++; if (filename) { prefix->section = TAKE_PTR(n); r = hashmap_ensure_allocated(&network->prefixes_by_section, &network_config_hash_ops); if (r < 0) return r; r = hashmap_put(network->prefixes_by_section, prefix->section, prefix); if (r < 0) return r; } *ret = TAKE_PTR(prefix); return 0; }
int config_parse_cpu_affinity( const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { _cleanup_cpu_free_ cpu_set_t *cpuset = NULL; Settings *settings = data; int ncpus; assert(rvalue); assert(settings); ncpus = parse_cpu_set_and_warn(rvalue, &cpuset, unit, filename, line, lvalue); if (ncpus < 0) return ncpus; if (ncpus == 0) { /* An empty assignment resets the CPU list */ settings->cpuset = cpu_set_mfree(settings->cpuset); settings->cpuset_ncpus = 0; return 0; } if (!settings->cpuset) { settings->cpuset = TAKE_PTR(cpuset); settings->cpuset_ncpus = (unsigned) ncpus; return 0; } if (settings->cpuset_ncpus < (unsigned) ncpus) { CPU_OR_S(CPU_ALLOC_SIZE(settings->cpuset_ncpus), cpuset, settings->cpuset, cpuset); CPU_FREE(settings->cpuset); settings->cpuset = TAKE_PTR(cpuset); settings->cpuset_ncpus = (unsigned) ncpus; return 0; } CPU_OR_S(CPU_ALLOC_SIZE((unsigned) ncpus), settings->cpuset, settings->cpuset, cpuset); return 0; }
static int network_link_get_strv(int ifindex, const char *key, char ***ret) { char path[STRLEN("/run/systemd/netif/links/") + DECIMAL_STR_MAX(ifindex) + 1]; _cleanup_strv_free_ char **a = NULL; _cleanup_free_ char *s = NULL; int r; assert_return(ifindex > 0, -EINVAL); assert_return(ret, -EINVAL); xsprintf(path, "/run/systemd/netif/links/%i", ifindex); r = parse_env_file(path, NEWLINE, key, &s, NULL); if (r == -ENOENT) return -ENODATA; if (r < 0) return r; if (isempty(s)) { *ret = NULL; return 0; } a = strv_split(s, " "); if (!a) return -ENOMEM; strv_uniq(a); r = strv_length(a); *ret = TAKE_PTR(a); return r; }
static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) { _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; int r; assert(c); assert(event); assert(_bus); r = sd_bus_default_system(&bus); if (r < 0) return log_error_errno(r, "Failed to get system bus connection: %m"); r = sd_bus_add_object_vtable(bus, NULL, "/org/freedesktop/hostname1", "org.freedesktop.hostname1", hostname_vtable, c); if (r < 0) return log_error_errno(r, "Failed to register object: %m"); r = sd_bus_request_name_async(bus, NULL, "org.freedesktop.hostname1", 0, NULL, NULL); if (r < 0) return log_error_errno(r, "Failed to request name: %m"); r = sd_bus_attach_event(bus, event, 0); if (r < 0) return log_error_errno(r, "Failed to attach bus to event loop: %m"); *_bus = TAKE_PTR(bus); return 0; }
static int find_device( const struct rfkill_event *event, sd_device **ret) { _cleanup_(sd_device_unrefp) sd_device *device = NULL; _cleanup_free_ char *sysname = NULL; const char *name; int r; assert(event); assert(ret); if (asprintf(&sysname, "rfkill%i", event->idx) < 0) return log_oom(); r = sd_device_new_from_subsystem_sysname(&device, "rfkill", sysname); if (r < 0) return log_full_errno(IN_SET(r, -ENOENT, -ENXIO, -ENODEV) ? LOG_DEBUG : LOG_ERR, r, "Failed to open device '%s': %m", sysname); r = sd_device_get_sysattr_value(device, "name", &name); if (r < 0) return log_debug_errno(r, "Device has no name, ignoring: %m"); log_debug("Operating on rfkill device '%s'.", name); *ret = TAKE_PTR(device); return 0; }
static int file_of_seat(const char *seat, char **_p) { char *p; int r; assert(_p); if (seat) { if (!filename_is_valid(seat)) return -EINVAL; p = strappend("/run/systemd/seats/", seat); } else { _cleanup_free_ char *buf = NULL; r = sd_session_get_seat(NULL, &buf); if (r < 0) return r; p = strappend("/run/systemd/seats/", buf); } if (!p) return -ENOMEM; *_p = TAKE_PTR(p); return 0; }
int raw_export_new( RawExport **ret, sd_event *event, RawExportFinished on_finished, void *userdata) { _cleanup_(raw_export_unrefp) RawExport *e = NULL; int r; assert(ret); e = new0(RawExport, 1); if (!e) return -ENOMEM; e->output_fd = e->input_fd = -1; e->on_finished = on_finished; e->userdata = userdata; RATELIMIT_INIT(e->progress_rate_limit, 100 * USEC_PER_MSEC, 1); e->last_percent = (unsigned) -1; if (event) e->event = sd_event_ref(event); else { r = sd_event_default(&e->event); if (r < 0) return r; } *ret = TAKE_PTR(e); return 0; }
static int network_get_strv(const char *key, char ***ret) { _cleanup_strv_free_ char **a = NULL; _cleanup_free_ char *s = NULL; int r; assert_return(ret, -EINVAL); r = parse_env_file("/run/systemd/netif/state", NEWLINE, key, &s, NULL); if (r == -ENOENT) return -ENODATA; if (r < 0) return r; if (isempty(s)) { *ret = NULL; return 0; } a = strv_split(s, " "); if (!a) return -ENOMEM; strv_uniq(a); r = strv_length(a); *ret = TAKE_PTR(a); return r; }
static int extract_pretty(const char *path, const char *suffix, char **ret) { _cleanup_free_ char *name = NULL; const char *p; size_t n; assert(path); assert(ret); p = last_path_component(path); n = strcspn(p, "/"); name = strndup(p, n); if (!name) return -ENOMEM; if (suffix) { char *e; e = endswith(name, suffix); if (!e) return -EINVAL; *e = 0; } if (!image_name_is_valid(name)) return -EINVAL; *ret = TAKE_PTR(name); return 0; }
static int manager_new(Manager **ret) { _cleanup_(manager_unrefp) Manager *m = NULL; int r; assert(ret); m = new0(Manager, 1); if (!m) return -ENOMEM; m->machines = hashmap_new(&string_hash_ops); m->machine_units = hashmap_new(&string_hash_ops); m->machine_leaders = hashmap_new(NULL); if (!m->machines || !m->machine_units || !m->machine_leaders) return -ENOMEM; r = sd_event_default(&m->event); if (r < 0) return r; r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); if (r < 0) return r; r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); if (r < 0) return r; (void) sd_event_set_watchdog(m->event, true); *ret = TAKE_PTR(m); return 0; }
int find_converted_keymap(const char *x11_layout, const char *x11_variant, char **new_keymap) { const char *dir; _cleanup_free_ char *n; if (x11_variant) n = strjoin(x11_layout, "-", x11_variant); else n = strdup(x11_layout); if (!n) return -ENOMEM; NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS) { _cleanup_free_ char *p = NULL, *pz = NULL; bool uncompressed; p = strjoin(dir, "xkb/", n, ".map"); pz = strjoin(dir, "xkb/", n, ".map.gz"); if (!p || !pz) return -ENOMEM; uncompressed = access(p, F_OK) == 0; if (uncompressed || access(pz, F_OK) == 0) { log_debug("Found converted keymap %s at %s", n, uncompressed ? p : pz); *new_keymap = TAKE_PTR(n); return 1; } }
static int allocate_journal_field(int fd, size_t size, char **ret, size_t *ret_size) { _cleanup_free_ char *field = NULL; ssize_t n; assert(fd >= 0); assert(ret); assert(ret_size); if (lseek(fd, 0, SEEK_SET) == (off_t) -1) return log_warning_errno(errno, "Failed to seek: %m"); field = malloc(9 + size); if (!field) { log_warning("Failed to allocate memory for coredump, coredump will not be stored."); return -ENOMEM; } memcpy(field, "COREDUMP=", 9); n = read(fd, field + 9, size); if (n < 0) return log_error_errno((int) n, "Failed to read core data: %m"); if ((size_t) n < size) { log_error("Core data too short."); return -EIO; } *ret = TAKE_PTR(field); *ret_size = size + 9; return 0; }
int get_locales(char ***ret) { _cleanup_set_free_ Set *locales = NULL; _cleanup_strv_free_ char **l = NULL; int r; locales = set_new(&string_hash_ops); if (!locales) return -ENOMEM; r = add_locales_from_archive(locales); if (r < 0 && r != -ENOENT) return r; r = add_locales_from_libdir(locales); if (r < 0) return r; l = set_get_strv(locales); if (!l) return -ENOMEM; strv_sort(l); *ret = TAKE_PTR(l); return 0; }
int device_wait_for_initialization(sd_device *device, const char *subsystem, sd_device **ret) { _cleanup_(sd_device_monitor_unrefp) sd_device_monitor *monitor = NULL; _cleanup_(sd_event_unrefp) sd_event *event = NULL; struct DeviceMonitorData data = {}; int r; assert(device); assert(subsystem); if (sd_device_get_is_initialized(device) > 0) { if (ret) *ret = sd_device_ref(device); return 0; } assert_se(sd_device_get_sysname(device, &data.sysname) >= 0); /* Wait until the device is initialized, so that we can get access to the ID_PATH property */ r = sd_event_new(&event); if (r < 0) return log_error_errno(r, "Failed to get default event: %m"); r = sd_device_monitor_new(&monitor); if (r < 0) return log_error_errno(r, "Failed to acquire monitor: %m"); r = sd_device_monitor_filter_add_match_subsystem_devtype(monitor, subsystem, NULL); if (r < 0) return log_error_errno(r, "Failed to add %s subsystem match to monitor: %m", subsystem); r = sd_device_monitor_attach_event(monitor, event); if (r < 0) return log_error_errno(r, "Failed to attach event to device monitor: %m"); r = sd_device_monitor_start(monitor, device_monitor_handler, &data); if (r < 0) return log_error_errno(r, "Failed to start device monitor: %m"); /* Check again, maybe things changed. Udev will re-read the db if the device wasn't initialized * yet. */ if (sd_device_get_is_initialized(device) > 0) { if (ret) *ret = sd_device_ref(device); return 0; } r = sd_event_loop(event); if (r < 0) return log_error_errno(r, "Event loop failed: %m"); if (ret) *ret = TAKE_PTR(data.device); return 0; }
int settings_load(FILE *f, const char *path, Settings **ret) { _cleanup_(settings_freep) Settings *s = NULL; int r; assert(path); assert(ret); s = new0(Settings, 1); if (!s) return -ENOMEM; s->start_mode = _START_MODE_INVALID; s->personality = PERSONALITY_INVALID; s->userns_mode = _USER_NAMESPACE_MODE_INVALID; s->resolv_conf = _RESOLV_CONF_MODE_INVALID; s->link_journal = _LINK_JOURNAL_INVALID; s->timezone = _TIMEZONE_MODE_INVALID; s->uid_shift = UID_INVALID; s->uid_range = UID_INVALID; s->no_new_privileges = -1; s->read_only = -1; s->volatile_mode = _VOLATILE_MODE_INVALID; s->userns_chown = -1; s->private_network = -1; s->network_veth = -1; r = config_parse(NULL, path, f, "Exec\0" "Network\0" "Files\0", config_item_perf_lookup, nspawn_gperf_lookup, CONFIG_PARSE_WARN, s); if (r < 0) return r; /* Make sure that if userns_mode is set, userns_chown is set to something appropriate, and vice versa. Either * both fields shall be initialized or neither. */ if (s->userns_mode == USER_NAMESPACE_PICK) s->userns_chown = true; else if (s->userns_mode != _USER_NAMESPACE_MODE_INVALID && s->userns_chown < 0) s->userns_chown = false; if (s->userns_chown >= 0 && s->userns_mode == _USER_NAMESPACE_MODE_INVALID) s->userns_mode = USER_NAMESPACE_NO; *ret = TAKE_PTR(s); return 0; }
static int routing_policy_rule_new_static(Network *network, const char *filename, unsigned section_line, RoutingPolicyRule **ret) { _cleanup_routing_policy_rule_free_ RoutingPolicyRule *rule = NULL; _cleanup_network_config_section_free_ NetworkConfigSection *n = NULL; int r; assert(network); assert(ret); assert(!!filename == (section_line > 0)); r = network_config_section_new(filename, section_line, &n); if (r < 0) return r; rule = hashmap_get(network->rules_by_section, n); if (rule) { *ret = TAKE_PTR(rule); return 0; } r = routing_policy_rule_new(&rule); if (r < 0) return r; rule->section = n; rule->network = network; n = NULL; r = hashmap_put(network->rules_by_section, rule->section, rule); if (r < 0) return r; LIST_APPEND(rules, network->rules, rule); network->n_rules++; *ret = TAKE_PTR(rule); return 0; }
static int prompt_root_password(void) { const char *msg1, *msg2, *etc_shadow; int r; if (arg_root_password) return 0; if (!arg_prompt_root_password) return 0; etc_shadow = prefix_roota(arg_root, "/etc/shadow"); if (laccess(etc_shadow, F_OK) >= 0) return 0; print_welcome(); putchar('\n'); msg1 = strjoina(special_glyph(SPECIAL_GLYPH_TRIANGULAR_BULLET), " Please enter a new root password (empty to skip): "); msg2 = strjoina(special_glyph(SPECIAL_GLYPH_TRIANGULAR_BULLET), " Please enter new root password again: "); for (;;) { _cleanup_strv_free_erase_ char **a = NULL, **b = NULL; r = ask_password_tty(-1, msg1, NULL, 0, 0, NULL, &a); if (r < 0) return log_error_errno(r, "Failed to query root password: %m"); if (strv_length(a) != 1) { log_warning("Received multiple passwords, where we expected one."); return -EINVAL; } if (isempty(*a)) { log_warning("No password entered, skipping."); break; } r = ask_password_tty(-1, msg2, NULL, 0, 0, NULL, &b); if (r < 0) return log_error_errno(r, "Failed to query root password: %m"); if (!streq(*a, *b)) { log_error("Entered passwords did not match, please try again."); continue; } arg_root_password = TAKE_PTR(*a); break; } return 0; }
static int determine_matches(const char *image, char **l, bool allow_any, char ***ret) { _cleanup_strv_free_ char **k = NULL; int r; /* Determine the matches to apply. If the list is empty we derive the match from the image name. If the list * contains exactly the "-" we return a wildcard list (which is the empty list), but only if this is expressly * permitted. */ if (strv_isempty(l)) { char *prefix; r = extract_prefix(image, &prefix); if (r < 0) return log_error_errno(r, "Failed to extract prefix of image name '%s': %m", image); if (!arg_quiet) log_info("(Matching unit files with prefix '%s'.)", prefix); r = strv_consume(&k, prefix); if (r < 0) return log_oom(); } else if (strv_equal(l, STRV_MAKE("-"))) { if (!allow_any) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Refusing all unit file match."); if (!arg_quiet) log_info("(Matching all unit files.)"); } else { k = strv_copy(l); if (!k) return log_oom(); if (!arg_quiet) { _cleanup_free_ char *joined = NULL; joined = strv_join(k, "', '"); if (!joined) return log_oom(); log_info("(Matching unit files with prefixes '%s'.)", joined); } } *ret = TAKE_PTR(k); return 0; }
int prefix_new(Prefix **ret) { _cleanup_(prefix_freep) Prefix *prefix = NULL; prefix = new0(Prefix, 1); if (!prefix) return -ENOMEM; if (sd_radv_prefix_new(&prefix->radv_prefix) < 0) return -ENOMEM; *ret = TAKE_PTR(prefix); return 0; }
int network_config_section_new(const char *filename, unsigned line, NetworkConfigSection **s) { NetworkConfigSection *cs; cs = malloc0(offsetof(NetworkConfigSection, filename) + strlen(filename) + 1); if (!cs) return -ENOMEM; strcpy(cs->filename, filename); cs->line = line; *s = TAKE_PTR(cs); return 0; }
static int manager_add_host_machine(Manager *m) { _cleanup_free_ char *rd = NULL, *unit = NULL; sd_id128_t mid; Machine *t; int r; if (m->host_machine) return 0; r = sd_id128_get_machine(&mid); if (r < 0) return log_error_errno(r, "Failed to get machine ID: %m"); rd = strdup("/"); if (!rd) return log_oom(); unit = strdup(SPECIAL_ROOT_SLICE); if (!unit) return log_oom(); t = machine_new(m, MACHINE_HOST, ".host"); if (!t) return log_oom(); t->leader = 1; t->id = mid; t->root_directory = TAKE_PTR(rd); t->unit = TAKE_PTR(unit); dual_timestamp_from_boottime_or_monotonic(&t->timestamp, 0); m->host_machine = t; return 0; }
int locale_write_data(Context *c, char ***settings) { int r, p; _cleanup_strv_free_ char **l = NULL; /* Set values will be returned as strv in *settings on success. */ r = load_env_file(NULL, "/etc/locale.conf", NULL, &l); if (r < 0 && r != -ENOENT) return r; for (p = 0; p < _VARIABLE_LC_MAX; p++) { _cleanup_free_ char *t = NULL; char **u; const char *name; name = locale_variable_to_string(p); assert(name); if (isempty(c->locale[p])) { l = strv_env_unset(l, name); continue; } if (asprintf(&t, "%s=%s", name, c->locale[p]) < 0) return -ENOMEM; u = strv_env_set(l, t); if (!u) return -ENOMEM; strv_free(l); l = u; } if (strv_isempty(l)) { if (unlink("/etc/locale.conf") < 0) return errno == ENOENT ? 0 : -errno; return 0; } r = write_env_file_label("/etc/locale.conf", l); if (r < 0) return r; *settings = TAKE_PTR(l); return 0; }
/* Retrieve existing subsystems. This function is called in a new cgroup * namespace. */ static int get_process_controllers(Set **ret) { _cleanup_set_free_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; for (;;) { _cleanup_free_ char *line = NULL; char *e, *l; r = read_line(f, LONG_LINE_MAX, &line); if (r < 0) return r; if (r == 0) break; l = strchr(line, ':'); if (!l) continue; l++; e = strchr(l, ':'); if (!e) continue; *e = 0; if (STR_IN_SET(l, "", "name=systemd", "name=unified")) continue; r = set_put_strdup(controllers, l); if (r < 0) return r; } *ret = TAKE_PTR(controllers); return 0; }
static int image_new( ImageType t, const char *pretty, const char *path, const char *filename, bool read_only, usec_t crtime, usec_t mtime, Image **ret) { _cleanup_(image_unrefp) Image *i = NULL; assert(t >= 0); assert(t < _IMAGE_TYPE_MAX); assert(pretty); assert(filename); assert(ret); i = new0(Image, 1); if (!i) return -ENOMEM; i->n_ref = 1; i->type = t; i->read_only = read_only; i->crtime = crtime; i->mtime = mtime; i->usage = i->usage_exclusive = (uint64_t) -1; i->limit = i->limit_exclusive = (uint64_t) -1; i->name = strdup(pretty); if (!i->name) return -ENOMEM; if (path) i->path = strjoin(path, "/", filename); else i->path = strdup(filename); if (!i->path) return -ENOMEM; path_simplify(i->path, false); *ret = TAKE_PTR(i); return 0; }
int locale_write_data(Context *c, char ***settings) { _cleanup_strv_free_ char **l = NULL; struct stat st; int r, p; /* Set values will be returned as strv in *settings on success. */ for (p = 0; p < _VARIABLE_LC_MAX; p++) { _cleanup_free_ char *t = NULL; char **u; const char *name; name = locale_variable_to_string(p); assert(name); if (isempty(c->locale[p])) continue; if (asprintf(&t, "%s=%s", name, c->locale[p]) < 0) return -ENOMEM; u = strv_env_set(l, t); if (!u) return -ENOMEM; strv_free_and_replace(l, u); } if (strv_isempty(l)) { if (unlink("/etc/locale.conf") < 0) return errno == ENOENT ? 0 : -errno; c->locale_mtime = USEC_INFINITY; return 0; } r = write_env_file_label("/etc/locale.conf", l); if (r < 0) return r; *settings = TAKE_PTR(l); if (stat("/etc/locale.conf", &st) >= 0) c->locale_mtime = timespec_load(&st.st_mtim); return 0; }
_public_ int sd_network_get_operational_state(char **state) { _cleanup_free_ char *s = NULL; int r; assert_return(state, -EINVAL); r = parse_env_file("/run/systemd/netif/state", NEWLINE, "OPER_STATE", &s, NULL); if (r == -ENOENT) return -ENODATA; if (r < 0) return r; if (isempty(s)) return -ENODATA; *state = TAKE_PTR(s); return 0; }