On Tue, 04.11.14 12:05, Jan Synacek (jsyna...@redhat.com) wrote: One more addition:
> +} > + > +int xkb_get_keymaps(char ***list, enum keymap_state look_for, const char > *layout_prefix) > +{ > + _cleanup_fclose_ FILE *f; > + char line[LINE_MAX]; > + enum keymap_state state = NONE; > + int r; > + > + f = fopen("/usr/share/X11/xkb/rules/base.lst", "re"); > + if (!f) { > + log_error("Failed to open keyboard mapping list. %m"); > + return -errno; > + } > + > + FOREACH_LINE(line, f, break) { > + char *l, *w; > + > + l = strstrip(line); > + > + if (isempty(l)) > + continue; > + > + if (l[0] == '!') { > + if (startswith(l, "! model")) > + state = MODELS; > + else if (startswith(l, "! layout")) > + state = LAYOUTS; > + else if (startswith(l, "! variant")) > + state = VARIANTS; > + else if (startswith(l, "! option")) > + state = OPTIONS; > + else > + state = NONE; > + > + continue; > + } > + > + if (state != look_for) > + continue; > + > + w = l + strcspn(l, WHITESPACE); > + > + if (layout_prefix) { > + char *e; > + > + if (*w == 0) > + continue; > + > + *w = 0; > + w++; > + w += strspn(w, WHITESPACE); > + > + e = strchr(w, ':'); > + if (!e) > + continue; > + > + *e = 0; > + > + if (!streq(w, layout_prefix)) > + continue; > + } else > + *w = 0; > + > + r = strv_extend(list, l); > + if (r < 0) > + return log_oom(); I think, while we are at it, this should really be reworked to use GREEDY_REALLOC. See strv_split_quoted() for an example. > + } > + > + if (strv_isempty(*list)) { > + log_error("Couldn't find any entries."); /* TODO: improve > error message */ > + return -ENOENT; > + } > + > + return 0; Lennart -- Lennart Poettering, Red Hat _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel