summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2018-10-23 18:26:06 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2018-10-23 18:29:25 +0900
commitd354690e7d0429338cdd1c2cfe1fdd08fc53da9e (patch)
treed973cacc0865e3ddcb222692459bc8d887ebfa09 /src
parent45a73f4be32481eacdb652c0869d69025fab354c (diff)
downloadsystemd-d354690e7d0429338cdd1c2cfe1fdd08fc53da9e.tar.gz
systemd-d354690e7d0429338cdd1c2cfe1fdd08fc53da9e.tar.bz2
systemd-d354690e7d0429338cdd1c2cfe1fdd08fc53da9e.zip
udev-builtin: propagate negative errno
Diffstat (limited to 'src')
-rw-r--r--src/udev/udev-builtin-blkid.c29
-rw-r--r--src/udev/udev-builtin-btrfs.c16
-rw-r--r--src/udev/udev-builtin-hwdb.c23
-rw-r--r--src/udev/udev-builtin-input_id.c2
-rw-r--r--src/udev/udev-builtin-keyboard.c15
-rw-r--r--src/udev/udev-builtin-kmod.c4
-rw-r--r--src/udev/udev-builtin-net_id.c23
-rw-r--r--src/udev/udev-builtin-net_setup_link.c15
-rw-r--r--src/udev/udev-builtin-path_id.c8
-rw-r--r--src/udev/udev-builtin-uaccess.c15
-rw-r--r--src/udev/udev-builtin-usb_id.c36
-rw-r--r--src/udev/udev-rules.c7
-rw-r--r--src/udev/udevadm-test-builtin.c2
13 files changed, 87 insertions, 108 deletions
diff --git a/src/udev/udev-builtin-blkid.c b/src/udev/udev-builtin-blkid.c
index f521357aba..7ed4fbad78 100644
--- a/src/udev/udev-builtin-blkid.c
+++ b/src/udev/udev-builtin-blkid.c
@@ -182,6 +182,8 @@ static int probe_superblocks(blkid_probe pr) {
struct stat st;
int rc;
+ /* TODO: Return negative errno. */
+
if (fstat(blkid_probe_get_fd(pr), &st))
return -errno;
@@ -235,11 +237,9 @@ static int builtin_blkid(sd_device *dev, int argc, char *argv[], bool test) {
case 'o':
r = safe_atoi64(optarg, &offset);
if (r < 0)
- goto out;
- if (offset < 0) {
- r = -ERANGE;
- goto out;
- }
+ return r;
+ if (offset < 0)
+ return -ERANGE;
break;
case 'R':
noraid = true;
@@ -247,9 +247,10 @@ static int builtin_blkid(sd_device *dev, int argc, char *argv[], bool test) {
}
}
+ errno = 0;
pr = blkid_new_probe();
if (!pr)
- return EXIT_FAILURE;
+ return errno > 0 ? -errno : -ENOMEM;
blkid_probe_set_superblocks_flags(pr,
BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID |
@@ -261,17 +262,16 @@ static int builtin_blkid(sd_device *dev, int argc, char *argv[], bool test) {
r = sd_device_get_devname(dev, &devnode);
if (r < 0)
- goto out;
+ return r;
fd = open(devnode, O_RDONLY|O_CLOEXEC);
- if (fd < 0) {
- r = log_debug_errno(errno, "Failure opening block device %s: %m", devnode);
- goto out;
- }
+ if (fd < 0)
+ return log_debug_errno(errno, "Failure opening block device %s: %m", devnode);
+ errno = 0;
r = blkid_probe_set_device(pr, fd, offset, 0);
if (r < 0)
- goto out;
+ return errno > 0 ? -errno : -ENOMEM;
log_debug("probe %s %sraid offset=%"PRIi64,
devnode,
@@ -279,7 +279,7 @@ static int builtin_blkid(sd_device *dev, int argc, char *argv[], bool test) {
r = probe_superblocks(pr);
if (r < 0)
- goto out;
+ return r;
/* If we are a partition then our parent passed on the root
* partition UUID to us */
@@ -305,8 +305,7 @@ static int builtin_blkid(sd_device *dev, int argc, char *argv[], bool test) {
if (is_gpt)
find_gpt_root(dev, pr, test);
-out:
- return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+ return 0;
}
const struct udev_builtin udev_builtin_blkid = {
diff --git a/src/udev/udev-builtin-btrfs.c b/src/udev/udev-builtin-btrfs.c
index 93fc29f56c..4380eb0be4 100644
--- a/src/udev/udev-builtin-btrfs.c
+++ b/src/udev/udev-builtin-btrfs.c
@@ -18,22 +18,22 @@
static int builtin_btrfs(sd_device *dev, int argc, char *argv[], bool test) {
struct btrfs_ioctl_vol_args args = {};
_cleanup_close_ int fd = -1;
- int err;
+ int r;
if (argc != 3 || !streq(argv[1], "ready"))
- return EXIT_FAILURE;
+ return -EINVAL;
fd = open("/dev/btrfs-control", O_RDWR|O_CLOEXEC);
if (fd < 0)
- return EXIT_FAILURE;
+ return -errno;
strscpy(args.name, sizeof(args.name), argv[2]);
- err = ioctl(fd, BTRFS_IOC_DEVICES_READY, &args);
- if (err < 0)
- return EXIT_FAILURE;
+ r = ioctl(fd, BTRFS_IOC_DEVICES_READY, &args);
+ if (r < 0)
+ return -errno;
- udev_builtin_add_property(dev, test, "ID_BTRFS_READY", one_zero(err == 0));
- return EXIT_SUCCESS;
+ udev_builtin_add_property(dev, test, "ID_BTRFS_READY", one_zero(r == 0));
+ return 0;
}
const struct udev_builtin udev_builtin_btrfs = {
diff --git a/src/udev/udev-builtin-hwdb.c b/src/udev/udev-builtin-hwdb.c
index 5a905c3b66..3beb433589 100644
--- a/src/udev/udev-builtin-hwdb.c
+++ b/src/udev/udev-builtin-hwdb.c
@@ -127,9 +127,10 @@ static int builtin_hwdb(sd_device *dev, int argc, char *argv[], bool test) {
const char *subsystem = NULL;
const char *prefix = NULL;
_cleanup_(sd_device_unrefp) sd_device *srcdev = NULL;
+ int r;
if (!hwdb)
- return EXIT_FAILURE;
+ return -EINVAL;
for (;;) {
int option;
@@ -158,21 +159,17 @@ static int builtin_hwdb(sd_device *dev, int argc, char *argv[], bool test) {
}
/* query a specific key given as argument */
- if (argv[optind]) {
- if (udev_builtin_hwdb_lookup(dev, prefix, argv[optind], filter, test) > 0)
- return EXIT_SUCCESS;
- return EXIT_FAILURE;
- }
+ if (argv[optind])
+ return udev_builtin_hwdb_lookup(dev, prefix, argv[optind], filter, test);
/* read data from another device than the device we will store the data */
- if (device)
- if (sd_device_new_from_device_id(&srcdev, device) < 0)
- return EXIT_FAILURE;
-
- if (udev_builtin_hwdb_search(dev, srcdev, subsystem, prefix, filter, test) > 0)
- return EXIT_SUCCESS;
+ if (device) {
+ r = sd_device_new_from_device_id(&srcdev, device);
+ if (r < 0)
+ return r;
+ }
- return EXIT_FAILURE;
+ return udev_builtin_hwdb_search(dev, srcdev, subsystem, prefix, filter, test);
}
/* called at udev startup and reload */
diff --git a/src/udev/udev-builtin-input_id.c b/src/udev/udev-builtin-input_id.c
index a96db58c7a..900c815058 100644
--- a/src/udev/udev-builtin-input_id.c
+++ b/src/udev/udev-builtin-input_id.c
@@ -354,7 +354,7 @@ static int builtin_input_id(sd_device *dev, int argc, char *argv[], bool test) {
startswith(sysname, "event"))
extract_info(dev, devnode, test);
- return EXIT_SUCCESS;
+ return 0;
}
const struct udev_builtin udev_builtin_input_id = {
diff --git a/src/udev/udev-builtin-keyboard.c b/src/udev/udev-builtin-keyboard.c
index 79d9826621..728daa02d8 100644
--- a/src/udev/udev-builtin-keyboard.c
+++ b/src/udev/udev-builtin-keyboard.c
@@ -195,8 +195,7 @@ static int builtin_keyboard(sd_device *dev, int argc, char *argv[], bool test) {
const char *s = NULL;
(void) sd_device_get_syspath(dev, &s);
- log_error_errno(r, "No device node for \"%s\": %m", strnull(s));
- return EXIT_FAILURE;
+ return log_error_errno(r, "No device node for \"%s\": %m", strnull(s));
}
FOREACH_DEVICE_PROPERTY(dev, key, value) {
@@ -228,7 +227,7 @@ static int builtin_keyboard(sd_device *dev, int argc, char *argv[], bool test) {
if (fd == -1) {
fd = open_device(node);
if (fd < 0)
- return EXIT_FAILURE;
+ return fd;
}
map_keycode(fd, node, scancode, keycode);
@@ -245,7 +244,7 @@ static int builtin_keyboard(sd_device *dev, int argc, char *argv[], bool test) {
if (fd == -1) {
fd = open_device(node);
if (fd < 0)
- return EXIT_FAILURE;
+ return fd;
}
if (has_abs == -1) {
@@ -253,10 +252,8 @@ static int builtin_keyboard(sd_device *dev, int argc, char *argv[], bool test) {
int rc;
rc = ioctl(fd, EVIOCGBIT(0, sizeof(bits)), &bits);
- if (rc < 0) {
- log_error_errno(errno, "Unable to EVIOCGBIT device \"%s\"", node);
- return EXIT_FAILURE;
- }
+ if (rc < 0)
+ return log_error_errno(errno, "Unable to EVIOCGBIT device \"%s\"", node);
has_abs = !!(bits & (1 << EV_ABS));
if (!has_abs)
@@ -275,7 +272,7 @@ static int builtin_keyboard(sd_device *dev, int argc, char *argv[], bool test) {
if (release_count > 0)
install_force_release(dev, release, release_count);
- return EXIT_SUCCESS;
+ return 0;
}
const struct udev_builtin udev_builtin_keyboard = {
diff --git a/src/udev/udev-builtin-kmod.c b/src/udev/udev-builtin-kmod.c
index 052c7aa311..d8575b72bd 100644
--- a/src/udev/udev-builtin-kmod.c
+++ b/src/udev/udev-builtin-kmod.c
@@ -29,13 +29,13 @@ static int builtin_kmod(sd_device *dev, int argc, char *argv[], bool test) {
if (argc < 3 || !streq(argv[1], "load")) {
log_error("%s: expected: load <module>", argv[0]);
- return EXIT_FAILURE;
+ return -EINVAL;
}
for (i = 2; argv[i]; i++)
(void) module_load_and_warn(ctx, argv[i], false);
- return EXIT_SUCCESS;
+ return 0;
}
/* called at udev startup and reload */
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
index 79d66ed520..afcf60933f 100644
--- a/src/udev/udev-builtin-net_id.c
+++ b/src/udev/udev-builtin-net_id.c
@@ -813,7 +813,7 @@ static int builtin_net_id(sd_device *dev, int argc, char *argv[], bool test) {
/* handle only ARPHRD_ETHER, ARPHRD_SLIP and ARPHRD_INFINIBAND devices */
r = sd_device_get_sysattr_value(dev, "type", &s);
if (r < 0)
- return EXIT_FAILURE;
+ return r;
i = strtoul(s, NULL, 0);
switch (i) {
@@ -833,10 +833,10 @@ static int builtin_net_id(sd_device *dev, int argc, char *argv[], bool test) {
/* skip stacked devices, like VLANs, ... */
r = sd_device_get_sysattr_value(dev, "ifindex", &s);
if (r < 0)
- return EXIT_FAILURE;
+ return r;
r = sd_device_get_sysattr_value(dev, "iflink", &p);
if (r < 0)
- return EXIT_FAILURE;
+ return r;
if (!streq(s, p))
return 0;
@@ -865,7 +865,7 @@ static int builtin_net_id(sd_device *dev, int argc, char *argv[], bool test) {
if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.ccw_busid))
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
- goto out;
+ return 0;
}
/* get ibmveth/ibmvnic slot-based names. */
@@ -874,7 +874,7 @@ static int builtin_net_id(sd_device *dev, int argc, char *argv[], bool test) {
if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.vio_slot))
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
- goto out;
+ return 0;
}
/* get ACPI path names for ARM64 platform devices */
@@ -883,12 +883,12 @@ static int builtin_net_id(sd_device *dev, int argc, char *argv[], bool test) {
if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.platform_path))
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
- goto out;
+ return 0;
}
/* get PCI based path names, we compose only PCI based paths */
if (names_pci(dev, &names) < 0)
- goto out;
+ return 0;
/* plain PCI device */
if (names.type == NET_PCI) {
@@ -909,7 +909,7 @@ static int builtin_net_id(sd_device *dev, int argc, char *argv[], bool test) {
if (names.pci_slot[0] &&
snprintf_ok(str, sizeof str, "%s%s", prefix, names.pci_slot))
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
- goto out;
+ return 0;
}
/* USB device */
@@ -923,7 +923,7 @@ static int builtin_net_id(sd_device *dev, int argc, char *argv[], bool test) {
if (names.pci_slot[0] &&
snprintf_ok(str, sizeof str, "%s%s%s", prefix, names.pci_slot, names.usb_ports))
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
- goto out;
+ return 0;
}
/* Broadcom bus */
@@ -937,11 +937,10 @@ static int builtin_net_id(sd_device *dev, int argc, char *argv[], bool test) {
if (names.pci_slot[0] &&
snprintf(str, sizeof str, "%s%s%s", prefix, names.pci_slot, names.bcma_core))
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
- goto out;
+ return 0;
}
-out:
- return EXIT_SUCCESS;
+ return 0;
}
const struct udev_builtin udev_builtin_net_id = {
diff --git a/src/udev/udev-builtin-net_setup_link.c b/src/udev/udev-builtin-net_setup_link.c
index b971e6b238..d9a0acb63d 100644
--- a/src/udev/udev-builtin-net_setup_link.c
+++ b/src/udev/udev-builtin-net_setup_link.c
@@ -16,7 +16,7 @@ static int builtin_net_setup_link(sd_device *dev, int argc, char **argv, bool te
if (argc > 1) {
log_error("This program takes no arguments.");
- return EXIT_FAILURE;
+ return -EINVAL;
}
r = link_get_driver(ctx, dev, &driver);
@@ -25,13 +25,10 @@ static int builtin_net_setup_link(sd_device *dev, int argc, char **argv, bool te
r = link_config_get(ctx, dev, &link);
if (r < 0) {
- if (r == -ENOENT) {
- log_debug("No matching link configuration found.");
- return EXIT_SUCCESS;
- } else {
- log_error_errno(r, "Could not get link config: %m");
- return EXIT_FAILURE;
- }
+ if (r == -ENOENT)
+ return log_debug_errno(r, "No matching link configuration found.");
+
+ return log_error_errno(r, "Could not get link config: %m");
}
r = link_config_apply(ctx, link, dev, &name);
@@ -47,7 +44,7 @@ static int builtin_net_setup_link(sd_device *dev, int argc, char **argv, bool te
if (name)
udev_builtin_add_property(dev, test, "ID_NET_NAME", name);
- return EXIT_SUCCESS;
+ return 0;
}
static int builtin_net_setup_link_init(void) {
diff --git a/src/udev/udev-builtin-path_id.c b/src/udev/udev-builtin-path_id.c
index ef8adcdab4..e8581a4869 100644
--- a/src/udev/udev-builtin-path_id.c
+++ b/src/udev/udev-builtin-path_id.c
@@ -619,7 +619,7 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
}
if (!path)
- return EXIT_FAILURE;
+ return -ENOENT;
/*
* Do not return devices with an unknown parent device type. They
@@ -627,7 +627,7 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
* unique and predictable name.
*/
if (!supported_parent)
- return EXIT_FAILURE;
+ return -ENOENT;
/*
* Do not return block devices without a well-known transport. Some
@@ -637,7 +637,7 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
if (sd_device_get_subsystem(dev, &subsystem) >= 0 &&
streq(subsystem, "block") &&
!supported_transport)
- return EXIT_FAILURE;
+ return -ENOENT;
{
char tag[UTIL_NAME_SIZE];
@@ -673,7 +673,7 @@ static int builtin_path_id(sd_device *dev, int argc, char *argv[], bool test) {
udev_builtin_add_property(dev, test, "ID_PATH_TAG", tag);
}
- return EXIT_SUCCESS;
+ return 0;
}
const struct udev_builtin udev_builtin_path_id = {
diff --git a/src/udev/udev-builtin-uaccess.c b/src/udev/udev-builtin-uaccess.c
index 7be17f32c7..72f40dc4d6 100644
--- a/src/udev/udev-builtin-uaccess.c
+++ b/src/udev/udev-builtin-uaccess.c
@@ -35,12 +35,13 @@ static int builtin_uaccess(sd_device *dev, int argc, char *argv[], bool test) {
seat = "seat0";
r = sd_seat_get_active(seat, NULL, &uid);
- if (IN_SET(r, -ENXIO, -ENODATA)) {
- /* No active session on this seat */
- r = 0;
- goto finish;
- } else if (r < 0) {
- log_error("Failed to determine active user on seat %s.", seat);
+ if (r < 0) {
+ if (IN_SET(r, -ENXIO, -ENODATA))
+ /* No active session on this seat */
+ r = 0;
+ else
+ log_error_errno(r, "Failed to determine active user on seat %s: %m", seat);
+
goto finish;
}
@@ -66,7 +67,7 @@ finish:
}
}
- return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+ return r;
}
const struct udev_builtin udev_builtin_uaccess = {
diff --git a/src/udev/udev-builtin-usb_id.c b/src/udev/udev-builtin-usb_id.c
index 376cda1d3d..68c08444b0 100644
--- a/src/udev/udev-builtin-usb_id.c
+++ b/src/udev/udev-builtin-usb_id.c
@@ -253,11 +253,11 @@ static int builtin_usb_id(sd_device *dev, int argc, char *argv[], bool test) {
r = sd_device_get_syspath(dev, &syspath);
if (r < 0)
- return EXIT_FAILURE;
+ return r;
r = sd_device_get_sysname(dev, &sysname);
if (r < 0)
- return EXIT_FAILURE;
+ return r;
/* shortcut, if we are called directly for a "usb_device" type */
if (sd_device_get_devtype(dev, &devtype) >= 0 && streq(devtype, "usb_device")) {
@@ -268,22 +268,18 @@ static int builtin_usb_id(sd_device *dev, int argc, char *argv[], bool test) {
/* usb interface directory */
r = sd_device_get_parent_with_subsystem_devtype(dev, "usb", "usb_interface", &dev_interface);
- if (r < 0) {
- log_debug_errno(r, "Failed to access usb_interface device of '%s': %m", syspath);
- return EXIT_FAILURE;
- }
+ if (r < 0)
+ return log_debug_errno(r, "Failed to access usb_interface device of '%s': %m", syspath);
r = sd_device_get_syspath(dev_interface, &interface_syspath);
if (r < 0)
- return EXIT_FAILURE;
+ return r;
(void) sd_device_get_sysattr_value(dev_interface, "bInterfaceNumber", &ifnum);
(void) sd_device_get_sysattr_value(dev_interface, "driver", &driver);
r = sd_device_get_sysattr_value(dev_interface, "bInterfaceClass", &if_class);
- if (r < 0) {
- log_debug_errno(r, "Failed to get bInterfaceClass attribute of '%s': %m", sysname);
- return EXIT_FAILURE;
- }
+ if (r < 0)
+ return log_debug_errno(r, "Failed to get bInterfaceClass attribute of '%s': %m", sysname);
if_class_num = strtoul(if_class, NULL, 16);
if (if_class_num == 8) {
@@ -297,10 +293,8 @@ static int builtin_usb_id(sd_device *dev, int argc, char *argv[], bool test) {
/* usb device directory */
r = sd_device_get_parent_with_subsystem_devtype(dev_interface, "usb", "usb_device", &dev_usb);
- if (r < 0) {
- log_debug_errno(r, "Failed to find parent 'usb' device of '%s'", syspath);
- return EXIT_FAILURE;
- }
+ if (r < 0)
+ return log_debug_errno(r, "Failed to find parent 'usb' device of '%s'", syspath);
/* all interfaces of the device in a single string */
dev_if_packed_info(dev_usb, packed_if_str, sizeof(packed_if_str));
@@ -368,11 +362,11 @@ static int builtin_usb_id(sd_device *dev, int argc, char *argv[], bool test) {
fallback:
r = sd_device_get_sysattr_value(dev_usb, "idVendor", &vendor_id);
if (r < 0)
- return EXIT_FAILURE;
+ return r;
r = sd_device_get_sysattr_value(dev_usb, "idProduct", &product_id);
if (r < 0)
- return EXIT_FAILURE;
+ return r;
/* fallback to USB vendor & device */
if (vendor_str[0] == '\0') {
@@ -380,10 +374,6 @@ fallback:
if (sd_device_get_sysattr_value(dev_usb, "manufacturer", &usb_vendor) < 0)
usb_vendor = vendor_id;
- if (!usb_vendor) {
- log_debug("No USB vendor information available");
- return EXIT_FAILURE;
- }
udev_util_encode_string(usb_vendor, vendor_str_enc, sizeof(vendor_str_enc));
util_replace_whitespace(usb_vendor, vendor_str, sizeof(vendor_str)-1);
util_replace_chars(vendor_str, NULL);
@@ -394,8 +384,6 @@ fallback:
if (sd_device_get_sysattr_value(dev_usb, "product", &usb_model) < 0)
usb_model = product_id;
- if (!usb_model)
- return EXIT_FAILURE;
udev_util_encode_string(usb_model, model_str_enc, sizeof(model_str_enc));
util_replace_whitespace(usb_model, model_str, sizeof(model_str)-1);
util_replace_chars(model_str, NULL);
@@ -459,7 +447,7 @@ fallback:
udev_builtin_add_property(dev, test, "ID_USB_INTERFACE_NUM", ifnum);
if (driver)
udev_builtin_add_property(dev, test, "ID_USB_DRIVER", driver);
- return EXIT_SUCCESS;
+ return 0;
}
const struct udev_builtin udev_builtin_usb_id = {
diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c
index defa289782..7703e867f8 100644
--- a/src/udev/udev-rules.c
+++ b/src/udev/udev-rules.c
@@ -2015,10 +2015,11 @@ int udev_rules_apply_to_event(
rules_str(rules, rule->rule.filename_off),
rule->rule.filename_line);
- if (udev_builtin_run(event->dev->device, cur->key.builtin_cmd, command, false) != 0) {
+ r = udev_builtin_run(event->dev->device, cur->key.builtin_cmd, command, false);
+ if (r < 0) {
/* remember failure */
- log_debug("IMPORT builtin '%s' returned non-zero",
- udev_builtin_name(cur->key.builtin_cmd));
+ log_debug_errno(r, "IMPORT builtin '%s' fails: %m",
+ udev_builtin_name(cur->key.builtin_cmd));
event->builtin_ret |= (1 << cur->key.builtin_cmd);
if (cur->key.op != OP_NOMATCH)
goto nomatch;
diff --git a/src/udev/udevadm-test-builtin.c b/src/udev/udevadm-test-builtin.c
index 6be3871d0b..7bf7b08a44 100644
--- a/src/udev/udevadm-test-builtin.c
+++ b/src/udev/udevadm-test-builtin.c
@@ -91,7 +91,7 @@ int builtin_main(int argc, char *argv[], void *userdata) {
r = udev_builtin_run(dev, cmd, arg_command, true);
if (r < 0)
- log_debug("error executing '%s', exit code %i", arg_command, r);
+ log_debug_errno(r, "Builtin command '%s' fails: %m", arg_command);
finish:
udev_builtin_exit();