From 38c9ca5380befc231685beec3f80a7bef7124814 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Mon, 5 May 2025 12:42:08 +0200 Subject: [PATCH] tree-wide: Remove strv_from_stdarg_alloca() It's trivial to replace all uses of this function with STRV_MAKE() and strv_new_ap() so let's get rid of this variant. --- src/basic/strv.h | 29 ---------------------- src/libsystemd/sd-bus/bus-objects.c | 33 +++++++++++++++++++++----- src/login/logind-button.c | 6 ++--- src/login/logind-dbus.c | 12 ++++------ src/login/logind-dbus.h | 3 ++- src/login/logind-device.c | 4 ++-- src/login/logind-inhibit.c | 2 +- src/login/logind-seat-dbus.c | 7 ++---- src/login/logind-seat-dbus.h | 3 ++- src/login/logind-seat.c | 6 ++--- src/login/logind-session-dbus.c | 7 ++---- src/login/logind-session-dbus.h | 3 ++- src/login/logind-session.c | 24 +++++++++---------- src/login/logind-user-dbus.c | 7 ++---- src/login/logind-user-dbus.h | 3 ++- src/network/networkd-dhcp-server-bus.c | 9 +++---- src/network/networkd-dhcp4-bus.c | 9 +++---- src/network/networkd-dhcp6-bus.c | 9 +++---- src/network/networkd-link-bus.c | 8 ------- src/network/networkd-link-bus.h | 2 +- src/network/networkd-link.c | 2 +- src/resolve/resolved-bus.c | 9 ++++--- src/resolve/resolved-bus.h | 4 ++-- src/shared/exec-util.c | 9 ++++--- src/shared/exec-util.h | 4 ++-- src/test/test-strv.c | 22 ----------------- 26 files changed, 89 insertions(+), 147 deletions(-) diff --git a/src/basic/strv.h b/src/basic/strv.h index 24bdd47cc58..0f2c251fe10 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -183,35 +183,6 @@ char* endswith_strv(const char *s, char * const *l); #define ENDSWITH_SET(p, ...) \ endswith_strv(p, STRV_MAKE(__VA_ARGS__)) -#define strv_from_stdarg_alloca(first) \ - ({ \ - char **_l; \ - \ - if (!first) \ - _l = (char**) &first; \ - else { \ - size_t _n; \ - va_list _ap; \ - \ - _n = 1; \ - va_start(_ap, first); \ - while (va_arg(_ap, char*)) \ - _n++; \ - va_end(_ap); \ - \ - _l = newa(char*, _n+1); \ - _l[_n = 0] = (char*) first; \ - va_start(_ap, first); \ - for (;;) { \ - _l[++_n] = va_arg(_ap, char*); \ - if (!_l[_n]) \ - break; \ - } \ - va_end(_ap); \ - } \ - _l; \ - }) - #define STR_IN_SET(x, ...) strv_contains(STRV_MAKE(__VA_ARGS__), x) #define STRPTR_IN_SET(x, ...) \ ({ \ diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c index 37f9495138f..e7ec43a19d9 100644 --- a/src/libsystemd/sd-bus/bus-objects.c +++ b/src/libsystemd/sd-bus/bus-objects.c @@ -2328,7 +2328,7 @@ _public_ int sd_bus_emit_properties_changed( const char *interface, const char *name, ...) { - char **names; + _cleanup_strv_free_ char **names = NULL; assert_return(bus, -EINVAL); assert_return(bus = bus_resolve(bus), -ENOPKG); @@ -2342,7 +2342,14 @@ _public_ int sd_bus_emit_properties_changed( if (!name) return 0; - names = strv_from_stdarg_alloca(name); + va_list ap; + + va_start(ap, name); + names = strv_new_ap(name, ap); + va_end(ap); + + if (!names) + return -ENOMEM; return sd_bus_emit_properties_changed_strv(bus, path, interface, names); } @@ -2927,7 +2934,7 @@ _public_ int sd_bus_emit_interfaces_added_strv(sd_bus *bus, const char *path, ch } _public_ int sd_bus_emit_interfaces_added(sd_bus *bus, const char *path, const char *interface, ...) { - char **interfaces; + _cleanup_strv_free_ char **interfaces = NULL; assert_return(bus, -EINVAL); assert_return(bus = bus_resolve(bus), -ENOPKG); @@ -2937,7 +2944,14 @@ _public_ int sd_bus_emit_interfaces_added(sd_bus *bus, const char *path, const c if (!BUS_IS_OPEN(bus->state)) return -ENOTCONN; - interfaces = strv_from_stdarg_alloca(interface); + va_list ap; + + va_start(ap, interface); + interfaces = strv_new_ap(interface, ap); + va_end(ap); + + if (!interfaces) + return -ENOMEM; return sd_bus_emit_interfaces_added_strv(bus, path, interfaces); } @@ -2981,7 +2995,7 @@ _public_ int sd_bus_emit_interfaces_removed_strv(sd_bus *bus, const char *path, } _public_ int sd_bus_emit_interfaces_removed(sd_bus *bus, const char *path, const char *interface, ...) { - char **interfaces; + _cleanup_strv_free_ char **interfaces = NULL; assert_return(bus, -EINVAL); assert_return(bus = bus_resolve(bus), -ENOPKG); @@ -2991,7 +3005,14 @@ _public_ int sd_bus_emit_interfaces_removed(sd_bus *bus, const char *path, const if (!BUS_IS_OPEN(bus->state)) return -ENOTCONN; - interfaces = strv_from_stdarg_alloca(interface); + va_list ap; + + va_start(ap, interface); + interfaces = strv_new_ap(interface, ap); + va_end(ap); + + if (!interfaces) + return -ENOMEM; return sd_bus_emit_interfaces_removed_strv(bus, path, interfaces); } diff --git a/src/login/logind-button.c b/src/login/logind-button.c index 4d4853b570a..29ee3e968ba 100644 --- a/src/login/logind-button.c +++ b/src/login/logind-button.c @@ -414,7 +414,7 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u b->lid_closed = true; button_lid_switch_handle_action(b->manager, /* is_edge= */ true, b->seat); button_install_check_event_source(b); - manager_send_changed(b->manager, "LidClosed", NULL); + manager_send_changed(b->manager, "LidClosed"); } else if (ev.code == SW_DOCK) { log_struct(LOG_INFO, @@ -433,7 +433,7 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u b->lid_closed = false; b->check_event_source = sd_event_source_unref(b->check_event_source); - manager_send_changed(b->manager, "LidClosed", NULL); + manager_send_changed(b->manager, "LidClosed"); } else if (ev.code == SW_DOCK) { log_struct(LOG_INFO, @@ -617,7 +617,7 @@ int button_check_switches(Button *b) { b->lid_closed = bitset_get(switches, SW_LID); b->docked = bitset_get(switches, SW_DOCK); - manager_send_changed(b->manager, "LidClosed", NULL); + manager_send_changed(b->manager, "LidClosed"); if (b->lid_closed) button_install_check_event_source(b); diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index a7fc968facf..b1062cbf090 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -2570,7 +2570,7 @@ static void reset_scheduled_shutdown(Manager *m) { (void) unlink(SHUTDOWN_SCHEDULE_FILE); - manager_send_changed(m, "ScheduledShutdown", NULL); + manager_send_changed(m, "ScheduledShutdown"); } static int update_schedule_file(Manager *m) { @@ -2841,7 +2841,7 @@ static int method_schedule_shutdown(sd_bus_message *message, void *userdata, sd_ return r; } - manager_send_changed(m, "ScheduledShutdown", NULL); + manager_send_changed(m, "ScheduledShutdown"); return sd_bus_reply_method_return(message, NULL); } @@ -4520,18 +4520,14 @@ int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error return 0; } -int manager_send_changed(Manager *manager, const char *property, ...) { - char **l; - +int manager_send_changed_strv(Manager *manager, char **properties) { assert(manager); - l = strv_from_stdarg_alloca(property); - return sd_bus_emit_properties_changed_strv( manager->bus, "/org/freedesktop/login1", "org.freedesktop.login1.Manager", - l); + properties); } int manager_start_scope( diff --git a/src/login/logind-dbus.h b/src/login/logind-dbus.h index 0cf39c4ae5c..3b12ee860fb 100644 --- a/src/login/logind-dbus.h +++ b/src/login/logind-dbus.h @@ -25,7 +25,8 @@ int match_unit_removed(sd_bus_message *message, void *userdata, sd_bus_error *er int match_properties_changed(sd_bus_message *message, void *userdata, sd_bus_error *error); int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error); -int manager_send_changed(Manager *manager, const char *property, ...) _sentinel_; +int manager_send_changed_strv(Manager *manager, char **properties); +#define manager_send_changed(manager, ...) manager_send_changed_strv(manager, STRV_MAKE(__VA_ARGS__)) int manager_start_scope( Manager *manager, diff --git a/src/login/logind-device.c b/src/login/logind-device.c index 5f6b58b8402..4314790d97d 100644 --- a/src/login/logind-device.c +++ b/src/login/logind-device.c @@ -53,7 +53,7 @@ static void device_detach(Device *d) { if (!seat_has_master_device(s)) { seat_add_to_gc_queue(s); - seat_send_changed(s, "CanGraphical", NULL); + seat_send_changed(s, "CanGraphical"); } } @@ -102,6 +102,6 @@ void device_attach(Device *d, Seat *s) { if (!had_master && d->master && s->started) { seat_save(s); - seat_send_changed(s, "CanGraphical", NULL); + seat_send_changed(s, "CanGraphical"); } } diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c index 86bae8f0b7c..e5070ff5738 100644 --- a/src/login/logind-inhibit.c +++ b/src/login/logind-inhibit.c @@ -168,7 +168,7 @@ static int bus_manager_send_inhibited_change(Inhibitor *i) { property = IN_SET(i->mode, INHIBIT_BLOCK, INHIBIT_BLOCK_WEAK) ? "BlockInhibited" : "DelayInhibited"; - return manager_send_changed(i->manager, property, NULL); + return manager_send_changed(i->manager, property); } int inhibitor_start(Inhibitor *i) { diff --git a/src/login/logind-seat-dbus.c b/src/login/logind-seat-dbus.c index 31897b8c194..4214d7cbde1 100644 --- a/src/login/logind-seat-dbus.c +++ b/src/login/logind-seat-dbus.c @@ -381,9 +381,8 @@ int seat_send_signal(Seat *s, bool new_seat) { "so", s->id, p); } -int seat_send_changed(Seat *s, const char *properties, ...) { +int seat_send_changed_strv(Seat *s, char **properties) { _cleanup_free_ char *p = NULL; - char **l; assert(s); @@ -394,9 +393,7 @@ int seat_send_changed(Seat *s, const char *properties, ...) { if (!p) return -ENOMEM; - l = strv_from_stdarg_alloca(properties); - - return sd_bus_emit_properties_changed_strv(s->manager->bus, p, "org.freedesktop.login1.Seat", l); + return sd_bus_emit_properties_changed_strv(s->manager->bus, p, "org.freedesktop.login1.Seat", properties); } static const sd_bus_vtable seat_vtable[] = { diff --git a/src/login/logind-seat-dbus.h b/src/login/logind-seat-dbus.h index 782ee01c60a..5b4e6846178 100644 --- a/src/login/logind-seat-dbus.h +++ b/src/login/logind-seat-dbus.h @@ -13,6 +13,7 @@ extern const BusObjectImplementation seat_object; char* seat_bus_path(Seat *s); int seat_send_signal(Seat *s, bool new_seat); -int seat_send_changed(Seat *s, const char *properties, ...) _sentinel_; +int seat_send_changed_strv(Seat *s, char **properties); +#define seat_send_changed(s, ...) seat_send_changed_strv(s, STRV_MAKE(__VA_ARGS__)) int bus_seat_method_terminate(sd_bus_message *message, void *userdata, sd_bus_error *error); diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c index 285c9b418db..2c0905e64df 100644 --- a/src/login/logind-seat.c +++ b/src/login/logind-seat.c @@ -251,18 +251,18 @@ int seat_set_active(Seat *s, Session *session) { if (old_active) { session_device_pause_all(old_active); - session_send_changed(old_active, "Active", NULL); + session_send_changed(old_active, "Active"); } (void) seat_apply_acls(s, old_active); if (session && session->started) { - session_send_changed(session, "Active", NULL); + session_send_changed(session, "Active"); session_device_resume_all(session); } if (!session || session->started) - seat_send_changed(s, "ActiveSession", NULL); + seat_send_changed(s, "ActiveSession"); if (session) { session_save(session); diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index a7e4b7c861f..f3fe877a2c1 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -847,9 +847,8 @@ int session_send_signal(Session *s, bool new_session) { "so", s->id, p); } -int session_send_changed(Session *s, const char *properties, ...) { +int session_send_changed_strv(Session *s, char **properties) { _cleanup_free_ char *p = NULL; - char **l; assert(s); @@ -860,9 +859,7 @@ int session_send_changed(Session *s, const char *properties, ...) { if (!p) return -ENOMEM; - l = strv_from_stdarg_alloca(properties); - - return sd_bus_emit_properties_changed_strv(s->manager->bus, p, "org.freedesktop.login1.Session", l); + return sd_bus_emit_properties_changed_strv(s->manager->bus, p, "org.freedesktop.login1.Session", properties); } int session_send_lock(Session *s, bool lock) { diff --git a/src/login/logind-session-dbus.h b/src/login/logind-session-dbus.h index 175e29a93fc..4ff45cb54f7 100644 --- a/src/login/logind-session-dbus.h +++ b/src/login/logind-session-dbus.h @@ -14,7 +14,8 @@ extern const BusObjectImplementation session_object; char* session_bus_path(Session *s); int session_send_signal(Session *s, bool new_session); -int session_send_changed(Session *s, const char *properties, ...) _sentinel_; +int session_send_changed_strv(Session *s, char **properties); +#define session_send_changed(s, ...) session_send_changed_strv(s, STRV_MAKE(__VA_ARGS__)) int session_send_lock(Session *s, bool lock); int session_send_lock_all(Manager *m, bool lock); diff --git a/src/login/logind-session.c b/src/login/logind-session.c index 2ca5a3716d6..a540774ccaf 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -882,10 +882,10 @@ int session_start(Session *s, sd_bus_message *properties, sd_bus_error *error) { /* Send signals */ session_send_signal(s, true); - user_send_changed(s->user, "Display", NULL); + user_send_changed(s->user, "Display"); if (s->seat && s->seat->active == s) - (void) seat_send_changed(s->seat, "ActiveSession", NULL); + (void) seat_send_changed(s->seat, "ActiveSession"); return 0; } @@ -1017,7 +1017,7 @@ int session_finalize(Session *s) { session_reset_leader(s, /* keep_fdstore = */ false); (void) user_save(s->user); - (void) user_send_changed(s->user, "Display", NULL); + (void) user_send_changed(s->user, "Display"); return 0; } @@ -1163,13 +1163,13 @@ int session_set_idle_hint(Session *s, bool b) { s->idle_hint = b; dual_timestamp_now(&s->idle_hint_timestamp); - session_send_changed(s, "IdleHint", "IdleSinceHint", "IdleSinceHintMonotonic", NULL); + session_send_changed(s, "IdleHint", "IdleSinceHint", "IdleSinceHintMonotonic"); if (s->seat) - seat_send_changed(s->seat, "IdleHint", "IdleSinceHint", "IdleSinceHintMonotonic", NULL); + seat_send_changed(s->seat, "IdleHint", "IdleSinceHint", "IdleSinceHintMonotonic"); - user_send_changed(s->user, "IdleHint", "IdleSinceHint", "IdleSinceHintMonotonic", NULL); - manager_send_changed(s->manager, "IdleHint", "IdleSinceHint", "IdleSinceHintMonotonic", NULL); + user_send_changed(s->user, "IdleHint", "IdleSinceHint", "IdleSinceHintMonotonic"); + manager_send_changed(s->manager, "IdleHint", "IdleSinceHint", "IdleSinceHintMonotonic"); return 1; } @@ -1191,7 +1191,7 @@ int session_set_locked_hint(Session *s, bool b) { s->locked_hint = b; (void) session_save(s); - (void) session_send_changed(s, "LockedHint", NULL); + (void) session_send_changed(s, "LockedHint"); return 1; } @@ -1204,7 +1204,7 @@ void session_set_type(Session *s, SessionType t) { s->type = t; (void) session_save(s); - (void) session_send_changed(s, "Type", NULL); + (void) session_send_changed(s, "Type"); } void session_set_class(Session *s, SessionClass c) { @@ -1215,7 +1215,7 @@ void session_set_class(Session *s, SessionClass c) { s->class = c; (void) session_save(s); - (void) session_send_changed(s, "Class", NULL); + (void) session_send_changed(s, "Class"); /* This class change might mean we need the per-user session manager now. Try to start it. */ (void) user_start_service_manager(s->user); @@ -1232,7 +1232,7 @@ int session_set_display(Session *s, const char *display) { return r; (void) session_save(s); - (void) session_send_changed(s, "Display", NULL); + (void) session_send_changed(s, "Display"); return 1; } @@ -1248,7 +1248,7 @@ int session_set_tty(Session *s, const char *tty) { return r; (void) session_save(s); - (void) session_send_changed(s, "TTY", NULL); + (void) session_send_changed(s, "TTY"); return 1; } diff --git a/src/login/logind-user-dbus.c b/src/login/logind-user-dbus.c index ade2368b969..34904d9b74a 100644 --- a/src/login/logind-user-dbus.c +++ b/src/login/logind-user-dbus.c @@ -399,9 +399,8 @@ int user_send_signal(User *u, bool new_user) { "uo", (uint32_t) u->user_record->uid, p); } -int user_send_changed(User *u, const char *properties, ...) { +int user_send_changed_strv(User *u, char **properties) { _cleanup_free_ char *p = NULL; - char **l; assert(u); @@ -412,7 +411,5 @@ int user_send_changed(User *u, const char *properties, ...) { if (!p) return -ENOMEM; - l = strv_from_stdarg_alloca(properties); - - return sd_bus_emit_properties_changed_strv(u->manager->bus, p, "org.freedesktop.login1.User", l); + return sd_bus_emit_properties_changed_strv(u->manager->bus, p, "org.freedesktop.login1.User", properties); } diff --git a/src/login/logind-user-dbus.h b/src/login/logind-user-dbus.h index 33f810f7f54..867abc1799e 100644 --- a/src/login/logind-user-dbus.h +++ b/src/login/logind-user-dbus.h @@ -13,7 +13,8 @@ extern const BusObjectImplementation user_object; char* user_bus_path(User *s); int user_send_signal(User *u, bool new_user); -int user_send_changed(User *u, const char *properties, ...) _sentinel_; +int user_send_changed_strv(User *u, char **properties); +#define user_send_changed(u, ...) user_send_changed_strv(u, STRV_MAKE(__VA_ARGS__)) int bus_user_method_terminate(sd_bus_message *message, void *userdata, sd_bus_error *error); int bus_user_method_kill(sd_bus_message *message, void *userdata, sd_bus_error *error); diff --git a/src/network/networkd-dhcp-server-bus.c b/src/network/networkd-dhcp-server-bus.c index 470e5599e27..8a6822e2b7a 100644 --- a/src/network/networkd-dhcp-server-bus.c +++ b/src/network/networkd-dhcp-server-bus.c @@ -72,9 +72,8 @@ static int property_get_leases( return sd_bus_message_close_container(reply); } -static int dhcp_server_emit_changed(Link *link, const char *property, ...) { +static int dhcp_server_emit_changed_strv(Link *link, char **properties) { _cleanup_free_ char *path = NULL; - char **l; assert(link); @@ -85,20 +84,18 @@ static int dhcp_server_emit_changed(Link *link, const char *property, ...) { if (!path) return log_oom(); - l = strv_from_stdarg_alloca(property); - return sd_bus_emit_properties_changed_strv( link->manager->bus, path, "org.freedesktop.network1.DHCPServer", - l); + properties); } void dhcp_server_callback(sd_dhcp_server *s, uint64_t event, void *data) { Link *l = ASSERT_PTR(data); if (event & SD_DHCP_SERVER_EVENT_LEASE_CHANGED) - (void) dhcp_server_emit_changed(l, "Leases", NULL); + (void) dhcp_server_emit_changed_strv(l, STRV_MAKE("Leases")); } static const sd_bus_vtable dhcp_server_vtable[] = { diff --git a/src/network/networkd-dhcp4-bus.c b/src/network/networkd-dhcp4-bus.c index e00aa0364fa..68fe7bc394b 100644 --- a/src/network/networkd-dhcp4-bus.c +++ b/src/network/networkd-dhcp4-bus.c @@ -33,9 +33,8 @@ static int property_get_dhcp_client_state( return sd_bus_message_append(reply, "s", dhcp_state_to_string(dhcp_client_get_state(c))); } -static int dhcp_client_emit_changed(Link *link, const char *property, ...) { +static int dhcp_client_emit_changed(Link *link, char **properties) { _cleanup_free_ char *path = NULL; - char **l; assert(link); @@ -46,19 +45,17 @@ static int dhcp_client_emit_changed(Link *link, const char *property, ...) { if (!path) return log_oom(); - l = strv_from_stdarg_alloca(property); - return sd_bus_emit_properties_changed_strv( link->manager->bus, path, "org.freedesktop.network1.DHCPv4Client", - l); + properties); } int dhcp_client_callback_bus(sd_dhcp_client *c, int event, void *userdata) { Link *l = ASSERT_PTR(userdata); - return dhcp_client_emit_changed(l, "State", NULL); + return dhcp_client_emit_changed(l, STRV_MAKE("State")); } static const sd_bus_vtable dhcp_client_vtable[] = { diff --git a/src/network/networkd-dhcp6-bus.c b/src/network/networkd-dhcp6-bus.c index a225877373e..7f37ca09eb6 100644 --- a/src/network/networkd-dhcp6-bus.c +++ b/src/network/networkd-dhcp6-bus.c @@ -32,9 +32,8 @@ static int property_get_dhcp6_client_state( return sd_bus_message_append(reply, "s", dhcp6_state_to_string(dhcp6_client_get_state(c))); } -static int dhcp6_client_emit_changed(Link *link, const char *property, ...) { +static int dhcp6_client_emit_changed_strv(Link *link, char **properties) { _cleanup_free_ char *path = NULL; - char **l; assert(link); @@ -45,19 +44,17 @@ static int dhcp6_client_emit_changed(Link *link, const char *property, ...) { if (!path) return log_oom(); - l = strv_from_stdarg_alloca(property); - return sd_bus_emit_properties_changed_strv( link->manager->bus, path, "org.freedesktop.network1.DHCPv6Client", - l); + properties); } void dhcp6_client_callback_bus(sd_dhcp6_client *c, int event, void *userdata) { Link *l = ASSERT_PTR(userdata); - dhcp6_client_emit_changed(l, "State", NULL); + dhcp6_client_emit_changed_strv(l, STRV_MAKE("State")); } static const sd_bus_vtable dhcp6_client_vtable[] = { diff --git a/src/network/networkd-link-bus.c b/src/network/networkd-link-bus.c index b4026054c09..9e8ae7635d5 100644 --- a/src/network/networkd-link-bus.c +++ b/src/network/networkd-link-bus.c @@ -902,14 +902,6 @@ int link_send_changed_strv(Link *link, char **properties) { properties); } -int link_send_changed(Link *link, const char *property, ...) { - char **properties; - - properties = strv_from_stdarg_alloca(property); - - return link_send_changed_strv(link, properties); -} - const BusObjectImplementation link_object = { "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", diff --git a/src/network/networkd-link-bus.h b/src/network/networkd-link-bus.h index bb12db92ee7..7b0156b4df6 100644 --- a/src/network/networkd-link-bus.h +++ b/src/network/networkd-link-bus.h @@ -14,7 +14,7 @@ char* link_bus_path(Link *link); int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error); int link_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error); int link_send_changed_strv(Link *link, char **properties); -int link_send_changed(Link *link, const char *property, ...) _sentinel_; +#define link_send_changed(link, ...) link_send_changed_strv(link, STRV_MAKE(__VA_ARGS__)); int property_get_operational_state(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); int property_get_carrier_state(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index c7f48c6763d..f81e88fbc36 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -381,7 +381,7 @@ void link_set_state(Link *link, LinkState state) { link->state = state; - link_send_changed(link, "AdministrativeState", NULL); + link_send_changed(link, "AdministrativeState"); link_dirty(link); } diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index 23dad7f9cf4..e9b47488e75 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -2287,20 +2287,19 @@ int manager_connect_bus(Manager *m) { return 0; } -int _manager_send_changed(Manager *manager, const char *property, ...) { +int manager_send_changed_strv(Manager *manager, char **properties) { assert(manager); if (sd_bus_is_ready(manager->bus) <= 0) return 0; - char **l = strv_from_stdarg_alloca(property); - int r = sd_bus_emit_properties_changed_strv( manager->bus, "/org/freedesktop/resolve1", "org.freedesktop.resolve1.Manager", - l); + properties); if (r < 0) - log_notice_errno(r, "Failed to emit notification about changed property %s: %m", property); + log_notice_errno(r, "Failed to emit notification about changed properties: %m"); + return r; } diff --git a/src/resolve/resolved-bus.h b/src/resolve/resolved-bus.h index 073ff1eb5a3..fb8de0ddb49 100644 --- a/src/resolve/resolved-bus.h +++ b/src/resolve/resolved-bus.h @@ -10,8 +10,8 @@ typedef struct Manager Manager; extern const BusObjectImplementation manager_object; int manager_connect_bus(Manager *m); -int _manager_send_changed(Manager *manager, const char *property, ...) _sentinel_; -#define manager_send_changed(manager, ...) _manager_send_changed(manager, __VA_ARGS__, NULL) +int manager_send_changed_strv(Manager *manager, char **properties); +#define manager_send_changed(manager, ...) manager_send_changed_strv(manager, STRV_MAKE(__VA_ARGS__)); int bus_dns_server_append(sd_bus_message *reply, DnsServer *s, bool with_ifindex, bool extended); int bus_property_get_resolve_support(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, diff --git a/src/shared/exec-util.c b/src/shared/exec-util.c index 0b8b20addde..75f24aef985 100644 --- a/src/shared/exec-util.c +++ b/src/shared/exec-util.c @@ -561,10 +561,10 @@ int shall_fork_agent(void) { return true; } -int _fork_agent(const char *name, const int except[], size_t n_except, pid_t *ret_pid, const char *path, ...) { +int _fork_agent(const char *name, char * const *argv, const int except[], size_t n_except, pid_t *ret_pid) { int r; - assert(path); + assert(!strv_isempty(argv)); /* Spawns a temporary TTY agent, making sure it goes away when we go away */ @@ -617,8 +617,7 @@ int _fork_agent(const char *name, const int except[], size_t n_except, pid_t *re } /* Count arguments */ - char **l = strv_from_stdarg_alloca(path); - execv(path, l); - log_error_errno(errno, "Failed to execute %s: %m", path); + execv(argv[0], argv); + log_error_errno(errno, "Failed to execute %s: %m", argv[0]); _exit(EXIT_FAILURE); } diff --git a/src/shared/exec-util.h b/src/shared/exec-util.h index 172fc5dc73a..93d9e8c1118 100644 --- a/src/shared/exec-util.h +++ b/src/shared/exec-util.h @@ -62,5 +62,5 @@ ExecCommandFlags exec_command_flags_from_string(const char *s); int fexecve_or_execve(int executable_fd, const char *executable, char *const argv[], char *const envp[]); int shall_fork_agent(void); -int _fork_agent(const char *name, const int except[], size_t n_except, pid_t *ret_pid, const char *path, ...) _sentinel_; -#define fork_agent(name, ...) _fork_agent(name, __VA_ARGS__, NULL) +int _fork_agent(const char *name, char * const *argv, const int except[], size_t n_except, pid_t *ret_pid); +#define fork_agent(name, except, n_except, ret_pid, ...) _fork_agent(name, STRV_MAKE(__VA_ARGS__), except, n_except, ret_pid) diff --git a/src/test/test-strv.c b/src/test/test-strv.c index 028765665b9..63d30afe8f3 100644 --- a/src/test/test-strv.c +++ b/src/test/test-strv.c @@ -791,28 +791,6 @@ TEST(strv_foreach_pair) { ASSERT_STREQ(*x, *y); } -static void test_strv_from_stdarg_alloca_one(char **l, const char *first, ...) { - char **j; - unsigned i; - - log_info("/* %s */", __func__); - - j = strv_from_stdarg_alloca(first); - - for (i = 0;; i++) { - ASSERT_STREQ(l[i], j[i]); - - if (!l[i]) - break; - } -} - -TEST(strv_from_stdarg_alloca) { - test_strv_from_stdarg_alloca_one(STRV_MAKE("foo", "bar"), "foo", "bar", NULL); - test_strv_from_stdarg_alloca_one(STRV_MAKE("foo"), "foo", NULL); - test_strv_from_stdarg_alloca_one(STRV_MAKE_EMPTY, NULL); -} - TEST(strv_insert) { _cleanup_strv_free_ char **a = NULL; -- 2.47.3