static int list_vconsole_keymaps(DBusConnection *bus, char **args, unsigned n) { char _cleanup_strv_free_ **l = NULL; char **i; keymaps = set_new(string_hash_func, string_compare_func); if (!keymaps) return log_oom(); nftw("/usr/share/kbd/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS); nftw("/usr/lib/kbd/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS); nftw("/lib/kbd/keymaps/", nftw_cb, 20, FTW_MOUNT|FTW_PHYS); l = set_get_strv(keymaps); if (!l) { set_free_free(keymaps); return log_oom(); } set_free(keymaps); if (strv_isempty(l)) { log_error("Couldn't find any console keymaps."); return -ENOENT; } strv_sort(l); pager_open_if_enabled(); STRV_FOREACH(i, l) puts(*i); return 0; }
static int list_vconsole_keymaps(sd_bus *bus, char **args, unsigned n) { _cleanup_strv_free_ char **l = NULL; const char *dir; keymaps = set_new(string_hash_func, string_compare_func); if (!keymaps) return log_oom(); NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS) nftw(dir, nftw_cb, 20, FTW_MOUNT|FTW_PHYS); l = set_get_strv(keymaps); if (!l) { set_free_free(keymaps); return log_oom(); } set_free(keymaps); if (strv_isempty(l)) { log_error("Couldn't find any console keymaps."); return -ENOENT; } strv_sort(l); pager_open_if_enabled(); strv_print(l); return 0; }
static void link_config_free(link_config *link) { if (!link) return; free(link->filename); set_free_free(link->match_mac); strv_free(link->match_path); strv_free(link->match_driver); strv_free(link->match_type); free(link->match_name); free(link->match_host); free(link->match_virt); free(link->match_kernel_cmdline); free(link->match_kernel_version); free(link->match_arch); free(link->description); free(link->mac); free(link->name_policy); free(link->name); free(link->alias); free(link); }
void link_flush_settings(Link *l) { assert(l); l->llmnr_support = RESOLVE_SUPPORT_YES; l->mdns_support = RESOLVE_SUPPORT_NO; l->dnssec_mode = _DNSSEC_MODE_INVALID; dns_server_unlink_all(l->dns_servers); dns_search_domain_unlink_all(l->search_domains); l->dnssec_negative_trust_anchors = set_free_free(l->dnssec_negative_trust_anchors); }
int mount_cgroup_controllers(char ***join_controllers) { int r; FILE *f; char buf[LINE_MAX]; Set *controllers; /* Mount all available cgroup controllers that are built into the kernel. */ f = fopen("/proc/cgroups", "re"); if (!f) { log_error("Failed to enumerate cgroup controllers: %m"); return 0; } controllers = set_new(string_hash_func, string_compare_func); if (!controllers) { r = log_oom(); goto finish; } /* Ignore the header line */ (void) fgets(buf, sizeof(buf), f); for (;;) { char *controller; int enabled = 0; if (fscanf(f, "%ms %*i %*i %i", &controller, &enabled) != 2) { if (feof(f)) break; log_error("Failed to parse /proc/cgroups."); r = -EIO; goto finish; } if (!enabled) { free(controller); continue; } r = set_put(controllers, controller); if (r < 0) { log_error("Failed to add controller to set."); free(controller); goto finish; } } for (;;) { MountPoint p; char *controller, *where, *options; char ***k = NULL; controller = set_steal_first(controllers); if (!controller) break; if (join_controllers) for (k = join_controllers; *k; k++) if (strv_find(*k, controller)) break; if (k && *k) { char **i, **j; for (i = *k, j = *k; *i; i++) { if (!streq(*i, controller)) { char *t; t = set_remove(controllers, *i); if (!t) { free(*i); continue; } free(t); } *(j++) = *i; } *j = NULL; options = strv_join(*k, ","); if (!options) { free(controller); r = log_oom(); goto finish; } } else { options = controller; controller = NULL; } where = strappend("/sys/fs/cgroup/", options); if (!where) { free(options); r = log_oom(); goto finish; } zero(p); p.what = "cgroup"; p.where = where; p.type = "cgroup"; p.options = options; p.flags = MS_NOSUID|MS_NOEXEC|MS_NODEV; p.mode = MNT_IN_CONTAINER; r = mount_one(&p, true); free(controller); free(where); if (r < 0) { free(options); goto finish; } if (r > 0 && k && *k) { char **i; for (i = *k; *i; i++) { char *t; t = strappend("/sys/fs/cgroup/", *i); if (!t) { r = log_oom(); free(options); goto finish; } r = symlink(options, t); free(t); if (r < 0 && errno != EEXIST) { log_error("Failed to create symlink: %m"); r = -errno; free(options); goto finish; } } } free(options); } r = 0; finish: set_free_free(controllers); fclose(f); return r; }
static int list_locales(DBusConnection *bus, char **args, unsigned n) { /* Stolen from glibc... */ struct locarhead { uint32_t magic; /* Serial number. */ uint32_t serial; /* Name hash table. */ uint32_t namehash_offset; uint32_t namehash_used; uint32_t namehash_size; /* String table. */ uint32_t string_offset; uint32_t string_used; uint32_t string_size; /* Table with locale records. */ uint32_t locrectab_offset; uint32_t locrectab_used; uint32_t locrectab_size; /* MD5 sum hash table. */ uint32_t sumhash_offset; uint32_t sumhash_used; uint32_t sumhash_size; }; struct namehashent { /* Hash value of the name. */ uint32_t hashval; /* Offset of the name in the string table. */ uint32_t name_offset; /* Offset of the locale record. */ uint32_t locrec_offset; }; const struct locarhead *h; const struct namehashent *e; const void *p = MAP_FAILED; _cleanup_close_ int fd = -1; _cleanup_strv_free_ char **l = NULL; char **j; Set *locales; size_t sz = 0; struct stat st; unsigned i; int r; locales = set_new(string_hash_func, string_compare_func); if (!locales) return log_oom(); fd = open("/usr/lib/locale/locale-archive", O_RDONLY|O_NOCTTY|O_CLOEXEC); if (fd < 0) { log_error("Failed to open locale archive: %m"); r = -errno; goto finish; } if (fstat(fd, &st) < 0) { log_error("fstat() failed: %m"); r = -errno; goto finish; } if (!S_ISREG(st.st_mode)) { log_error("Archive file is not regular"); r = -EBADMSG; goto finish; } if (st.st_size < (off_t) sizeof(struct locarhead)) { log_error("Archive has invalid size"); r = -EBADMSG; goto finish; } p = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { log_error("Failed to map archive: %m"); r = -errno; goto finish; } h = (const struct locarhead *) p; if (h->magic != 0xde020109 || h->namehash_offset + h->namehash_size > st.st_size || h->string_offset + h->string_size > st.st_size || h->locrectab_offset + h->locrectab_size > st.st_size || h->sumhash_offset + h->sumhash_size > st.st_size) { log_error("Invalid archive file."); r = -EBADMSG; goto finish; } e = (const struct namehashent*) ((const uint8_t*) p + h->namehash_offset); for (i = 0; i < h->namehash_size; i++) { char *z; if (e[i].locrec_offset == 0) continue; z = strdup((char*) p + e[i].name_offset); if (!z) { r = log_oom(); goto finish; } r = set_put(locales, z); if (r < 0) { free(z); log_error("Failed to add locale: %s", strerror(-r)); goto finish; } } l = set_get_strv(locales); if (!l) { r = log_oom(); goto finish; } set_free(locales); locales = NULL; strv_sort(l); pager_open_if_enabled(); STRV_FOREACH(j, l) puts(*j); r = 0; finish: if (p != MAP_FAILED) munmap((void*) p, sz); set_free_free(locales); return r; }
static void load_unix_sockets(void) { FILE *f = NULL; char line[LINE_MAX]; if (unix_sockets) return; /* We maintain a cache of the sockets we found in * /proc/net/unix to speed things up a little. */ unix_sockets = set_new(string_hash_func, string_compare_func); if (!unix_sockets) return; f = fopen("/proc/net/unix", "re"); if (!f) return; /* Skip header */ if (!fgets(line, sizeof(line), f)) goto fail; for (;;) { char *p, *s; int k; if (!fgets(line, sizeof(line), f)) break; truncate_nl(line); p = strchr(line, ':'); if (!p) continue; if (strlen(p) < 37) continue; p += 37; p += strspn(p, WHITESPACE); p += strcspn(p, WHITESPACE); /* skip one more word */ p += strspn(p, WHITESPACE); if (*p != '/') continue; s = strdup(p); if (!s) goto fail; path_kill_slashes(s); k = set_put(unix_sockets, s); if (k < 0) { free(s); if (k != -EEXIST) goto fail; } } fclose(f); return; fail: set_free_free(unix_sockets); unix_sockets = NULL; if (f) fclose(f); }
static void manager_free(Manager *m) { Session *session; User *u; Device *d; Seat *s; Inhibitor *i; Button *b; assert(m); while ((session = hashmap_first(m->sessions))) session_free(session); while ((u = hashmap_first(m->users))) user_free(u); while ((d = hashmap_first(m->devices))) device_free(d); while ((s = hashmap_first(m->seats))) seat_free(s); while ((i = hashmap_first(m->inhibitors))) inhibitor_free(i); while ((b = hashmap_first(m->buttons))) button_free(b); hashmap_free(m->devices); hashmap_free(m->seats); hashmap_free(m->sessions); hashmap_free(m->users); hashmap_free(m->inhibitors); hashmap_free(m->buttons); hashmap_free(m->user_units); hashmap_free(m->session_units); set_free_free(m->busnames); sd_event_source_unref(m->idle_action_event_source); sd_event_source_unref(m->inhibit_timeout_source); sd_event_source_unref(m->scheduled_shutdown_timeout_source); sd_event_source_unref(m->nologin_timeout_source); sd_event_source_unref(m->wall_message_timeout_source); sd_event_source_unref(m->console_active_event_source); sd_event_source_unref(m->udev_seat_event_source); sd_event_source_unref(m->udev_device_event_source); sd_event_source_unref(m->udev_vcsa_event_source); sd_event_source_unref(m->udev_button_event_source); sd_event_source_unref(m->lid_switch_ignore_event_source); safe_close(m->console_active_fd); if (m->udev_seat_monitor) udev_monitor_unref(m->udev_seat_monitor); if (m->udev_device_monitor) udev_monitor_unref(m->udev_device_monitor); if (m->udev_vcsa_monitor) udev_monitor_unref(m->udev_vcsa_monitor); if (m->udev_button_monitor) udev_monitor_unref(m->udev_button_monitor); if (m->udev) udev_unref(m->udev); if (m->unlink_nologin) (void) unlink("/run/nologin"); bus_verify_polkit_async_registry_free(m->polkit_registry); sd_bus_unref(m->bus); sd_event_unref(m->event); safe_close(m->reserve_vt_fd); strv_free(m->kill_only_users); strv_free(m->kill_exclude_users); free(m->scheduled_shutdown_type); free(m->scheduled_shutdown_tty); free(m->wall_message); free(m->action_job); free(m); }
void manager_free(Manager *m) { Session *session; User *u; Device *d; Seat *s; Inhibitor *i; Button *b; assert(m); while ((session = hashmap_first(m->sessions))) session_free(session); while ((u = hashmap_first(m->users))) user_free(u); while ((d = hashmap_first(m->devices))) device_free(d); while ((s = hashmap_first(m->seats))) seat_free(s); while ((i = hashmap_first(m->inhibitors))) inhibitor_free(i); while ((b = hashmap_first(m->buttons))) button_free(b); hashmap_free(m->devices); hashmap_free(m->seats); hashmap_free(m->sessions); hashmap_free(m->users); hashmap_free(m->inhibitors); hashmap_free(m->buttons); hashmap_free(m->user_units); hashmap_free(m->session_units); set_free_free(m->busnames); sd_event_source_unref(m->idle_action_event_source); sd_event_source_unref(m->console_active_event_source); sd_event_source_unref(m->udev_seat_event_source); sd_event_source_unref(m->udev_device_event_source); sd_event_source_unref(m->udev_vcsa_event_source); sd_event_source_unref(m->udev_button_event_source); if (m->console_active_fd >= 0) close_nointr_nofail(m->console_active_fd); if (m->udev_seat_monitor) udev_monitor_unref(m->udev_seat_monitor); if (m->udev_device_monitor) udev_monitor_unref(m->udev_device_monitor); if (m->udev_vcsa_monitor) udev_monitor_unref(m->udev_vcsa_monitor); if (m->udev_button_monitor) udev_monitor_unref(m->udev_button_monitor); if (m->udev) udev_unref(m->udev); bus_verify_polkit_async_registry_free(m->bus, m->polkit_registry); sd_bus_unref(m->bus); sd_event_unref(m->event); if (m->reserve_vt_fd >= 0) close_nointr_nofail(m->reserve_vt_fd); strv_free(m->kill_only_users); strv_free(m->kill_exclude_users); free(m->action_job); free(m); }