static int locale_read_data(Context *c) { int r; context_free_locale(c); r = parse_env_file("/etc/locale.conf", NEWLINE, "LANG", &c->locale[VARIABLE_LANG], "LANGUAGE", &c->locale[VARIABLE_LANGUAGE], "LC_CTYPE", &c->locale[VARIABLE_LC_CTYPE], "LC_NUMERIC", &c->locale[VARIABLE_LC_NUMERIC], "LC_TIME", &c->locale[VARIABLE_LC_TIME], "LC_COLLATE", &c->locale[VARIABLE_LC_COLLATE], "LC_MONETARY", &c->locale[VARIABLE_LC_MONETARY], "LC_MESSAGES", &c->locale[VARIABLE_LC_MESSAGES], "LC_PAPER", &c->locale[VARIABLE_LC_PAPER], "LC_NAME", &c->locale[VARIABLE_LC_NAME], "LC_ADDRESS", &c->locale[VARIABLE_LC_ADDRESS], "LC_TELEPHONE", &c->locale[VARIABLE_LC_TELEPHONE], "LC_MEASUREMENT", &c->locale[VARIABLE_LC_MEASUREMENT], "LC_IDENTIFICATION", &c->locale[VARIABLE_LC_IDENTIFICATION], NULL); if (r == -ENOENT) { int p; /* Fill in what we got passed from systemd. */ for (p = 0; p < _VARIABLE_LC_MAX; p++) { const char *name; name = locale_variable_to_string(p); assert(name); r = free_and_strdup(&c->locale[p], empty_to_null(getenv(name))); if (r < 0) return r; } r = 0; } locale_simplify(c); return r; }
static int locale_read_data(Context *c) { int r; context_free_locale(c); r = parse_env_file("/etc/locale.conf", NEWLINE, "LANG", &c->locale[LOCALE_LANG], "LANGUAGE", &c->locale[LOCALE_LANGUAGE], "LC_CTYPE", &c->locale[LOCALE_LC_CTYPE], "LC_NUMERIC", &c->locale[LOCALE_LC_NUMERIC], "LC_TIME", &c->locale[LOCALE_LC_TIME], "LC_COLLATE", &c->locale[LOCALE_LC_COLLATE], "LC_MONETARY", &c->locale[LOCALE_LC_MONETARY], "LC_MESSAGES", &c->locale[LOCALE_LC_MESSAGES], "LC_PAPER", &c->locale[LOCALE_LC_PAPER], "LC_NAME", &c->locale[LOCALE_LC_NAME], "LC_ADDRESS", &c->locale[LOCALE_LC_ADDRESS], "LC_TELEPHONE", &c->locale[LOCALE_LC_TELEPHONE], "LC_MEASUREMENT", &c->locale[LOCALE_LC_MEASUREMENT], "LC_IDENTIFICATION", &c->locale[LOCALE_LC_IDENTIFICATION], NULL); if (r == -ENOENT) { int p; /* Fill in what we got passed from systemd. */ for (p = 0; p < _LOCALE_MAX; p++) { assert(names[p]); r = free_and_copy(&c->locale[p], getenv(names[p])); if (r < 0) return r; } r = 0; } locale_simplify(c); return r; }
int locale_read_data(Context *c, sd_bus_message *m) { struct stat st; int r; /* Do not try to re-read the file within single bus operation. */ if (m) { if (m == c->locale_cache) return 0; sd_bus_message_unref(c->locale_cache); c->locale_cache = sd_bus_message_ref(m); } r = stat("/etc/locale.conf", &st); if (r < 0 && errno != ENOENT) return -errno; if (r >= 0) { usec_t t; /* If mtime is not changed, then we do not need to re-read the file. */ t = timespec_load(&st.st_mtim); if (c->locale_mtime != USEC_INFINITY && t == c->locale_mtime) return 0; c->locale_mtime = t; context_free_locale(c); r = parse_env_file(NULL, "/etc/locale.conf", NEWLINE, "LANG", &c->locale[VARIABLE_LANG], "LANGUAGE", &c->locale[VARIABLE_LANGUAGE], "LC_CTYPE", &c->locale[VARIABLE_LC_CTYPE], "LC_NUMERIC", &c->locale[VARIABLE_LC_NUMERIC], "LC_TIME", &c->locale[VARIABLE_LC_TIME], "LC_COLLATE", &c->locale[VARIABLE_LC_COLLATE], "LC_MONETARY", &c->locale[VARIABLE_LC_MONETARY], "LC_MESSAGES", &c->locale[VARIABLE_LC_MESSAGES], "LC_PAPER", &c->locale[VARIABLE_LC_PAPER], "LC_NAME", &c->locale[VARIABLE_LC_NAME], "LC_ADDRESS", &c->locale[VARIABLE_LC_ADDRESS], "LC_TELEPHONE", &c->locale[VARIABLE_LC_TELEPHONE], "LC_MEASUREMENT", &c->locale[VARIABLE_LC_MEASUREMENT], "LC_IDENTIFICATION", &c->locale[VARIABLE_LC_IDENTIFICATION], NULL); if (r < 0) return r; } else { int p; c->locale_mtime = USEC_INFINITY; context_free_locale(c); /* Fill in what we got passed from systemd. */ for (p = 0; p < _VARIABLE_LC_MAX; p++) { const char *name; name = locale_variable_to_string(p); assert(name); r = free_and_strdup(&c->locale[p], empty_to_null(getenv(name))); if (r < 0) return r; } } locale_simplify(c->locale); return 0; }