int vconsole_write_data(Context *c) { _cleanup_strv_free_ char **l = NULL; struct stat st; int r; r = load_env_file(NULL, "/etc/vconsole.conf", NULL, &l); if (r < 0 && r != -ENOENT) return r; if (isempty(c->vc_keymap)) l = strv_env_unset(l, "KEYMAP"); else { _cleanup_free_ char *s = NULL; char **u; s = strappend("KEYMAP=", c->vc_keymap); if (!s) return -ENOMEM; u = strv_env_set(l, s); if (!u) return -ENOMEM; strv_free_and_replace(l, u); } if (isempty(c->vc_keymap_toggle)) l = strv_env_unset(l, "KEYMAP_TOGGLE"); else { _cleanup_free_ char *s = NULL; char **u; s = strappend("KEYMAP_TOGGLE=", c->vc_keymap_toggle); if (!s) return -ENOMEM; u = strv_env_set(l, s); if (!u) return -ENOMEM; strv_free_and_replace(l, u); } if (strv_isempty(l)) { if (unlink("/etc/vconsole.conf") < 0) return errno == ENOENT ? 0 : -errno; c->vc_mtime = USEC_INFINITY; return 0; } r = write_env_file_label("/etc/vconsole.conf", l); if (r < 0) return r; if (stat("/etc/vconsole.conf", &st) >= 0) c->vc_mtime = timespec_load(&st.st_mtim); return 0; }
static int vconsole_write_data(Context *c) { int r; _cleanup_strv_free_ char **l = NULL; r = load_env_file("/etc/vconsole.conf", NULL, &l); if (r < 0 && r != -ENOENT) return r; if (isempty(c->vc_keymap)) l = strv_env_unset(l, "KEYMAP"); else { char *s, **u; s = strappend("KEYMAP=", c->vc_keymap); if (!s) return -ENOMEM; u = strv_env_set(l, s); free(s); strv_free(l); if (!u) return -ENOMEM; l = u; } if (isempty(c->vc_keymap_toggle)) l = strv_env_unset(l, "KEYMAP_TOGGLE"); else { char *s, **u; s = strappend("KEYMAP_TOGGLE=", c->vc_keymap_toggle); if (!s) return -ENOMEM; u = strv_env_set(l, s); free(s); strv_free(l); if (!u) return -ENOMEM; l = u; } if (strv_isempty(l)) { if (unlink("/etc/vconsole.conf") < 0) return errno == ENOENT ? 0 : -errno; return 0; } r = write_env_file_label("/etc/vconsole.conf", l); return r; }
static int context_write_data_machine_info(Context *c) { static const char * const name[_PROP_MAX] = { [PROP_PRETTY_HOSTNAME] = "PRETTY_HOSTNAME", [PROP_ICON_NAME] = "ICON_NAME", [PROP_CHASSIS] = "CHASSIS", [PROP_DEPLOYMENT] = "DEPLOYMENT", [PROP_LOCATION] = "LOCATION", }; _cleanup_strv_free_ char **l = NULL; int r, p; assert(c); r = load_env_file(NULL, "/etc/machine-info", NULL, &l); if (r < 0 && r != -ENOENT) return r; for (p = PROP_PRETTY_HOSTNAME; p <= PROP_LOCATION; p++) { _cleanup_free_ char *t = NULL; char **u; assert(name[p]); if (isempty(c->data[p])) { strv_env_unset(l, name[p]); continue; } t = strjoin(name[p], "=", c->data[p], NULL); if (!t) return -ENOMEM; u = strv_env_set(l, t); if (!u) return -ENOMEM; strv_free(l); l = u; } if (strv_isempty(l)) { if (unlink("/etc/machine-info") < 0) return errno == ENOENT ? 0 : -errno; return 0; } return write_env_file_label("/etc/machine-info", l); }
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; }
static void test_load_env_file_3(void) { _cleanup_strv_free_ char **data = NULL; int r; char name[] = "/tmp/test-load-env-file.XXXXXX"; _cleanup_close_ int fd; fd = mkostemp_safe(name); assert_se(fd >= 0); assert_se(write(fd, env_file_3, sizeof(env_file_3)) == sizeof(env_file_3)); r = load_env_file(NULL, name, NULL, &data); assert_se(r == 0); assert_se(data == NULL); unlink(name); }
static int locale_write_data(Context *c) { int r, p; char **l = NULL; r = load_env_file("/etc/locale.conf", NULL, &l); if (r < 0 && r != -ENOENT) return r; for (p = 0; p < _LOCALE_MAX; p++) { char *t, **u; assert(names[p]); if (isempty(c->locale[p])) { l = strv_env_unset(l, names[p]); continue; } if (asprintf(&t, "%s=%s", names[p], c->locale[p]) < 0) { strv_free(l); return -ENOMEM; } u = strv_env_set(l, t); free(t); strv_free(l); if (!u) return -ENOMEM; l = u; } if (strv_isempty(l)) { strv_free(l); if (unlink("/etc/locale.conf") < 0) return errno == ENOENT ? 0 : -errno; return 0; } r = write_env_file_label("/etc/locale.conf", l); strv_free(l); return r; }
static void test_load_env_file_2(void) { _cleanup_strv_free_ char **data = NULL; int r; char name[] = "/tmp/test-load-env-file.XXXXXX"; _cleanup_close_ int fd; fd = mkostemp_safe(name, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); assert_se(write(fd, env_file_2, sizeof(env_file_2)) == sizeof(env_file_2)); r = load_env_file(NULL, name, NULL, &data); assert_se(r == 0); assert_se(streq(data[0], "a=a")); assert_se(data[1] == NULL); unlink(name); }
static void test_load_env_file_4(void) { _cleanup_strv_free_ char **data = NULL; char name[] = "/tmp/test-load-env-file.XXXXXX"; _cleanup_close_ int fd; int r; fd = mkostemp_safe(name); assert_se(fd >= 0); assert_se(write(fd, env_file_4, sizeof(env_file_4)) == sizeof(env_file_4)); r = load_env_file(NULL, name, NULL, &data); assert_se(r == 0); assert_se(streq(data[0], "HWMON_MODULES=coretemp f71882fg")); assert_se(streq(data[1], "MODULE_0=coretemp")); assert_se(streq(data[2], "MODULE_1=f71882fg")); assert_se(data[3] == NULL); unlink(name); }
static void test_load_env_file_1(void) { _cleanup_strv_free_ char **data = NULL; int r; char name[] = "/tmp/test-load-env-file.XXXXXX"; _cleanup_close_ int fd; fd = mkostemp_safe(name); assert_se(fd >= 0); assert_se(write(fd, env_file_1, sizeof(env_file_1)) == sizeof(env_file_1)); r = load_env_file(NULL, name, NULL, &data); assert_se(r == 0); assert_se(streq(data[0], "a=a")); assert_se(streq(data[1], "b=bc")); assert_se(streq(data[2], "d=def")); assert_se(streq(data[3], "g=g ")); assert_se(streq(data[4], "h=h")); assert_se(streq(data[5], "i=i")); assert_se(data[6] == NULL); unlink(name); }
static void test_parse_env_file(void) { char t[] = "/tmp/test-fileio-in-XXXXXX", p[] = "/tmp/test-fileio-out-XXXXXX"; int fd, r; FILE *f; _cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL, *six = NULL, *seven = NULL, *eight = NULL, *nine = NULL, *ten = NULL; _cleanup_strv_free_ char **a = NULL, **b = NULL; char **i; unsigned k; fd = mkostemp_safe(p, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); close(fd); fd = mkostemp_safe(t, O_RDWR|O_CLOEXEC); assert_se(fd >= 0); f = fdopen(fd, "w"); assert_se(f); fputs("one=BAR \n" "# comment\n" " # comment \n" " ; comment \n" " two = bar \n" "invalid line\n" "invalid line #comment\n" "three = \"333\n" "xxxx\"\n" "four = \'44\\\"44\'\n" "five = \'55\\\'55\' \"FIVE\" cinco \n" "six = seis sechs\\\n" " sis\n" "seven=\"sevenval\" #nocomment\n" "eight=eightval #nocomment\n" "export nine=nineval\n" "ten=", f); fflush(f); fclose(f); r = load_env_file(t, NULL, &a); assert_se(r >= 0); STRV_FOREACH(i, a) log_info("Got: <%s>", *i); assert_se(streq_ptr(a[0], "one=BAR")); assert_se(streq_ptr(a[1], "two=bar")); assert_se(streq_ptr(a[2], "three=333\nxxxx")); assert_se(streq_ptr(a[3], "four=44\"44")); assert_se(streq_ptr(a[4], "five=55\'55FIVEcinco")); assert_se(streq_ptr(a[5], "six=seis sechs sis")); assert_se(streq_ptr(a[6], "seven=sevenval#nocomment")); assert_se(streq_ptr(a[7], "eight=eightval #nocomment")); assert_se(streq_ptr(a[8], "export nine=nineval")); assert_se(streq_ptr(a[9], "ten=")); assert_se(a[10] == NULL); strv_env_clean_log(a, "test"); k = 0; STRV_FOREACH(i, b) { log_info("Got2: <%s>", *i); assert_se(streq(*i, a[k++])); }
assert_se(streq(one, "BAR")); assert_se(streq(two, "bar")); assert_se(streq(three, "333\nxxxx")); assert_se(streq(four, "44\"44")); assert_se(streq(five, "55\'55FIVEcinco")); assert_se(streq(six, "seis sechs sis")); assert_se(streq(seven, "sevenval#nocomment")); assert_se(streq(eight, "eightval #nocomment")); assert_se(streq(nine, "nineval")); assert_se(ten == NULL); r = write_env_file(p, a); assert_se(r >= 0); r = load_env_file(p, NULL, &b); assert_se(r >= 0); unlink(t); unlink(p); } static void test_parse_multiline_env_file(void) { char t[] = "/tmp/test-fileio-in-XXXXXX", p[] = "/tmp/test-fileio-out-XXXXXX"; int fd, r; FILE *f; _cleanup_strv_free_ char **a = NULL, **b = NULL; char **i; fd = mkostemp_safe(p, O_RDWR|O_CLOEXEC);
static int write_data_vconsole(void) { int r; char **l = NULL; r = load_env_file("/etc/vconsole.conf", &l); if (r < 0 && r != -ENOENT) return r; if (isempty(state.vc_keymap)) l = strv_env_unset(l, "KEYMAP"); else { char *s, **u; s = strappend("KEYMAP=", state.vc_keymap); if (!s) { strv_free(l); return -ENOMEM; } u = strv_env_set(l, s); free(s); strv_free(l); if (!u) return -ENOMEM; l = u; } if (isempty(state.vc_keymap_toggle)) l = strv_env_unset(l, "KEYMAP_TOGGLE"); else { char *s, **u; s = strappend("KEYMAP_TOGGLE=", state.vc_keymap_toggle); if (!s) { strv_free(l); return -ENOMEM; } u = strv_env_set(l, s); free(s); strv_free(l); if (!u) return -ENOMEM; l = u; } if (strv_isempty(l)) { strv_free(l); if (unlink("/etc/vconsole.conf") < 0) return errno == ENOENT ? 0 : -errno; return 0; } r = write_env_file("/etc/vconsole.conf", l); strv_free(l); return r; }
assert_se(streq(one, "BAR")); assert_se(streq(two, "bar")); assert_se(streq(three, "333\nxxxx")); assert_se(streq(four, "44\"44")); assert_se(streq(five, "55\'55FIVEcinco")); assert_se(streq(six, "seis sechs sis")); assert_se(streq(seven, "sevenval#nocomment")); assert_se(streq(eight, "eightval #nocomment")); assert_se(streq(nine, "nineval")); assert_se(ten == NULL); r = write_env_file(p, a); assert_se(r >= 0); r = load_env_file(NULL, p, NULL, &b); assert_se(r >= 0); unlink(t); unlink(p); } static void test_parse_multiline_env_file(void) { char t[] = "/tmp/test-fileio-in-XXXXXX", p[] = "/tmp/test-fileio-out-XXXXXX"; int fd, r; FILE *f; _cleanup_strv_free_ char **a = NULL, **b = NULL; char **i; fd = mkostemp_safe(p, O_RDWR|O_CLOEXEC);
log_info("seven=[%s]", strna(seven)); log_info("eight=[%s]", strna(eight)); log_info("export nine=[%s]", strna(nine)); log_info("ten=[%s]", strna(nine)); assert_se(streq(one, "BAR")); assert_se(streq(two, "bar")); assert_se(streq(three, "333\nxxxx")); assert_se(streq(four, "44\"44")); assert_se(streq(five, "55\'55FIVEcinco")); assert_se(streq(six, "seis sechs sis")); assert_se(streq(seven, "sevenval#nocomment")); assert_se(streq(eight, "eightval #nocomment")); assert_se(streq(nine, "nineval")); assert_se(ten == NULL); r = write_env_file("/tmp/test-fileio", a); assert_se(r >= 0); r = load_env_file("/tmp/test-fileio", NULL, &b); assert_se(r >= 0); unlink(t); unlink("/tmp/test-fileio"); } int main(int argc, char *argv[]) { test_parse_env_file(); return 0; }