diff --git a/src/udev/meson.build b/src/udev/meson.build index 4a95c431a53..fd74e28682f 100644 --- a/src/udev/meson.build +++ b/src/udev/meson.build @@ -197,6 +197,12 @@ tests += [ [threads, libacl]], + [['src/udev/test-udev-builtin.c'], + [libudevd_core, + libshared], + [threads, + libacl]], + [['src/udev/fido_id/test-fido-id-desc.c', 'src/udev/fido_id/fido_id_desc.c']], ] diff --git a/src/udev/test-udev-builtin.c b/src/udev/test-udev-builtin.c new file mode 100644 index 00000000000..1bd1dbddf52 --- /dev/null +++ b/src/udev/test-udev-builtin.c @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "tests.h" +#include "udev-builtin.h" + +static void test_udev_builtin_cmd_to_ptr(void) { + log_info("/* %s */", __func__); + + /* Those could have been static_assert()s, but ({}) is not allowed there. */ +#if HAVE_BLKID + assert_se(UDEV_BUILTIN_CMD_TO_PTR(UDEV_BUILTIN_BLKID)); + assert_se(PTR_TO_UDEV_BUILTIN_CMD(UDEV_BUILTIN_CMD_TO_PTR(UDEV_BUILTIN_BLKID)) == UDEV_BUILTIN_BLKID); +#endif + assert_se(UDEV_BUILTIN_CMD_TO_PTR(UDEV_BUILTIN_BTRFS)); + assert_se(PTR_TO_UDEV_BUILTIN_CMD(UDEV_BUILTIN_CMD_TO_PTR(UDEV_BUILTIN_BTRFS)) == UDEV_BUILTIN_BTRFS); + assert_se(PTR_TO_UDEV_BUILTIN_CMD(UDEV_BUILTIN_CMD_TO_PTR(_UDEV_BUILTIN_INVALID)) == _UDEV_BUILTIN_INVALID); + + assert_se(PTR_TO_UDEV_BUILTIN_CMD(NULL) == _UDEV_BUILTIN_INVALID); + assert_se(PTR_TO_UDEV_BUILTIN_CMD((void*) 10000) == _UDEV_BUILTIN_INVALID); +} + +int main(int argc, char *argv[]) { + test_setup_logging(LOG_DEBUG); + + test_udev_builtin_cmd_to_ptr(); +} diff --git a/src/udev/udev-builtin.h b/src/udev/udev-builtin.h index 14d6406d2b1..b92d74fc9d1 100644 --- a/src/udev/udev-builtin.h +++ b/src/udev/udev-builtin.h @@ -37,8 +37,18 @@ typedef struct UdevBuiltin { bool run_once; } UdevBuiltin; -#define PTR_TO_UDEV_BUILTIN_CMD(p) ((UdevBuiltinCommand) ((intptr_t) (p)-1)) -#define UDEV_BUILTIN_CMD_TO_PTR(u) ((void *) ((intptr_t) (u)+1)) +#define UDEV_BUILTIN_CMD_TO_PTR(u) \ + ({ \ + UdevBuiltinCommand _u = (u); \ + _u < 0 ? NULL : (void*)(intptr_t) (_u + 1); \ + }) + +#define PTR_TO_UDEV_BUILTIN_CMD(p) \ + ({ \ + void *_p = (p); \ + _p && (intptr_t)(_p) <= _UDEV_BUILTIN_MAX ? \ + (UdevBuiltinCommand)((intptr_t)_p - 1) : _UDEV_BUILTIN_INVALID; \ + }) #if HAVE_BLKID extern const UdevBuiltin udev_builtin_blkid;