From 615906cdcfa8b950f583970a41bc3b3156f90f08 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 19 Apr 2024 14:47:28 +0200 Subject: [PATCH] sd-id128: add an app-specific flavour of the invocation ID too --- man/sd_id128_get_machine.xml | 21 +++++++++++++++----- src/libsystemd/libsystemd.sym | 1 + src/libsystemd/sd-id128/sd-id128.c | 13 ++++++++++++ src/systemd/sd-id128.h | 1 + src/test/test-id128.c | 32 +++++++++++++++++++++++++++++- 5 files changed, 62 insertions(+), 6 deletions(-) diff --git a/man/sd_id128_get_machine.xml b/man/sd_id128_get_machine.xml index 6904f2953c6..59f3266e6fe 100644 --- a/man/sd_id128_get_machine.xml +++ b/man/sd_id128_get_machine.xml @@ -63,6 +63,12 @@ sd_id128_t *ret + + int sd_id128_get_invocation_app_specific + sd_id128_t app_id + sd_id128_t *ret + + @@ -126,12 +132,16 @@ for details. The ID is cached internally. In future a different mechanism to determine the invocation ID may be added. + sd_id128_get_invocation_app_specific() derives an application-specific ID from + the invocation ID. + Note that sd_id128_get_machine_app_specific(), - sd_id128_get_boot(), sd_id128_get_boot_app_specific(), and - sd_id128_get_invocation() always return UUID Variant 1 Version 4 compatible IDs. - sd_id128_get_machine() will also return a UUID Variant 1 Version 4 compatible ID on - new installations but might not on older. It is possible to convert the machine ID non-reversibly into a - UUID Variant 1 Version 4 compatible one. For more information, see + sd_id128_get_boot(), sd_id128_get_boot_app_specific(), + sd_id128_get_invocation() and + sd_id128_get_invocation_app_specific always return UUID Variant 1 Version 4 + compatible IDs. sd_id128_get_machine() will also return a UUID Variant 1 Version 4 + compatible ID on new installations but might not on older. It is possible to convert the machine ID + non-reversibly into a UUID Variant 1 Version 4 compatible one. For more information, see machine-id5. It is hence guaranteed that these functions will never return the ID consisting of all zero or all one bits (SD_ID128_NULL, SD_ID128_ALLF) — with the possible exception of @@ -262,6 +272,7 @@ As man:sd-id128(3) macro: sd_id128_get_machine_app_specific() was added in version 233. sd_id128_get_boot_app_specific() was added in version 240. sd_id128_get_app_specific() was added in version 255. + sd_id128_get_invocation_app_specific() was added in version 256. diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index 89de4b37cab..78b44534629 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -839,6 +839,7 @@ LIBSYSTEMD_256 { global: sd_bus_creds_get_pidfd_dup; sd_bus_creds_new_from_pidfd; + sd_id128_get_invocation_app_specific; sd_journal_stream_fd_with_namespace; sd_event_source_get_inotify_path; } LIBSYSTEMD_255; diff --git a/src/libsystemd/sd-id128/sd-id128.c b/src/libsystemd/sd-id128/sd-id128.c index 4336d3f1b70..62b8aaa347d 100644 --- a/src/libsystemd/sd-id128/sd-id128.c +++ b/src/libsystemd/sd-id128/sd-id128.c @@ -390,3 +390,16 @@ _public_ int sd_id128_get_boot_app_specific(sd_id128_t app_id, sd_id128_t *ret) return sd_id128_get_app_specific(id, app_id, ret); } + +_public_ int sd_id128_get_invocation_app_specific(sd_id128_t app_id, sd_id128_t *ret) { + sd_id128_t id; + int r; + + assert_return(ret, -EINVAL); + + r = sd_id128_get_invocation(&id); + if (r < 0) + return r; + + return sd_id128_get_app_specific(id, app_id, ret); +} diff --git a/src/systemd/sd-id128.h b/src/systemd/sd-id128.h index a984a9d85e1..a9210526b6a 100644 --- a/src/systemd/sd-id128.h +++ b/src/systemd/sd-id128.h @@ -53,6 +53,7 @@ int sd_id128_get_invocation(sd_id128_t *ret); int sd_id128_get_app_specific(sd_id128_t base, sd_id128_t app_id, sd_id128_t *ret); int sd_id128_get_machine_app_specific(sd_id128_t app_id, sd_id128_t *ret); int sd_id128_get_boot_app_specific(sd_id128_t app_id, sd_id128_t *ret); +int sd_id128_get_invocation_app_specific(sd_id128_t app_id, sd_id128_t *ret); #define SD_ID128_ARRAY(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) \ { .bytes = { 0x##v0, 0x##v1, 0x##v2, 0x##v3, 0x##v4, 0x##v5, 0x##v6, 0x##v7, \ diff --git a/src/test/test-id128.c b/src/test/test-id128.c index 3ddbeec0fc7..48fdbba6c7d 100644 --- a/src/test/test-id128.c +++ b/src/test/test-id128.c @@ -199,7 +199,7 @@ TEST(id128) { } TEST(sd_id128_get_invocation) { - sd_id128_t id; + sd_id128_t id = SD_ID128_NULL; int r; /* Query the invocation ID */ @@ -208,6 +208,36 @@ TEST(sd_id128_get_invocation) { log_warning_errno(r, "Failed to get invocation ID, ignoring: %m"); else log_info("Invocation ID: " SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(id)); + + sd_id128_t appid = SD_ID128_NULL; + r = sd_id128_get_invocation_app_specific(SD_ID128_MAKE(59,36,e9,92,fd,11,42,fe,87,c9,e9,b5,6c,9e,4f,04), &appid); + if (r < 0) + log_warning_errno(r, "Failed to get invocation ID, ignoring: %m"); + else { + assert(!sd_id128_equal(id, appid)); + log_info("Per-App Invocation ID: " SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(appid)); + } + + sd_id128_t appid2 = SD_ID128_NULL; + r = sd_id128_get_invocation_app_specific(SD_ID128_MAKE(59,36,e9,92,fd,11,42,fe,87,c9,e9,b5,6c,9e,4f,05), &appid2); /* slightly different appid */ + if (r < 0) + log_warning_errno(r, "Failed to get invocation ID, ignoring: %m"); + else { + assert(!sd_id128_equal(id, appid2)); + assert(!sd_id128_equal(appid, appid2)); + log_info("Per-App Invocation ID 2: " SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(appid2)); + } + + sd_id128_t appid3 = SD_ID128_NULL; + r = sd_id128_get_invocation_app_specific(SD_ID128_MAKE(59,36,e9,92,fd,11,42,fe,87,c9,e9,b5,6c,9e,4f,04), &appid3); /* same appid as before */ + if (r < 0) + log_warning_errno(r, "Failed to get invocation ID, ignoring: %m"); + else { + assert(!sd_id128_equal(id, appid3)); + assert(sd_id128_equal(appid, appid3)); + assert(!sd_id128_equal(appid2, appid3)); + log_info("Per-App Invocation ID 3: " SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(appid3)); + } } TEST(benchmark_sd_id128_get_machine_app_specific) { -- 2.47.3