In data venerdì 26 giugno 2015 17:35:42, Chen Hanxiao ha scritto:
Also introduce get_random_uuid()
Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com> --- daemon/daemon.h | 2 ++ daemon/swap.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+)
diff --git a/daemon/daemon.h b/daemon/daemon.h index 9c8476c..6c07c6a 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -278,6 +278,8 @@ extern char *ntfs_get_label (const char *device);
/*-- in swap.c --*/ extern int swap_set_uuid (const char *device, const char *uuid); +extern int swap_set_uuid_random (const char *device); +extern char *get_random_uuid (void);
/* ordinary daemon functions use these to indicate errors * NB: you don't need to prefix the string with the current command, diff --git a/daemon/swap.c b/daemon/swap.c index 26fe30d..923adb2 100644 --- a/daemon/swap.c +++ b/daemon/swap.c @@ -34,6 +34,7 @@ GUESTFSD_EXT_CMD(str_mkswap, mkswap); GUESTFSD_EXT_CMD(str_swapon, swapon); GUESTFSD_EXT_CMD(str_swapoff, swapoff); GUESTFSD_EXT_CMD(str_swaplabel, swaplabel); +GUESTFSD_EXT_CMD(str_uuidgen, uuidgen);
/* Confirmed this is true for Linux swap partitions from the Linux sources. */ #define SWAP_LABEL_MAX 16 @@ -255,3 +256,34 @@ swap_set_uuid (const char *device, const char *uuid)
return 0; } + +char * +get_random_uuid (void) +{ + int r; + char *out; + CLEANUP_FREE char *err = NULL; + + r = command (&out, &err, str_uuidgen, NULL); + if (r == -1) { + reply_with_error ("%s", err); + return NULL; + } + + /* caller free */ + return out; + +}
The addition of the get_random_uuid() is worth an own commit. Also, it is not specific to swap, so I'd say to put it directly in guestfsd.c, named like uuidgen() (much like the OCaml equivalent in Common_utils). Furthermore, you should make sure uuidgen is actually in the appliance: while in Fedora is in util-linux (already part of the appliance), e.g. in Debian/Ubuntu is in uuid-runtime. Thus you need to add that package to the Debian ones in appliance/packagelist.in.
+int +swap_set_uuid_random (const char *device) +{ + CLEANUP_FREE char *err = NULL; + CLEANUP_FREE char *uuid_random = NULL; + + uuid_random = get_random_uuid (); + if (uuid_random == NULL) + return -1; + + return swap_set_uuid (device, uuid_random); +}
This is nothing specific for swap, and could just be done directly in the set_uuid_random implementation, for all the filesystems we have tools to change their UUIDs (so swap only so far). In practice something like: else if (STREQ (vfs_type, "swap")) { CLEANUP_FREE char *uuid = uuidgen (); if (uuid == NULL) return -1; r = swap_set_uuid (device, uuid); } Thanks, -- Pino Toscano