From: Yu Watanabe Date: Tue, 1 May 2018 01:48:21 +0000 (+0900) Subject: nsflsgs: drop namespace_flag_{from,to}_string() X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=de675c5e1e7be07abfcdd7990b3c947517c2ef06;p=elogind.git nsflsgs: drop namespace_flag_{from,to}_string() This also drops namespace_flag_to_string_many_with_check(), and renames namespace_flag_{from,to}_string_many() to namespace_flags_{from,to}_string(). --- diff --git a/src/shared/bus-util.c b/src/shared/bus-util.c index a191c3a4a..37f0f9f2b 100644 --- a/src/shared/bus-util.c +++ b/src/shared/bus-util.c @@ -720,7 +720,7 @@ int bus_print_property(const char *name, sd_bus_message *m, bool value, bool all else if ((u & NAMESPACE_FLAGS_ALL) == NAMESPACE_FLAGS_ALL) result = "no"; else { - r = namespace_flag_to_string_many(u, &s); + r = namespace_flags_to_string(u, &s); if (r < 0) return r; @@ -1082,7 +1082,9 @@ static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, unsigne if (r < 0) return r; - return strv_free_and_replace(*p, l); + strv_free(*p); + *p = TAKE_PTR(l); + return 0; } case SD_BUS_TYPE_BOOLEAN: { @@ -1306,15 +1308,9 @@ int bus_connect_transport(BusTransport transport, const char *host, bool user, s if (user) r = sd_bus_default_user(&bus); #endif // 0 - else { - if (sd_booted() <= 0) { - /* Print a friendly message when the local system is actually not running systemd as PID 1. */ - log_error("System has not been booted with elogind as init system (PID 1). Can't operate."); - - return -EHOSTDOWN; - } + else r = sd_bus_default_system(&bus); - } + break; case BUS_TRANSPORT_REMOTE: @@ -1356,15 +1352,9 @@ int bus_connect_transport_systemd(BusTransport transport, const char *host, bool case BUS_TRANSPORT_LOCAL: if (user) r = bus_connect_user_systemd(bus); - else { - if (sd_booted() <= 0) { - /* Print a friendly message when the local system is actually not running systemd as PID 1. */ - log_error("System has not been booted with systemd as init system (PID 1). Can't operate."); - - return -EHOSTDOWN; - } + else r = bus_connect_system_systemd(bus); - } + break; case BUS_TRANSPORT_REMOTE: @@ -1630,40 +1620,36 @@ int bus_property_get_rlimit( void *userdata, sd_bus_error *error) { - const char *is_soft; struct rlimit *rl; uint64_t u; rlim_t x; + const char *is_soft; assert(bus); assert(reply); assert(userdata); is_soft = endswith(property, "Soft"); - rl = *(struct rlimit**) userdata; if (rl) x = is_soft ? rl->rlim_cur : rl->rlim_max; else { struct rlimit buf = {}; - const char *s, *p; int z; + const char *s; - /* Chop off "Soft" suffix */ s = is_soft ? strndupa(property, is_soft - property) : property; - /* Skip over any prefix, such as "Default" */ - assert_se(p = strstr(s, "Limit")); - - z = rlimit_from_string(p + 5); + z = rlimit_from_string(strstr(s, "Limit")); assert(z >= 0); - (void) getrlimit(z, &buf); + getrlimit(z, &buf); x = is_soft ? buf.rlim_cur : buf.rlim_max; } - /* rlim_t might have different sizes, let's map RLIMIT_INFINITY to (uint64_t) -1, so that it is the same on all - * archs */ + /* rlim_t might have different sizes, let's map + * RLIMIT_INFINITY to (uint64_t) -1, so that it is the same on + * all archs */ u = x == RLIM_INFINITY ? (uint64_t) -1 : (uint64_t) x; return sd_bus_message_append(reply, "t", u); @@ -1744,124 +1730,3 @@ int bus_open_system_watch_bind_with_description(sd_bus **ret, const char *descri return 0; } - -struct request_name_data { - const char *name; - uint64_t flags; - void *userdata; -}; - -static int reload_dbus_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) { - _cleanup_free_ struct request_name_data *data = userdata; - const sd_bus_error *e; - int r; - - assert(m); - assert(data); - assert(data->name); - - e = sd_bus_message_get_error(m); - if (e) { - log_error_errno(sd_bus_error_get_errno(e), "Failed to reload DBus configuration: %s", e->message); - return 1; - } - - /* Here, use the default request name handler to avoid an infinite loop of reloading and requesting. */ - r = sd_bus_request_name_async(sd_bus_message_get_bus(m), NULL, data->name, data->flags, NULL, data->userdata); - if (r < 0) - log_error_errno(r, "Failed to request name: %m"); - - return 1; -} - -static int request_name_handler_may_reload_dbus(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) { - _cleanup_free_ struct request_name_data *data = userdata; - uint32_t ret; - int r; - - assert(m); - assert(userdata); - - if (sd_bus_message_is_method_error(m, NULL)) { - const sd_bus_error *e = sd_bus_message_get_error(m); - - if (!sd_bus_error_has_name(e, SD_BUS_ERROR_ACCESS_DENIED)) { - log_debug_errno(sd_bus_error_get_errno(e), - "Unable to request name, failing connection: %s", - e->message); - - bus_enter_closing(sd_bus_message_get_bus(m)); - return 1; - } - - log_debug_errno(sd_bus_error_get_errno(e), - "Unable to request name, retry after reloading DBus configuration: %s", - e->message); - - /* If systemd-timesyncd.service enables DynamicUser= and dbus.service - * started before the dynamic user is realized, then the DBus policy - * about timesyncd has not been enabled yet. So, let's try to reload - * DBus configuration, and after that request name again. Note that it - * seems that no privileges are necessary to call the following method. */ - - r = sd_bus_call_method_async( - sd_bus_message_get_bus(m), - NULL, - "org.freedesktop.DBus", - "/org/freedesktop/DBus", - "org.freedesktop.DBus", - "ReloadConfig", - reload_dbus_handler, - userdata, NULL); - if (r < 0) { - log_error_errno(r, "Failed to reload DBus configuration: %m"); - bus_enter_closing(sd_bus_message_get_bus(m)); - return 1; - } - - data = NULL; /* Avoid free() */ - return 1; - } - - r = sd_bus_message_read(m, "u", &ret); - if (r < 0) - return r; - - switch (ret) { - - case BUS_NAME_ALREADY_OWNER: - log_debug("Already owner of requested service name, ignoring."); - return 1; - - case BUS_NAME_IN_QUEUE: - log_debug("In queue for requested service name."); - return 1; - - case BUS_NAME_PRIMARY_OWNER: - log_debug("Successfully acquired requested service name."); - return 1; - - case BUS_NAME_EXISTS: - log_debug("Requested service name already owned, failing connection."); - bus_enter_closing(sd_bus_message_get_bus(m)); - return 1; - } - - log_debug("Unexpected response from RequestName(), failing connection."); - bus_enter_closing(sd_bus_message_get_bus(m)); - return 1; -} - -int bus_request_name_async_may_reload_dbus(sd_bus *bus, sd_bus_slot **ret_slot, const char *name, uint64_t flags, void *userdata) { - struct request_name_data *data; - - data = new0(struct request_name_data, 1); - if (!data) - return -ENOMEM; - - data->name = name; - data->flags = flags; - data->userdata = userdata; - - return sd_bus_request_name_async(bus, ret_slot, name, flags, request_name_handler_may_reload_dbus, data); -} diff --git a/src/shared/nsflags.c b/src/shared/nsflags.c index 2b4f6e664..ae1afc829 100644 --- a/src/shared/nsflags.c +++ b/src/shared/nsflags.c @@ -25,33 +25,9 @@ const struct namespace_flag_map namespace_flag_map[] = { {} }; -const char* namespace_flag_to_string(unsigned long flag) { - unsigned i; - - flag &= NAMESPACE_FLAGS_ALL; - - for (i = 0; namespace_flag_map[i].name; i++) - if (flag == namespace_flag_map[i].flag) - return namespace_flag_map[i].name; - - return NULL; /* either unknown namespace flag, or a combination of many. This call supports neither. */ -} - -unsigned long namespace_flag_from_string(const char *name) { - unsigned i; - - if (isempty(name)) - return 0; - - for (i = 0; namespace_flag_map[i].name; i++) - if (streq(name, namespace_flag_map[i].name)) - return namespace_flag_map[i].flag; - - return 0; -} #if 0 /// UNNEEDED by elogind -int namespace_flag_from_string_many(const char *name, unsigned long *ret) { +int namespace_flags_from_string(const char *name, unsigned long *ret) { unsigned long flags = 0; int r; @@ -59,7 +35,8 @@ int namespace_flag_from_string_many(const char *name, unsigned long *ret) { for (;;) { _cleanup_free_ char *word = NULL; - unsigned long f; + unsigned long f = 0; + unsigned i; r = extract_first_word(&name, &word, NULL, 0); if (r < 0) @@ -67,7 +44,12 @@ int namespace_flag_from_string_many(const char *name, unsigned long *ret) { if (r == 0) break; - f = namespace_flag_from_string(word); + for (i = 0; namespace_flag_map[i].name; i++) + if (streq(word, namespace_flag_map[i].name)) { + f = namespace_flag_map[i].flag; + break; + } + if (f == 0) return -EINVAL; @@ -79,7 +61,7 @@ int namespace_flag_from_string_many(const char *name, unsigned long *ret) { } #endif // 0 -int namespace_flag_to_string_many(unsigned long flags, char **ret) { +int namespace_flags_to_string(unsigned long flags, char **ret) { _cleanup_free_ char *s = NULL; unsigned i; @@ -87,14 +69,8 @@ int namespace_flag_to_string_many(unsigned long flags, char **ret) { if ((flags & namespace_flag_map[i].flag) != namespace_flag_map[i].flag) continue; - if (!s) { - s = strdup(namespace_flag_map[i].name); - if (!s) - return -ENOMEM; - } else { - if (!strextend(&s, " ", namespace_flag_map[i].name, NULL)) - return -ENOMEM; - } + if (!strextend_with_separator(&s, " ", namespace_flag_map[i].name, NULL)) + return -ENOMEM; } if (!s) { diff --git a/src/shared/nsflags.h b/src/shared/nsflags.h index d34b79f96..7f2b94d16 100644 --- a/src/shared/nsflags.h +++ b/src/shared/nsflags.h @@ -24,12 +24,10 @@ CLONE_NEWUSER| \ CLONE_NEWUTS)) -const char* namespace_flag_to_string(unsigned long flag); -unsigned long namespace_flag_from_string(const char *name); #if 0 /// UNNEEDED by elogind -int namespace_flag_from_string_many(const char *name, unsigned long *ret); #endif // 0 -int namespace_flag_to_string_many(unsigned long flags, char **ret); +int namespace_flags_from_string(const char *name, unsigned long *ret); +int namespace_flags_to_string(unsigned long flags, char **ret); struct namespace_flag_map { unsigned long flag;