diff options
Diffstat (limited to 'src/libsystemd')
25 files changed, 246 insertions, 153 deletions
diff --git a/src/libsystemd/libsystemd.pc.in b/src/libsystemd/libsystemd.pc.in index c861905b67..a010dea2e9 100644 --- a/src/libsystemd/libsystemd.pc.in +++ b/src/libsystemd/libsystemd.pc.in @@ -14,7 +14,7 @@ includedir=@includedir@ Name: systemd Description: systemd Library -URL: @PACKAGE_URL@ -Version: @PACKAGE_VERSION@ +URL: @PROJECT_URL@ +Version: @PROJECT_VERSION@ Libs: -L${libdir} -lsystemd Cflags: -I${includedir} diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index 96e6347795..a6748ceb20 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -671,3 +671,8 @@ global: sd_event_source_get_floating; sd_event_source_set_floating; } LIBSYSTEMD_239; + +LIBSYSTEMD_241 { +global: + sd_bus_close_unref; +} LIBSYSTEMD_240; diff --git a/src/libsystemd/meson.build b/src/libsystemd/meson.build index 05d4ea0e7f..67add387e6 100644 --- a/src/libsystemd/meson.build +++ b/src/libsystemd/meson.build @@ -109,9 +109,8 @@ libsystemd_static = static_library( libsystemd_sym = 'src/libsystemd/libsystemd.sym' -libsystemd_pc = configure_file( +configure_file( input : 'libsystemd.pc.in', output : 'libsystemd.pc', - configuration : substs) -install_data(libsystemd_pc, - install_dir : pkgconfiglibdir) + configuration : substs, + install_dir : pkgconfiglibdir == 'no' ? '' : pkgconfiglibdir) diff --git a/src/libsystemd/sd-bus/bus-dump.h b/src/libsystemd/sd-bus/bus-dump.h index 373a86dd4f..a1b67c6b14 100644 --- a/src/libsystemd/sd-bus/bus-dump.h +++ b/src/libsystemd/sd-bus/bus-dump.h @@ -7,8 +7,8 @@ #include "sd-bus.h" enum { - BUS_MESSAGE_DUMP_WITH_HEADER = 1, - BUS_MESSAGE_DUMP_SUBTREE_ONLY = 2, + BUS_MESSAGE_DUMP_WITH_HEADER = 1 << 0, + BUS_MESSAGE_DUMP_SUBTREE_ONLY = 1 << 1, }; int bus_message_dump(sd_bus_message *m, FILE *f, unsigned flags); diff --git a/src/libsystemd/sd-bus/bus-match.c b/src/libsystemd/sd-bus/bus-match.c index ad135406f6..9642de10c3 100644 --- a/src/libsystemd/sd-bus/bus-match.c +++ b/src/libsystemd/sd-bus/bus-match.c @@ -49,11 +49,11 @@ * ` BUS_MATCH_LEAF: E */ -static inline bool BUS_MATCH_IS_COMPARE(enum bus_match_node_type t) { +static bool BUS_MATCH_IS_COMPARE(enum bus_match_node_type t) { return t >= BUS_MATCH_SENDER && t <= BUS_MATCH_ARG_HAS_LAST; } -static inline bool BUS_MATCH_CAN_HASH(enum bus_match_node_type t) { +static bool BUS_MATCH_CAN_HASH(enum bus_match_node_type t) { return (t >= BUS_MATCH_MESSAGE_TYPE && t <= BUS_MATCH_PATH) || (t >= BUS_MATCH_ARG && t <= BUS_MATCH_ARG_LAST) || (t >= BUS_MATCH_ARG_HAS && t <= BUS_MATCH_ARG_HAS_LAST); diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c index d0538104ae..58329f3fe7 100644 --- a/src/libsystemd/sd-bus/bus-objects.c +++ b/src/libsystemd/sd-bus/bus-objects.c @@ -1149,7 +1149,7 @@ static int object_manager_serialize_path_and_fallbacks( return 0; /* Second, add fallback vtables registered for any of the prefixes */ - prefix = alloca(strlen(path) + 1); + prefix = newa(char, strlen(path) + 1); OBJECT_PATH_FOREACH_PREFIX(prefix, path) { r = object_manager_serialize_path(bus, reply, prefix, path, true, error); if (r < 0) @@ -1500,7 +1500,7 @@ static int bus_find_parent_object_manager(sd_bus *bus, struct node **out, const if (!n) { char *prefix; - prefix = alloca(strlen(path) + 1); + prefix = newa(char, strlen(path) + 1); OBJECT_PATH_FOREACH_PREFIX(prefix, path) { n = hashmap_get(bus->nodes, prefix); if (n) @@ -2114,7 +2114,7 @@ _public_ int sd_bus_emit_properties_changed_strv( if (bus->nodes_modified) continue; - prefix = alloca(strlen(path) + 1); + prefix = newa(char, strlen(path) + 1); OBJECT_PATH_FOREACH_PREFIX(prefix, path) { r = emit_properties_changed_on_interface(bus, prefix, path, interface, true, &found_interface, names); if (r != 0) @@ -2291,7 +2291,7 @@ static int object_added_append_all(sd_bus *bus, sd_bus_message *m, const char *p if (bus->nodes_modified) return 0; - prefix = alloca(strlen(path) + 1); + prefix = newa(char, strlen(path) + 1); OBJECT_PATH_FOREACH_PREFIX(prefix, path) { r = object_added_append_all_prefix(bus, m, s, prefix, path, true); if (r < 0) @@ -2462,7 +2462,7 @@ static int object_removed_append_all(sd_bus *bus, sd_bus_message *m, const char if (bus->nodes_modified) return 0; - prefix = alloca(strlen(path) + 1); + prefix = newa(char, strlen(path) + 1); OBJECT_PATH_FOREACH_PREFIX(prefix, path) { r = object_removed_append_all_prefix(bus, m, s, prefix, path, true); if (r < 0) @@ -2626,7 +2626,7 @@ static int interfaces_added_append_one( if (bus->nodes_modified) return 0; - prefix = alloca(strlen(path) + 1); + prefix = newa(char, strlen(path) + 1); OBJECT_PATH_FOREACH_PREFIX(prefix, path) { r = interfaces_added_append_one_prefix(bus, m, prefix, path, interface, true); if (r != 0) diff --git a/src/libsystemd/sd-bus/bus-protocol.h b/src/libsystemd/sd-bus/bus-protocol.h index a5f4724aa9..d01fd8e6a3 100644 --- a/src/libsystemd/sd-bus/bus-protocol.h +++ b/src/libsystemd/sd-bus/bus-protocol.h @@ -54,9 +54,9 @@ enum { /* Flags */ enum { - BUS_MESSAGE_NO_REPLY_EXPECTED = 1, - BUS_MESSAGE_NO_AUTO_START = 2, - BUS_MESSAGE_ALLOW_INTERACTIVE_AUTHORIZATION = 4, + BUS_MESSAGE_NO_REPLY_EXPECTED = 1 << 0, + BUS_MESSAGE_NO_AUTO_START = 1 << 1, + BUS_MESSAGE_ALLOW_INTERACTIVE_AUTHORIZATION = 1 << 2, }; /* Header fields */ @@ -78,9 +78,9 @@ enum { /* RequestName parameters */ enum { - BUS_NAME_ALLOW_REPLACEMENT = 1, - BUS_NAME_REPLACE_EXISTING = 2, - BUS_NAME_DO_NOT_QUEUE = 4 + BUS_NAME_ALLOW_REPLACEMENT = 1 << 0, + BUS_NAME_REPLACE_EXISTING = 1 << 1, + BUS_NAME_DO_NOT_QUEUE = 1 << 2, }; /* RequestName returns */ diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c index ed185131b8..441b4a816f 100644 --- a/src/libsystemd/sd-bus/bus-socket.c +++ b/src/libsystemd/sd-bus/bus-socket.c @@ -981,7 +981,7 @@ int bus_socket_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) { return r; n = m->n_iovec * sizeof(struct iovec); - iov = alloca(n); + iov = newa(struct iovec, n); memcpy_safe(iov, m->iovec, n); j = 0; @@ -1072,7 +1072,7 @@ static int bus_socket_read_message_need(sd_bus *bus, size_t *need) { } static int bus_socket_make_message(sd_bus *bus, size_t size) { - sd_bus_message *t; + sd_bus_message *t = NULL; void *b; int r; @@ -1097,7 +1097,9 @@ static int bus_socket_make_message(sd_bus *bus, size_t size) { bus->fds, bus->n_fds, NULL, &t); - if (r < 0) { + if (r == -EBADMSG) + log_debug_errno(r, "Received invalid message from connection %s, dropping.", strna(bus->description)); + else if (r < 0) { free(b); return r; } @@ -1108,7 +1110,8 @@ static int bus_socket_make_message(sd_bus *bus, size_t size) { bus->fds = NULL; bus->n_fds = 0; - bus->rqueue[bus->rqueue_size++] = t; + if (t) + bus->rqueue[bus->rqueue_size++] = t; return 1; } diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 3b00bc8157..1ff858f32d 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -1556,17 +1556,24 @@ _public_ void sd_bus_close(sd_bus *bus) { bus_close_inotify_fd(bus); } +_public_ sd_bus *sd_bus_close_unref(sd_bus *bus) { + if (!bus) + return NULL; + + sd_bus_close(bus); + + return sd_bus_unref(bus); +} + _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) { if (!bus) return NULL; /* Have to do this before flush() to prevent hang */ bus_kill_exec(bus); - sd_bus_flush(bus); - sd_bus_close(bus); - return sd_bus_unref(bus); + return sd_bus_close_unref(bus); } void bus_enter_closing(sd_bus *bus) { diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c index 218210f234..9e8f0a73f5 100644 --- a/src/libsystemd/sd-daemon/sd-daemon.c +++ b/src/libsystemd/sd-daemon/sd-daemon.c @@ -604,7 +604,13 @@ _public_ int sd_booted(void) { * created. This takes place in mount-setup.c, so is * guaranteed to happen very early during boot. */ - return laccess("/run/systemd/system/", F_OK) >= 0; + if (laccess("/run/systemd/system/", F_OK) >= 0) + return true; + + if (errno == ENOENT) + return false; + + return -errno; } _public_ int sd_watchdog_enabled(int unset_environment, uint64_t *usec) { diff --git a/src/libsystemd/sd-device/device-monitor.c b/src/libsystemd/sd-device/device-monitor.c index b86932663e..27d0af5918 100644 --- a/src/libsystemd/sd-device/device-monitor.c +++ b/src/libsystemd/sd-device/device-monitor.c @@ -93,14 +93,8 @@ _public_ int sd_device_monitor_set_receive_buffer_size(sd_device_monitor *m, siz assert_return(m, -EINVAL); assert_return((size_t) n == size, -EINVAL); - if (m->bound) - return log_debug_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), - "sd-device-monitor: Socket fd is already bound. " - "It may be dangerous to change buffer size. " - "Refusing to change buffer size."); - - if (setsockopt_int(m->sock, SOL_SOCKET, SO_RCVBUF, n) < 0) { - r = setsockopt_int(m->sock, SOL_SOCKET, SO_RCVBUFFORCE, n); + if (setsockopt_int(m->sock, SOL_SOCKET, SO_RCVBUFFORCE, n) < 0) { + r = setsockopt_int(m->sock, SOL_SOCKET, SO_RCVBUF, n); if (r < 0) return r; } @@ -754,7 +748,7 @@ _public_ int sd_device_monitor_filter_remove(sd_device_monitor *m) { m->subsystem_filter = hashmap_free_free_free(m->subsystem_filter); m->tag_filter = set_free_free(m->tag_filter); - if (setsockopt(m->sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter)) < 0) + if (setsockopt(m->sock, SOL_SOCKET, SO_DETACH_FILTER, &filter, sizeof(filter)) < 0) return -errno; m->filter_uptodate = true; diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c index 01a5aa3d3f..76267a1e74 100644 --- a/src/libsystemd/sd-device/device-private.c +++ b/src/libsystemd/sd-device/device-private.c @@ -326,15 +326,6 @@ static int device_append(sd_device *device, char *key, const char **_major, cons action = device_action_from_string(value); if (action == _DEVICE_ACTION_INVALID) return -EINVAL; - /* FIXME: remove once we no longer flush previuos state for each action */ - if (action == DEVICE_ACTION_BIND || action == DEVICE_ACTION_UNBIND) { - static bool warned; - if (!warned) { - log_device_debug(device, "sd-device: ignoring actions 'bind' and 'unbind'"); - warned = true; - } - return -EINVAL; - } } else if (streq(key, "SEQNUM")) { r = safe_atou64(value, &seqnum); if (r < 0) @@ -711,13 +702,24 @@ int device_new_from_stat_rdev(sd_device **ret, const struct stat *st) { int device_copy_properties(sd_device *device_dst, sd_device *device_src) { const char *property, *value; + Iterator i; int r; assert(device_dst); assert(device_src); - FOREACH_DEVICE_PROPERTY(device_src, property, value) { - r = device_add_property(device_dst, property, value); + r = device_properties_prepare(device_src); + if (r < 0) + return r; + + ORDERED_HASHMAP_FOREACH_KEY(value, property, device_src->properties_db, i) { + r = device_add_property_aux(device_dst, property, value, true); + if (r < 0) + return r; + } + + ORDERED_HASHMAP_FOREACH_KEY(value, property, device_src->properties, i) { + r = device_add_property_aux(device_dst, property, value, false); if (r < 0) return r; } diff --git a/src/libsystemd/sd-device/device-private.h b/src/libsystemd/sd-device/device-private.h index 56558b38c6..062bfd651c 100644 --- a/src/libsystemd/sd-device/device-private.h +++ b/src/libsystemd/sd-device/device-private.h @@ -37,6 +37,7 @@ uint64_t device_get_properties_generation(sd_device *device); uint64_t device_get_tags_generation(sd_device *device); uint64_t device_get_devlinks_generation(sd_device *device); +int device_properties_prepare(sd_device *device); int device_get_properties_nulstr(sd_device *device, const uint8_t **nulstr, size_t *len); int device_get_properties_strv(sd_device *device, char ***strv); diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index db58615df5..2a69f2e94b 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -29,7 +29,7 @@ #include "util.h" int device_new_aux(sd_device **ret) { - sd_device *device = NULL; + sd_device *device; assert(ret); @@ -205,9 +205,7 @@ int device_set_syspath(sd_device *device, const char *_syspath, bool verify) { return r; free_and_replace(device->syspath, syspath); - device->devpath = devpath; - return 0; } @@ -227,7 +225,6 @@ _public_ int sd_device_new_from_syspath(sd_device **ret, const char *syspath) { return r; *ret = TAKE_PTR(device); - return 0; } @@ -610,8 +607,8 @@ _public_ int sd_device_new_from_device_id(sd_device **ret, const char *id) { return sd_device_new_from_devnum(ret, id[0], devt); } - case 'n': - { + + case 'n': { _cleanup_(sd_device_unrefp) sd_device *device = NULL; _cleanup_close_ int sk = -1; struct ifreq ifr = {}; @@ -642,11 +639,10 @@ _public_ int sd_device_new_from_device_id(sd_device **ret, const char *id) { return -ENODEV; *ret = TAKE_PTR(device); - return 0; } - case '+': - { + + case '+': { char subsys[PATH_MAX]; char *sysname; @@ -660,6 +656,7 @@ _public_ int sd_device_new_from_device_id(sd_device **ret, const char *id) { return sd_device_new_from_subsystem_sysname(ret, subsys, sysname); } + default: return -EINVAL; } @@ -727,7 +724,6 @@ _public_ int sd_device_get_parent(sd_device *child, sd_device **ret) { return -ENOENT; *ret = child->parent; - return 0; } @@ -746,11 +742,8 @@ int device_set_subsystem(sd_device *device, const char *_subsystem) { if (r < 0) return r; - free_and_replace(device->subsystem, subsystem); - device->subsystem_set = true; - - return 0; + return free_and_replace(device->subsystem, subsystem); } static int device_set_drivers_subsystem(sd_device *device, const char *_subsystem) { @@ -769,9 +762,7 @@ static int device_set_drivers_subsystem(sd_device *device, const char *_subsyste if (r < 0) return r; - free_and_replace(device->driver_subsystem, subsystem); - - return 0; + return free_and_replace(device->driver_subsystem, subsystem); } _public_ int sd_device_get_subsystem(sd_device *device, const char **ret) { @@ -836,7 +827,6 @@ _public_ int sd_device_get_subsystem(sd_device *device, const char **ret) { return -ENOENT; *ret = device->subsystem; - return 0; } @@ -886,7 +876,6 @@ _public_ int sd_device_get_parent_with_subsystem_devtype(sd_device *child, const return r; *ret = parent; - return 0; } @@ -923,11 +912,8 @@ int device_set_driver(sd_device *device, const char *_driver) { if (r < 0) return r; - free_and_replace(device->driver, driver); - device->driver_set = true; - - return 0; + return free_and_replace(device->driver, driver); } _public_ int sd_device_get_driver(sd_device *device, const char **ret) { @@ -960,7 +946,6 @@ _public_ int sd_device_get_driver(sd_device *device, const char **ret) { return -ENOENT; *ret = device->driver; - return 0; } @@ -972,7 +957,6 @@ _public_ int sd_device_get_devpath(sd_device *device, const char **devpath) { assert(device->devpath[0] == '/'); *devpath = device->devpath; - return 0; } @@ -992,7 +976,6 @@ _public_ int sd_device_get_devname(sd_device *device, const char **devname) { assert(path_startswith(device->devname, "/dev/")); *devname = device->devname; - return 0; } @@ -1002,6 +985,9 @@ static int device_set_sysname(sd_device *device) { const char *pos; size_t len = 0; + if (!device->devpath) + return -EINVAL; + pos = strrchr(device->devpath, '/'); if (!pos) return -EINVAL; @@ -1030,13 +1016,9 @@ static int device_set_sysname(sd_device *device) { if (len == 0) sysnum = NULL; - free_and_replace(device->sysname, sysname); - - device->sysnum = sysnum; - device->sysname_set = true; - - return 0; + device->sysnum = sysnum; + return free_and_replace(device->sysname, sysname); } _public_ int sd_device_get_sysname(sd_device *device, const char **ret) { @@ -1054,7 +1036,6 @@ _public_ int sd_device_get_sysname(sd_device *device, const char **ret) { assert_return(device->sysname, -ENOENT); *ret = device->sysname; - return 0; } @@ -1074,7 +1055,6 @@ _public_ int sd_device_get_sysnum(sd_device *device, const char **ret) { return -ENOENT; *ret = device->sysnum; - return 0; } @@ -1283,7 +1263,6 @@ int device_get_id_filename(sd_device *device, const char **ret) { } *ret = device->id_filename; - return 0; } @@ -1415,7 +1394,6 @@ _public_ int sd_device_get_usec_since_initialized(sd_device *device, uint64_t *u return -EIO; *usec = now_ts - device->usec_initialized; - return 0; } @@ -1475,7 +1453,7 @@ _public_ const char *sd_device_get_devlink_next(sd_device *device) { return v; } -static int device_properties_prepare(sd_device *device) { +int device_properties_prepare(sd_device *device) { int r; assert(device); @@ -1558,7 +1536,6 @@ _public_ const char *sd_device_get_property_first(sd_device *device, const char if (_value) *_value = value; - return key; } @@ -1580,7 +1557,6 @@ _public_ const char *sd_device_get_property_next(sd_device *device, const char * if (_value) *_value = value; - return key; } @@ -1691,7 +1667,6 @@ _public_ int sd_device_get_property_value(sd_device *device, const char *key, co if (_value) *_value = value; - return 0; } @@ -1718,8 +1693,7 @@ static int device_add_sysattr_value(sd_device *device, const char *_key, char *v r = hashmap_put(device->sysattr_values, key, value); if (r < 0) return r; - - key = NULL; + TAKE_PTR(key); return 0; } @@ -1736,7 +1710,6 @@ static int device_get_sysattr_value(sd_device *device, const char *_key, const c if (_value) *_value = value; - return 0; } @@ -1820,14 +1793,11 @@ _public_ int sd_device_get_sysattr_value(sd_device *device, const char *sysattr, static void device_remove_sysattr_value(sd_device *device, const char *_key) { _cleanup_free_ char *key = NULL; - _cleanup_free_ char *value = NULL; assert(device); assert(_key); - value = hashmap_remove2(device->sysattr_values, _key, (void **) &key); - - return; + free(hashmap_remove2(device->sysattr_values, _key, (void **) &key)); } /* set the attribute and save it in the cache. If a NULL value is passed the @@ -1843,7 +1813,6 @@ _public_ int sd_device_set_sysattr_value(sd_device *device, const char *sysattr, if (!_value) { device_remove_sysattr_value(device, sysattr); - return 0; } @@ -1874,23 +1843,22 @@ _public_ int sd_device_set_sysattr_value(sd_device *device, const char *sysattr, if (r == -EISDIR) return r; - free(value); - value = strdup(""); - if (!value) - return -ENOMEM; + r = free_and_strdup(&value, ""); + if (r < 0) + return r; r = device_add_sysattr_value(device, sysattr, value); if (r < 0) return r; + TAKE_PTR(value); - value = NULL; return -ENXIO; } r = device_add_sysattr_value(device, sysattr, value); if (r < 0) return r; + TAKE_PTR(value); - value = NULL; return 0; } diff --git a/src/libsystemd/sd-device/test-sd-device-monitor.c b/src/libsystemd/sd-device/test-sd-device-monitor.c index 9e5ca11fe9..aa1edaaf3c 100644 --- a/src/libsystemd/sd-device/test-sd-device-monitor.c +++ b/src/libsystemd/sd-device/test-sd-device-monitor.c @@ -21,14 +21,46 @@ static int monitor_handler(sd_device_monitor *m, sd_device *d, void *userdata) { assert_se(sd_device_get_syspath(d, &s) >= 0); assert_se(streq(s, syspath)); - return sd_event_exit(sd_device_monitor_get_event(m), 0); + return sd_event_exit(sd_device_monitor_get_event(m), 100); } -static int test_send_receive_one(sd_device *device, bool subsystem_filter, bool tag_filter, bool use_bpf) { +static int test_receive_device_fail(void) { _cleanup_(sd_device_monitor_unrefp) sd_device_monitor *monitor_server = NULL, *monitor_client = NULL; - const char *syspath, *subsystem, *tag, *devtype = NULL; + _cleanup_(sd_device_unrefp) sd_device *loopback = NULL; + const char *syspath; int r; + log_info("/* %s */", __func__); + + /* Try to send device with invalid action and without seqnum. */ + assert_se(sd_device_new_from_syspath(&loopback, "/sys/class/net/lo") >= 0); + assert_se(device_add_property(loopback, "ACTION", "hoge") >= 0); + + assert_se(sd_device_get_syspath(loopback, &syspath) >= 0); + + assert_se(device_monitor_new_full(&monitor_server, MONITOR_GROUP_NONE, -1) >= 0); + assert_se(sd_device_monitor_start(monitor_server, NULL, NULL) >= 0); + assert_se(sd_event_source_set_description(sd_device_monitor_get_event_source(monitor_server), "sender") >= 0); + + assert_se(device_monitor_new_full(&monitor_client, MONITOR_GROUP_NONE, -1) >= 0); + assert_se(device_monitor_allow_unicast_sender(monitor_client, monitor_server) >= 0); + assert_se(sd_device_monitor_start(monitor_client, monitor_handler, (void *) syspath) >= 0); + assert_se(sd_event_source_set_description(sd_device_monitor_get_event_source(monitor_client), "receiver") >= 0); + + /* Do not use assert_se() here. */ + r = device_monitor_send_device(monitor_server, monitor_client, loopback); + if (r < 0) + return log_error_errno(r, "Failed to send loopback device: %m"); + + assert_se(sd_event_run(sd_device_monitor_get_event(monitor_client), 0) >= 0); + + return 0; +} + +static void test_send_receive_one(sd_device *device, bool subsystem_filter, bool tag_filter, bool use_bpf) { + _cleanup_(sd_device_monitor_unrefp) sd_device_monitor *monitor_server = NULL, *monitor_client = NULL; + const char *syspath, *subsystem, *tag, *devtype = NULL; + log_device_info(device, "/* %s(subsystem_filter=%s, tag_filter=%s, use_bpf=%s) */", __func__, true_false(subsystem_filter), true_false(tag_filter), true_false(use_bpf)); @@ -56,14 +88,8 @@ static int test_send_receive_one(sd_device *device, bool subsystem_filter, bool if ((subsystem_filter || tag_filter) && use_bpf) assert_se(sd_device_monitor_filter_update(monitor_client) >= 0); - /* Do not use assert_se() here. */ - r = device_monitor_send_device(monitor_server, monitor_client, device); - if (r < 0) - return log_error_errno(r, "Failed to send loopback device: %m"); - - assert_se(sd_event_loop(sd_device_monitor_get_event(monitor_client)) == 0); - - return 0; + assert_se(device_monitor_send_device(monitor_server, monitor_client, device) >= 0); + assert_se(sd_event_loop(sd_device_monitor_get_event(monitor_client)) == 100); } static void test_subsystem_filter(sd_device *device) { @@ -99,7 +125,45 @@ static void test_subsystem_filter(sd_device *device) { log_info("Sending device subsystem:%s syspath:%s", subsystem, syspath); assert_se(device_monitor_send_device(monitor_server, monitor_client, device) >= 0); - assert_se(sd_event_loop(sd_device_monitor_get_event(monitor_client)) == 0); + assert_se(sd_event_loop(sd_device_monitor_get_event(monitor_client)) == 100); +} + +static void test_sd_device_monitor_filter_remove(sd_device *device) { + _cleanup_(sd_device_monitor_unrefp) sd_device_monitor *monitor_server = NULL, *monitor_client = NULL; + const char *syspath; + + log_device_info(device, "/* %s */", __func__); + + assert_se(sd_device_get_syspath(device, &syspath) >= 0); + + assert_se(device_monitor_new_full(&monitor_server, MONITOR_GROUP_NONE, -1) >= 0); + assert_se(sd_device_monitor_start(monitor_server, NULL, NULL) >= 0); + assert_se(sd_event_source_set_description(sd_device_monitor_get_event_source(monitor_server), "sender") >= 0); + + assert_se(device_monitor_new_full(&monitor_client, MONITOR_GROUP_NONE, -1) >= 0); + assert_se(device_monitor_allow_unicast_sender(monitor_client, monitor_server) >= 0); + assert_se(sd_device_monitor_start(monitor_client, monitor_handler, (void *) syspath) >= 0); + assert_se(sd_event_source_set_description(sd_device_monitor_get_event_source(monitor_client), "receiver") >= 0); + + assert_se(sd_device_monitor_filter_add_match_subsystem_devtype(monitor_client, "hoge", NULL) >= 0); + assert_se(sd_device_monitor_filter_update(monitor_client) >= 0); + + assert_se(device_monitor_send_device(monitor_server, monitor_client, device) >= 0); + assert_se(sd_event_run(sd_device_monitor_get_event(monitor_client), 0) >= 0); + + assert_se(sd_device_monitor_filter_remove(monitor_client) >= 0); + + assert_se(device_monitor_send_device(monitor_server, monitor_client, device) >= 0); + assert_se(sd_event_loop(sd_device_monitor_get_event(monitor_client)) == 100); +} + +static void test_device_copy_properties(sd_device *device) { + _cleanup_(sd_device_unrefp) sd_device *copy = NULL; + + assert_se(device_shallow_clone(device, ©) >= 0); + assert_se(device_copy_properties(copy, device) >= 0); + + test_send_receive_one(copy, false, false, false); } int main(int argc, char *argv[]) { @@ -111,24 +175,27 @@ int main(int argc, char *argv[]) { if (getuid() != 0) return log_tests_skipped("not root"); - assert_se(sd_device_new_from_syspath(&loopback, "/sys/class/net/lo") >= 0); - assert_se(device_add_property(loopback, "ACTION", "add") >= 0); - assert_se(device_add_property(loopback, "SEQNUM", "10") >= 0); - - r = test_send_receive_one(loopback, false, false, false); + r = test_receive_device_fail(); if (r < 0) { assert_se(r == -EPERM && detect_container() > 0); return log_tests_skipped("Running in container? Skipping remaining tests"); } - assert_se(test_send_receive_one(loopback, true, false, false) >= 0); - assert_se(test_send_receive_one(loopback, false, true, false) >= 0); - assert_se(test_send_receive_one(loopback, true, true, false) >= 0); - assert_se(test_send_receive_one(loopback, true, false, true) >= 0); - assert_se(test_send_receive_one(loopback, false, true, true) >= 0); - assert_se(test_send_receive_one(loopback, true, true, true) >= 0); + assert_se(sd_device_new_from_syspath(&loopback, "/sys/class/net/lo") >= 0); + assert_se(device_add_property(loopback, "ACTION", "add") >= 0); + assert_se(device_add_property(loopback, "SEQNUM", "10") >= 0); + + test_send_receive_one(loopback, false, false, false); + test_send_receive_one(loopback, true, false, false); + test_send_receive_one(loopback, false, true, false); + test_send_receive_one(loopback, true, true, false); + test_send_receive_one(loopback, true, false, true); + test_send_receive_one(loopback, false, true, true); + test_send_receive_one(loopback, true, true, true); test_subsystem_filter(loopback); + test_sd_device_monitor_filter_remove(loopback); + test_device_copy_properties(loopback); r = sd_device_new_from_subsystem_sysname(&sda, "block", "sda"); if (r < 0) { @@ -139,13 +206,13 @@ int main(int argc, char *argv[]) { assert_se(device_add_property(sda, "ACTION", "change") >= 0); assert_se(device_add_property(sda, "SEQNUM", "11") >= 0); - assert_se(test_send_receive_one(sda, false, false, false) >= 0); - assert_se(test_send_receive_one(sda, true, false, false) >= 0); - assert_se(test_send_receive_one(sda, false, true, false) >= 0); - assert_se(test_send_receive_one(sda, true, true, false) >= 0); - assert_se(test_send_receive_one(sda, true, false, true) >= 0); - assert_se(test_send_receive_one(sda, false, true, true) >= 0); - assert_se(test_send_receive_one(sda, true, true, true) >= 0); + test_send_receive_one(sda, false, false, false); + test_send_receive_one(sda, true, false, false); + test_send_receive_one(sda, false, true, false); + test_send_receive_one(sda, true, true, false); + test_send_receive_one(sda, true, false, true); + test_send_receive_one(sda, false, true, true); + test_send_receive_one(sda, true, true, true); return 0; } diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index 0030ea5dbe..04ba7e2574 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -470,6 +470,17 @@ static struct clock_data* event_get_clock_data(sd_event *e, EventSourceType t) { } } +static void event_free_signal_data(sd_event *e, struct signal_data *d) { + assert(e); + + if (!d) + return; + + hashmap_remove(e->signal_data, &d->priority); + safe_close(d->fd); + free(d); +} + static int event_make_signal_data( sd_event *e, int sig, @@ -559,11 +570,8 @@ static int event_make_signal_data( return 0; fail: - if (added) { - d->fd = safe_close(d->fd); - hashmap_remove(e->signal_data, &d->priority); - free(d); - } + if (added) + event_free_signal_data(e, d); return r; } @@ -582,11 +590,8 @@ static void event_unmask_signal_data(sd_event *e, struct signal_data *d, int sig assert_se(sigdelset(&d->sigset, sig) >= 0); if (sigisemptyset(&d->sigset)) { - /* If all the mask is all-zero we can get rid of the structure */ - hashmap_remove(e->signal_data, &d->priority); - safe_close(d->fd); - free(d); + event_free_signal_data(e, d); return; } diff --git a/src/libsystemd/sd-hwdb/hwdb-util.c b/src/libsystemd/sd-hwdb/hwdb-util.c index c5c329f2ac..f8529670b3 100644 --- a/src/libsystemd/sd-hwdb/hwdb-util.c +++ b/src/libsystemd/sd-hwdb/hwdb-util.c @@ -367,7 +367,7 @@ static int trie_store(struct trie *trie, const char *filename, bool compat) { int64_t size; struct trie_header_f h = { .signature = HWDB_SIG, - .tool_version = htole64(atoi(PACKAGE_VERSION)), + .tool_version = htole64(PROJECT_VERSION), .header_size = htole64(sizeof(struct trie_header_f)), .node_size = htole64(sizeof(struct trie_node_f)), .child_entry_size = htole64(sizeof(struct trie_child_entry_f)), diff --git a/src/libsystemd/sd-hwdb/sd-hwdb.c b/src/libsystemd/sd-hwdb/sd-hwdb.c index b81786a64d..233944c078 100644 --- a/src/libsystemd/sd-hwdb/sd-hwdb.c +++ b/src/libsystemd/sd-hwdb/sd-hwdb.c @@ -240,7 +240,7 @@ static int trie_search_f(sd_hwdb *hwdb, const char *search) { size_t p = 0; if (node->prefix_off) { - uint8_t c; + char c; for (; (c = trie_string(hwdb, node->prefix_off)[p]); p++) { if (IN_SET(c, '*', '?', '[')) diff --git a/src/libsystemd/sd-id128/sd-id128.c b/src/libsystemd/sd-id128/sd-id128.c index 3593a71c02..e72af1593c 100644 --- a/src/libsystemd/sd-id128/sd-id128.c +++ b/src/libsystemd/sd-id128/sd-id128.c @@ -18,7 +18,7 @@ #include "user-util.h" #include "util.h" -_public_ char *sd_id128_to_string(sd_id128_t id, char s[SD_ID128_STRING_MAX]) { +_public_ char *sd_id128_to_string(sd_id128_t id, char s[_SD_ARRAY_STATIC SD_ID128_STRING_MAX]) { unsigned n; assert_return(s, NULL); diff --git a/src/libsystemd/sd-login/sd-login.c b/src/libsystemd/sd-login/sd-login.c index a904c6b544..07f21e84de 100644 --- a/src/libsystemd/sd-login/sd-login.c +++ b/src/libsystemd/sd-login/sd-login.c @@ -945,11 +945,11 @@ _public_ int sd_machine_get_ifindices(const char *machine, int **ifindices) { return nr; } -static inline int MONITOR_TO_FD(sd_login_monitor *m) { +static int MONITOR_TO_FD(sd_login_monitor *m) { return (int) (unsigned long) m - 1; } -static inline sd_login_monitor* FD_TO_MONITOR(int fd) { +static sd_login_monitor* FD_TO_MONITOR(int fd) { return (sd_login_monitor*) (unsigned long) (fd + 1); } diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c index b0b25639f4..5e9bc45139 100644 --- a/src/libsystemd/sd-netlink/netlink-message.c +++ b/src/libsystemd/sd-netlink/netlink-message.c @@ -370,6 +370,42 @@ int sd_netlink_message_append_in6_addr(sd_netlink_message *m, unsigned short typ return 0; } +int sd_netlink_message_append_sockaddr_in(sd_netlink_message *m, unsigned short type, const struct sockaddr_in *data) { + int r; + + assert_return(m, -EINVAL); + assert_return(!m->sealed, -EPERM); + assert_return(data, -EINVAL); + + r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_SOCKADDR); + if (r < 0) + return r; + + r = add_rtattr(m, type, data, sizeof(struct sockaddr_in)); + if (r < 0) + return r; + + return 0; +} + +int sd_netlink_message_append_sockaddr_in6(sd_netlink_message *m, unsigned short type, const struct sockaddr_in6 *data) { + int r; + + assert_return(m, -EINVAL); + assert_return(!m->sealed, -EPERM); + assert_return(data, -EINVAL); + + r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_SOCKADDR); + if (r < 0) + return r; + + r = add_rtattr(m, type, data, sizeof(struct sockaddr_in6)); + if (r < 0) + return r; + + return 0; +} + int sd_netlink_message_append_ether_addr(sd_netlink_message *m, unsigned short type, const struct ether_addr *data) { int r; diff --git a/src/libsystemd/sd-netlink/netlink-types.c b/src/libsystemd/sd-netlink/netlink-types.c index cd5cdcc6e5..9dcd3f2ac8 100644 --- a/src/libsystemd/sd-netlink/netlink-types.c +++ b/src/libsystemd/sd-netlink/netlink-types.c @@ -721,7 +721,7 @@ static const NLType genl_wireguard_peer_types[] = { [WGPEER_A_FLAGS] = { .type = NETLINK_TYPE_U32 }, [WGPEER_A_PRESHARED_KEY] = { .size = WG_KEY_LEN }, [WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL] = { .type = NETLINK_TYPE_U16 }, - [WGPEER_A_ENDPOINT] = { /* either size of sockaddr_in or sockaddr_in6 depending on address family */ }, + [WGPEER_A_ENDPOINT] = { .type = NETLINK_TYPE_SOCKADDR }, [WGPEER_A_ALLOWEDIPS] = { .type = NETLINK_TYPE_NESTED, .type_system = &genl_wireguard_allowedip_type_system }, }; @@ -732,7 +732,7 @@ static const NLTypeSystem genl_wireguard_peer_type_system = { static const NLType genl_wireguard_set_device_types[] = { [WGDEVICE_A_IFINDEX] = { .type = NETLINK_TYPE_U32 }, - [WGDEVICE_A_IFNAME] = { .type = NETLINK_TYPE_STRING }, + [WGDEVICE_A_IFNAME] = { .type = NETLINK_TYPE_STRING, .size = IFNAMSIZ-1 }, [WGDEVICE_A_FLAGS] = { .type = NETLINK_TYPE_U32 }, [WGDEVICE_A_PRIVATE_KEY] = { .size = WG_KEY_LEN }, [WGDEVICE_A_LISTEN_PORT] = { .type = NETLINK_TYPE_U16 }, diff --git a/src/libsystemd/sd-netlink/netlink-types.h b/src/libsystemd/sd-netlink/netlink-types.h index 3133e4863d..b84fa4762b 100644 --- a/src/libsystemd/sd-netlink/netlink-types.h +++ b/src/libsystemd/sd-netlink/netlink-types.h @@ -16,6 +16,7 @@ enum { NETLINK_TYPE_CACHE_INFO, NETLINK_TYPE_NESTED, /* NLA_NESTED */ NETLINK_TYPE_UNION, + NETLINK_TYPE_SOCKADDR, }; typedef enum NLMatchType { diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index d4b5e248cc..812826fe3d 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -276,11 +276,11 @@ _public_ int sd_network_link_get_carrier_bound_by(int ifindex, int **ret) { return network_link_get_ifindexes(ifindex, "CARRIER_BOUND_BY", ret); } -static inline int MONITOR_TO_FD(sd_network_monitor *m) { +static int MONITOR_TO_FD(sd_network_monitor *m) { return (int) (unsigned long) m - 1; } -static inline sd_network_monitor* FD_TO_MONITOR(int fd) { +static sd_network_monitor* FD_TO_MONITOR(int fd) { return (sd_network_monitor*) (unsigned long) (fd + 1); } diff --git a/src/libsystemd/sd-resolve/sd-resolve.c b/src/libsystemd/sd-resolve/sd-resolve.c index 21d783b8f0..36b9c8d019 100644 --- a/src/libsystemd/sd-resolve/sd-resolve.c +++ b/src/libsystemd/sd-resolve/sd-resolve.c @@ -912,7 +912,6 @@ static int alloc_query(sd_resolve *resolve, bool floating, sd_resolve_query **_q return 0; } - int resolve_getaddrinfo_with_destroy_callback( sd_resolve *resolve, sd_resolve_query **ret_query, |