168 lines
4.5 KiB
C
168 lines
4.5 KiB
C
/* 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);
|
|
}
|