From b01f31954f1c7c4601925173ae2638b572224e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 12 Jun 2022 16:52:57 +0200 Subject: [PATCH 01/23] Turn mempool_enabled() into a weak symbol Before we had the following scheme: mempool_enabled() would check mempool_use_allowed, and libsystemd-shared would be linked with a .c file that provides mempool_use_allowed=true, while other things would linked with a different .c file with mempool_use_allowed=false. In the new scheme, mempool_enabled() itself is a weak symbol. If it's not found, we assume false. So it only needs to be provided for libsystemd-shared, where it can return false or true. test-set-disable-mempool is libshared, so it gets the symbol. But then we actually disable the mempool via envvar. mempool_enable() is called to check its return value directly. --- meson.build | 6 ------ src/basic/hashmap.c | 7 +++---- src/basic/mempool.c | 17 ----------------- src/basic/mempool.h | 3 +-- src/libsystemd/disable-mempool.c | 5 ----- src/libsystemd/meson.build | 1 - src/shared/enable-mempool.c | 18 ++++++++++++++++-- src/test/test-set-disable-mempool.c | 7 +++++++ 8 files changed, 27 insertions(+), 37 deletions(-) delete mode 100644 src/libsystemd/disable-mempool.c diff --git a/meson.build b/meson.build index 2e8b69c96a..25bcfdba1b 100644 --- a/meson.build +++ b/meson.build @@ -1928,7 +1928,6 @@ alias_target('devel', libsystemd_pc, libudev_pc) libsystemd = shared_library( 'systemd', - disable_mempool_c, version : libsystemd_version, include_directories : libsystemd_includes, link_args : ['-shared', @@ -1953,7 +1952,6 @@ install_libsystemd_static = static_library( basic_gcrypt_sources, basic_compress_sources, fundamental_sources, - disable_mempool_c, include_directories : libsystemd_includes, build_by_default : static_libsystemd != 'false', install : static_libsystemd != 'false', @@ -1975,7 +1973,6 @@ install_libsystemd_static = static_library( libudev = shared_library( 'udev', - disable_mempool_c, version : libudev_version, include_directories : includes, link_args : ['-shared', @@ -1997,7 +1994,6 @@ install_libudev_static = static_library( shared_sources, libsystemd_sources, libudev_sources, - disable_mempool_c, include_directories : includes, build_by_default : static_libudev != 'false', install : static_libudev != 'false', @@ -2118,7 +2114,6 @@ subdir('test') test_dlopen = executable( 'test-dlopen', test_dlopen_c, - disable_mempool_c, include_directories : includes, link_with : [libbasic], dependencies : [libdl], @@ -2148,7 +2143,6 @@ foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'], nss = shared_library( 'nss_' + module, sources, - disable_mempool_c, version : '2', include_directories : incs, # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned diff --git a/src/basic/hashmap.c b/src/basic/hashmap.c index 62380b0e4a..1fadaad996 100644 --- a/src/basic/hashmap.c +++ b/src/basic/hashmap.c @@ -771,16 +771,15 @@ static void shared_hash_key_initialize(void) { static struct HashmapBase* hashmap_base_new(const struct hash_ops *hash_ops, enum HashmapType type HASHMAP_DEBUG_PARAMS) { HashmapBase *h; const struct hashmap_type_info *hi = &hashmap_type_info[type]; - bool up; - up = mempool_enabled(); + bool use_pool = mempool_enabled && mempool_enabled(); - h = up ? mempool_alloc0_tile(hi->mempool) : malloc0(hi->head_size); + h = use_pool ? mempool_alloc0_tile(hi->mempool) : malloc0(hi->head_size); if (!h) return NULL; h->type = type; - h->from_pool = up; + h->from_pool = use_pool; h->hash_ops = hash_ops ?: &trivial_hash_ops; if (type == HASHMAP_TYPE_ORDERED) { diff --git a/src/basic/mempool.c b/src/basic/mempool.c index 9eedc20c4f..fff23fdbac 100644 --- a/src/basic/mempool.c +++ b/src/basic/mempool.c @@ -3,12 +3,9 @@ #include #include -#include "env-util.h" #include "macro.h" #include "memory-util.h" #include "mempool.h" -#include "process-util.h" -#include "util.h" struct pool { struct pool *next; @@ -73,20 +70,6 @@ void mempool_free_tile(struct mempool *mp, void *p) { mp->freelist = p; } -bool mempool_enabled(void) { - static int b = -1; - - if (!is_main_thread()) - return false; - - if (!mempool_use_allowed) - b = false; - if (b < 0) - b = getenv_bool("SYSTEMD_MEMPOOL") != 0; - - return b; -} - #if VALGRIND void mempool_drop(struct mempool *mp) { struct pool *p = mp->first_pool; diff --git a/src/basic/mempool.h b/src/basic/mempool.h index 0fe2f2789c..539ccbdf06 100644 --- a/src/basic/mempool.h +++ b/src/basic/mempool.h @@ -23,8 +23,7 @@ static struct mempool pool_name = { \ .at_least = alloc_at_least, \ } -extern const bool mempool_use_allowed; -bool mempool_enabled(void); +__attribute__((weak)) bool mempool_enabled(void); #if VALGRIND void mempool_drop(struct mempool *mp); diff --git a/src/libsystemd/disable-mempool.c b/src/libsystemd/disable-mempool.c deleted file mode 100644 index 1baf91f05b..0000000000 --- a/src/libsystemd/disable-mempool.c +++ /dev/null @@ -1,5 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -#include "mempool.h" - -const bool mempool_use_allowed = false; diff --git a/src/libsystemd/meson.build b/src/libsystemd/meson.build index 2701efc8f9..055fa11ede 100644 --- a/src/libsystemd/meson.build +++ b/src/libsystemd/meson.build @@ -158,7 +158,6 @@ libsystemd_sources = files( 'sd-utf8/sd-utf8.c', ) + sd_journal_sources + id128_sources + sd_daemon_sources + sd_event_sources + sd_login_sources -disable_mempool_c = files('disable-mempool.c') libsystemd_c_args = ['-fvisibility=default'] diff --git a/src/shared/enable-mempool.c b/src/shared/enable-mempool.c index 1abfccbd81..fd582c0e78 100644 --- a/src/shared/enable-mempool.c +++ b/src/shared/enable-mempool.c @@ -1,5 +1,19 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include "mempool.h" +#include -const bool mempool_use_allowed = true; +#include "env-util.h" +#include "mempool.h" +#include "process-util.h" + +bool mempool_enabled(void) { + static int cache = -1; + + if (!is_main_thread()) + return false; + + if (cache < 0) + cache = getenv_bool("SYSTEMD_MEMPOOL") != 0; + + return cache; +} diff --git a/src/test/test-set-disable-mempool.c b/src/test/test-set-disable-mempool.c index f02e433d7b..91244b25ac 100644 --- a/src/test/test-set-disable-mempool.c +++ b/src/test/test-set-disable-mempool.c @@ -2,6 +2,7 @@ #include +#include "mempool.h" #include "process-util.h" #include "set.h" #include "tests.h" @@ -15,6 +16,9 @@ static void* thread(void *p) { assert_se(*s); assert_se(!is_main_thread()); + assert_se(mempool_enabled); + assert_se(!mempool_enabled()); + assert_se(set_size(*s) == NUM); *s = set_free(*s); @@ -29,7 +33,10 @@ static void test_one(const char *val) { log_info("Testing with SYSTEMD_MEMPOOL=%s", val); assert_se(setenv("SYSTEMD_MEMPOOL", val, true) == 0); + assert_se(is_main_thread()); + assert_se(mempool_enabled); /* It is a weak symbol, but we expect it to be available */ + assert_se(!mempool_enabled()); assert_se(s = set_new(NULL)); for (i = 0; i < NUM; i++) From f2ef78d2086890159ab7e808998b0ae79ab38888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 12 Jun 2022 20:13:49 +0200 Subject: [PATCH 02/23] sd-netlink: remove sd_ prefix from static function --- src/libsystemd/sd-netlink/netlink-message-nfnl.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libsystemd/sd-netlink/netlink-message-nfnl.c b/src/libsystemd/sd-netlink/netlink-message-nfnl.c index 9b24f74042..6f32167772 100644 --- a/src/libsystemd/sd-netlink/netlink-message-nfnl.c +++ b/src/libsystemd/sd-netlink/netlink-message-nfnl.c @@ -277,7 +277,7 @@ int sd_nfnl_nft_message_del_setelems_begin( return r; } -static int sd_nfnl_add_data(sd_netlink_message *m, uint16_t attr, const void *data, uint32_t dlen) { +static int add_data(sd_netlink_message *m, uint16_t attr, const void *data, uint32_t dlen) { int r; r = sd_netlink_message_open_container(m, attr); @@ -305,12 +305,12 @@ int sd_nfnl_nft_message_add_setelem( if (r < 0) return r; - r = sd_nfnl_add_data(m, NFTA_SET_ELEM_KEY, key, klen); + r = add_data(m, NFTA_SET_ELEM_KEY, key, klen); if (r < 0) goto cancel; if (data) { - r = sd_nfnl_add_data(m, NFTA_SET_ELEM_DATA, data, dlen); + r = add_data(m, NFTA_SET_ELEM_DATA, data, dlen); if (r < 0) goto cancel; } From 3e4f1dc9d9e7993b5a3366543c67543cabf886e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 12 Jun 2022 20:32:29 +0200 Subject: [PATCH 03/23] sd-daemon: remove sd_ prefix from static function --- src/libsystemd/sd-daemon/sd-daemon.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c index c6380768bb..199d10a00e 100644 --- a/src/libsystemd/sd-daemon/sd-daemon.c +++ b/src/libsystemd/sd-daemon/sd-daemon.c @@ -190,7 +190,7 @@ _public_ int sd_is_special(int fd, const char *path) { return 1; } -static int sd_is_socket_internal(int fd, int type, int listening) { +static int is_socket_internal(int fd, int type, int listening) { struct stat st_fd; assert_return(fd >= 0, -EBADF); @@ -239,7 +239,7 @@ _public_ int sd_is_socket(int fd, int family, int type, int listening) { assert_return(fd >= 0, -EBADF); assert_return(family >= 0, -EINVAL); - r = sd_is_socket_internal(fd, type, listening); + r = is_socket_internal(fd, type, listening); if (r <= 0) return r; @@ -267,7 +267,7 @@ _public_ int sd_is_socket_inet(int fd, int family, int type, int listening, uint assert_return(fd >= 0, -EBADF); assert_return(IN_SET(family, 0, AF_INET, AF_INET6), -EINVAL); - r = sd_is_socket_internal(fd, type, listening); + r = is_socket_internal(fd, type, listening); if (r <= 0) return r; @@ -307,7 +307,7 @@ _public_ int sd_is_socket_sockaddr(int fd, int type, const struct sockaddr* addr assert_return(addr_len >= sizeof(sa_family_t), -ENOBUFS); assert_return(IN_SET(addr->sa_family, AF_INET, AF_INET6), -EPFNOSUPPORT); - r = sd_is_socket_internal(fd, type, listening); + r = is_socket_internal(fd, type, listening); if (r <= 0) return r; @@ -362,7 +362,7 @@ _public_ int sd_is_socket_unix(int fd, int type, int listening, const char *path assert_return(fd >= 0, -EBADF); - r = sd_is_socket_internal(fd, type, listening); + r = is_socket_internal(fd, type, listening); if (r <= 0) return r; From 42d824dee3f4a818513113802f086324730e2efa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 12 Jun 2022 21:42:51 +0200 Subject: [PATCH 04/23] test-lib*-sym: print symbols names in addition to addresses This makes it easier to see what the test is doing. I converted the code to use f-strings. They are already used in other scripts necessary for build, so IIUC this is OK. --- src/test/generate-sym-test.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/test/generate-sym-test.py b/src/test/generate-sym-test.py index 955d5e9699..8ed4d26fd3 100755 --- a/src/test/generate-sym-test.py +++ b/src/test/generate-sym-test.py @@ -11,21 +11,26 @@ print(''' /* We want to check deprecated symbols too, without complaining */ #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -const void* symbols[] = {''') +const struct { + const char *name; + const void *symbol; +} symbols[] = {''') +count = 0 for line in open(sys.argv[1]): match = re.search('^ +([a-zA-Z0-9_]+);', line) if match: s = match.group(1) if s == 'sd_bus_object_vtable_format': - print(' &{},'.format(s)) + print(f' {{"{s}", &{s}}},') else: - print(' {},'.format(s)) + print(f' {{"{s}", {s}}},') + count += 1 -print('''}; +print(f'''}}; -int main(void) { - for (size_t i = 0; i < sizeof(symbols)/sizeof(void*); i++) - printf("%p\\n", symbols[i]); +int main(void) {{ + for (size_t i = 0; i < {count}; i++) + printf("%p: %s\\n", symbols[i].symbol, symbols[i].name); return 0; -}''') +}}''') From 84e1001541151da71bae2137e2a1c254b5a3b89f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 12 Jun 2022 21:51:50 +0200 Subject: [PATCH 05/23] libsystemd: export sd-netlink It was added originally in 65f568bbeb9b8c70200e44c19a797df3a0bfd485. The API is has stabilized pretty much, and generally follows the usual style for libsystemd. We've held it as a public-but-private library for almost 10 years, let's export it. sd_netlink_sendv() and sd_nfnl_nft_*() are excluded. libsystemd.so seems to grow by 12k. --- src/libsystemd/libsystemd.sym | 155 ++++++++++++++++ src/libsystemd/sd-netlink/netlink-genl.c | 10 +- src/libsystemd/sd-netlink/netlink-internal.h | 36 +++- .../sd-netlink/netlink-message-rtnl.c | 169 ++++++++++-------- src/libsystemd/sd-netlink/netlink-message.c | 105 +++++------ src/libsystemd/sd-netlink/netlink-socket.c | 36 ---- src/libsystemd/sd-netlink/netlink-util.c | 121 +++++++++++++ src/libsystemd/sd-netlink/netlink-util.h | 5 + src/libsystemd/sd-netlink/sd-netlink.c | 114 ++---------- src/shared/firewall-util-nft.c | 2 + src/systemd/meson.build | 2 +- src/systemd/sd-netlink.h | 27 --- 12 files changed, 485 insertions(+), 297 deletions(-) diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index 528e86b663..524eeb9557 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -782,4 +782,159 @@ global: LIBSYSTEMD_252 { global: sd_hwdb_new_from_path; + + sd_netlink_new_from_fd; + sd_netlink_open; + sd_netlink_open_fd; + sd_netlink_inc_rcvbuf; + sd_netlink_ref; + sd_netlink_unref; + sd_netlink_send; + sd_netlink_call_async; + sd_netlink_call; + sd_netlink_read; + sd_netlink_get_events; + sd_netlink_get_timeout; + sd_netlink_process; + sd_netlink_wait; + sd_netlink_add_match; + sd_netlink_attach_event; + sd_netlink_detach_event; + sd_netlink_attach_filter; + sd_netlink_message_append_string; + sd_netlink_message_append_strv; + sd_netlink_message_append_flag; + sd_netlink_message_append_u8; + sd_netlink_message_append_u16; + sd_netlink_message_append_u32; + sd_netlink_message_append_u64; + sd_netlink_message_append_s8; + sd_netlink_message_append_s16; + sd_netlink_message_append_s32; + sd_netlink_message_append_s64; + sd_netlink_message_append_data; + sd_netlink_message_append_in_addr; + sd_netlink_message_append_in6_addr; + sd_netlink_message_append_sockaddr_in; + sd_netlink_message_append_sockaddr_in6; + sd_netlink_message_append_ether_addr; + sd_netlink_message_append_cache_info; + sd_netlink_message_open_container; + sd_netlink_message_open_container_union; + sd_netlink_message_close_container; + sd_netlink_message_read; + sd_netlink_message_read_data; + sd_netlink_message_read_data_suffix0; + sd_netlink_message_read_string_strdup; + sd_netlink_message_read_string; + sd_netlink_message_read_strv; + sd_netlink_message_read_u8; + sd_netlink_message_read_u16; + sd_netlink_message_read_u32; + sd_netlink_message_read_ether_addr; + sd_netlink_message_read_cache_info; + sd_netlink_message_read_in_addr; + sd_netlink_message_read_in6_addr; + sd_netlink_message_has_flag; + sd_netlink_message_enter_container; + sd_netlink_message_enter_array; + sd_netlink_message_exit_container; + sd_netlink_message_open_array; + sd_netlink_message_cancel_array; + sd_netlink_message_rewind; + sd_netlink_message_next; + sd_netlink_message_ref; + sd_netlink_message_unref; + sd_netlink_message_request_dump; + sd_netlink_message_is_error; + sd_netlink_message_get_errno; + sd_netlink_message_get_type; + sd_netlink_message_set_flags; + sd_netlink_message_is_broadcast; + sd_netlink_message_get_max_attribute; + sd_netlink_slot_ref; + sd_netlink_slot_unref; + sd_netlink_slot_get_netlink; + sd_netlink_slot_get_userdata; + sd_netlink_slot_set_userdata; + sd_netlink_slot_get_destroy_callback; + sd_netlink_slot_set_destroy_callback; + sd_netlink_slot_get_floating; + sd_netlink_slot_set_floating; + sd_netlink_slot_get_description; + sd_netlink_slot_set_description; + + sd_rtnl_message_get_family; + sd_rtnl_message_new_addr; + sd_rtnl_message_new_addr_update; + sd_rtnl_message_addr_set_prefixlen; + sd_rtnl_message_addr_set_scope; + sd_rtnl_message_addr_set_flags; + sd_rtnl_message_addr_get_family; + sd_rtnl_message_addr_get_prefixlen; + sd_rtnl_message_addr_get_scope; + sd_rtnl_message_addr_get_flags; + sd_rtnl_message_addr_get_ifindex; + sd_rtnl_message_new_link; + sd_rtnl_message_link_set_flags; + sd_rtnl_message_link_set_type; + sd_rtnl_message_link_set_family; + sd_rtnl_message_link_get_ifindex; + sd_rtnl_message_link_get_flags; + sd_rtnl_message_link_get_type; + sd_rtnl_message_new_route; + sd_rtnl_message_route_set_dst_prefixlen; + sd_rtnl_message_route_set_src_prefixlen; + sd_rtnl_message_route_set_scope; + sd_rtnl_message_route_set_flags; + sd_rtnl_message_route_set_table; + sd_rtnl_message_route_set_type; + sd_rtnl_message_route_get_flags; + sd_rtnl_message_route_get_family; + sd_rtnl_message_route_get_protocol; + sd_rtnl_message_route_get_scope; + sd_rtnl_message_route_get_tos; + sd_rtnl_message_route_get_table; + sd_rtnl_message_route_get_dst_prefixlen; + sd_rtnl_message_route_get_src_prefixlen; + sd_rtnl_message_route_get_type; + sd_rtnl_message_new_nexthop; + sd_rtnl_message_nexthop_set_flags; + sd_rtnl_message_nexthop_get_flags; + sd_rtnl_message_nexthop_get_family; + sd_rtnl_message_nexthop_get_protocol; + sd_rtnl_message_new_neigh; + sd_rtnl_message_neigh_set_flags; + sd_rtnl_message_neigh_set_state; + sd_rtnl_message_neigh_get_family; + sd_rtnl_message_neigh_get_ifindex; + sd_rtnl_message_neigh_get_state; + sd_rtnl_message_neigh_get_flags; + sd_rtnl_message_new_addrlabel; + sd_rtnl_message_addrlabel_set_prefixlen; + sd_rtnl_message_addrlabel_get_prefixlen; + sd_rtnl_message_new_routing_policy_rule; + sd_rtnl_message_routing_policy_rule_set_tos; + sd_rtnl_message_routing_policy_rule_get_tos; + sd_rtnl_message_routing_policy_rule_set_table; + sd_rtnl_message_routing_policy_rule_get_table; + sd_rtnl_message_routing_policy_rule_set_fib_src_prefixlen; + sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen; + sd_rtnl_message_routing_policy_rule_set_fib_dst_prefixlen; + sd_rtnl_message_routing_policy_rule_get_fib_dst_prefixlen; + sd_rtnl_message_routing_policy_rule_set_fib_type; + sd_rtnl_message_routing_policy_rule_get_fib_type; + sd_rtnl_message_routing_policy_rule_set_flags; + sd_rtnl_message_routing_policy_rule_get_flags; + sd_rtnl_message_new_traffic_control; + sd_rtnl_message_traffic_control_get_ifindex; + sd_rtnl_message_traffic_control_get_handle; + sd_rtnl_message_traffic_control_get_parent; + sd_rtnl_message_new_mdb; + + sd_genl_socket_open; + sd_genl_message_new; + sd_genl_message_get_family_name; + sd_genl_message_get_command; + sd_genl_add_match; } LIBSYSTEMD_251; diff --git a/src/libsystemd/sd-netlink/netlink-genl.c b/src/libsystemd/sd-netlink/netlink-genl.c index 8c907f2836..74be75d406 100644 --- a/src/libsystemd/sd-netlink/netlink-genl.c +++ b/src/libsystemd/sd-netlink/netlink-genl.c @@ -365,7 +365,7 @@ int genl_get_type_system_and_header_size( return 0; } -int sd_genl_message_new(sd_netlink *nl, const char *family_name, uint8_t cmd, sd_netlink_message **ret) { +_public_ int sd_genl_message_new(sd_netlink *nl, const char *family_name, uint8_t cmd, sd_netlink_message **ret) { const GenericNetlinkFamily *family; int r; @@ -381,7 +381,7 @@ int sd_genl_message_new(sd_netlink *nl, const char *family_name, uint8_t cmd, sd return genl_message_new(nl, family, cmd, ret); } -int sd_genl_message_get_family_name(sd_netlink *nl, sd_netlink_message *m, const char **ret) { +_public_ int sd_genl_message_get_family_name(sd_netlink *nl, sd_netlink_message *m, const char **ret) { const GenericNetlinkFamily *family; uint16_t nlmsg_type; int r; @@ -403,7 +403,7 @@ int sd_genl_message_get_family_name(sd_netlink *nl, sd_netlink_message *m, const return 0; } -int sd_genl_message_get_command(sd_netlink *nl, sd_netlink_message *m, uint8_t *ret) { +_public_ int sd_genl_message_get_command(sd_netlink *nl, sd_netlink_message *m, uint8_t *ret) { struct genlmsghdr *h; uint16_t nlmsg_type; size_t size; @@ -448,7 +448,7 @@ static int genl_family_get_multicast_group_id_by_name(const GenericNetlinkFamily return 0; } -int sd_genl_add_match( +_public_ int sd_genl_add_match( sd_netlink *nl, sd_netlink_slot **ret_slot, const char *family_name, @@ -483,6 +483,6 @@ int sd_genl_add_match( callback, destroy_callback, userdata, description); } -int sd_genl_socket_open(sd_netlink **ret) { +_public_ int sd_genl_socket_open(sd_netlink **ret) { return netlink_open_family(ret, NETLINK_GENERIC); } diff --git a/src/libsystemd/sd-netlink/netlink-internal.h b/src/libsystemd/sd-netlink/netlink-internal.h index 80d28258e2..497ffe9112 100644 --- a/src/libsystemd/sd-netlink/netlink-internal.h +++ b/src/libsystemd/sd-netlink/netlink-internal.h @@ -138,7 +138,12 @@ int message_new_full( sd_netlink_message **ret); int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t type); int message_new_synthetic_error(sd_netlink *nl, int error, uint32_t serial, sd_netlink_message **ret); -uint32_t message_get_serial(sd_netlink_message *m); + +static inline uint32_t message_get_serial(sd_netlink_message *m) { + assert(m); + return ASSERT_PTR(m->hdr)->nlmsg_seq; +} + void message_seal(sd_netlink_message *m); int netlink_open_family(sd_netlink **ret, int family); @@ -146,12 +151,10 @@ bool netlink_pid_changed(sd_netlink *nl); int netlink_rqueue_make_room(sd_netlink *nl); int netlink_rqueue_partial_make_room(sd_netlink *nl); -int socket_open(int family); int socket_bind(sd_netlink *nl); int socket_broadcast_group_ref(sd_netlink *nl, unsigned group); int socket_broadcast_group_unref(sd_netlink *nl, unsigned group); int socket_write_message(sd_netlink *nl, sd_netlink_message *m); -int socket_writev_message(sd_netlink *nl, sd_netlink_message **m, size_t msgcount); int socket_read_message(sd_netlink *nl); int netlink_add_match_internal( @@ -169,3 +172,30 @@ int netlink_add_match_internal( /* Make sure callbacks don't destroy the netlink connection */ #define NETLINK_DONT_DESTROY(nl) \ _cleanup_(sd_netlink_unrefp) _unused_ sd_netlink *_dont_destroy_##nl = sd_netlink_ref(nl) + +/* nfnl */ +/* TODO: to be exported later */ +int sd_nfnl_socket_open(sd_netlink **ret); +int sd_nfnl_message_batch_begin(sd_netlink *nfnl, sd_netlink_message **ret); +int sd_nfnl_message_batch_end(sd_netlink *nfnl, sd_netlink_message **ret); +int sd_nfnl_nft_message_del_table(sd_netlink *nfnl, sd_netlink_message **ret, + int family, const char *table); +int sd_nfnl_nft_message_new_table(sd_netlink *nfnl, sd_netlink_message **ret, + int family, const char *table); +int sd_nfnl_nft_message_new_basechain(sd_netlink *nfnl, sd_netlink_message **ret, + int family, const char *table, const char *chain, + const char *type, uint8_t hook, int prio); +int sd_nfnl_nft_message_new_rule(sd_netlink *nfnl, sd_netlink_message **ret, + int family, const char *table, const char *chain); +int sd_nfnl_nft_message_new_set(sd_netlink *nfnl, sd_netlink_message **ret, + int family, const char *table, const char *set_name, + uint32_t setid, uint32_t klen); +int sd_nfnl_nft_message_new_setelems_begin(sd_netlink *nfnl, sd_netlink_message **ret, + int family, const char *table, const char *set_name); +int sd_nfnl_nft_message_del_setelems_begin(sd_netlink *nfnl, sd_netlink_message **ret, + int family, const char *table, const char *set_name); +int sd_nfnl_nft_message_add_setelem(sd_netlink_message *m, + uint32_t num, + const void *key, uint32_t klen, + const void *data, uint32_t dlen); +int sd_nfnl_nft_message_add_setelem_end(sd_netlink_message *m); diff --git a/src/libsystemd/sd-netlink/netlink-message-rtnl.c b/src/libsystemd/sd-netlink/netlink-message-rtnl.c index 87b1c3c3c8..289eb41ca9 100644 --- a/src/libsystemd/sd-netlink/netlink-message-rtnl.c +++ b/src/libsystemd/sd-netlink/netlink-message-rtnl.c @@ -17,7 +17,7 @@ #include "socket-util.h" #include "util.h" -int sd_rtnl_message_route_set_dst_prefixlen(sd_netlink_message *m, unsigned char prefixlen) { +_public_ int sd_rtnl_message_route_set_dst_prefixlen(sd_netlink_message *m, unsigned char prefixlen) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -35,7 +35,7 @@ int sd_rtnl_message_route_set_dst_prefixlen(sd_netlink_message *m, unsigned char return 0; } -int sd_rtnl_message_route_set_src_prefixlen(sd_netlink_message *m, unsigned char prefixlen) { +_public_ int sd_rtnl_message_route_set_src_prefixlen(sd_netlink_message *m, unsigned char prefixlen) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -53,7 +53,7 @@ int sd_rtnl_message_route_set_src_prefixlen(sd_netlink_message *m, unsigned char return 0; } -int sd_rtnl_message_route_set_scope(sd_netlink_message *m, unsigned char scope) { +_public_ int sd_rtnl_message_route_set_scope(sd_netlink_message *m, unsigned char scope) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -67,7 +67,7 @@ int sd_rtnl_message_route_set_scope(sd_netlink_message *m, unsigned char scope) return 0; } -int sd_rtnl_message_route_set_flags(sd_netlink_message *m, unsigned flags) { +_public_ int sd_rtnl_message_route_set_flags(sd_netlink_message *m, unsigned flags) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -81,7 +81,7 @@ int sd_rtnl_message_route_set_flags(sd_netlink_message *m, unsigned flags) { return 0; } -int sd_rtnl_message_route_get_flags(sd_netlink_message *m, unsigned *flags) { +_public_ int sd_rtnl_message_route_get_flags(sd_netlink_message *m, unsigned *flags) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -96,7 +96,7 @@ int sd_rtnl_message_route_get_flags(sd_netlink_message *m, unsigned *flags) { return 0; } -int sd_rtnl_message_route_set_table(sd_netlink_message *m, unsigned char table) { +_public_ int sd_rtnl_message_route_set_table(sd_netlink_message *m, unsigned char table) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -110,7 +110,7 @@ int sd_rtnl_message_route_set_table(sd_netlink_message *m, unsigned char table) return 0; } -int sd_rtnl_message_route_get_family(sd_netlink_message *m, int *family) { +_public_ int sd_rtnl_message_route_get_family(sd_netlink_message *m, int *family) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -125,7 +125,7 @@ int sd_rtnl_message_route_get_family(sd_netlink_message *m, int *family) { return 0; } -int sd_rtnl_message_route_get_type(sd_netlink_message *m, unsigned char *type) { +_public_ int sd_rtnl_message_route_get_type(sd_netlink_message *m, unsigned char *type) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -140,7 +140,7 @@ int sd_rtnl_message_route_get_type(sd_netlink_message *m, unsigned char *type) { return 0; } -int sd_rtnl_message_route_set_type(sd_netlink_message *m, unsigned char type) { +_public_ int sd_rtnl_message_route_set_type(sd_netlink_message *m, unsigned char type) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -154,7 +154,7 @@ int sd_rtnl_message_route_set_type(sd_netlink_message *m, unsigned char type) { return 0; } -int sd_rtnl_message_route_get_protocol(sd_netlink_message *m, unsigned char *protocol) { +_public_ int sd_rtnl_message_route_get_protocol(sd_netlink_message *m, unsigned char *protocol) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -169,7 +169,7 @@ int sd_rtnl_message_route_get_protocol(sd_netlink_message *m, unsigned char *pro return 0; } -int sd_rtnl_message_route_get_scope(sd_netlink_message *m, unsigned char *scope) { +_public_ int sd_rtnl_message_route_get_scope(sd_netlink_message *m, unsigned char *scope) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -184,7 +184,7 @@ int sd_rtnl_message_route_get_scope(sd_netlink_message *m, unsigned char *scope) return 0; } -int sd_rtnl_message_route_get_tos(sd_netlink_message *m, uint8_t *tos) { +_public_ int sd_rtnl_message_route_get_tos(sd_netlink_message *m, uint8_t *tos) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -199,7 +199,7 @@ int sd_rtnl_message_route_get_tos(sd_netlink_message *m, uint8_t *tos) { return 0; } -int sd_rtnl_message_route_get_table(sd_netlink_message *m, unsigned char *table) { +_public_ int sd_rtnl_message_route_get_table(sd_netlink_message *m, unsigned char *table) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -214,7 +214,7 @@ int sd_rtnl_message_route_get_table(sd_netlink_message *m, unsigned char *table) return 0; } -int sd_rtnl_message_route_get_dst_prefixlen(sd_netlink_message *m, unsigned char *dst_len) { +_public_ int sd_rtnl_message_route_get_dst_prefixlen(sd_netlink_message *m, unsigned char *dst_len) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -229,7 +229,7 @@ int sd_rtnl_message_route_get_dst_prefixlen(sd_netlink_message *m, unsigned char return 0; } -int sd_rtnl_message_route_get_src_prefixlen(sd_netlink_message *m, unsigned char *src_len) { +_public_ int sd_rtnl_message_route_get_src_prefixlen(sd_netlink_message *m, unsigned char *src_len) { struct rtmsg *rtm; assert_return(m, -EINVAL); @@ -244,7 +244,7 @@ int sd_rtnl_message_route_get_src_prefixlen(sd_netlink_message *m, unsigned char return 0; } -int sd_rtnl_message_new_route(sd_netlink *rtnl, sd_netlink_message **ret, +_public_ int sd_rtnl_message_new_route(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int rtm_family, unsigned char rtm_protocol) { struct rtmsg *rtm; @@ -270,7 +270,7 @@ int sd_rtnl_message_new_route(sd_netlink *rtnl, sd_netlink_message **ret, return 0; } -int sd_rtnl_message_new_nexthop(sd_netlink *rtnl, sd_netlink_message **ret, +_public_ int sd_rtnl_message_new_nexthop(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int nh_family, unsigned char nh_protocol) { struct nhmsg *nhm; @@ -308,7 +308,7 @@ int sd_rtnl_message_new_nexthop(sd_netlink *rtnl, sd_netlink_message **ret, return 0; } -int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint8_t flags) { +_public_ int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint8_t flags) { struct nhmsg *nhm; assert_return(m, -EINVAL); @@ -321,7 +321,7 @@ int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint8_t flags) { return 0; } -int sd_rtnl_message_nexthop_get_flags(sd_netlink_message *m, uint8_t *ret) { +_public_ int sd_rtnl_message_nexthop_get_flags(sd_netlink_message *m, uint8_t *ret) { struct nhmsg *nhm; assert_return(m, -EINVAL); @@ -335,7 +335,7 @@ int sd_rtnl_message_nexthop_get_flags(sd_netlink_message *m, uint8_t *ret) { return 0; } -int sd_rtnl_message_nexthop_get_family(sd_netlink_message *m, uint8_t *family) { +_public_ int sd_rtnl_message_nexthop_get_family(sd_netlink_message *m, uint8_t *family) { struct nhmsg *nhm; assert_return(m, -EINVAL); @@ -349,7 +349,7 @@ int sd_rtnl_message_nexthop_get_family(sd_netlink_message *m, uint8_t *family) { return 0; } -int sd_rtnl_message_nexthop_get_protocol(sd_netlink_message *m, uint8_t *protocol) { +_public_ int sd_rtnl_message_nexthop_get_protocol(sd_netlink_message *m, uint8_t *protocol) { struct nhmsg *nhm; assert_return(m, -EINVAL); @@ -363,7 +363,7 @@ int sd_rtnl_message_nexthop_get_protocol(sd_netlink_message *m, uint8_t *protoco return 0; } -int sd_rtnl_message_neigh_set_flags(sd_netlink_message *m, uint8_t flags) { +_public_ int sd_rtnl_message_neigh_set_flags(sd_netlink_message *m, uint8_t flags) { struct ndmsg *ndm; assert_return(m, -EINVAL); @@ -376,7 +376,7 @@ int sd_rtnl_message_neigh_set_flags(sd_netlink_message *m, uint8_t flags) { return 0; } -int sd_rtnl_message_neigh_set_state(sd_netlink_message *m, uint16_t state) { +_public_ int sd_rtnl_message_neigh_set_state(sd_netlink_message *m, uint16_t state) { struct ndmsg *ndm; assert_return(m, -EINVAL); @@ -389,7 +389,7 @@ int sd_rtnl_message_neigh_set_state(sd_netlink_message *m, uint16_t state) { return 0; } -int sd_rtnl_message_neigh_get_flags(sd_netlink_message *m, uint8_t *flags) { +_public_ int sd_rtnl_message_neigh_get_flags(sd_netlink_message *m, uint8_t *flags) { struct ndmsg *ndm; assert_return(m, -EINVAL); @@ -402,7 +402,7 @@ int sd_rtnl_message_neigh_get_flags(sd_netlink_message *m, uint8_t *flags) { return 0; } -int sd_rtnl_message_neigh_get_state(sd_netlink_message *m, uint16_t *state) { +_public_ int sd_rtnl_message_neigh_get_state(sd_netlink_message *m, uint16_t *state) { struct ndmsg *ndm; assert_return(m, -EINVAL); @@ -415,7 +415,7 @@ int sd_rtnl_message_neigh_get_state(sd_netlink_message *m, uint16_t *state) { return 0; } -int sd_rtnl_message_neigh_get_family(sd_netlink_message *m, int *family) { +_public_ int sd_rtnl_message_neigh_get_family(sd_netlink_message *m, int *family) { struct ndmsg *ndm; assert_return(m, -EINVAL); @@ -430,7 +430,7 @@ int sd_rtnl_message_neigh_get_family(sd_netlink_message *m, int *family) { return 0; } -int sd_rtnl_message_neigh_get_ifindex(sd_netlink_message *m, int *index) { +_public_ int sd_rtnl_message_neigh_get_ifindex(sd_netlink_message *m, int *index) { struct ndmsg *ndm; assert_return(m, -EINVAL); @@ -445,7 +445,13 @@ int sd_rtnl_message_neigh_get_ifindex(sd_netlink_message *m, int *index) { return 0; } -int sd_rtnl_message_new_neigh(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int index, int ndm_family) { +_public_ int sd_rtnl_message_new_neigh( + sd_netlink *rtnl, + sd_netlink_message **ret, + uint16_t nlmsg_type, + int index, + int ndm_family) { + struct ndmsg *ndm; int r; @@ -472,7 +478,7 @@ int sd_rtnl_message_new_neigh(sd_netlink *rtnl, sd_netlink_message **ret, uint16 return 0; } -int sd_rtnl_message_link_set_flags(sd_netlink_message *m, unsigned flags, unsigned change) { +_public_ int sd_rtnl_message_link_set_flags(sd_netlink_message *m, unsigned flags, unsigned change) { struct ifinfomsg *ifi; assert_return(m, -EINVAL); @@ -488,7 +494,7 @@ int sd_rtnl_message_link_set_flags(sd_netlink_message *m, unsigned flags, unsign return 0; } -int sd_rtnl_message_link_set_type(sd_netlink_message *m, unsigned type) { +_public_ int sd_rtnl_message_link_set_type(sd_netlink_message *m, unsigned type) { struct ifinfomsg *ifi; assert_return(m, -EINVAL); @@ -502,7 +508,7 @@ int sd_rtnl_message_link_set_type(sd_netlink_message *m, unsigned type) { return 0; } -int sd_rtnl_message_link_set_family(sd_netlink_message *m, unsigned family) { +_public_ int sd_rtnl_message_link_set_family(sd_netlink_message *m, unsigned family) { struct ifinfomsg *ifi; assert_return(m, -EINVAL); @@ -516,7 +522,7 @@ int sd_rtnl_message_link_set_family(sd_netlink_message *m, unsigned family) { return 0; } -int sd_rtnl_message_new_link(sd_netlink *rtnl, sd_netlink_message **ret, +_public_ int sd_rtnl_message_new_link(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int index) { struct ifinfomsg *ifi; int r; @@ -541,7 +547,7 @@ int sd_rtnl_message_new_link(sd_netlink *rtnl, sd_netlink_message **ret, return 0; } -int sd_rtnl_message_addr_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen) { +_public_ int sd_rtnl_message_addr_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen) { struct ifaddrmsg *ifa; assert_return(m, -EINVAL); @@ -559,7 +565,7 @@ int sd_rtnl_message_addr_set_prefixlen(sd_netlink_message *m, unsigned char pref return 0; } -int sd_rtnl_message_addr_set_flags(sd_netlink_message *m, unsigned char flags) { +_public_ int sd_rtnl_message_addr_set_flags(sd_netlink_message *m, unsigned char flags) { struct ifaddrmsg *ifa; assert_return(m, -EINVAL); @@ -573,7 +579,7 @@ int sd_rtnl_message_addr_set_flags(sd_netlink_message *m, unsigned char flags) { return 0; } -int sd_rtnl_message_addr_set_scope(sd_netlink_message *m, unsigned char scope) { +_public_ int sd_rtnl_message_addr_set_scope(sd_netlink_message *m, unsigned char scope) { struct ifaddrmsg *ifa; assert_return(m, -EINVAL); @@ -587,7 +593,7 @@ int sd_rtnl_message_addr_set_scope(sd_netlink_message *m, unsigned char scope) { return 0; } -int sd_rtnl_message_addr_get_family(sd_netlink_message *m, int *family) { +_public_ int sd_rtnl_message_addr_get_family(sd_netlink_message *m, int *family) { struct ifaddrmsg *ifa; assert_return(m, -EINVAL); @@ -602,7 +608,7 @@ int sd_rtnl_message_addr_get_family(sd_netlink_message *m, int *family) { return 0; } -int sd_rtnl_message_addr_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen) { +_public_ int sd_rtnl_message_addr_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen) { struct ifaddrmsg *ifa; assert_return(m, -EINVAL); @@ -617,7 +623,7 @@ int sd_rtnl_message_addr_get_prefixlen(sd_netlink_message *m, unsigned char *pre return 0; } -int sd_rtnl_message_addr_get_scope(sd_netlink_message *m, unsigned char *scope) { +_public_ int sd_rtnl_message_addr_get_scope(sd_netlink_message *m, unsigned char *scope) { struct ifaddrmsg *ifa; assert_return(m, -EINVAL); @@ -632,7 +638,7 @@ int sd_rtnl_message_addr_get_scope(sd_netlink_message *m, unsigned char *scope) return 0; } -int sd_rtnl_message_addr_get_flags(sd_netlink_message *m, unsigned char *flags) { +_public_ int sd_rtnl_message_addr_get_flags(sd_netlink_message *m, unsigned char *flags) { struct ifaddrmsg *ifa; assert_return(m, -EINVAL); @@ -647,7 +653,7 @@ int sd_rtnl_message_addr_get_flags(sd_netlink_message *m, unsigned char *flags) return 0; } -int sd_rtnl_message_addr_get_ifindex(sd_netlink_message *m, int *ifindex) { +_public_ int sd_rtnl_message_addr_get_ifindex(sd_netlink_message *m, int *ifindex) { struct ifaddrmsg *ifa; assert_return(m, -EINVAL); @@ -662,9 +668,13 @@ int sd_rtnl_message_addr_get_ifindex(sd_netlink_message *m, int *ifindex) { return 0; } -int sd_rtnl_message_new_addr(sd_netlink *rtnl, sd_netlink_message **ret, - uint16_t nlmsg_type, int index, - int family) { +_public_ int sd_rtnl_message_new_addr( + sd_netlink *rtnl, + sd_netlink_message **ret, + uint16_t nlmsg_type, + int index, + int family) { + struct ifaddrmsg *ifa; int r; @@ -687,8 +697,11 @@ int sd_rtnl_message_new_addr(sd_netlink *rtnl, sd_netlink_message **ret, return 0; } -int sd_rtnl_message_new_addr_update(sd_netlink *rtnl, sd_netlink_message **ret, - int index, int family) { +_public_ int sd_rtnl_message_new_addr_update( + sd_netlink *rtnl, + sd_netlink_message **ret, + int index, + int family) { int r; r = sd_rtnl_message_new_addr(rtnl, ret, RTM_NEWADDR, index, family); @@ -700,7 +713,7 @@ int sd_rtnl_message_new_addr_update(sd_netlink *rtnl, sd_netlink_message **ret, return 0; } -int sd_rtnl_message_link_get_ifindex(sd_netlink_message *m, int *ifindex) { +_public_ int sd_rtnl_message_link_get_ifindex(sd_netlink_message *m, int *ifindex) { struct ifinfomsg *ifi; assert_return(m, -EINVAL); @@ -715,7 +728,7 @@ int sd_rtnl_message_link_get_ifindex(sd_netlink_message *m, int *ifindex) { return 0; } -int sd_rtnl_message_link_get_flags(sd_netlink_message *m, unsigned *flags) { +_public_ int sd_rtnl_message_link_get_flags(sd_netlink_message *m, unsigned *flags) { struct ifinfomsg *ifi; assert_return(m, -EINVAL); @@ -730,7 +743,7 @@ int sd_rtnl_message_link_get_flags(sd_netlink_message *m, unsigned *flags) { return 0; } -int sd_rtnl_message_link_get_type(sd_netlink_message *m, unsigned short *type) { +_public_ int sd_rtnl_message_link_get_type(sd_netlink_message *m, unsigned short *type) { struct ifinfomsg *ifi; assert_return(m, -EINVAL); @@ -745,7 +758,7 @@ int sd_rtnl_message_link_get_type(sd_netlink_message *m, unsigned short *type) { return 0; } -int sd_rtnl_message_get_family(sd_netlink_message *m, int *family) { +_public_ int sd_rtnl_message_get_family(sd_netlink_message *m, int *family) { assert_return(m, -EINVAL); assert_return(family, -EINVAL); @@ -804,7 +817,13 @@ int sd_rtnl_message_get_family(sd_netlink_message *m, int *family) { return -EOPNOTSUPP; } -int sd_rtnl_message_new_addrlabel(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifindex, int ifal_family) { +_public_ int sd_rtnl_message_new_addrlabel( + sd_netlink *rtnl, + sd_netlink_message **ret, + uint16_t nlmsg_type, + int ifindex, + int ifal_family) { + struct ifaddrlblmsg *addrlabel; int r; @@ -826,7 +845,7 @@ int sd_rtnl_message_new_addrlabel(sd_netlink *rtnl, sd_netlink_message **ret, ui return 0; } -int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen) { +_public_ int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen) { struct ifaddrlblmsg *addrlabel; assert_return(m, -EINVAL); @@ -843,7 +862,7 @@ int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, unsigned char return 0; } -int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen) { +_public_ int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen) { struct ifaddrlblmsg *addrlabel; assert_return(m, -EINVAL); @@ -857,7 +876,12 @@ int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message *m, unsigned char return 0; } -int sd_rtnl_message_new_routing_policy_rule(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifal_family) { +_public_ int sd_rtnl_message_new_routing_policy_rule( + sd_netlink *rtnl, + sd_netlink_message **ret, + uint16_t nlmsg_type, + int ifal_family) { + struct fib_rule_hdr *frh; int r; @@ -877,7 +901,7 @@ int sd_rtnl_message_new_routing_policy_rule(sd_netlink *rtnl, sd_netlink_message return 0; } -int sd_rtnl_message_routing_policy_rule_set_tos(sd_netlink_message *m, uint8_t tos) { +_public_ int sd_rtnl_message_routing_policy_rule_set_tos(sd_netlink_message *m, uint8_t tos) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -891,7 +915,7 @@ int sd_rtnl_message_routing_policy_rule_set_tos(sd_netlink_message *m, uint8_t t return 0; } -int sd_rtnl_message_routing_policy_rule_get_tos(sd_netlink_message *m, uint8_t *tos) { +_public_ int sd_rtnl_message_routing_policy_rule_get_tos(sd_netlink_message *m, uint8_t *tos) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -905,7 +929,7 @@ int sd_rtnl_message_routing_policy_rule_get_tos(sd_netlink_message *m, uint8_t * return 0; } -int sd_rtnl_message_routing_policy_rule_set_table(sd_netlink_message *m, uint8_t table) { +_public_ int sd_rtnl_message_routing_policy_rule_set_table(sd_netlink_message *m, uint8_t table) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -919,7 +943,7 @@ int sd_rtnl_message_routing_policy_rule_set_table(sd_netlink_message *m, uint8_t return 0; } -int sd_rtnl_message_routing_policy_rule_get_table(sd_netlink_message *m, uint8_t *table) { +_public_ int sd_rtnl_message_routing_policy_rule_get_table(sd_netlink_message *m, uint8_t *table) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -933,7 +957,7 @@ int sd_rtnl_message_routing_policy_rule_get_table(sd_netlink_message *m, uint8_t return 0; } -int sd_rtnl_message_routing_policy_rule_set_flags(sd_netlink_message *m, uint32_t flags) { +_public_ int sd_rtnl_message_routing_policy_rule_set_flags(sd_netlink_message *m, uint32_t flags) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -946,7 +970,7 @@ int sd_rtnl_message_routing_policy_rule_set_flags(sd_netlink_message *m, uint32_ return 0; } -int sd_rtnl_message_routing_policy_rule_get_flags(sd_netlink_message *m, uint32_t *flags) { +_public_ int sd_rtnl_message_routing_policy_rule_get_flags(sd_netlink_message *m, uint32_t *flags) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -959,7 +983,7 @@ int sd_rtnl_message_routing_policy_rule_get_flags(sd_netlink_message *m, uint32_ return 0; } -int sd_rtnl_message_routing_policy_rule_set_fib_type(sd_netlink_message *m, uint8_t type) { +_public_ int sd_rtnl_message_routing_policy_rule_set_fib_type(sd_netlink_message *m, uint8_t type) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -973,7 +997,7 @@ int sd_rtnl_message_routing_policy_rule_set_fib_type(sd_netlink_message *m, uint return 0; } -int sd_rtnl_message_routing_policy_rule_get_fib_type(sd_netlink_message *m, uint8_t *type) { +_public_ int sd_rtnl_message_routing_policy_rule_get_fib_type(sd_netlink_message *m, uint8_t *type) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -987,7 +1011,7 @@ int sd_rtnl_message_routing_policy_rule_get_fib_type(sd_netlink_message *m, uint return 0; } -int sd_rtnl_message_routing_policy_rule_set_fib_dst_prefixlen(sd_netlink_message *m, uint8_t len) { +_public_ int sd_rtnl_message_routing_policy_rule_set_fib_dst_prefixlen(sd_netlink_message *m, uint8_t len) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -1001,7 +1025,7 @@ int sd_rtnl_message_routing_policy_rule_set_fib_dst_prefixlen(sd_netlink_message return 0; } -int sd_rtnl_message_routing_policy_rule_get_fib_dst_prefixlen(sd_netlink_message *m, uint8_t *len) { +_public_ int sd_rtnl_message_routing_policy_rule_get_fib_dst_prefixlen(sd_netlink_message *m, uint8_t *len) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -1015,7 +1039,7 @@ int sd_rtnl_message_routing_policy_rule_get_fib_dst_prefixlen(sd_netlink_message return 0; } -int sd_rtnl_message_routing_policy_rule_set_fib_src_prefixlen(sd_netlink_message *m, uint8_t len) { +_public_ int sd_rtnl_message_routing_policy_rule_set_fib_src_prefixlen(sd_netlink_message *m, uint8_t len) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -1029,7 +1053,7 @@ int sd_rtnl_message_routing_policy_rule_set_fib_src_prefixlen(sd_netlink_message return 0; } -int sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen(sd_netlink_message *m, uint8_t *len) { +_public_ int sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen(sd_netlink_message *m, uint8_t *len) { struct fib_rule_hdr *frh; assert_return(m, -EINVAL); @@ -1043,7 +1067,7 @@ int sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen(sd_netlink_message return 0; } -int sd_rtnl_message_new_traffic_control( +_public_ int sd_rtnl_message_new_traffic_control( sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, @@ -1072,7 +1096,7 @@ int sd_rtnl_message_new_traffic_control( return 0; } -int sd_rtnl_message_traffic_control_get_ifindex(sd_netlink_message *m, int *ret) { +_public_ int sd_rtnl_message_traffic_control_get_ifindex(sd_netlink_message *m, int *ret) { struct tcmsg *tcm; assert_return(m, -EINVAL); @@ -1086,7 +1110,7 @@ int sd_rtnl_message_traffic_control_get_ifindex(sd_netlink_message *m, int *ret) return 0; } -int sd_rtnl_message_traffic_control_get_handle(sd_netlink_message *m, uint32_t *ret) { +_public_ int sd_rtnl_message_traffic_control_get_handle(sd_netlink_message *m, uint32_t *ret) { struct tcmsg *tcm; assert_return(m, -EINVAL); @@ -1100,7 +1124,7 @@ int sd_rtnl_message_traffic_control_get_handle(sd_netlink_message *m, uint32_t * return 0; } -int sd_rtnl_message_traffic_control_get_parent(sd_netlink_message *m, uint32_t *ret) { +_public_ int sd_rtnl_message_traffic_control_get_parent(sd_netlink_message *m, uint32_t *ret) { struct tcmsg *tcm; assert_return(m, -EINVAL); @@ -1114,7 +1138,12 @@ int sd_rtnl_message_traffic_control_get_parent(sd_netlink_message *m, uint32_t * return 0; } -int sd_rtnl_message_new_mdb(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int mdb_ifindex) { +_public_ int sd_rtnl_message_new_mdb( + sd_netlink *rtnl, + sd_netlink_message **ret, + uint16_t nlmsg_type, + int mdb_ifindex) { + struct br_port_msg *bpm; int r; diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c index e846399a53..dafc16f258 100644 --- a/src/libsystemd/sd-netlink/netlink-message.c +++ b/src/libsystemd/sd-netlink/netlink-message.c @@ -113,7 +113,7 @@ int message_new_synthetic_error(sd_netlink *nl, int error, uint32_t serial, sd_n return 0; } -int sd_netlink_message_request_dump(sd_netlink_message *m, int dump) { +_public_ int sd_netlink_message_request_dump(sd_netlink_message *m, int dump) { assert_return(m, -EINVAL); assert_return(m->hdr, -EINVAL); assert_return(m->protocol != NETLINK_ROUTE || @@ -129,7 +129,7 @@ int sd_netlink_message_request_dump(sd_netlink_message *m, int dump) { DEFINE_TRIVIAL_REF_FUNC(sd_netlink_message, sd_netlink_message); -sd_netlink_message *sd_netlink_message_unref(sd_netlink_message *m) { +_public_ sd_netlink_message* sd_netlink_message_unref(sd_netlink_message *m) { while (m && --m->n_ref == 0) { unsigned i; @@ -146,7 +146,7 @@ sd_netlink_message *sd_netlink_message_unref(sd_netlink_message *m) { return NULL; } -int sd_netlink_message_get_type(sd_netlink_message *m, uint16_t *type) { +_public_ int sd_netlink_message_get_type(sd_netlink_message *m, uint16_t *type) { assert_return(m, -EINVAL); assert_return(type != 0, -EINVAL); @@ -155,7 +155,7 @@ int sd_netlink_message_get_type(sd_netlink_message *m, uint16_t *type) { return 0; } -int sd_netlink_message_set_flags(sd_netlink_message *m, uint16_t flags) { +_public_ int sd_netlink_message_set_flags(sd_netlink_message *m, uint16_t flags) { assert_return(m, -EINVAL); assert_return(flags != 0, -EINVAL); @@ -164,7 +164,7 @@ int sd_netlink_message_set_flags(sd_netlink_message *m, uint16_t flags) { return 0; } -int sd_netlink_message_is_broadcast(sd_netlink_message *m) { +_public_ int sd_netlink_message_is_broadcast(sd_netlink_message *m) { assert_return(m, -EINVAL); return m->multicast_group != 0; @@ -231,7 +231,7 @@ static int message_attribute_has_type(sd_netlink_message *m, size_t *out_size, u return 0; } -int sd_netlink_message_append_string(sd_netlink_message *m, unsigned short type, const char *data) { +_public_ int sd_netlink_message_append_string(sd_netlink_message *m, unsigned short type, const char *data) { size_t length, size; int r; @@ -257,7 +257,7 @@ int sd_netlink_message_append_string(sd_netlink_message *m, unsigned short type, return 0; } -int sd_netlink_message_append_strv(sd_netlink_message *m, unsigned short type, char * const *data) { +_public_ int sd_netlink_message_append_strv(sd_netlink_message *m, unsigned short type, char * const *data) { size_t length, size; int r; @@ -285,7 +285,7 @@ int sd_netlink_message_append_strv(sd_netlink_message *m, unsigned short type, c return 0; } -int sd_netlink_message_append_flag(sd_netlink_message *m, unsigned short type) { +_public_ int sd_netlink_message_append_flag(sd_netlink_message *m, unsigned short type) { size_t size; int r; @@ -303,7 +303,7 @@ int sd_netlink_message_append_flag(sd_netlink_message *m, unsigned short type) { return 0; } -int sd_netlink_message_append_u8(sd_netlink_message *m, unsigned short type, uint8_t data) { +_public_ int sd_netlink_message_append_u8(sd_netlink_message *m, unsigned short type, uint8_t data) { int r; assert_return(m, -EINVAL); @@ -320,7 +320,7 @@ int sd_netlink_message_append_u8(sd_netlink_message *m, unsigned short type, uin return 0; } -int sd_netlink_message_append_u16(sd_netlink_message *m, unsigned short type, uint16_t data) { +_public_ int sd_netlink_message_append_u16(sd_netlink_message *m, unsigned short type, uint16_t data) { int r; assert_return(m, -EINVAL); @@ -337,7 +337,7 @@ int sd_netlink_message_append_u16(sd_netlink_message *m, unsigned short type, ui return 0; } -int sd_netlink_message_append_u32(sd_netlink_message *m, unsigned short type, uint32_t data) { +_public_ int sd_netlink_message_append_u32(sd_netlink_message *m, unsigned short type, uint32_t data) { int r; assert_return(m, -EINVAL); @@ -354,7 +354,7 @@ int sd_netlink_message_append_u32(sd_netlink_message *m, unsigned short type, ui return 0; } -int sd_netlink_message_append_u64(sd_netlink_message *m, unsigned short type, uint64_t data) { +_public_ int sd_netlink_message_append_u64(sd_netlink_message *m, unsigned short type, uint64_t data) { int r; assert_return(m, -EINVAL); @@ -371,7 +371,7 @@ int sd_netlink_message_append_u64(sd_netlink_message *m, unsigned short type, ui return 0; } -int sd_netlink_message_append_s8(sd_netlink_message *m, unsigned short type, int8_t data) { +_public_ int sd_netlink_message_append_s8(sd_netlink_message *m, unsigned short type, int8_t data) { int r; assert_return(m, -EINVAL); @@ -388,7 +388,7 @@ int sd_netlink_message_append_s8(sd_netlink_message *m, unsigned short type, int return 0; } -int sd_netlink_message_append_s16(sd_netlink_message *m, unsigned short type, int16_t data) { +_public_ int sd_netlink_message_append_s16(sd_netlink_message *m, unsigned short type, int16_t data) { int r; assert_return(m, -EINVAL); @@ -405,7 +405,7 @@ int sd_netlink_message_append_s16(sd_netlink_message *m, unsigned short type, in return 0; } -int sd_netlink_message_append_s32(sd_netlink_message *m, unsigned short type, int32_t data) { +_public_ int sd_netlink_message_append_s32(sd_netlink_message *m, unsigned short type, int32_t data) { int r; assert_return(m, -EINVAL); @@ -422,7 +422,7 @@ int sd_netlink_message_append_s32(sd_netlink_message *m, unsigned short type, in return 0; } -int sd_netlink_message_append_s64(sd_netlink_message *m, unsigned short type, int64_t data) { +_public_ int sd_netlink_message_append_s64(sd_netlink_message *m, unsigned short type, int64_t data) { int r; assert_return(m, -EINVAL); @@ -439,7 +439,7 @@ int sd_netlink_message_append_s64(sd_netlink_message *m, unsigned short type, in return 0; } -int sd_netlink_message_append_data(sd_netlink_message *m, unsigned short type, const void *data, size_t len) { +_public_ int sd_netlink_message_append_data(sd_netlink_message *m, unsigned short type, const void *data, size_t len) { int r; assert_return(m, -EINVAL); @@ -471,11 +471,11 @@ int netlink_message_append_in_addr_union(sd_netlink_message *m, unsigned short t return 0; } -int sd_netlink_message_append_in_addr(sd_netlink_message *m, unsigned short type, const struct in_addr *data) { +_public_ int sd_netlink_message_append_in_addr(sd_netlink_message *m, unsigned short type, const struct in_addr *data) { return netlink_message_append_in_addr_union(m, type, AF_INET, (const union in_addr_union *) data); } -int sd_netlink_message_append_in6_addr(sd_netlink_message *m, unsigned short type, const struct in6_addr *data) { +_public_ int sd_netlink_message_append_in6_addr(sd_netlink_message *m, unsigned short type, const struct in6_addr *data) { return netlink_message_append_in_addr_union(m, type, AF_INET6, (const union in_addr_union *) data); } @@ -498,15 +498,15 @@ int netlink_message_append_sockaddr_union(sd_netlink_message *m, unsigned short return 0; } -int sd_netlink_message_append_sockaddr_in(sd_netlink_message *m, unsigned short type, const struct sockaddr_in *data) { +_public_ int sd_netlink_message_append_sockaddr_in(sd_netlink_message *m, unsigned short type, const struct sockaddr_in *data) { return netlink_message_append_sockaddr_union(m, type, (const union sockaddr_union *) data); } -int sd_netlink_message_append_sockaddr_in6(sd_netlink_message *m, unsigned short type, const struct sockaddr_in6 *data) { +_public_ int sd_netlink_message_append_sockaddr_in6(sd_netlink_message *m, unsigned short type, const struct sockaddr_in6 *data) { return netlink_message_append_sockaddr_union(m, type, (const union sockaddr_union *) data); } -int sd_netlink_message_append_ether_addr(sd_netlink_message *m, unsigned short type, const struct ether_addr *data) { +_public_ int sd_netlink_message_append_ether_addr(sd_netlink_message *m, unsigned short type, const struct ether_addr *data) { int r; assert_return(m, -EINVAL); @@ -543,7 +543,7 @@ int netlink_message_append_hw_addr(sd_netlink_message *m, unsigned short type, c return 0; } -int sd_netlink_message_append_cache_info(sd_netlink_message *m, unsigned short type, const struct ifa_cacheinfo *info) { +_public_ int sd_netlink_message_append_cache_info(sd_netlink_message *m, unsigned short type, const struct ifa_cacheinfo *info) { int r; assert_return(m, -EINVAL); @@ -561,7 +561,7 @@ int sd_netlink_message_append_cache_info(sd_netlink_message *m, unsigned short t return 0; } -int sd_netlink_message_open_container(sd_netlink_message *m, unsigned short type) { +_public_ int sd_netlink_message_open_container(sd_netlink_message *m, unsigned short type) { size_t size; int r; @@ -610,7 +610,7 @@ int sd_netlink_message_open_container(sd_netlink_message *m, unsigned short type return 0; } -int sd_netlink_message_open_container_union(sd_netlink_message *m, unsigned short type, const char *key) { +_public_ int sd_netlink_message_open_container_union(sd_netlink_message *m, unsigned short type, const char *key) { const NLTypeSystemUnion *type_system_union; int r; @@ -645,7 +645,7 @@ int sd_netlink_message_open_container_union(sd_netlink_message *m, unsigned shor return 0; } -int sd_netlink_message_close_container(sd_netlink_message *m) { +_public_ int sd_netlink_message_close_container(sd_netlink_message *m) { assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(m->n_containers > 0, -EINVAL); @@ -657,7 +657,7 @@ int sd_netlink_message_close_container(sd_netlink_message *m) { return 0; } -int sd_netlink_message_open_array(sd_netlink_message *m, uint16_t type) { +_public_ int sd_netlink_message_open_array(sd_netlink_message *m, uint16_t type) { int r; assert_return(m, -EINVAL); @@ -675,7 +675,7 @@ int sd_netlink_message_open_array(sd_netlink_message *m, uint16_t type) { return 0; } -int sd_netlink_message_cancel_array(sd_netlink_message *m) { +_public_ int sd_netlink_message_cancel_array(sd_netlink_message *m) { uint32_t rta_len; assert_return(m, -EINVAL); @@ -731,7 +731,7 @@ static int netlink_message_read_internal( return RTA_PAYLOAD(rta); } -int sd_netlink_message_read(sd_netlink_message *m, unsigned short type, size_t size, void *data) { +_public_ int sd_netlink_message_read(sd_netlink_message *m, unsigned short type, size_t size, void *data) { void *attr_data; int r; @@ -750,7 +750,7 @@ int sd_netlink_message_read(sd_netlink_message *m, unsigned short type, size_t s return r; } -int sd_netlink_message_read_data(sd_netlink_message *m, unsigned short type, size_t *ret_size, void **ret_data) { +_public_ int sd_netlink_message_read_data(sd_netlink_message *m, unsigned short type, size_t *ret_size, void **ret_data) { void *attr_data; int r; @@ -776,7 +776,7 @@ int sd_netlink_message_read_data(sd_netlink_message *m, unsigned short type, siz return r; } -int sd_netlink_message_read_data_suffix0(sd_netlink_message *m, unsigned short type, size_t *ret_size, void **ret_data) { +_public_ int sd_netlink_message_read_data_suffix0(sd_netlink_message *m, unsigned short type, size_t *ret_size, void **ret_data) { void *attr_data; int r; @@ -802,7 +802,7 @@ int sd_netlink_message_read_data_suffix0(sd_netlink_message *m, unsigned short t return r; } -int sd_netlink_message_read_string_strdup(sd_netlink_message *m, unsigned short type, char **data) { +_public_ int sd_netlink_message_read_string_strdup(sd_netlink_message *m, unsigned short type, char **data) { void *attr_data; int r; @@ -829,7 +829,7 @@ int sd_netlink_message_read_string_strdup(sd_netlink_message *m, unsigned short return 0; } -int sd_netlink_message_read_string(sd_netlink_message *m, unsigned short type, const char **data) { +_public_ int sd_netlink_message_read_string(sd_netlink_message *m, unsigned short type, const char **data) { void *attr_data; int r; @@ -852,7 +852,7 @@ int sd_netlink_message_read_string(sd_netlink_message *m, unsigned short type, c return 0; } -int sd_netlink_message_read_u8(sd_netlink_message *m, unsigned short type, uint8_t *data) { +_public_ int sd_netlink_message_read_u8(sd_netlink_message *m, unsigned short type, uint8_t *data) { void *attr_data; int r; @@ -875,7 +875,7 @@ int sd_netlink_message_read_u8(sd_netlink_message *m, unsigned short type, uint8 return 0; } -int sd_netlink_message_read_u16(sd_netlink_message *m, unsigned short type, uint16_t *data) { +_public_ int sd_netlink_message_read_u16(sd_netlink_message *m, unsigned short type, uint16_t *data) { void *attr_data; bool net_byteorder; int r; @@ -903,7 +903,7 @@ int sd_netlink_message_read_u16(sd_netlink_message *m, unsigned short type, uint return 0; } -int sd_netlink_message_read_u32(sd_netlink_message *m, unsigned short type, uint32_t *data) { +_public_ int sd_netlink_message_read_u32(sd_netlink_message *m, unsigned short type, uint32_t *data) { void *attr_data; bool net_byteorder; int r; @@ -931,7 +931,7 @@ int sd_netlink_message_read_u32(sd_netlink_message *m, unsigned short type, uint return 0; } -int sd_netlink_message_read_ether_addr(sd_netlink_message *m, unsigned short type, struct ether_addr *data) { +_public_ int sd_netlink_message_read_ether_addr(sd_netlink_message *m, unsigned short type, struct ether_addr *data) { void *attr_data; int r; @@ -979,7 +979,7 @@ int netlink_message_read_hw_addr(sd_netlink_message *m, unsigned short type, str return 0; } -int sd_netlink_message_read_cache_info(sd_netlink_message *m, unsigned short type, struct ifa_cacheinfo *info) { +_public_ int sd_netlink_message_read_cache_info(sd_netlink_message *m, unsigned short type, struct ifa_cacheinfo *info) { void *attr_data; int r; @@ -1026,7 +1026,7 @@ int netlink_message_read_in_addr_union(sd_netlink_message *m, unsigned short typ return 0; } -int sd_netlink_message_read_in_addr(sd_netlink_message *m, unsigned short type, struct in_addr *data) { +_public_ int sd_netlink_message_read_in_addr(sd_netlink_message *m, unsigned short type, struct in_addr *data) { union in_addr_union u; int r; @@ -1037,7 +1037,7 @@ int sd_netlink_message_read_in_addr(sd_netlink_message *m, unsigned short type, return r; } -int sd_netlink_message_read_in6_addr(sd_netlink_message *m, unsigned short type, struct in6_addr *data) { +_public_ int sd_netlink_message_read_in6_addr(sd_netlink_message *m, unsigned short type, struct in6_addr *data) { union in_addr_union u; int r; @@ -1048,7 +1048,7 @@ int sd_netlink_message_read_in6_addr(sd_netlink_message *m, unsigned short type, return r; } -int sd_netlink_message_has_flag(sd_netlink_message *m, unsigned short type) { +_public_ int sd_netlink_message_has_flag(sd_netlink_message *m, unsigned short type) { void *attr_data; int r; @@ -1069,7 +1069,7 @@ int sd_netlink_message_has_flag(sd_netlink_message *m, unsigned short type) { return 1; } -int sd_netlink_message_read_strv(sd_netlink_message *m, unsigned short container_type, unsigned short type_id, char ***ret) { +_public_ int sd_netlink_message_read_strv(sd_netlink_message *m, unsigned short container_type, unsigned short type_id, char ***ret) { _cleanup_strv_free_ char **s = NULL; const NLTypeSystem *type_system; const NLType *nl_type; @@ -1166,7 +1166,7 @@ static int netlink_container_parse( return 0; } -int sd_netlink_message_enter_container(sd_netlink_message *m, unsigned short type_id) { +_public_ int sd_netlink_message_enter_container(sd_netlink_message *m, unsigned short type_id) { const NLType *nl_type; const NLTypeSystem *type_system; void *container; @@ -1261,7 +1261,7 @@ int sd_netlink_message_enter_container(sd_netlink_message *m, unsigned short typ return 0; } -int sd_netlink_message_enter_array(sd_netlink_message *m, unsigned short type_id) { +_public_ int sd_netlink_message_enter_array(sd_netlink_message *m, unsigned short type_id) { void *container; size_t size; int r; @@ -1290,7 +1290,7 @@ int sd_netlink_message_enter_array(sd_netlink_message *m, unsigned short type_id return 0; } -int sd_netlink_message_exit_container(sd_netlink_message *m) { +_public_ int sd_netlink_message_exit_container(sd_netlink_message *m) { assert_return(m, -EINVAL); assert_return(m->sealed, -EINVAL); assert_return(m->n_containers > 0, -EINVAL); @@ -1304,7 +1304,7 @@ int sd_netlink_message_exit_container(sd_netlink_message *m) { return 0; } -int sd_netlink_message_get_max_attribute(sd_netlink_message *m, uint16_t *ret) { +_public_ int sd_netlink_message_get_max_attribute(sd_netlink_message *m, uint16_t *ret) { assert_return(m, -EINVAL); assert_return(m->sealed, -EINVAL); assert_return(ret, -EINVAL); @@ -1313,21 +1313,14 @@ int sd_netlink_message_get_max_attribute(sd_netlink_message *m, uint16_t *ret) { return 0; } -uint32_t message_get_serial(sd_netlink_message *m) { - assert(m); - assert(m->hdr); - - return m->hdr->nlmsg_seq; -} - -int sd_netlink_message_is_error(sd_netlink_message *m) { +_public_ int sd_netlink_message_is_error(sd_netlink_message *m) { assert_return(m, 0); assert_return(m->hdr, 0); return m->hdr->nlmsg_type == NLMSG_ERROR; } -int sd_netlink_message_get_errno(sd_netlink_message *m) { +_public_ int sd_netlink_message_get_errno(sd_netlink_message *m) { struct nlmsgerr *err; assert_return(m, -EINVAL); @@ -1362,7 +1355,7 @@ static int netlink_message_parse_error(sd_netlink_message *m) { NLMSG_PAYLOAD(m->hdr, hlen)); } -int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *nl) { +_public_ int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *nl) { size_t size; int r; diff --git a/src/libsystemd/sd-netlink/netlink-socket.c b/src/libsystemd/sd-netlink/netlink-socket.c index 7197cb4daa..70f5b85a54 100644 --- a/src/libsystemd/sd-netlink/netlink-socket.c +++ b/src/libsystemd/sd-netlink/netlink-socket.c @@ -17,16 +17,6 @@ #include "socket-util.h" #include "util.h" -int socket_open(int family) { - int fd; - - fd = socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, family); - if (fd < 0) - return -errno; - - return fd_move_above_stdio(fd); -} - static int broadcast_groups_get(sd_netlink *nl) { _cleanup_free_ uint32_t *groups = NULL; socklen_t len = 0, old_len; @@ -192,32 +182,6 @@ int socket_write_message(sd_netlink *nl, sd_netlink_message *m) { return k; } -int socket_writev_message(sd_netlink *nl, sd_netlink_message **m, size_t msgcount) { - _cleanup_free_ struct iovec *iovs = NULL; - ssize_t k; - - assert(nl); - assert(m); - assert(msgcount > 0); - - iovs = new(struct iovec, msgcount); - if (!iovs) - return -ENOMEM; - - for (size_t i = 0; i < msgcount; i++) { - assert(m[i]->hdr); - assert(m[i]->hdr->nlmsg_len > 0); - - iovs[i] = IOVEC_MAKE(m[i]->hdr, m[i]->hdr->nlmsg_len); - } - - k = writev(nl->fd, iovs, msgcount); - if (k < 0) - return -errno; - - return k; -} - static int socket_recv_message(int fd, struct iovec *iov, uint32_t *ret_mcast_group, bool peek) { union sockaddr_union sender; CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(struct nl_pktinfo))) control; diff --git a/src/libsystemd/sd-netlink/netlink-util.c b/src/libsystemd/sd-netlink/netlink-util.c index ce2c4f3b54..8e05161558 100644 --- a/src/libsystemd/sd-netlink/netlink-util.c +++ b/src/libsystemd/sd-netlink/netlink-util.c @@ -2,11 +2,14 @@ #include "sd-netlink.h" +#include "fd-util.h" #include "format-util.h" +#include "io-util.h" #include "memory-util.h" #include "netlink-internal.h" #include "netlink-util.h" #include "parse-util.h" +#include "process-util.h" #include "strv.h" int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name) { @@ -628,3 +631,121 @@ int rtattr_read_nexthop(const struct rtnexthop *rtnh, size_t size, int family, O *ret = TAKE_PTR(set); return 0; } + +bool netlink_pid_changed(sd_netlink *nl) { + /* We don't support people creating an nl connection and + * keeping it around over a fork(). Let's complain. */ + return ASSERT_PTR(nl)->original_pid != getpid_cached(); +} + +static int socket_open(int family) { + int fd; + + fd = socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, family); + if (fd < 0) + return -errno; + + return fd_move_above_stdio(fd); +} + +int netlink_open_family(sd_netlink **ret, int family) { + _cleanup_close_ int fd = -1; + int r; + + fd = socket_open(family); + if (fd < 0) + return fd; + + r = sd_netlink_open_fd(ret, fd); + if (r < 0) + return r; + TAKE_FD(fd); + + return 0; +} + +void netlink_seal_message(sd_netlink *nl, sd_netlink_message *m) { + uint32_t picked; + + assert(nl); + assert(!netlink_pid_changed(nl)); + assert(m); + assert(m->hdr); + + /* Avoid collisions with outstanding requests */ + do { + picked = nl->serial; + + /* Don't use seq == 0, as that is used for broadcasts, so we would get confused by replies to + such messages */ + nl->serial = nl->serial == UINT32_MAX ? 1 : nl->serial + 1; + + } while (hashmap_contains(nl->reply_callbacks, UINT32_TO_PTR(picked))); + + m->hdr->nlmsg_seq = picked; + message_seal(m); +} + +static int socket_writev_message(sd_netlink *nl, sd_netlink_message **m, size_t msgcount) { + _cleanup_free_ struct iovec *iovs = NULL; + ssize_t k; + + assert(nl); + assert(m); + assert(msgcount > 0); + + iovs = new(struct iovec, msgcount); + if (!iovs) + return -ENOMEM; + + for (size_t i = 0; i < msgcount; i++) { + assert(m[i]->hdr); + assert(m[i]->hdr->nlmsg_len > 0); + + iovs[i] = IOVEC_MAKE(m[i]->hdr, m[i]->hdr->nlmsg_len); + } + + k = writev(nl->fd, iovs, msgcount); + if (k < 0) + return -errno; + + return k; +} + +int sd_netlink_sendv( + sd_netlink *nl, + sd_netlink_message **messages, + size_t msgcount, + uint32_t **ret_serial) { + + _cleanup_free_ uint32_t *serials = NULL; + int r; + + assert_return(nl, -EINVAL); + assert_return(!netlink_pid_changed(nl), -ECHILD); + assert_return(messages, -EINVAL); + assert_return(msgcount > 0, -EINVAL); + + if (ret_serial) { + serials = new(uint32_t, msgcount); + if (!serials) + return -ENOMEM; + } + + for (size_t i = 0; i < msgcount; i++) { + assert_return(!messages[i]->sealed, -EPERM); + + netlink_seal_message(nl, messages[i]); + if (serials) + serials[i] = message_get_serial(messages[i]); + } + + r = socket_writev_message(nl, messages, msgcount); + if (r < 0) + return r; + + if (ret_serial) + *ret_serial = TAKE_PTR(serials); + + return r; +} diff --git a/src/libsystemd/sd-netlink/netlink-util.h b/src/libsystemd/sd-netlink/netlink-util.h index fee450cdc2..606d14eeaf 100644 --- a/src/libsystemd/sd-netlink/netlink-util.h +++ b/src/libsystemd/sd-netlink/netlink-util.h @@ -142,3 +142,8 @@ void rtattr_append_attribute_internal(struct rtattr *rta, unsigned short type, c int rtattr_append_attribute(struct rtattr **rta, unsigned short type, const void *data, size_t data_length); int rtattr_read_nexthop(const struct rtnexthop *rtnh, size_t size, int family, OrderedSet **ret); + +void netlink_seal_message(sd_netlink *nl, sd_netlink_message *m); + +/* TODO: to be exported later */ +int sd_netlink_sendv(sd_netlink *nl, sd_netlink_message **messages, size_t msgcnt, uint32_t **ret_serial); diff --git a/src/libsystemd/sd-netlink/sd-netlink.c b/src/libsystemd/sd-netlink/sd-netlink.c index e23e2cc163..5afe04c3a3 100644 --- a/src/libsystemd/sd-netlink/sd-netlink.c +++ b/src/libsystemd/sd-netlink/sd-netlink.c @@ -12,6 +12,7 @@ #include "netlink-genl.h" #include "netlink-internal.h" #include "netlink-slot.h" +#include "netlink-util.h" #include "process-util.h" #include "socket-util.h" #include "string-util.h" @@ -68,7 +69,7 @@ static int netlink_new(sd_netlink **ret) { return 0; } -int sd_netlink_new_from_fd(sd_netlink **ret, int fd) { +_public_ int sd_netlink_new_from_fd(sd_netlink **ret, int fd) { _cleanup_(sd_netlink_unrefp) sd_netlink *nl = NULL; socklen_t addrlen; int r; @@ -93,7 +94,7 @@ int sd_netlink_new_from_fd(sd_netlink **ret, int fd) { return 0; } -int sd_netlink_open_fd(sd_netlink **ret, int fd) { +_public_ int sd_netlink_open_fd(sd_netlink **ret, int fd) { _cleanup_(sd_netlink_unrefp) sd_netlink *nl = NULL; int r, protocol; @@ -131,36 +132,11 @@ int sd_netlink_open_fd(sd_netlink **ret, int fd) { return 0; } -int netlink_open_family(sd_netlink **ret, int family) { - _cleanup_close_ int fd = -1; - int r; - - fd = socket_open(family); - if (fd < 0) - return fd; - - r = sd_netlink_open_fd(ret, fd); - if (r < 0) - return r; - TAKE_FD(fd); - - return 0; -} - -int sd_netlink_open(sd_netlink **ret) { +_public_ int sd_netlink_open(sd_netlink **ret) { return netlink_open_family(ret, NETLINK_ROUTE); } -bool netlink_pid_changed(sd_netlink *nl) { - assert(nl); - - /* We don't support people creating an nl connection and - * keeping it around over a fork(). Let's complain. */ - - return nl->original_pid != getpid_cached(); -} - -int sd_netlink_inc_rcvbuf(sd_netlink *nl, size_t size) { +_public_ int sd_netlink_inc_rcvbuf(sd_netlink *nl, size_t size) { assert_return(nl, -EINVAL); assert_return(!netlink_pid_changed(nl), -ECHILD); @@ -204,29 +180,7 @@ static sd_netlink *netlink_free(sd_netlink *nl) { DEFINE_TRIVIAL_REF_UNREF_FUNC(sd_netlink, sd_netlink, netlink_free); -static void netlink_seal_message(sd_netlink *nl, sd_netlink_message *m) { - uint32_t picked; - - assert(nl); - assert(!netlink_pid_changed(nl)); - assert(m); - assert(m->hdr); - - /* Avoid collisions with outstanding requests */ - do { - picked = nl->serial; - - /* Don't use seq == 0, as that is used for broadcasts, so we would get confused by replies to - such messages */ - nl->serial = nl->serial == UINT32_MAX ? 1 : nl->serial + 1; - - } while (hashmap_contains(nl->reply_callbacks, UINT32_TO_PTR(picked))); - - m->hdr->nlmsg_seq = picked; - message_seal(m); -} - -int sd_netlink_send( +_public_ int sd_netlink_send( sd_netlink *nl, sd_netlink_message *message, uint32_t *serial) { @@ -250,44 +204,6 @@ int sd_netlink_send( return 1; } -int sd_netlink_sendv( - sd_netlink *nl, - sd_netlink_message **messages, - size_t msgcount, - uint32_t **ret_serial) { - - _cleanup_free_ uint32_t *serials = NULL; - int r; - - assert_return(nl, -EINVAL); - assert_return(!netlink_pid_changed(nl), -ECHILD); - assert_return(messages, -EINVAL); - assert_return(msgcount > 0, -EINVAL); - - if (ret_serial) { - serials = new(uint32_t, msgcount); - if (!serials) - return -ENOMEM; - } - - for (size_t i = 0; i < msgcount; i++) { - assert_return(!messages[i]->sealed, -EPERM); - - netlink_seal_message(nl, messages[i]); - if (serials) - serials[i] = message_get_serial(messages[i]); - } - - r = socket_writev_message(nl, messages, msgcount); - if (r < 0) - return r; - - if (ret_serial) - *ret_serial = TAKE_PTR(serials); - - return r; -} - int netlink_rqueue_make_room(sd_netlink *nl) { assert(nl); @@ -594,7 +510,7 @@ static int timeout_compare(const void *a, const void *b) { return CMP(x->timeout, y->timeout); } -int sd_netlink_call_async( +_public_ int sd_netlink_call_async( sd_netlink *nl, sd_netlink_slot **ret_slot, sd_netlink_message *m, @@ -659,7 +575,7 @@ int sd_netlink_call_async( return k; } -int sd_netlink_read( +_public_ int sd_netlink_read( sd_netlink *nl, uint32_t serial, uint64_t usec, @@ -736,7 +652,7 @@ int sd_netlink_read( } } -int sd_netlink_call( +_public_ int sd_netlink_call( sd_netlink *nl, sd_netlink_message *message, uint64_t usec, @@ -756,14 +672,14 @@ int sd_netlink_call( return sd_netlink_read(nl, serial, usec, ret); } -int sd_netlink_get_events(sd_netlink *nl) { +_public_ int sd_netlink_get_events(sd_netlink *nl) { assert_return(nl, -EINVAL); assert_return(!netlink_pid_changed(nl), -ECHILD); return nl->rqueue_size == 0 ? POLLIN : 0; } -int sd_netlink_get_timeout(sd_netlink *nl, uint64_t *timeout_usec) { +_public_ int sd_netlink_get_timeout(sd_netlink *nl, uint64_t *timeout_usec) { struct reply_callback *c; assert_return(nl, -EINVAL); @@ -846,7 +762,7 @@ static int prepare_callback(sd_event_source *s, void *userdata) { return 1; } -int sd_netlink_attach_event(sd_netlink *nl, sd_event *event, int64_t priority) { +_public_ int sd_netlink_attach_event(sd_netlink *nl, sd_event *event, int64_t priority) { int r; assert_return(nl, -EINVAL); @@ -898,7 +814,7 @@ fail: return r; } -int sd_netlink_detach_event(sd_netlink *nl) { +_public_ int sd_netlink_detach_event(sd_netlink *nl) { assert_return(nl, -EINVAL); assert_return(nl->event, -ENXIO); @@ -961,7 +877,7 @@ int netlink_add_match_internal( return 0; } -int sd_netlink_add_match( +_public_ int sd_netlink_add_match( sd_netlink *rtnl, sd_netlink_slot **ret_slot, uint16_t type, @@ -1031,7 +947,7 @@ int sd_netlink_add_match( destroy_callback, userdata, description); } -int sd_netlink_attach_filter(sd_netlink *nl, size_t len, struct sock_filter *filter) { +_public_ int sd_netlink_attach_filter(sd_netlink *nl, size_t len, struct sock_filter *filter) { assert_return(nl, -EINVAL); assert_return(len == 0 || filter, -EINVAL); diff --git a/src/shared/firewall-util-nft.c b/src/shared/firewall-util-nft.c index 2f98e791c2..87a326cafd 100644 --- a/src/shared/firewall-util-nft.c +++ b/src/shared/firewall-util-nft.c @@ -18,6 +18,8 @@ #include "firewall-util-private.h" #include "in-addr-util.h" #include "macro.h" +#include "netlink-internal.h" +#include "netlink-util.h" #include "socket-util.h" #include "time-util.h" diff --git a/src/systemd/meson.build b/src/systemd/meson.build index c13e88b594..df8c74ebdd 100644 --- a/src/systemd/meson.build +++ b/src/systemd/meson.build @@ -12,6 +12,7 @@ _systemd_headers = [ 'sd-journal.h', 'sd-login.h', 'sd-messages.h', + 'sd-netlink.h', 'sd-path.h', ] @@ -32,7 +33,6 @@ _not_installed_headers = [ 'sd-lldp-tx.h', 'sd-lldp.h', 'sd-ndisc.h', - 'sd-netlink.h', 'sd-network.h', 'sd-radv.h', 'sd-resolve.h', diff --git a/src/systemd/sd-netlink.h b/src/systemd/sd-netlink.h index 2f748df2b5..38116917ce 100644 --- a/src/systemd/sd-netlink.h +++ b/src/systemd/sd-netlink.h @@ -49,7 +49,6 @@ sd_netlink *sd_netlink_ref(sd_netlink *nl); sd_netlink *sd_netlink_unref(sd_netlink *nl); int sd_netlink_send(sd_netlink *nl, sd_netlink_message *message, uint32_t *serial); -int sd_netlink_sendv(sd_netlink *nl, sd_netlink_message **messages, size_t msgcnt, uint32_t **ret_serial); int sd_netlink_call_async(sd_netlink *nl, sd_netlink_slot **ret_slot, sd_netlink_message *message, sd_netlink_message_handler_t callback, sd_netlink_destroy_t destoy_callback, void *userdata, uint64_t usec, const char *description); @@ -210,32 +209,6 @@ int sd_rtnl_message_traffic_control_get_parent(sd_netlink_message *m, uint32_t * int sd_rtnl_message_new_mdb(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int mdb_ifindex); -/* nfnl */ -int sd_nfnl_socket_open(sd_netlink **ret); -int sd_nfnl_message_batch_begin(sd_netlink *nfnl, sd_netlink_message **ret); -int sd_nfnl_message_batch_end(sd_netlink *nfnl, sd_netlink_message **ret); -int sd_nfnl_nft_message_del_table(sd_netlink *nfnl, sd_netlink_message **ret, - int family, const char *table); -int sd_nfnl_nft_message_new_table(sd_netlink *nfnl, sd_netlink_message **ret, - int family, const char *table); -int sd_nfnl_nft_message_new_basechain(sd_netlink *nfnl, sd_netlink_message **ret, - int family, const char *table, const char *chain, - const char *type, uint8_t hook, int prio); -int sd_nfnl_nft_message_new_rule(sd_netlink *nfnl, sd_netlink_message **ret, - int family, const char *table, const char *chain); -int sd_nfnl_nft_message_new_set(sd_netlink *nfnl, sd_netlink_message **ret, - int family, const char *table, const char *set_name, - uint32_t setid, uint32_t klen); -int sd_nfnl_nft_message_new_setelems_begin(sd_netlink *nfnl, sd_netlink_message **ret, - int family, const char *table, const char *set_name); -int sd_nfnl_nft_message_del_setelems_begin(sd_netlink *nfnl, sd_netlink_message **ret, - int family, const char *table, const char *set_name); -int sd_nfnl_nft_message_add_setelem(sd_netlink_message *m, - uint32_t num, - const void *key, uint32_t klen, - const void *data, uint32_t dlen); -int sd_nfnl_nft_message_add_setelem_end(sd_netlink_message *m); - /* genl */ int sd_genl_socket_open(sd_netlink **ret); int sd_genl_message_new(sd_netlink *genl, const char *family_name, uint8_t cmd, sd_netlink_message **ret); From 2dbf1c0f1556bcf8fbab2491ec0f23a85884c551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 12 Jun 2022 22:09:49 +0200 Subject: [PATCH 06/23] libsystemd: drop unexported sd-utf8 It had two symbols which were not actually exported because they were not listed in libsystemd.sym. They were also entirely unused in our codebase. I don't think it makes much sense to export just those two functions, and it doesn't make to build a string processing library in systemd either. History of the file shows that it was created in faaa5728d956b7f0d24f27f3341d0b9fff30af00 'utf8: export utf8 validation functions as part of sd-bus' and hasn't gone even one non-trivial change since then ;) --- src/libsystemd/meson.build | 1 - src/libsystemd/sd-utf8/sd-utf8.c | 18 ------------------ src/systemd/meson.build | 1 - 3 files changed, 20 deletions(-) delete mode 100644 src/libsystemd/sd-utf8/sd-utf8.c diff --git a/src/libsystemd/meson.build b/src/libsystemd/meson.build index 055fa11ede..2b288ccb28 100644 --- a/src/libsystemd/meson.build +++ b/src/libsystemd/meson.build @@ -155,7 +155,6 @@ libsystemd_sources = files( 'sd-path/sd-path.c', 'sd-resolve/resolve-private.h', 'sd-resolve/sd-resolve.c', - 'sd-utf8/sd-utf8.c', ) + sd_journal_sources + id128_sources + sd_daemon_sources + sd_event_sources + sd_login_sources diff --git a/src/libsystemd/sd-utf8/sd-utf8.c b/src/libsystemd/sd-utf8/sd-utf8.c deleted file mode 100644 index 82fa125ade..0000000000 --- a/src/libsystemd/sd-utf8/sd-utf8.c +++ /dev/null @@ -1,18 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -#include "sd-utf8.h" - -#include "utf8.h" -#include "util.h" - -_public_ const char *sd_utf8_is_valid(const char *s) { - assert_return(s, NULL); - - return utf8_is_valid(s); -} - -_public_ const char *sd_ascii_is_valid(const char *s) { - assert_return(s, NULL); - - return ascii_is_valid(s); -} diff --git a/src/systemd/meson.build b/src/systemd/meson.build index df8c74ebdd..6048c13859 100644 --- a/src/systemd/meson.build +++ b/src/systemd/meson.build @@ -36,7 +36,6 @@ _not_installed_headers = [ 'sd-network.h', 'sd-radv.h', 'sd-resolve.h', - 'sd-utf8.h', ] install_headers( From 7a1f261da3bfdf0b8a620f2ee4e0fa882c33a3a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 13 Jun 2022 10:00:22 +0200 Subject: [PATCH 07/23] sd-bus: drop unused prototype Function was exported in 07a0d22f9ec5a0cac2385b73dc08b12a811cead8, but apparently we forgot to remove the old declaration. --- src/libsystemd/sd-bus/bus-error.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libsystemd/sd-bus/bus-error.h b/src/libsystemd/sd-bus/bus-error.h index 05dabdb737..b7e4a4530c 100644 --- a/src/libsystemd/sd-bus/bus-error.h +++ b/src/libsystemd/sd-bus/bus-error.h @@ -12,7 +12,6 @@ bool bus_error_is_dirty(sd_bus_error *e); const char *bus_error_message(const sd_bus_error *e, int error); int bus_error_setfv(sd_bus_error *e, const char *name, const char *format, va_list ap) _printf_(3,0); -int bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_list ap) _printf_(3,0); #define BUS_ERROR_OOM SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_MEMORY, "Out of memory") #define BUS_ERROR_FAILED SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FAILED, "Operation failed") From fc69fab5ec8879acc771f9cfd6f90670c43773ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 13 Jun 2022 10:02:15 +0200 Subject: [PATCH 08/23] sd-bus: export sd_bus_error_setfv() The usual: if we find that function useful, other users of the library will too. In particular, the v-variants are necessary to build pass-thru wrappers. --- src/libsystemd/libsystemd.sym | 2 ++ src/libsystemd/sd-bus/bus-convenience.c | 2 +- src/libsystemd/sd-bus/bus-error.c | 4 ++-- src/libsystemd/sd-bus/bus-error.h | 2 -- src/libsystemd/sd-bus/bus-message.c | 2 +- src/systemd/sd-bus.h | 2 ++ 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index 524eeb9557..c18ac52766 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -781,6 +781,8 @@ global: LIBSYSTEMD_252 { global: + sd_bus_error_setfv; + sd_hwdb_new_from_path; sd_netlink_new_from_fd; diff --git a/src/libsystemd/sd-bus/bus-convenience.c b/src/libsystemd/sd-bus/bus-convenience.c index a36aeb238e..6a3f2ea0ec 100644 --- a/src/libsystemd/sd-bus/bus-convenience.c +++ b/src/libsystemd/sd-bus/bus-convenience.c @@ -270,7 +270,7 @@ _public_ int sd_bus_reply_method_errorfv( if (call->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) return 0; - bus_error_setfv(&error, name, format, ap); + sd_bus_error_setfv(&error, name, format, ap); return sd_bus_reply_method_error(call, &error); } diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c index 2454a95b9d..218677eac4 100644 --- a/src/libsystemd/sd-bus/bus-error.c +++ b/src/libsystemd/sd-bus/bus-error.c @@ -237,7 +237,7 @@ _public_ int sd_bus_error_set(sd_bus_error *e, const char *name, const char *mes return -r; } -int bus_error_setfv(sd_bus_error *e, const char *name, const char *format, va_list ap) { +_public_ int sd_bus_error_setfv(sd_bus_error *e, const char *name, const char *format, va_list ap) { int r; if (!name) @@ -277,7 +277,7 @@ _public_ int sd_bus_error_setf(sd_bus_error *e, const char *name, const char *fo va_list ap; va_start(ap, format); - r = bus_error_setfv(e, name, format, ap); + r = sd_bus_error_setfv(e, name, format, ap); assert(!name || r < 0); va_end(ap); diff --git a/src/libsystemd/sd-bus/bus-error.h b/src/libsystemd/sd-bus/bus-error.h index b7e4a4530c..518493762c 100644 --- a/src/libsystemd/sd-bus/bus-error.h +++ b/src/libsystemd/sd-bus/bus-error.h @@ -11,8 +11,6 @@ bool bus_error_is_dirty(sd_bus_error *e); const char *bus_error_message(const sd_bus_error *e, int error); -int bus_error_setfv(sd_bus_error *e, const char *name, const char *format, va_list ap) _printf_(3,0); - #define BUS_ERROR_OOM SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_MEMORY, "Out of memory") #define BUS_ERROR_FAILED SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_FAILED, "Operation failed") diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c index 7ab1de80d9..674884a3c8 100644 --- a/src/libsystemd/sd-bus/bus-message.c +++ b/src/libsystemd/sd-bus/bus-message.c @@ -674,7 +674,7 @@ _public_ int sd_bus_message_new_method_errorf( assert_return(m, -EINVAL); va_start(ap, format); - bus_error_setfv(&error, name, format, ap); + sd_bus_error_setfv(&error, name, format, ap); va_end(ap); return sd_bus_message_new_method_error(call, m, &error); diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index cad37d64ba..b3453471ab 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -445,6 +445,8 @@ int sd_bus_creds_get_description(sd_bus_creds *c, const char **name); void sd_bus_error_free(sd_bus_error *e); int sd_bus_error_set(sd_bus_error *e, const char *name, const char *message); int sd_bus_error_setf(sd_bus_error *e, const char *name, const char *format, ...) _sd_printf_(3, 4); +int sd_bus_error_setfv(sd_bus_error *e, const char *name, const char *format, va_list ap) _sd_printf_(3,0); + int sd_bus_error_set_const(sd_bus_error *e, const char *name, const char *message); int sd_bus_error_set_errno(sd_bus_error *e, int error); int sd_bus_error_set_errnof(sd_bus_error *e, int error, const char *format, ...) _sd_printf_(3, 4); From 4e116dd4fcd2a28d46cd98e6dced07e1ac9cfdb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 13 Jun 2022 10:10:30 +0200 Subject: [PATCH 09/23] meson: update man-generation rules for sd_hwdb_new_from_path Forgotten in 60f0ba75569312825ff14680d05a4b4f95842951. --- man/rules/meson.build | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/man/rules/meson.build b/man/rules/meson.build index 55376c0ecc..e7fe10dceb 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -646,7 +646,10 @@ manpages = [ '3', ['SD_HWDB_FOREACH_PROPERTY', 'sd_hwdb_enumerate', 'sd_hwdb_seek'], ''], - ['sd_hwdb_new', '3', ['sd_hwdb_ref', 'sd_hwdb_unref'], ''], + ['sd_hwdb_new', + '3', + ['sd_hwdb_new_from_path', 'sd_hwdb_ref', 'sd_hwdb_unref'], + ''], ['sd_id128_get_machine', '3', ['sd_id128_get_boot', From 870c2aaf8cc21d9e096d4d26421fd651cad9d019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 13 Jun 2022 10:11:22 +0200 Subject: [PATCH 10/23] man: document sd_bus_error_setfv() The description for sd_bus_error_set_errnof/sd_bus_error_set_errnofv are adjusted to use the same pattern. --- man/rules/meson.build | 3 ++- man/sd_bus_error.xml | 43 +++++++++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/man/rules/meson.build b/man/rules/meson.build index e7fe10dceb..48da2f8f8c 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -267,7 +267,8 @@ manpages = [ 'sd_bus_error_set_errno', 'sd_bus_error_set_errnof', 'sd_bus_error_set_errnofv', - 'sd_bus_error_setf'], + 'sd_bus_error_setf', + 'sd_bus_error_setfv'], ''], ['sd_bus_error_add_map', '3', diff --git a/man/sd_bus_error.xml b/man/sd_bus_error.xml index d8f3317e29..6f5e9e4b97 100644 --- a/man/sd_bus_error.xml +++ b/man/sd_bus_error.xml @@ -22,6 +22,7 @@ sd_bus_error_free sd_bus_error_set sd_bus_error_setf + sd_bus_error_setfv sd_bus_error_set_const sd_bus_error_set_errno sd_bus_error_set_errnof @@ -74,6 +75,14 @@ + + int sd_bus_error_setfv + sd_bus_error *e + const char *name + const char *format + va_list ap + + int sd_bus_error_set_const sd_bus_error *e @@ -196,11 +205,15 @@ which case an SD_BUS_ERROR_NO_MEMORY error will be set instead and -ENOMEM returned. - sd_bus_error_setf() is similar to - sd_bus_error_set(), but takes a printf3 - format string and corresponding arguments to generate the - message field. + sd_bus_error_setf() and sd_bus_error_setfv() are similar + to sd_bus_error_set(), but take a printf3 format + string and corresponding arguments to generate the message field. + sd_bus_error_setf() uses variadic arguments, and + sd_bus_error_setfv() accepts the arguments as a + va_arg3 + parameter list. sd_bus_error_set_const() is similar to sd_bus_error_set(), but the string parameters are not copied internally, and must @@ -223,17 +236,15 @@ due to lack of memory, in which case an SD_BUS_ERROR_NO_MEMORY error is set instead, and -ENOMEM is returned. - sd_bus_error_set_errnof() is similar to - sd_bus_error_set_errno(), but in addition to - error, takes a printf3 - format string and corresponding arguments. The - message field will be generated from - format and the arguments. - - sd_bus_error_set_errnofv() is similar to - sd_bus_error_set_errnof(), but takes the - format string parameters as sd_bus_error_set_errnof() and sd_bus_error_set_errnof() + are similar to sd_bus_error_set_errno(), but in addition to + error, take a printf3 format + string and corresponding arguments. The message field will be generated from + format and the arguments. + sd_bus_error_set_errnof() uses variadic arguments, and + sd_bus_error_set_errnofv() accepts the arguments as a + va_arg3 parameter list. From e16144844b9963f8ff72b325e281fa91aef3bc34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 13 Jun 2022 10:22:46 +0200 Subject: [PATCH 11/23] sd-id128: rename and export sd_id128_string_equal() We find this function useful in our code, so no reason not to export it. I changed the order of last two words in the name to match the arguments. (With "equal_string" I expected sd_id128_t first, string second, but in actual use, the second argument is usually a long constant so it's nice to keep this order of arguments.) --- src/home/homed-manager.c | 4 +++- src/home/homework-luks.c | 4 ++-- src/libsystemd/libsystemd.sym | 2 ++ src/libsystemd/sd-id128/id128-util.c | 16 ---------------- src/libsystemd/sd-id128/id128-util.h | 2 -- src/libsystemd/sd-id128/sd-id128.c | 16 ++++++++++++++++ src/shared/find-esp.c | 10 +++++----- src/systemd/sd-id128.h | 2 ++ 8 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/home/homed-manager.c b/src/home/homed-manager.c index 12e0ff516c..d114236cf7 100644 --- a/src/home/homed-manager.c +++ b/src/home/homed-manager.c @@ -10,6 +10,8 @@ #include #include +#include "sd-id128.h" + #include "btrfs-util.h" #include "bus-common-errors.h" #include "bus-error.h" @@ -1239,7 +1241,7 @@ static int manager_add_device(Manager *m, sd_device *d) { return 0; if (r < 0) return log_error_errno(r, "Failed to acquire ID_PART_ENTRY_TYPE device property, ignoring: %m"); - if (id128_equal_string(parttype, GPT_USER_HOME) <= 0) { + if (sd_id128_string_equal(parttype, GPT_USER_HOME) <= 0) { log_debug("Found partition (%s) we don't care about, ignoring.", sysfs); return 0; } diff --git a/src/home/homework-luks.c b/src/home/homework-luks.c index bffd75bdd0..97269db80d 100644 --- a/src/home/homework-luks.c +++ b/src/home/homework-luks.c @@ -14,6 +14,7 @@ #include "sd-daemon.h" #include "sd-device.h" #include "sd-event.h" +#include "sd-id128.h" #include "blkid-util.h" #include "blockdev-util.h" @@ -34,7 +35,6 @@ #include "home-util.h" #include "homework-luks.h" #include "homework-mount.h" -#include "id128-util.h" #include "io-util.h" #include "keyring-util.h" #include "memory-util.h" @@ -704,7 +704,7 @@ static int luks_validate( if (!pp) return errno > 0 ? -errno : -EIO; - if (id128_equal_string(blkid_partition_get_type_string(pp), GPT_USER_HOME) <= 0) + if (sd_id128_string_equal(blkid_partition_get_type_string(pp), GPT_USER_HOME) <= 0) continue; if (!streq_ptr(blkid_partition_get_name(pp), label)) diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index c18ac52766..87a2897eea 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -783,6 +783,8 @@ LIBSYSTEMD_252 { global: sd_bus_error_setfv; + sd_id128_string_equal; + sd_hwdb_new_from_path; sd_netlink_new_from_fd; diff --git a/src/libsystemd/sd-id128/id128-util.c b/src/libsystemd/sd-id128/id128-util.c index e4a3bbd3eb..1068721dd4 100644 --- a/src/libsystemd/sd-id128/id128-util.c +++ b/src/libsystemd/sd-id128/id128-util.c @@ -206,19 +206,3 @@ int id128_get_product(sd_id128_t *ret) { *ret = uuid; return 0; } - -int id128_equal_string(const char *s, sd_id128_t id) { - sd_id128_t parsed; - int r; - - if (!s) - return false; - - /* Checks if the specified string matches a valid string representation of the specified 128 bit ID/uuid */ - - r = sd_id128_from_string(s, &parsed); - if (r < 0) - return r; - - return sd_id128_equal(parsed, id); -} diff --git a/src/libsystemd/sd-id128/id128-util.h b/src/libsystemd/sd-id128/id128-util.h index 65a278c8ee..17b180c10c 100644 --- a/src/libsystemd/sd-id128/id128-util.h +++ b/src/libsystemd/sd-id128/id128-util.h @@ -34,5 +34,3 @@ extern const struct hash_ops id128_hash_ops; sd_id128_t id128_make_v4_uuid(sd_id128_t id); int id128_get_product(sd_id128_t *ret); - -int id128_equal_string(const char *s, sd_id128_t id); diff --git a/src/libsystemd/sd-id128/sd-id128.c b/src/libsystemd/sd-id128/sd-id128.c index 183d34054d..709c8ffb57 100644 --- a/src/libsystemd/sd-id128/sd-id128.c +++ b/src/libsystemd/sd-id128/sd-id128.c @@ -101,6 +101,22 @@ _public_ int sd_id128_from_string(const char s[], sd_id128_t *ret) { return 0; } +_public_ int sd_id128_string_equal(const char *s, sd_id128_t id) { + sd_id128_t parsed; + int r; + + if (!s) + return false; + + /* Checks if the specified string matches a valid string representation of the specified 128 bit ID/uuid */ + + r = sd_id128_from_string(s, &parsed); + if (r < 0) + return r; + + return sd_id128_equal(parsed, id); +} + _public_ int sd_id128_get_machine(sd_id128_t *ret) { static thread_local sd_id128_t saved_machine_id = {}; int r; diff --git a/src/shared/find-esp.c b/src/shared/find-esp.c index 41eb644aa5..ea27d7911a 100644 --- a/src/shared/find-esp.c +++ b/src/shared/find-esp.c @@ -4,6 +4,7 @@ #include #include "sd-device.h" +#include "sd-id128.h" #include "alloc-util.h" #include "blkid-util.h" @@ -13,7 +14,6 @@ #include "errno-util.h" #include "find-esp.h" #include "gpt.h" -#include "id128-util.h" #include "parse-util.h" #include "path-util.h" #include "stat-util.h" @@ -85,7 +85,7 @@ static int verify_esp_blkid( r = blkid_probe_lookup_value(b, "PART_ENTRY_TYPE", &v, NULL); if (r != 0) return log_error_errno(errno ?: EIO, "Failed to probe partition type UUID of \"%s\": %m", node); - if (id128_equal_string(v, GPT_ESP) <= 0) + if (sd_id128_string_equal(v, GPT_ESP) <= 0) return log_full_errno(searching ? LOG_DEBUG : LOG_ERR, SYNTHETIC_ERRNO(searching ? EADDRNOTAVAIL : ENODEV), "File system \"%s\" has wrong type for an EFI System Partition (ESP).", node); @@ -178,7 +178,7 @@ static int verify_esp_udev( r = sd_device_get_property_value(d, "ID_PART_ENTRY_TYPE", &v); if (r < 0) return log_error_errno(r, "Failed to get device property: %m"); - if (id128_equal_string(v, GPT_ESP) <= 0) + if (sd_id128_string_equal(v, GPT_ESP) <= 0) return log_full_errno(searching ? LOG_DEBUG : LOG_ERR, SYNTHETIC_ERRNO(searching ? EADDRNOTAVAIL : ENODEV), "File system \"%s\" has wrong type for an EFI System Partition (ESP).", node); @@ -510,7 +510,7 @@ static int verify_xbootldr_blkid( r = blkid_probe_lookup_value(b, "PART_ENTRY_TYPE", &v, NULL); if (r != 0) return log_error_errno(errno ?: SYNTHETIC_ERRNO(EIO), "%s: Failed to probe PART_ENTRY_TYPE: %m", node); - if (id128_equal_string(v, GPT_XBOOTLDR) <= 0) + if (sd_id128_string_equal(v, GPT_XBOOTLDR) <= 0) return log_full_errno(searching ? LOG_DEBUG : LOG_ERR, searching ? SYNTHETIC_ERRNO(EADDRNOTAVAIL) : SYNTHETIC_ERRNO(ENODEV), "%s: Partitition has wrong PART_ENTRY_TYPE=%s for XBOOTLDR partition.", node, v); @@ -576,7 +576,7 @@ static int verify_xbootldr_udev( if (r < 0) return log_device_error_errno(d, r, "Failed to query ID_PART_ENTRY_TYPE: %m"); - r = id128_equal_string(v, GPT_XBOOTLDR); + r = sd_id128_string_equal(v, GPT_XBOOTLDR); if (r < 0) return log_device_error_errno(d, r, "Failed to parse ID_PART_ENTRY_TYPE=%s: %m", v); if (r == 0) diff --git a/src/systemd/sd-id128.h b/src/systemd/sd-id128.h index cf87e8820f..92682166d7 100644 --- a/src/systemd/sd-id128.h +++ b/src/systemd/sd-id128.h @@ -119,6 +119,8 @@ _sd_pure_ static __inline__ int sd_id128_equal(sd_id128_t a, sd_id128_t b) { return memcmp(&a, &b, 16) == 0; } +int sd_id128_string_equal(const char *s, sd_id128_t id); + _sd_pure_ static __inline__ int sd_id128_is_null(sd_id128_t a) { return a.qwords[0] == 0 && a.qwords[1] == 0; } From d13f105165538ca7976eae93b44719ecb7ae5b76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 13 Jun 2022 10:38:14 +0200 Subject: [PATCH 12/23] man: rework the text in sd-id128 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In places the text was overly formal, e.g. "an 128-bit ID" was repeated, even though it is clear from the context that we're talking about this type of ID. OTOH, in other places the text was informal, e.g. "You can use …". Also, "you may use f() to frob" → "f() frobs". The text without all the flourishes is easier to read. sd_id128_in_set_sentinel() was described only in passing when taking about sd_id128_in_set(), now it gets is own brief paragraph. The synopsis was missing. --- man/sd-id128.xml | 153 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 108 insertions(+), 45 deletions(-) diff --git a/man/sd-id128.xml b/man/sd-id128.xml index b6e50a559e..566cc2b595 100644 --- a/man/sd-id128.xml +++ b/man/sd-id128.xml @@ -40,6 +40,69 @@ #include <systemd/sd-id128.h> + + + SD_ID128_ALLF + + + SD_ID128_NULL + + + SD_ID128_CONST_STR(id) + + + SD_ID128_FORMAT_STR + + + SD_ID128_FORMAT_VAL(id) + + + SD_ID128_MAKE(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, vA, vB, vC, vD, vE, vF) + + + SD_ID128_MAKE_STR(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, vA, vB, vC, vD, vE, vF) + + + SD_ID128_MAKE_UUID_STR(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, vA, vB, vC, vD, vE, vF) + + + SD_ID128_UUID_FORMAT_STR + + + + int sd_id128_equal + sd_id128_t a + sd_id128_t b + + + + int sd_id128_is_null + sd_id128_t id + + + + int sd_id128_is_allf + sd_id128_t id + + + + int sd_id128_in_setv + sd_id128_t id + va_list ap + + + + int sd_id128_in_set_sentinel + sd_id128_t id + + SD_ID128_NULL + + + + int sd_id128_in_set + sd_id128_t id + + @@ -51,20 +114,13 @@ Description - sd-id128.h provides APIs to process and generate 128-bit ID values. The - 128-bit ID values processed and generated by these APIs are a generalization of OSF UUIDs as defined by - RFC 4122 but use a simpler string format. These - functions impose no structure on the used IDs, much unlike OSF UUIDs or Microsoft GUIDs, but are mostly - compatible with those types of IDs. + sd-id128.h provides APIs to generate, convert, and compare 128-bit ID values. + The 128-bit ID values processed and generated by these APIs are a generalization of OSF UUIDs as defined + by RFC 4122 but use a simpler string format. + These functions impose no structure on the used IDs, much unlike OSF UUIDs or Microsoft GUIDs, but are + mostly compatible with those types of IDs. - See - sd_id128_to_string3, - sd_id128_randomize3 - and - sd_id128_get_machine3 - for more information about the implemented functions. - A 128-bit ID is implemented as the following union type: @@ -73,30 +129,28 @@ uint64_t qwords[2]; } sd_id128_t; - This union type allows accessing the 128-bit ID as 16 - separate bytes or two 64-bit words. It is generally safer to - access the ID components by their 8-bit array to avoid endianness - issues. This union is intended to be passed call-by-value (as - opposed to call-by-reference) and may be directly manipulated by + This union type allows accessing the 128-bit ID as 16 separate bytes or two 64-bit words. It is + generally safer to access the ID components by their 8-bit array to avoid endianness issues. This union + is intended to be passed by value (as opposed to pass-by-reference) and may be directly manipulated by clients. A couple of macros are defined to denote and decode 128-bit IDs: - SD_ID128_MAKE() may be used to denote a - constant 128-bit ID in source code. A commonly used idiom is to - assign a name to a 128-bit ID using this macro: + SD_ID128_MAKE() is used to write a constant ID in source code. A commonly used + idiom is to assign a name to an ID using this macro: #define SD_MESSAGE_COREDUMP SD_ID128_MAKE(fc,2e,22,bc,6e,e6,47,b6,b9,07,29,ab,34,a2,50,b1) - SD_ID128_NULL may be used to refer to the 128-bit ID consisting of only - NUL bytes (i.e. all bits off). + SD_ID128_NULL defines an ID consisting of only NUL bytes + (i.e. all bits off). - SD_ID128_ALLF may be used to refer to the 128-bit ID consisting of only - 0xFF bytes (i.e. all bits on). + SD_ID128_ALLF defines an ID consisting of only 0xFF bytes + (i.e. all bits on). - SD_ID128_MAKE_STR() is similar to SD_ID128_MAKE(), but creates a - const char* expression that can be conveniently used in message formats and such: + SD_ID128_MAKE_STR() is similar to SD_ID128_MAKE(), but + creates a const char* expression that can be conveniently used in message formats and + such: #include <stdio.h> #define SD_MESSAGE_COREDUMP_STR SD_ID128_MAKE_STR(fc,2e,22,bc,6e,e6,47,b6,b9,07,29,ab,34,a2,50,b1) @@ -105,18 +159,16 @@ int main(int argc, char **argv) { puts("Match for coredumps: MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR); } - SD_ID128_CONST_STR() may be used to - convert constant 128-bit IDs into constant strings for output. The - following example code will output the string - "fc2e22bc6ee647b6b90729ab34a250b1": + SD_ID128_CONST_STR() converts constant IDs into constant strings for + output. The following example code will output the string "fc2e22bc6ee647b6b90729ab34a250b1": int main(int argc, char *argv[]) { puts("Match for coredumps: %s", SD_ID128_CONST_STR(SD_MESSAGE_COREDUMP)); } - SD_ID128_FORMAT_STR and SD_ID128_FORMAT_VAL() may - be used to format a 128-bit ID in a - printf3 - format string, as shown in the following example: + SD_ID128_FORMAT_STR and SD_ID128_FORMAT_VAL() is used to + format an ID in a printf3 format + string, as shown in the following example: int main(int argc, char *argv[]) { sd_id128_t id; @@ -136,7 +188,7 @@ int main(int argc, char **argv) { best to avoid UUIDs of other variants, in order to avoid unnecessary ambiguities. All 128-bit IDs generated by the sd-id128 APIs strictly conform to Variant 1 Version 4 UUIDs, as per RFC 4122. - Use sd_id128_equal() to compare two 128-bit IDs: + sd_id128_equal() compares two 128-bit IDs: int main(int argc, char *argv[]) { sd_id128_t a, b, c; @@ -148,18 +200,22 @@ int main(int argc, char **argv) { return 0; } - Use sd_id128_is_null() to check if an 128-bit ID consists of only - NUL bytes: + sd_id128_is_null() checks if an ID consists of only NUL + bytes: assert(sd_id128_is_null(SD_ID128_NULL)); - Similarly, use sd_id128_is_allf() to check if an 128-bit ID consists of only + Similarly, sd_id128_is_allf() checks if an ID consists of only 0xFF bytes (all bits on): assert(sd_id128_is_allf(SD_ID128_ALLF)); - For convenience, sd_id128_in_set() takes a list of IDs and - returns true if any are equal to the first argument: + sd_id128_in_set_sentinel() takes a list of IDs and returns true if the first + argument is equal to any of the subsequent arguments. The argument list is terminated by an + SD_ID128_NULL sentinel, which must be present. + + sd_id128_in_set() is a convenience function that takes a list of IDs and + returns true if the first argument is equal to any of the subsequent arguments: int main(int argc, char *argv[]) { sd_id12_t a = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07); @@ -175,18 +231,25 @@ int main(int argc, char **argv) { sd_id128_in_set() is defined as a macro over - sd_id128_in_set_sentinel(), adding the SD_ID128_NULL - sentinel. Since sd_id128_in_set_sentinel() uses SD_ID128_NULL - as the sentinel, SD_ID128_NULL cannot be otherwise placed in the argument list. - + sd_id128_in_set_sentinel(), adding the SD_ID128_NULL sentinel + automatically. Since sd_id128_in_set_sentinel() uses + SD_ID128_NULL as the sentinel, SD_ID128_NULL cannot be + otherwise placed in the argument list. sd_id128_in_setv() is similar to sd_id128_in_set_sentinel(), but takes a struct varargs argument. - Note that new, randomized IDs may be generated with + New randomized IDs may be generated with systemd-id1281's new command. + + See + sd_id128_to_string3, + sd_id128_randomize3 + and + sd_id128_get_machine3 + for information about other implemented functions. From 944c1243307ce002be2b297c45c59cb8d2c13c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 13 Jun 2022 11:02:54 +0200 Subject: [PATCH 13/23] man: document sd_id128_string_equal() --- man/rules/meson.build | 1 + man/sd-id128.xml | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/man/rules/meson.build b/man/rules/meson.build index 48da2f8f8c..b1d1c5d595 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -137,6 +137,7 @@ manpages = [ 'sd_id128_in_setv', 'sd_id128_is_allf', 'sd_id128_is_null', + 'sd_id128_string_equal', 'sd_id128_t'], ''], ['sd-journal', '3', [], ''], diff --git a/man/sd-id128.xml b/man/sd-id128.xml index 566cc2b595..c869943ad7 100644 --- a/man/sd-id128.xml +++ b/man/sd-id128.xml @@ -28,6 +28,7 @@ SD_ID128_NULL SD_ID128_UUID_FORMAT_STR sd_id128_equal + sd_id128_string_equal sd_id128_in_set sd_id128_in_set_sentinel sd_id128_in_setv @@ -75,6 +76,12 @@ sd_id128_t b + + int sd_id128_string_equal + const char *a + sd_id128_t b + + int sd_id128_is_null sd_id128_t id @@ -200,6 +207,10 @@ int main(int argc, char **argv) { return 0; } + sd_id128_string_equal() is similar to sd_id128_equal(), + but the first ID is formatted as const char*. The same restrictions apply as to the first + argument of sd_id128_from_string(). + sd_id128_is_null() checks if an ID consists of only NUL bytes: From cf2edf1d5cb9611c53d08b1f04059b2265c0578c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 13 Jun 2022 11:17:17 +0200 Subject: [PATCH 14/23] sd-bus: export sd_bus_message_read_strv_extend() The same story as before: it's a useful helper, other uses of the library are likely to find it useful. --- src/libsystemd/libsystemd.sym | 1 + src/libsystemd/sd-bus/bus-message.c | 4 ++-- src/libsystemd/sd-bus/bus-message.h | 1 - src/shared/bus-map-properties.c | 4 ++-- src/systemd/sd-bus.h | 1 + 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index 87a2897eea..cb27f17c56 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -781,6 +781,7 @@ global: LIBSYSTEMD_252 { global: + sd_bus_message_read_strv_extend; sd_bus_error_setfv; sd_id128_string_equal; diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c index 674884a3c8..d9c52d64c0 100644 --- a/src/libsystemd/sd-bus/bus-message.c +++ b/src/libsystemd/sd-bus/bus-message.c @@ -4256,7 +4256,7 @@ int bus_message_get_blob(sd_bus_message *m, void **buffer, size_t *sz) { return 0; } -int bus_message_read_strv_extend(sd_bus_message *m, char ***l) { +_public_ int sd_bus_message_read_strv_extend(sd_bus_message *m, char ***l) { char type; const char *contents, *s; int r; @@ -4299,7 +4299,7 @@ _public_ int sd_bus_message_read_strv(sd_bus_message *m, char ***l) { assert_return(m->sealed, -EPERM); assert_return(l, -EINVAL); - r = bus_message_read_strv_extend(m, &strv); + r = sd_bus_message_read_strv_extend(m, &strv); if (r <= 0) return r; diff --git a/src/libsystemd/sd-bus/bus-message.h b/src/libsystemd/sd-bus/bus-message.h index b51fb896ed..0439fbd45a 100644 --- a/src/libsystemd/sd-bus/bus-message.h +++ b/src/libsystemd/sd-bus/bus-message.h @@ -159,7 +159,6 @@ static inline void* BUS_MESSAGE_FIELDS(sd_bus_message *m) { } int bus_message_get_blob(sd_bus_message *m, void **buffer, size_t *sz); -int bus_message_read_strv_extend(sd_bus_message *m, char ***l); int bus_message_from_malloc( sd_bus *bus, diff --git a/src/shared/bus-map-properties.c b/src/shared/bus-map-properties.c index 84608567aa..e5e8933963 100644 --- a/src/shared/bus-map-properties.c +++ b/src/shared/bus-map-properties.c @@ -30,7 +30,7 @@ int bus_map_strv_sort(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus char ***p = userdata; int r; - r = bus_message_read_strv_extend(m, &l); + r = sd_bus_message_read_strv_extend(m, &l); if (r < 0) return r; @@ -75,7 +75,7 @@ static int map_basic(sd_bus *bus, const char *member, sd_bus_message *m, unsigne _cleanup_strv_free_ char **l = NULL; char ***p = userdata; - r = bus_message_read_strv_extend(m, &l); + r = sd_bus_message_read_strv_extend(m, &l); if (r < 0) return r; diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index b3453471ab..12168a22a2 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -330,6 +330,7 @@ int sd_bus_message_readv(sd_bus_message *m, const char *types, va_list ap); int sd_bus_message_read_basic(sd_bus_message *m, char type, void *p); int sd_bus_message_read_array(sd_bus_message *m, char type, const void **ptr, size_t *size); int sd_bus_message_read_strv(sd_bus_message *m, char ***l); /* free the result! */ +int sd_bus_message_read_strv_extend(sd_bus_message *m, char ***l); int sd_bus_message_skip(sd_bus_message *m, const char *types); int sd_bus_message_enter_container(sd_bus_message *m, char type, const char *contents); int sd_bus_message_exit_container(sd_bus_message *m); From 85f8afb7065451e20e9105e56b8e427210a59119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 13 Jun 2022 11:17:33 +0200 Subject: [PATCH 15/23] man: document sd_bus_message_read_strv_extend() --- man/rules/meson.build | 2 +- man/sd_bus_message_read_strv.xml | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/man/rules/meson.build b/man/rules/meson.build index b1d1c5d595..277ab5e593 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -361,7 +361,7 @@ manpages = [ ''], ['sd_bus_message_read_array', '3', [], ''], ['sd_bus_message_read_basic', '3', [], ''], - ['sd_bus_message_read_strv', '3', [], ''], + ['sd_bus_message_read_strv', '3', ['sd_bus_message_read_strv_extend'], ''], ['sd_bus_message_rewind', '3', [], ''], ['sd_bus_message_seal', '3', [], ''], ['sd_bus_message_sensitive', '3', [], ''], diff --git a/man/sd_bus_message_read_strv.xml b/man/sd_bus_message_read_strv.xml index 50580d86bc..6f46c18e09 100644 --- a/man/sd_bus_message_read_strv.xml +++ b/man/sd_bus_message_read_strv.xml @@ -17,6 +17,7 @@ sd_bus_message_read_strv + sd_bus_message_read_strv_extend Access an array of strings in a message @@ -30,26 +31,39 @@ sd_bus_message *m char ***l + + + int sd_bus_message_read_strv_extend + sd_bus_message *m + char ***l + Description - sd_bus_message_read_strv() gives access to an array of string-like items in + sd_bus_message_read_strv() reads an array of string-like items from the message m. The "read pointer" in the message must be right before an array of strings (D-Bus type as), object paths (D-Bus type ao), or signatures (D-Bus type ag). On success, a pointer to a - NULL-terminated array of strings is returned in the output parameter + NULL-terminated array of strings (strv) is returned in the output parameter l. Note that ownership of this array is transferred to the caller. Hence, the caller is responsible for freeing this array and its contents. + + sd_bus_message_read_strv_extend() is similar, but the second parameter is an + input-output parameter. If *l is NULL, if behaves identically + to sd_bus_message_read_strv(). Otherwise, *l must point to a + strv, which will be reallocated and extended with additional strings. This function is particularly + useful when combining multiple lists of strings in a message or messages into a single array of strings. + Return Value - On success, sd_bus_message_read_strv() returns a non-negative integer. On - failure, it returns a negative errno-style error code. + On success, these functions return a non-negative integer. On failure, they return a negative + errno-style error code. Errors From 7d9337ed77b08ee691568172e7c074d2b5d8e15e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 23 Jun 2022 12:56:34 +0200 Subject: [PATCH 16/23] sd-netlink: allow sd_netlink_message_read() to be used for union types Before, sd_netlink_message_read() expected to fill a buffer completely, and would return -EIO if the attribute being read was shorter than the buffer. This means that the function can be used to "peek" into attributes (by specifying a short buffer to just read part of the attribute), but cannot be used to read something into a union without knowing beforehand which specific field in the union is being filled. That latter operation seems more useful (messages are short, so we don't really need to do partial reads), so let's allow reads that don't fill the output buffer completely. --- src/libsystemd/sd-netlink/netlink-message.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c index dafc16f258..34b4c23bd5 100644 --- a/src/libsystemd/sd-netlink/netlink-message.c +++ b/src/libsystemd/sd-netlink/netlink-message.c @@ -741,11 +741,11 @@ _public_ int sd_netlink_message_read(sd_netlink_message *m, unsigned short type, if (r < 0) return r; - if ((size_t) r < size) - return -EIO; + if ((size_t) r > size) + return -ENOBUFS; if (data) - memcpy(data, attr_data, size); + memcpy(data, attr_data, r); return r; } From 71193c0b629c76ec511dd222d6b68a52c4df132d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 14 Jun 2022 14:37:21 +0200 Subject: [PATCH 17/23] sd-event: allow sd_event_source_is_enabled() to return false for NULL This is a natural use case, and instead of defining a wrapper to do this for us, let's just make this part of the API. Calling with NULL was not allowed, so this is not a breaking change to the interface. (After sd_event_source_is_enabled was originally added, we introduced sd_event_source_disable_unref() and other similar functions which accept NULL. So not accepting NULL here is likely to confuse people. Let's just make the API usable with minimal fuss.) --- man/sd_event_source_set_enabled.xml | 16 +++++++++------- src/journal/managed-journal-file.c | 9 +++------ src/libsystemd/sd-event/event-util.c | 7 ------- src/libsystemd/sd-event/event-util.h | 1 - src/libsystemd/sd-event/sd-event.c | 4 ++++ src/network/netdev/wireguard.c | 2 +- 6 files changed, 17 insertions(+), 22 deletions(-) diff --git a/man/sd_event_source_set_enabled.xml b/man/sd_event_source_set_enabled.xml index c8ae169c17..d6cdf85eda 100644 --- a/man/sd_event_source_set_enabled.xml +++ b/man/sd_event_source_set_enabled.xml @@ -68,13 +68,15 @@ loop wakeups and will not be dispatched, until they are enabled again. - sd_event_source_get_enabled() may be - used to query whether the event source object - source is currently enabled or not. It - returns the enablement state (one of SD_EVENT_ON, - SD_EVENT_OFF, SD_EVENT_ONESHOT) - in enabled, if it is not NULL. - It also returns true if the event source is not disabled. + sd_event_source_get_enabled() may be used to query whether the event source + object source is currently enabled or not. If both the + source and the output parameter enabled are + NULL, this function returns false. Otherwise, source must be + a valid pointer to an sd_event_source object. If the output parameter + enabled is not NULL, it is set to the enablement state (one + of SD_EVENT_ON, SD_EVENT_OFF, + SD_EVENT_ONESHOT). The function also returns true if the event source is not + disabled. Event source objects are enabled when they are first created with calls such as diff --git a/src/journal/managed-journal-file.c b/src/journal/managed-journal-file.c index 5c34d14ddc..2672679458 100644 --- a/src/journal/managed-journal-file.c +++ b/src/journal/managed-journal-file.c @@ -375,12 +375,9 @@ ManagedJournalFile* managed_journal_file_close(ManagedJournalFile *f) { } #endif - if (f->file->post_change_timer) { - if (sd_event_source_get_enabled(f->file->post_change_timer, NULL) > 0) - journal_file_post_change(f->file); - - sd_event_source_disable_unref(f->file->post_change_timer); - } + if (sd_event_source_get_enabled(f->file->post_change_timer, NULL) > 0) + journal_file_post_change(f->file); + sd_event_source_disable_unref(f->file->post_change_timer); managed_journal_file_set_offline(f, true); diff --git a/src/libsystemd/sd-event/event-util.c b/src/libsystemd/sd-event/event-util.c index 8c24e7db63..3a7afe9ae3 100644 --- a/src/libsystemd/sd-event/event-util.c +++ b/src/libsystemd/sd-event/event-util.c @@ -116,13 +116,6 @@ int event_source_disable(sd_event_source *s) { return sd_event_source_set_enabled(s, SD_EVENT_OFF); } -int event_source_is_enabled(sd_event_source *s) { - if (!s) - return false; - - return sd_event_source_get_enabled(s, NULL); -} - int event_add_time_change(sd_event *e, sd_event_source **ret, sd_event_io_handler_t callback, void *userdata) { _cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL; _cleanup_close_ int fd = -1; diff --git a/src/libsystemd/sd-event/event-util.h b/src/libsystemd/sd-event/event-util.h index abd043bdcc..7bab42ed8f 100644 --- a/src/libsystemd/sd-event/event-util.h +++ b/src/libsystemd/sd-event/event-util.h @@ -28,6 +28,5 @@ int event_reset_time_relative( const char *description, bool force_reset); int event_source_disable(sd_event_source *s); -int event_source_is_enabled(sd_event_source *s); int event_add_time_change(sd_event *e, sd_event_source **ret, sd_event_io_handler_t callback, void *userdata); diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index 50f2bb2804..94431d0725 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -2413,6 +2413,10 @@ fail: } _public_ int sd_event_source_get_enabled(sd_event_source *s, int *ret) { + /* Quick mode: the event source doesn't exist and we only want to query boolean enablement state. */ + if (!s && !ret) + return false; + assert_return(s, -EINVAL); assert_return(!event_pid_changed(s->event), -ECHILD); diff --git a/src/network/netdev/wireguard.c b/src/network/netdev/wireguard.c index 2667a9fb2a..99ec09c641 100644 --- a/src/network/netdev/wireguard.c +++ b/src/network/netdev/wireguard.c @@ -405,7 +405,7 @@ static int peer_resolve_endpoint(WireguardPeer *peer) { /* Not necessary to resolve the endpoint. */ return 0; - if (event_source_is_enabled(peer->resolve_retry_event_source) > 0) + if (sd_event_source_get_enabled(peer->resolve_retry_event_source, NULL) > 0) /* Timer event source is enabled. The endpoint will be resolved later. */ return 0; From 7e922b05844fd3c4db51b565c1b946eb2f92f0fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 14 Jun 2022 14:40:30 +0200 Subject: [PATCH 18/23] sd-event: let sd_event_source_set_enabled accept NULL Same story as before: disabling a non-existent event source shouldn't need to be guarded by an if. I retained the wrapper so that that we don't have to say SD_EVENT_OFF in the many places where this is called. --- man/sd_event_source_set_enabled.xml | 19 +++++++++---------- src/libsystemd/sd-event/event-util.c | 7 ------- src/libsystemd/sd-event/event-util.h | 4 +++- src/libsystemd/sd-event/sd-event.c | 7 ++++++- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/man/sd_event_source_set_enabled.xml b/man/sd_event_source_set_enabled.xml index d6cdf85eda..5f13fc101d 100644 --- a/man/sd_event_source_set_enabled.xml +++ b/man/sd_event_source_set_enabled.xml @@ -53,16 +53,15 @@ Description - sd_event_source_set_enabled() may be - used to enable or disable the event source object specified as - source. The enabled - parameter takes one of SD_EVENT_ON (to - enable), SD_EVENT_OFF (to disable) or - SD_EVENT_ONESHOT. If invoked with - SD_EVENT_ONESHOT the event source will be - enabled but automatically reset to - SD_EVENT_OFF after the event source was - dispatched once. + sd_event_source_set_enabled() may be used to enable or disable the event + source object specified as source. The enabled parameter + takes one of SD_EVENT_ON (to enable), SD_EVENT_OFF (to disable) + or SD_EVENT_ONESHOT. If invoked with SD_EVENT_ONESHOT the event + source will be enabled but automatically reset to SD_EVENT_OFF after one dispatch. + For SD_EVENT_OFF, the event source source may be + NULL, in which case the function does nothing. Otherwise, + source must be a valid pointer to an sd_event_source + object. Event sources that are disabled will not result in event loop wakeups and will not be dispatched, until they are enabled diff --git a/src/libsystemd/sd-event/event-util.c b/src/libsystemd/sd-event/event-util.c index 3a7afe9ae3..a36eba9029 100644 --- a/src/libsystemd/sd-event/event-util.c +++ b/src/libsystemd/sd-event/event-util.c @@ -109,13 +109,6 @@ int event_reset_time_relative( return event_reset_time(e, s, clock, usec_add(usec_now, usec), accuracy, callback, userdata, priority, description, force_reset); } -int event_source_disable(sd_event_source *s) { - if (!s) - return 0; - - return sd_event_source_set_enabled(s, SD_EVENT_OFF); -} - int event_add_time_change(sd_event *e, sd_event_source **ret, sd_event_io_handler_t callback, void *userdata) { _cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL; _cleanup_close_ int fd = -1; diff --git a/src/libsystemd/sd-event/event-util.h b/src/libsystemd/sd-event/event-util.h index 7bab42ed8f..c185584412 100644 --- a/src/libsystemd/sd-event/event-util.h +++ b/src/libsystemd/sd-event/event-util.h @@ -27,6 +27,8 @@ int event_reset_time_relative( int64_t priority, const char *description, bool force_reset); -int event_source_disable(sd_event_source *s); +static inline int event_source_disable(sd_event_source *s) { + return sd_event_source_set_enabled(s, SD_EVENT_OFF); +} int event_add_time_change(sd_event *e, sd_event_source **ret, sd_event_io_handler_t callback, void *userdata); diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index 94431d0725..cea1c009d6 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -2594,8 +2594,13 @@ static int event_source_online( _public_ int sd_event_source_set_enabled(sd_event_source *s, int m) { int r; - assert_return(s, -EINVAL); assert_return(IN_SET(m, SD_EVENT_OFF, SD_EVENT_ON, SD_EVENT_ONESHOT), -EINVAL); + + /* Quick mode: if the source doesn't exist, SD_EVENT_OFF is a noop. */ + if (m == SD_EVENT_OFF && !s) + return 0; + + assert_return(s, -EINVAL); assert_return(!event_pid_changed(s->event), -ECHILD); /* If we are dead anyway, we are fine with turning off sources, but everything else needs to fail. */ From 628f7b1e706907d2520b3e51878bce3c787613c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 15 Jun 2022 10:25:08 +0200 Subject: [PATCH 19/23] sd-bus: use assert_return() in public function sd_bus_message_dump Also, document that NULL is allowed. --- man/sd_bus_message_dump.xml | 7 ++++--- src/libsystemd/sd-bus/bus-dump.c | 3 ++- src/systemd/sd-bus.h | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/man/sd_bus_message_dump.xml b/man/sd_bus_message_dump.xml index eac0541ca4..83a4a4e31a 100644 --- a/man/sd_bus_message_dump.xml +++ b/man/sd_bus_message_dump.xml @@ -44,9 +44,10 @@ Description The sd_bus_message_dump() function writes a textual representation of the - message m to the stream f. This function is intended to be - used for debugging purposes, and the output is neither stable nor designed to be machine readable. - + message m to the stream f. If f is + NULL, standard output (stdio) will be used. This function is + intended to be used for debugging purposes, and the output is neither stable nor designed to be machine + readable. The flags parameter may be used to modify the output. With SD_BUS_MESSAGE_DUMP_WITH_HEADER, a header that specifies the message type and flags diff --git a/src/libsystemd/sd-bus/bus-dump.c b/src/libsystemd/sd-bus/bus-dump.c index d67a170a2d..73939d8f7a 100644 --- a/src/libsystemd/sd-bus/bus-dump.c +++ b/src/libsystemd/sd-bus/bus-dump.c @@ -50,7 +50,8 @@ _public_ int sd_bus_message_dump(sd_bus_message *m, FILE *f, uint64_t flags) { unsigned level = 1; int r; - assert(m); + assert_return(m, -EINVAL); + assert_return((flags & ~_SD_BUS_MESSAGE_DUMP_KNOWN_FLAGS) == 0, -EINVAL); if (!f) f = stdout; diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index 12168a22a2..74bc56b427 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -102,7 +102,8 @@ __extension__ enum { __extension__ enum { SD_BUS_MESSAGE_DUMP_WITH_HEADER = 1ULL << 0, - SD_BUS_MESSAGE_DUMP_SUBTREE_ONLY = 1ULL << 1 + SD_BUS_MESSAGE_DUMP_SUBTREE_ONLY = 1ULL << 1, + _SD_BUS_MESSAGE_DUMP_KNOWN_FLAGS = SD_BUS_MESSAGE_DUMP_WITH_HEADER | SD_BUS_MESSAGE_DUMP_SUBTREE_ONLY }; /* Callbacks */ From 2c4ccaefc2772bd47797c35806a24f9f010c17ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 17 Jun 2022 15:14:31 +0200 Subject: [PATCH 20/23] sd-bus: indentation --- src/libsystemd/sd-bus/sd-bus.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 13ff6bcb1f..a4d3f479c9 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -505,15 +505,15 @@ static int synthesize_connected_signal(sd_bus *bus) { } void bus_set_state(sd_bus *bus, enum bus_state state) { - static const char * const table[_BUS_STATE_MAX] = { - [BUS_UNSET] = "UNSET", - [BUS_WATCH_BIND] = "WATCH_BIND", - [BUS_OPENING] = "OPENING", + static const char* const table[_BUS_STATE_MAX] = { + [BUS_UNSET] = "UNSET", + [BUS_WATCH_BIND] = "WATCH_BIND", + [BUS_OPENING] = "OPENING", [BUS_AUTHENTICATING] = "AUTHENTICATING", - [BUS_HELLO] = "HELLO", - [BUS_RUNNING] = "RUNNING", - [BUS_CLOSING] = "CLOSING", - [BUS_CLOSED] = "CLOSED", + [BUS_HELLO] = "HELLO", + [BUS_RUNNING] = "RUNNING", + [BUS_CLOSING] = "CLOSING", + [BUS_CLOSED] = "CLOSED", }; assert(bus); From 78cca583fee7cf01bef610d0077e2008ed3416e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 22 Jun 2022 10:47:28 +0200 Subject: [PATCH 21/23] =?UTF-8?q?sd-netlink:=20rename=20sd=5Fnetlink=5Finc?= =?UTF-8?q?=5Frcvbuf=20=E2=86=92=20sd=5Fnetlink=5Fincrease=5Frxbuf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We have RxBufferSize= and TxBufferSize= in .link files. Let's use the same abbreviation here. OTOH, "inc" could be short for "increment" or "increase", let's avoid that. --- src/libsystemd/libsystemd.sym | 2 +- src/libsystemd/sd-netlink/sd-netlink.c | 2 +- src/network/networkctl.c | 2 +- src/network/networkd-manager.c | 4 ++-- src/systemd/sd-netlink.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index cb27f17c56..24dfee7095 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -791,7 +791,7 @@ global: sd_netlink_new_from_fd; sd_netlink_open; sd_netlink_open_fd; - sd_netlink_inc_rcvbuf; + sd_netlink_increase_rxbuf; sd_netlink_ref; sd_netlink_unref; sd_netlink_send; diff --git a/src/libsystemd/sd-netlink/sd-netlink.c b/src/libsystemd/sd-netlink/sd-netlink.c index 5afe04c3a3..7b1a77d29a 100644 --- a/src/libsystemd/sd-netlink/sd-netlink.c +++ b/src/libsystemd/sd-netlink/sd-netlink.c @@ -136,7 +136,7 @@ _public_ int sd_netlink_open(sd_netlink **ret) { return netlink_open_family(ret, NETLINK_ROUTE); } -_public_ int sd_netlink_inc_rcvbuf(sd_netlink *nl, size_t size) { +_public_ int sd_netlink_increase_rxbuf(sd_netlink *nl, size_t size) { assert_return(nl, -EINVAL); assert_return(!netlink_pid_changed(nl), -ECHILD); diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 95ef31aab6..2f789e773a 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -692,7 +692,7 @@ static void acquire_wlan_link_info(LinkInfo *link) { return; } - (void) sd_netlink_inc_rcvbuf(genl, RCVBUF_SIZE); + (void) sd_netlink_increase_rxbuf(genl, RCVBUF_SIZE); r = wifi_get_interface(genl, link->ifindex, &link->wlan_iftype, &link->ssid); if (r < 0) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 3cda1110b9..d8a18006d3 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -226,7 +226,7 @@ static int manager_connect_genl(Manager *m) { if (r < 0) return r; - r = sd_netlink_inc_rcvbuf(m->genl, RCVBUF_SIZE); + r = sd_netlink_increase_rxbuf(m->genl, RCVBUF_SIZE); if (r < 0) log_warning_errno(r, "Failed to increase receive buffer size for general netlink socket, ignoring: %m"); @@ -298,7 +298,7 @@ static int manager_connect_rtnl(Manager *m) { * case systemd sets the receive buffer size for us, and the value in the .socket unit * should take full effect. */ if (fd < 0) { - r = sd_netlink_inc_rcvbuf(m->rtnl, RCVBUF_SIZE); + r = sd_netlink_increase_rxbuf(m->rtnl, RCVBUF_SIZE); if (r < 0) log_warning_errno(r, "Failed to increase receive buffer size for rtnl socket, ignoring: %m"); } diff --git a/src/systemd/sd-netlink.h b/src/systemd/sd-netlink.h index 38116917ce..dcdf77c4fe 100644 --- a/src/systemd/sd-netlink.h +++ b/src/systemd/sd-netlink.h @@ -43,7 +43,7 @@ typedef _sd_destroy_t sd_netlink_destroy_t; int sd_netlink_new_from_fd(sd_netlink **nl, int fd); int sd_netlink_open(sd_netlink **nl); int sd_netlink_open_fd(sd_netlink **nl, int fd); -int sd_netlink_inc_rcvbuf(sd_netlink *nl, const size_t size); +int sd_netlink_increase_rxbuf(sd_netlink *nl, const size_t size); sd_netlink *sd_netlink_ref(sd_netlink *nl); sd_netlink *sd_netlink_unref(sd_netlink *nl); From 28e7e9347dbe263b2d7287d2d507b3fb054f5d02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 28 Jun 2022 15:17:35 +0200 Subject: [PATCH 22/23] =?UTF-8?q?basic/socket-util:=20rename=20fd=5Finc=5F?= =?UTF-8?q?rcvbuf=20=E2=86=92=C2=A0fd=5Fincrease=5Frxbuf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See previous commit for justification. --- src/basic/socket-util.h | 2 +- src/core/manager.c | 6 +++--- src/libsystemd/sd-bus/bus-socket.c | 2 +- src/libsystemd/sd-netlink/sd-netlink.c | 2 +- src/libsystemd/sd-resolve/sd-resolve.c | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h index fdadc9c686..2e36e1a56b 100644 --- a/src/basic/socket-util.h +++ b/src/basic/socket-util.h @@ -129,7 +129,7 @@ static inline int fd_inc_sndbuf(int fd, size_t n) { return fd_set_sndbuf(fd, n, true); } int fd_set_rcvbuf(int fd, size_t n, bool increase); -static inline int fd_inc_rcvbuf(int fd, size_t n) { +static inline int fd_increase_rxbuf(int fd, size_t n) { return fd_set_rcvbuf(fd, n, true); } diff --git a/src/core/manager.c b/src/core/manager.c index bf9d18e96e..5453e5fa9b 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -1005,7 +1005,7 @@ static int manager_setup_notify(Manager *m) { if (fd < 0) return log_error_errno(errno, "Failed to allocate notification socket: %m"); - fd_inc_rcvbuf(fd, NOTIFY_RCVBUF_SIZE); + fd_increase_rxbuf(fd, NOTIFY_RCVBUF_SIZE); m->notify_socket = path_join(m->prefix[EXEC_DIRECTORY_RUNTIME], "systemd/notify"); if (!m->notify_socket) @@ -1093,7 +1093,7 @@ static int manager_setup_cgroups_agent(Manager *m) { if (fd < 0) return log_error_errno(errno, "Failed to allocate cgroups agent socket: %m"); - fd_inc_rcvbuf(fd, CGROUPS_AGENT_RCVBUF_SIZE); + fd_increase_rxbuf(fd, CGROUPS_AGENT_RCVBUF_SIZE); (void) sockaddr_un_unlink(&sa.un); @@ -1157,7 +1157,7 @@ static int manager_setup_user_lookup_fd(Manager *m) { if (socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, m->user_lookup_fds) < 0) return log_error_errno(errno, "Failed to allocate user lookup socket: %m"); - (void) fd_inc_rcvbuf(m->user_lookup_fds[0], NOTIFY_RCVBUF_SIZE); + (void) fd_increase_rxbuf(m->user_lookup_fds[0], NOTIFY_RCVBUF_SIZE); } if (!m->user_lookup_event_source) { diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c index bf70e19826..2148351952 100644 --- a/src/libsystemd/sd-bus/bus-socket.c +++ b/src/libsystemd/sd-bus/bus-socket.c @@ -608,7 +608,7 @@ void bus_socket_setup(sd_bus *b) { assert(b); /* Increase the buffers to 8 MB */ - (void) fd_inc_rcvbuf(b->input_fd, SNDBUF_SIZE); + (void) fd_increase_rxbuf(b->input_fd, SNDBUF_SIZE); (void) fd_inc_sndbuf(b->output_fd, SNDBUF_SIZE); b->message_version = 1; diff --git a/src/libsystemd/sd-netlink/sd-netlink.c b/src/libsystemd/sd-netlink/sd-netlink.c index 7b1a77d29a..5cb831cb4a 100644 --- a/src/libsystemd/sd-netlink/sd-netlink.c +++ b/src/libsystemd/sd-netlink/sd-netlink.c @@ -140,7 +140,7 @@ _public_ int sd_netlink_increase_rxbuf(sd_netlink *nl, size_t size) { assert_return(nl, -EINVAL); assert_return(!netlink_pid_changed(nl), -ECHILD); - return fd_inc_rcvbuf(nl->fd, size); + return fd_increase_rxbuf(nl->fd, size); } static sd_netlink *netlink_free(sd_netlink *nl) { diff --git a/src/libsystemd/sd-resolve/sd-resolve.c b/src/libsystemd/sd-resolve/sd-resolve.c index fdc09ff20f..e4d43e7558 100644 --- a/src/libsystemd/sd-resolve/sd-resolve.c +++ b/src/libsystemd/sd-resolve/sd-resolve.c @@ -506,9 +506,9 @@ _public_ int sd_resolve_new(sd_resolve **ret) { resolve->fds[i] = fd_move_above_stdio(resolve->fds[i]); (void) fd_inc_sndbuf(resolve->fds[REQUEST_SEND_FD], QUERIES_MAX * BUFSIZE); - (void) fd_inc_rcvbuf(resolve->fds[REQUEST_RECV_FD], QUERIES_MAX * BUFSIZE); + (void) fd_increase_rxbuf(resolve->fds[REQUEST_RECV_FD], QUERIES_MAX * BUFSIZE); (void) fd_inc_sndbuf(resolve->fds[RESPONSE_SEND_FD], QUERIES_MAX * BUFSIZE); - (void) fd_inc_rcvbuf(resolve->fds[RESPONSE_RECV_FD], QUERIES_MAX * BUFSIZE); + (void) fd_increase_rxbuf(resolve->fds[RESPONSE_RECV_FD], QUERIES_MAX * BUFSIZE); (void) fd_nonblock(resolve->fds[RESPONSE_RECV_FD], true); From e1c52cb27159ac7200ce6246bbd1a38b2d2e4e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 17 Jun 2022 15:14:44 +0200 Subject: [PATCH 23/23] docs/ARCHITECTURE: mention src/fundamental/ and add more details --- docs/ARCHITECTURE.md | 62 ++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 46d1d83d78..aaa3d86267 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -9,8 +9,8 @@ SPDX-License-Identifier: LGPL-2.1-or-later ## Code Map -This section will attempt to provide a high-level overview of the various -components of the systemd repository. +This document provides a high-level overview of the various components of the +systemd repository. ## Source Code @@ -21,30 +21,60 @@ names are self-explanatory. ### Shared Code -You might wonder what kind of common code belongs in `src/shared/` and what -belongs in `src/basic/`. The split is like this: anything that is used to -implement the public shared objects we provide (`sd-bus`, `sd-login`, -`sd-id128`, `nss-systemd`, `nss-mymachines`, `nss-resolve`, `nss-myhostname`, -`pam_systemd`), must be located in `src/basic` (those objects are not allowed -to link to `libsystemd-shared.so`). Conversely, anything which is shared -between multiple components and does not need to be in `src/basic/`, should be -in `src/shared/`. +The code that is shared between components is split into a few directories, +each with a different purpose: + +- `src/basic/` and `src/fundamental/` — those directories contain code + primitives that are used by all other code. `src/fundamental/` is stricter, + because it used for EFI and user-space code, while `src/basic/` is only used + for user-space code. The code in `src/fundamental/` cannot depend on any + other code in the tree, and `src/basic/` can depend only on itself and + `src/fundamental/`. For user-space, a static library is built from this code + and linked statically in various places. + +- `src/libsystemd/` implements the `libsystemd.so` shared library (also + available as static `libsystemd.a`). This code may use anything in + `src/basic/` or `src/fundamental/`. + +- `src/shared/` provides various utilities and code shared between other + components that is exposed as the `libsystemd-shared-.so` shared library. + +The other subdirectories implement individual components. They may depend only +on `src/fundamental/` + `src/basic/`, or also on `src/libsystemd/`, or also on +`src/shared/`. + +You might wonder what kind of code belongs where. In general, the rule is that +code should linked as few times as possible, ideally only once. Thus code that +is used by "higher-level" components (e.g. our binaries which are linked to +`libsystemd-shared-.so`), would go to a subdirectory specific to that +component if it is only used there. If the code is to be shared between +components, it'd go to `src/shared/`. Shared code that that is used by multiple +components that do not link to `libsystemd-shared-.so` may live either in +`src/libsystemd/`, `src/basic/`, or `src/fundamental/`. Any code that is used +only for EFI goes under `src/boot/efi/`, and `src/fundamental/` if is shared +with non-EFI compoenents. To summarize: +`src/fundamental/` +- may be used by all code in the tree +- may not use any code outside of `src/fundamental/` + `src/basic/` - may be used by all code in the tree -- may not use any code outside of `src/basic/` +- may not use any code outside of `src/fundamental/` and `src/basic/` `src/libsystemd/` -- may be used by all code in the tree, except for code in `src/basic/` -- may not use any code outside of `src/basic/`, `src/libsystemd/` +- may be used by all code in the tree that links to `libsystem.so` +- may not use any code outside of `src/fundamental/`, `src/basic/`, and + `src/libsystemd/` `src/shared/` - may be used by all code in the tree, except for code in `src/basic/`, -`src/libsystemd/`, `src/nss-*`, `src/login/pam_systemd.*`, and files under -`src/journal/` that end up in `libjournal-client.a` convenience library. -- may not use any code outside of `src/basic/`, `src/libsystemd/`, `src/shared/` + `src/libsystemd/`, `src/nss-*`, `src/login/pam_systemd.*`, and files under + `src/journal/` that end up in `libjournal-client.a` convenience library. +- may not use any code outside of `src/fundamental/`, `src/basic/`, + `src/libsystemd/`, `src/shared/` ### PID 1