mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-24 21:34:08 +03:00
shared: split out code that maps properties to local structs
Just some refactoring, no code changes.
This commit is contained in:
parent
9b71e4ab90
commit
807542bece
@ -4,6 +4,7 @@
|
||||
|
||||
#include "analyze-security.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "bus-unit-util.h"
|
||||
#include "bus-util.h"
|
||||
#include "env-util.h"
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "build.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-locator.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "bus-unit-util.h"
|
||||
#include "calendarspec.h"
|
||||
#include "conf-files.h"
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include "alloc-util.h"
|
||||
#include "architecture.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "hostname-util.h"
|
||||
#include "main-func.h"
|
||||
#include "pretty-print.h"
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include "bus-error.h"
|
||||
#include "bus-locator.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "kbd-util.h"
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "alloc-util.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-locator.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "bus-unit-procs.h"
|
||||
#include "cgroup-show.h"
|
||||
#include "cgroup-util.h"
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "bus-common-errors.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-locator.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "bus-unit-procs.h"
|
||||
#include "bus-unit-util.h"
|
||||
#include "bus-wait-for-jobs.h"
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "bus-common-errors.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-locator.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "dns-domain.h"
|
||||
#include "escape.h"
|
||||
#include "format-table.h"
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "alloc-util.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-locator.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "bus-unit-util.h"
|
||||
#include "bus-wait-for-jobs.h"
|
||||
#include "calendarspec.h"
|
||||
|
229
src/shared/bus-map-properties.c
Normal file
229
src/shared/bus-map-properties.c
Normal file
@ -0,0 +1,229 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#include "bus-map-properties.h"
|
||||
#include "alloc-util.h"
|
||||
#include "strv.h"
|
||||
#include "bus-message.h"
|
||||
|
||||
int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
|
||||
sd_id128_t *p = userdata;
|
||||
const void *v;
|
||||
size_t n;
|
||||
int r;
|
||||
|
||||
r = sd_bus_message_read_array(m, SD_BUS_TYPE_BYTE, &v, &n);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (n == 0)
|
||||
*p = SD_ID128_NULL;
|
||||
else if (n == 16)
|
||||
memcpy((*p).bytes, v, n);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, unsigned flags, 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:
|
||||
case SD_BUS_TYPE_OBJECT_PATH: {
|
||||
const char **p = userdata;
|
||||
const char *s;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &s);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (isempty(s))
|
||||
s = NULL;
|
||||
|
||||
if (flags & BUS_MAP_STRDUP)
|
||||
return free_and_strdup((char **) userdata, s);
|
||||
|
||||
*p = s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
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)
|
||||
return r;
|
||||
|
||||
return strv_extend_strv(p, l, false);
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_BOOLEAN: {
|
||||
int b;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &b);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (flags & BUS_MAP_BOOLEAN_AS_BOOL)
|
||||
*(bool*) userdata = b;
|
||||
else
|
||||
*(int*) userdata = b;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_INT32:
|
||||
case SD_BUS_TYPE_UINT32: {
|
||||
uint32_t u, *p = userdata;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &u);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*p = u;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_INT64:
|
||||
case SD_BUS_TYPE_UINT64: {
|
||||
uint64_t t, *p = userdata;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &t);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*p = t;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_DOUBLE: {
|
||||
double d, *p = userdata;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &d);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*p = d;
|
||||
return 0;
|
||||
}}
|
||||
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
int bus_message_map_all_properties(
|
||||
sd_bus_message *m,
|
||||
const struct bus_properties_map *map,
|
||||
unsigned flags,
|
||||
sd_bus_error *error,
|
||||
void *userdata) {
|
||||
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(map);
|
||||
|
||||
r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "{sv}");
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
while ((r = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) {
|
||||
const struct bus_properties_map *prop;
|
||||
const char *member;
|
||||
const char *contents;
|
||||
void *v;
|
||||
unsigned i;
|
||||
|
||||
r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &member);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
for (i = 0, prop = NULL; map[i].member; i++)
|
||||
if (streq(map[i].member, member)) {
|
||||
prop = &map[i];
|
||||
break;
|
||||
}
|
||||
|
||||
if (prop) {
|
||||
r = sd_bus_message_peek_type(m, NULL, &contents);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_enter_container(m, SD_BUS_TYPE_VARIANT, contents);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
v = (uint8_t *)userdata + prop->offset;
|
||||
if (map[i].set)
|
||||
r = prop->set(sd_bus_message_get_bus(m), member, m, error, v);
|
||||
else
|
||||
r = map_basic(sd_bus_message_get_bus(m), member, m, flags, error, v);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_exit_container(m);
|
||||
if (r < 0)
|
||||
return r;
|
||||
} else {
|
||||
r = sd_bus_message_skip(m, "v");
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = sd_bus_message_exit_container(m);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return sd_bus_message_exit_container(m);
|
||||
}
|
||||
|
||||
int bus_map_all_properties(
|
||||
sd_bus *bus,
|
||||
const char *destination,
|
||||
const char *path,
|
||||
const struct bus_properties_map *map,
|
||||
unsigned flags,
|
||||
sd_bus_error *error,
|
||||
sd_bus_message **reply,
|
||||
void *userdata) {
|
||||
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(destination);
|
||||
assert(path);
|
||||
assert(map);
|
||||
assert(reply || (flags & BUS_MAP_STRDUP));
|
||||
|
||||
r = sd_bus_call_method(
|
||||
bus,
|
||||
destination,
|
||||
path,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"GetAll",
|
||||
error,
|
||||
&m,
|
||||
"s", "");
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = bus_message_map_all_properties(m, map, flags, error, userdata);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (reply)
|
||||
*reply = sd_bus_message_ref(m);
|
||||
|
||||
return r;
|
||||
}
|
24
src/shared/bus-map-properties.h
Normal file
24
src/shared/bus-map-properties.h
Normal file
@ -0,0 +1,24 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
#pragma once
|
||||
|
||||
#include "sd-bus.h"
|
||||
|
||||
typedef int (*bus_property_set_t) (sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
|
||||
|
||||
struct bus_properties_map {
|
||||
const char *member;
|
||||
const char *signature;
|
||||
bus_property_set_t set;
|
||||
size_t offset;
|
||||
};
|
||||
|
||||
enum {
|
||||
BUS_MAP_STRDUP = 1 << 0, /* If set, each "s" message is duplicated. Thus, each pointer needs to be freed. */
|
||||
BUS_MAP_BOOLEAN_AS_BOOL = 1 << 1, /* If set, each "b" message is written to a bool pointer. If not set, "b" is written to a int pointer. */
|
||||
};
|
||||
|
||||
int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
|
||||
|
||||
int bus_message_map_all_properties(sd_bus_message *m, const struct bus_properties_map *map, unsigned flags, sd_bus_error *error, void *userdata);
|
||||
int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map,
|
||||
unsigned flags, sd_bus_error *error, sd_bus_message **reply, void *userdata);
|
@ -701,229 +701,6 @@ int bus_print_all_properties(
|
||||
return bus_message_print_all_properties(reply, func, filter, value, all, found_properties);
|
||||
}
|
||||
|
||||
int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
|
||||
sd_id128_t *p = userdata;
|
||||
const void *v;
|
||||
size_t n;
|
||||
int r;
|
||||
|
||||
r = sd_bus_message_read_array(m, SD_BUS_TYPE_BYTE, &v, &n);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (n == 0)
|
||||
*p = SD_ID128_NULL;
|
||||
else if (n == 16)
|
||||
memcpy((*p).bytes, v, n);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, unsigned flags, 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:
|
||||
case SD_BUS_TYPE_OBJECT_PATH: {
|
||||
const char **p = userdata;
|
||||
const char *s;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &s);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (isempty(s))
|
||||
s = NULL;
|
||||
|
||||
if (flags & BUS_MAP_STRDUP)
|
||||
return free_and_strdup((char **) userdata, s);
|
||||
|
||||
*p = s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
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)
|
||||
return r;
|
||||
|
||||
return strv_extend_strv(p, l, false);
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_BOOLEAN: {
|
||||
int b;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &b);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (flags & BUS_MAP_BOOLEAN_AS_BOOL)
|
||||
*(bool*) userdata = b;
|
||||
else
|
||||
*(int*) userdata = b;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_INT32:
|
||||
case SD_BUS_TYPE_UINT32: {
|
||||
uint32_t u, *p = userdata;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &u);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*p = u;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_INT64:
|
||||
case SD_BUS_TYPE_UINT64: {
|
||||
uint64_t t, *p = userdata;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &t);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*p = t;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case SD_BUS_TYPE_DOUBLE: {
|
||||
double d, *p = userdata;
|
||||
|
||||
r = sd_bus_message_read_basic(m, type, &d);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*p = d;
|
||||
return 0;
|
||||
}}
|
||||
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
int bus_message_map_all_properties(
|
||||
sd_bus_message *m,
|
||||
const struct bus_properties_map *map,
|
||||
unsigned flags,
|
||||
sd_bus_error *error,
|
||||
void *userdata) {
|
||||
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(map);
|
||||
|
||||
r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "{sv}");
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
while ((r = sd_bus_message_enter_container(m, SD_BUS_TYPE_DICT_ENTRY, "sv")) > 0) {
|
||||
const struct bus_properties_map *prop;
|
||||
const char *member;
|
||||
const char *contents;
|
||||
void *v;
|
||||
unsigned i;
|
||||
|
||||
r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &member);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
for (i = 0, prop = NULL; map[i].member; i++)
|
||||
if (streq(map[i].member, member)) {
|
||||
prop = &map[i];
|
||||
break;
|
||||
}
|
||||
|
||||
if (prop) {
|
||||
r = sd_bus_message_peek_type(m, NULL, &contents);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_enter_container(m, SD_BUS_TYPE_VARIANT, contents);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
v = (uint8_t *)userdata + prop->offset;
|
||||
if (map[i].set)
|
||||
r = prop->set(sd_bus_message_get_bus(m), member, m, error, v);
|
||||
else
|
||||
r = map_basic(sd_bus_message_get_bus(m), member, m, flags, error, v);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_message_exit_container(m);
|
||||
if (r < 0)
|
||||
return r;
|
||||
} else {
|
||||
r = sd_bus_message_skip(m, "v");
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = sd_bus_message_exit_container(m);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return sd_bus_message_exit_container(m);
|
||||
}
|
||||
|
||||
int bus_map_all_properties(
|
||||
sd_bus *bus,
|
||||
const char *destination,
|
||||
const char *path,
|
||||
const struct bus_properties_map *map,
|
||||
unsigned flags,
|
||||
sd_bus_error *error,
|
||||
sd_bus_message **reply,
|
||||
void *userdata) {
|
||||
|
||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(destination);
|
||||
assert(path);
|
||||
assert(map);
|
||||
assert(reply || (flags & BUS_MAP_STRDUP));
|
||||
|
||||
r = sd_bus_call_method(
|
||||
bus,
|
||||
destination,
|
||||
path,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"GetAll",
|
||||
error,
|
||||
&m,
|
||||
"s", "");
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = bus_message_map_all_properties(m, map, flags, error, userdata);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (reply)
|
||||
*reply = sd_bus_message_ref(m);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
int bus_connect_transport(BusTransport transport, const char *host, bool user, sd_bus **ret) {
|
||||
_cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
|
||||
int r;
|
||||
|
@ -22,26 +22,6 @@ typedef enum BusTransport {
|
||||
_BUS_TRANSPORT_INVALID = -1
|
||||
} BusTransport;
|
||||
|
||||
typedef int (*bus_property_set_t) (sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
|
||||
|
||||
struct bus_properties_map {
|
||||
const char *member;
|
||||
const char *signature;
|
||||
bus_property_set_t set;
|
||||
size_t offset;
|
||||
};
|
||||
|
||||
enum {
|
||||
BUS_MAP_STRDUP = 1 << 0, /* If set, each "s" message is duplicated. Thus, each pointer needs to be freed. */
|
||||
BUS_MAP_BOOLEAN_AS_BOOL = 1 << 1, /* If set, each "b" message is written to a bool pointer. If not set, "b" is written to a int pointer. */
|
||||
};
|
||||
|
||||
int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
|
||||
|
||||
int bus_message_map_all_properties(sd_bus_message *m, const struct bus_properties_map *map, unsigned flags, sd_bus_error *error, void *userdata);
|
||||
int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map,
|
||||
unsigned flags, sd_bus_error *error, sd_bus_message **reply, void *userdata);
|
||||
|
||||
int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name);
|
||||
|
||||
typedef bool (*check_idle_t)(void *userdata);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#include "bus-util.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "bus-wait-for-units.h"
|
||||
#include "hashmap.h"
|
||||
#include "string-util.h"
|
||||
|
@ -31,6 +31,8 @@ shared_sources = files('''
|
||||
bus-locator.h
|
||||
bus-log-control-api.c
|
||||
bus-log-control-api.h
|
||||
bus-map-properties.c
|
||||
bus-map-properties.h
|
||||
bus-object.c
|
||||
bus-object.h
|
||||
bus-polkit.c
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "bus-common-errors.h"
|
||||
#include "bus-error.h"
|
||||
#include "bus-locator.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "bus-message.h"
|
||||
#include "bus-unit-procs.h"
|
||||
#include "bus-unit-util.h"
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
#include "bus-error.h"
|
||||
#include "bus-locator.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "format-table.h"
|
||||
#include "in-addr-util.h"
|
||||
#include "main-func.h"
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "bus-error.h"
|
||||
#include "bus-locator.h"
|
||||
#include "bus-log-control-api.h"
|
||||
#include "bus-map-properties.h"
|
||||
#include "bus-polkit.h"
|
||||
#include "clock-util.h"
|
||||
#include "conf-files.h"
|
||||
|
Loading…
Reference in New Issue
Block a user