diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-07-19 10:57:04 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-07-21 04:08:22 +0900 |
commit | 976009897b2aac52d768e035bc9c2d4862c3956a (patch) | |
tree | 08f0f5afbd562725663420a272fb07dce4dc3b98 | |
parent | e293e755d5db821a8c987b93519d612931c969d7 (diff) | |
download | systemd-976009897b2aac52d768e035bc9c2d4862c3956a.tar.gz |
util: introduce helper functions to read in_addr from bus message
-rw-r--r-- | src/shared/bus-message-util.c | 50 | ||||
-rw-r--r-- | src/shared/bus-message-util.h | 9 | ||||
-rw-r--r-- | src/shared/meson.build | 2 |
3 files changed, 61 insertions, 0 deletions
diff --git a/src/shared/bus-message-util.c b/src/shared/bus-message-util.c new file mode 100644 index 0000000000..2b13001c32 --- /dev/null +++ b/src/shared/bus-message-util.c @@ -0,0 +1,50 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ + +#include "bus-message-util.h" + +int bus_message_read_family(sd_bus_message *message, sd_bus_error *error, int *ret) { + int family, r; + + assert(message); + assert(ret); + + assert_cc(sizeof(int) == sizeof(int32_t)); + + r = sd_bus_message_read(message, "i", &family); + if (r < 0) + return r; + + if (!IN_SET(family, AF_INET, AF_INET6)) + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown address family %i", family); + + *ret = family; + return 0; +} + +int bus_message_read_in_addr_auto(sd_bus_message *message, sd_bus_error *error, int *ret_family, union in_addr_union *ret_addr) { + int family, r; + const void *d; + size_t sz; + + assert(message); + + r = sd_bus_message_read(message, "i", &family); + if (r < 0) + return r; + + r = sd_bus_message_read_array(message, 'y', &d, &sz); + if (r < 0) + return r; + + if (!IN_SET(family, AF_INET, AF_INET6)) + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown address family %i", family); + + if (sz != FAMILY_ADDRESS_SIZE(family)) + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid address size"); + + if (ret_family) + *ret_family = family; + if (ret_addr) + memcpy(ret_addr, d, sz); + return 0; +} diff --git a/src/shared/bus-message-util.h b/src/shared/bus-message-util.h new file mode 100644 index 0000000000..79bef325e3 --- /dev/null +++ b/src/shared/bus-message-util.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ +#pragma once + +#include "sd-bus.h" + +#include "in-addr-util.h" + +int bus_message_read_family(sd_bus_message *message, sd_bus_error *error, int *ret); +int bus_message_read_in_addr_auto(sd_bus_message *message, sd_bus_error *error, int *ret_family, union in_addr_union *ret_addr); diff --git a/src/shared/meson.build b/src/shared/meson.build index 1868e8aede..0da733c3fe 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -35,6 +35,8 @@ shared_sources = files(''' bus-log-control-api.h bus-map-properties.c bus-map-properties.h + bus-message-util.c + bus-message-util.h bus-object.c bus-object.h bus-polkit.c |