diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2023-04-04 12:18:04 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2023-04-05 00:52:56 +0900 |
commit | 52673ef848e711cf66fcb871cc36af7e3b3faa47 (patch) | |
tree | bfb112a255de8020781052c1ff82c7e08a10193c /src/libsystemd | |
parent | 51339a9aebc4f8e8f14f684ab8d3ca3eed9cf7d9 (diff) | |
download | systemd-52673ef848e711cf66fcb871cc36af7e3b3faa47.tar.gz |
sd-id128: introduce ID128_REFUSE_NULL flag
Diffstat (limited to 'src/libsystemd')
-rw-r--r-- | src/libsystemd/sd-id128/id128-util.c | 18 | ||||
-rw-r--r-- | src/libsystemd/sd-id128/id128-util.h | 1 | ||||
-rw-r--r-- | src/libsystemd/sd-id128/sd-id128.c | 10 |
3 files changed, 19 insertions, 10 deletions
diff --git a/src/libsystemd/sd-id128/id128-util.c b/src/libsystemd/sd-id128/id128-util.c index 3fa1585aa3..76c9d1c051 100644 --- a/src/libsystemd/sd-id128/id128-util.c +++ b/src/libsystemd/sd-id128/id128-util.c @@ -43,6 +43,7 @@ bool id128_is_valid(const char *s) { int id128_read_fd(int fd, Id128Flag f, sd_id128_t *ret) { char buffer[SD_ID128_UUID_STRING_MAX + 1]; /* +1 is for trailing newline */ + sd_id128_t id; ssize_t l; int r; @@ -98,8 +99,18 @@ int id128_read_fd(int fd, Id128Flag f, sd_id128_t *ret) { return -EUCLEAN; } - r = sd_id128_from_string(buffer, ret); - return r == -EINVAL ? -EUCLEAN : r; + r = sd_id128_from_string(buffer, &id); + if (r == -EINVAL) + return -EUCLEAN; + if (r < 0) + return r; + + if (FLAGS_SET(f, ID128_REFUSE_NULL) && sd_id128_is_null(id)) + return -ENOMEDIUM; + + if (ret) + *ret = id; + return 0; } int id128_read_at(int dir_fd, const char *path, Id128Flag f, sd_id128_t *ret) { @@ -123,6 +134,9 @@ int id128_write_fd(int fd, Id128Flag f, sd_id128_t id) { assert(fd >= 0); assert(IN_SET((f & ID128_FORMAT_ANY), ID128_FORMAT_PLAIN, ID128_FORMAT_UUID)); + if (FLAGS_SET(f, ID128_REFUSE_NULL) && sd_id128_is_null(id)) + return -ENOMEDIUM; + if (FLAGS_SET(f, ID128_FORMAT_PLAIN)) { assert_se(sd_id128_to_string(id, buffer)); sz = SD_ID128_STRING_MAX; diff --git a/src/libsystemd/sd-id128/id128-util.h b/src/libsystemd/sd-id128/id128-util.h index fde58a5228..6f7660d9b4 100644 --- a/src/libsystemd/sd-id128/id128-util.h +++ b/src/libsystemd/sd-id128/id128-util.h @@ -17,6 +17,7 @@ typedef enum Id128Flag { ID128_FORMAT_ANY = ID128_FORMAT_PLAIN | ID128_FORMAT_UUID, ID128_SYNC_ON_WRITE = 1 << 2, /* Sync the file after write. Used only when writing an ID. */ + ID128_REFUSE_NULL = 1 << 3, /* Refuse all zero ID with -ENOMEDIUM. */ } Id128Flag; int id128_read_fd(int fd, Id128Flag f, sd_id128_t *ret); diff --git a/src/libsystemd/sd-id128/sd-id128.c b/src/libsystemd/sd-id128/sd-id128.c index 5ce36cf2fc..075e64d553 100644 --- a/src/libsystemd/sd-id128/sd-id128.c +++ b/src/libsystemd/sd-id128/sd-id128.c @@ -126,12 +126,9 @@ _public_ int sd_id128_get_machine(sd_id128_t *ret) { int r; if (sd_id128_is_null(saved_machine_id)) { - r = id128_read("/etc/machine-id", ID128_FORMAT_PLAIN, &saved_machine_id); + r = id128_read("/etc/machine-id", ID128_FORMAT_PLAIN | ID128_REFUSE_NULL, &saved_machine_id); if (r < 0) return r; - - if (sd_id128_is_null(saved_machine_id)) - return -ENOMEDIUM; } if (ret) @@ -144,14 +141,11 @@ _public_ int sd_id128_get_boot(sd_id128_t *ret) { int r; if (sd_id128_is_null(saved_boot_id)) { - r = id128_read("/proc/sys/kernel/random/boot_id", ID128_FORMAT_UUID, &saved_boot_id); + r = id128_read("/proc/sys/kernel/random/boot_id", ID128_FORMAT_UUID | ID128_REFUSE_NULL, &saved_boot_id); if (r == -ENOENT && proc_mounted() == 0) return -ENOSYS; if (r < 0) return r; - - if (sd_id128_is_null(saved_boot_id)) - return -ENOMEDIUM; } if (ret) |