/* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "bus-get-properties.h" #include "rlimit-util.h" #include "stdio-util.h" #include "string-util.h" int bus_property_get_bool( sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) { int b = *(bool*) userdata; return sd_bus_message_append_basic(reply, 'b', &b); } int bus_property_set_bool( sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *value, void *userdata, sd_bus_error *error) { int b, r; r = sd_bus_message_read(value, "b", &b); if (r < 0) return r; *(bool*) userdata = b; return 0; } int bus_property_get_id128( sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) { sd_id128_t *id = userdata; if (sd_id128_is_null(*id)) /* Add an empty array if the ID is zero */ return sd_bus_message_append(reply, "ay", 0); else return sd_bus_message_append_array(reply, 'y', id->bytes, 16); } int bus_property_get_percent( sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) { char pstr[DECIMAL_STR_MAX(int) + 2]; int p = *(int*) userdata; xsprintf(pstr, "%d%%", p); return sd_bus_message_append_basic(reply, 's', pstr); } #if __SIZEOF_SIZE_T__ != 8 int bus_property_get_size( sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) { uint64_t sz = *(size_t*) userdata; return sd_bus_message_append_basic(reply, 't', &sz); } #endif #if __SIZEOF_LONG__ != 8 int bus_property_get_long( sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) { int64_t l = *(long*) userdata; return sd_bus_message_append_basic(reply, 'x', &l); } int bus_property_get_ulong( sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) { uint64_t ul = *(unsigned long*) userdata; return sd_bus_message_append_basic(reply, 't', &ul); } #endif int bus_property_get_rlimit( sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error) { const char *is_soft; struct rlimit *rl; uint64_t u; rlim_t x; 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; /* 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); assert(z >= 0); (void) 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 */ u = x == RLIM_INFINITY ? (uint64_t) -1 : (uint64_t) x; return sd_bus_message_append(reply, "t", u); }