int sd_bus_list_names(sd_bus *bus, char ***l) { _cleanup_bus_message_unref_ sd_bus_message *reply1 = NULL, *reply2 = NULL; char **x = NULL; int r; if (!bus) return -EINVAL; if (!l) return -EINVAL; r = sd_bus_call_method( bus, "org.freedesktop.DBus", "/", "org.freedesktop.DBus", "ListNames", NULL, &reply1, NULL); if (r < 0) return r; r = sd_bus_call_method( bus, "org.freedesktop.DBus", "/", "org.freedesktop.DBus", "ListActivatableNames", NULL, &reply2, NULL); if (r < 0) return r; r = bus_message_read_strv_extend(reply1, &x); if (r < 0) { strv_free(x); return r; } r = bus_message_read_strv_extend(reply2, &x); if (r < 0) { strv_free(x); return r; } *l = strv_uniq(x); return 0; }
static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *error) { Context *c = userdata; _cleanup_strv_free_ char **l = NULL; char **i; const char *lang = NULL; int interactive; bool modified = false; bool have[_VARIABLE_LC_MAX] = {}; int p; int r; assert(m); assert(c); r = bus_message_read_strv_extend(m, &l); if (r < 0) return r; r = sd_bus_message_read_basic(m, 'b', &interactive); if (r < 0) return r; /* Check whether a variable changed and if it is valid */ STRV_FOREACH(i, l) { bool valid = false; for (p = 0; p < _VARIABLE_LC_MAX; p++) { size_t k; const char *name; name = locale_variable_to_string(p); assert(name); k = strlen(name); if (startswith(*i, name) && (*i)[k] == '=' && locale_is_valid((*i) + k + 1)) { valid = true; have[p] = true; if (p == VARIABLE_LANG) lang = (*i) + k + 1; if (!streq_ptr(*i + k + 1, c->locale[p])) modified = true; break; } } if (!valid) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Locale data."); }
static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) { char type; int r; r = sd_bus_message_peek_type(m, &type, NULL); if (r < 0) return r; switch (type) { case SD_BUS_TYPE_STRING: { const char *s; char *str; char **p = userdata; r = sd_bus_message_read_basic(m, type, &s); if (r < 0) break; if (isempty(s)) break; str = strdup(s); if (!str) { r = -ENOMEM; break; } free(*p); *p = str; break; } case SD_BUS_TYPE_ARRAY: { _cleanup_strv_free_ char **l = NULL; char ***p = userdata; r = bus_message_read_strv_extend(m, &l); if (r < 0) break; strv_free(*p); *p = l; l = NULL; break; } case SD_BUS_TYPE_BOOLEAN: { unsigned b; bool *p = userdata; r = sd_bus_message_read_basic(m, type, &b); if (r < 0) break; *p = b; break; } case SD_BUS_TYPE_UINT32: { uint64_t u; uint32_t *p = userdata; r = sd_bus_message_read_basic(m, type, &u); if (r < 0) break; *p = u; break; } case SD_BUS_TYPE_UINT64: { uint64_t t; uint64_t *p = userdata; r = sd_bus_message_read_basic(m, type, &t); if (r < 0) break; *p = t; break; } default: break; } return r; }
return -EINVAL; } static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *error) { _cleanup_(locale_variables_freep) char *new_locale[_VARIABLE_LC_MAX] = {}; _cleanup_strv_free_ char **settings = NULL, **l = NULL; Context *c = userdata; bool modified = false; int interactive, p, r; char **i; assert(m); assert(c); r = bus_message_read_strv_extend(m, &l); if (r < 0) return r; r = sd_bus_message_read_basic(m, 'b', &interactive); if (r < 0) return r; /* If single locale without variable name is provided, then we assume it is LANG=. */ if (strv_length(l) == 1 && !strchr(*l, '=')) { if (!locale_is_valid(*l)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Locale data."); new_locale[VARIABLE_LANG] = strdup(*l); if (!new_locale[VARIABLE_LANG]) return -ENOMEM;