From 9c4b6dbb314cabd14746527c0865d98300ea5190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Rolim?= Date: Tue, 10 Nov 2020 11:22:27 -0300 Subject: [PATCH] zgenhostid: accept hostid arguments equal to zero. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A common usage pattern for zgenhostid, including in the ZFS dracut module, is running it as: zgenhostid $(hostid) However, zgenhostid only accepted hostid arguments greater than 0, which meant that, when the output of hostid(1) was "00000000", zgenhostid would error out, even though 0 is a possible return value for the gethostid(3) function used by hostid(1): - On current musl libc, gethostid(3) is a stub that always returns 0. - On glibc, gethostid(3) will return 0 if /etc/hostid exists but is smaller than 4 bytes. In these cases, it makes more sense for zgenhostid to treat a value of 0 as other parts of the zfs codebase do, meaning that a hostid value couldn't be determined; therefore, it should attempt to generate a random value to write into /etc/hostid. The manpage and usage output have been updated to reflect this. Whitespace has also been fixed in the usage output. Reviewed-by: Brian Behlendorf Reviewed-by: Georgy Yakovlev Reviewed-by: Andrew J. Hesford Signed-off-by: Érico Rolim Closes #11174 Closes #11189 --- cmd/zgenhostid/zgenhostid.c | 10 +++++----- man/man8/zgenhostid.8 | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cmd/zgenhostid/zgenhostid.c b/cmd/zgenhostid/zgenhostid.c index 562262928c..50fcf05e42 100644 --- a/cmd/zgenhostid/zgenhostid.c +++ b/cmd/zgenhostid/zgenhostid.c @@ -47,10 +47,10 @@ usage(void) " -h\t\t print this usage and exit\n" " -o \t write hostid to this file\n\n" "If hostid file is not present, store a hostid in it.\n" - "The optional value must be an 8-digit hex number between" - "1 and 2^32-1.\n" - "If no value is provided, a random one will" - "be generated.\n" + "The optional value should be an 8-digit hex number between" + " 1 and 2^32-1.\n" + "If the value is 0 or no value is provided, a random one" + " will be generated.\n" "The value must be unique among your systems.\n"); exit(EXIT_FAILURE); /* NOTREACHED */ @@ -108,7 +108,7 @@ main(int argc, char **argv) exit(EXIT_FAILURE); } - if (input_i < 0x1 || input_i > UINT32_MAX) { + if (input_i > UINT32_MAX) { fprintf(stderr, "%s\n", strerror(ERANGE)); usage(); } diff --git a/man/man8/zgenhostid.8 b/man/man8/zgenhostid.8 index ff198443dd..14264cb8cd 100644 --- a/man/man8/zgenhostid.8 +++ b/man/man8/zgenhostid.8 @@ -54,7 +54,8 @@ instead of default .It Ar hostid Specifies the value to be placed in .Pa /etc/hostid . -It must be a number with a value between 1 and 2^32-1. +It should be a number with a value between 1 and 2^32-1. +If it is 0, zgenhostid will generate a random hostid. This value .Sy must be unique among your systems.