[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 3/3] xen-init-dom0: set Dom0 UUID if requested
Read from XEN_CONFIG_DIR/dom0-uuid. If it contains a valid UUID, set it for Dom0. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- v2: 1. add missing "goto out" 2. print file names more 3. also print errno in xc_interface_open error message 4. take care of short-read --- tools/examples/Makefile | 1 + tools/examples/README | 2 ++ tools/examples/dom0-uuid | 0 tools/helpers/Makefile | 3 +- tools/helpers/xen-init-dom0.c | 65 +++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 tools/examples/dom0-uuid diff --git a/tools/examples/Makefile b/tools/examples/Makefile index f86ed3a271..f8492462db 100644 --- a/tools/examples/Makefile +++ b/tools/examples/Makefile @@ -9,6 +9,7 @@ XEN_CONFIGS += xlexample.hvm XEN_CONFIGS += xlexample.pvlinux XEN_CONFIGS += xl.conf XEN_CONFIGS += cpupool +XEN_CONFIGS += dom0-uuid XEN_CONFIGS += $(XEN_CONFIGS-y) diff --git a/tools/examples/README b/tools/examples/README index 80a4652b06..8f940a55c1 100644 --- a/tools/examples/README +++ b/tools/examples/README @@ -14,6 +14,8 @@ block-common.sh - sourced by block, block-* block-enbd - binds/unbinds network block devices block-nbd - binds/unbinds network block devices cpupool - example configuration script for 'xl cpupool-create' +dom0-uuid - stores the UUID in canonical form for Dom0, will be + read by xen-init-dom0 external-device-migrate - called by xend for migrating external devices locking.sh - locking functions to prevent concurrent access to critical sections inside script files diff --git a/tools/examples/dom0-uuid b/tools/examples/dom0-uuid new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/helpers/Makefile b/tools/helpers/Makefile index 4f3bbe6a7d..f759528322 100644 --- a/tools/helpers/Makefile +++ b/tools/helpers/Makefile @@ -14,6 +14,7 @@ XEN_INIT_DOM0_OBJS = xen-init-dom0.o init-dom-json.o $(XEN_INIT_DOM0_OBJS): CFLAGS += $(CFLAGS_libxentoollog) $(XEN_INIT_DOM0_OBJS): CFLAGS += $(CFLAGS_libxenstore) $(XEN_INIT_DOM0_OBJS): CFLAGS += $(CFLAGS_libxenlight) +$(XEN_INIT_DOM0_OBJS): CFLAGS += $(CFLAGS_libxenctrl) INIT_XENSTORE_DOMAIN_OBJS = init-xenstore-domain.o init-dom-json.o $(INIT_XENSTORE_DOMAIN_OBJS): CFLAGS += $(CFLAGS_libxentoollog) @@ -26,7 +27,7 @@ $(INIT_XENSTORE_DOMAIN_OBJS): CFLAGS += $(CFLAGS_libxenlight) all: $(PROGS) xen-init-dom0: $(XEN_INIT_DOM0_OBJS) - $(CC) $(LDFLAGS) -o $@ $(XEN_INIT_DOM0_OBJS) $(LDLIBS_libxentoollog) $(LDLIBS_libxenstore) $(LDLIBS_libxenlight) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -o $@ $(XEN_INIT_DOM0_OBJS) $(LDLIBS_libxenctrl) $(LDLIBS_libxentoollog) $(LDLIBS_libxenstore) $(LDLIBS_libxenlight) $(APPEND_LDFLAGS) $(INIT_XENSTORE_DOMAIN_OBJS): _paths.h diff --git a/tools/helpers/xen-init-dom0.c b/tools/helpers/xen-init-dom0.c index 09bc0027f9..e826da57b4 100644 --- a/tools/helpers/xen-init-dom0.c +++ b/tools/helpers/xen-init-dom0.c @@ -3,23 +3,72 @@ #include <string.h> #include <stdio.h> +#include <xenctrl.h> #include <xenstore.h> +#include <libxl.h> #include "init-dom-json.h" +#include "_paths.h" #define DOMNAME_PATH "/local/domain/0/name" #define DOMID_PATH "/local/domain/0/domid" +#define DOM0_UUID_PATH XEN_CONFIG_DIR "/dom0-uuid" + +static void get_dom0_uuid(libxl_uuid *uuid) +{ + FILE *f = NULL; + size_t r; + char uuid_buf[LIBXL_UUID_FMTLEN+1]; + bool ok = false; + + f = fopen(DOM0_UUID_PATH, "r"); + if (!f) { + fprintf(stderr, "failed to open %s, errno %d\n", + DOM0_UUID_PATH, errno); + goto out; + } + + r = fread(uuid_buf, 1, LIBXL_UUID_FMTLEN, f); + if (r != LIBXL_UUID_FMTLEN) { + fprintf(stderr, "failed to read %s, read %zu, errno %d\n", + DOM0_UUID_PATH, r, ferror(f)); + goto out; + } + + uuid_buf[LIBXL_UUID_FMTLEN] = 0; + + if (libxl_uuid_from_string(uuid, uuid_buf)) { + fprintf(stderr, "failed to parse UUID in %s\n", DOM0_UUID_PATH); + goto out; + } + + ok = true; +out: + if (f) fclose(f); + if (!ok) libxl_uuid_clear(uuid); +} + int main(int argc, char **argv) { int rc; - struct xs_handle *xsh; + struct xs_handle *xsh = NULL; + xc_interface *xch = NULL; char *domname_string = NULL, *domid_string = NULL; + libxl_uuid uuid; xsh = xs_open(0); if (!xsh) { fprintf(stderr, "cannot open xenstore connection\n"); - exit(1); + rc = 1; + goto out; + } + + xch = xc_interface_open(NULL, NULL, 0); + if (!xch) { + fprintf(stderr, "xc_interface_open() failed\n"); + rc = 1; + goto out; } /* Sanity check: this program can only be run once. */ @@ -31,7 +80,16 @@ int main(int argc, char **argv) goto out; } - rc = gen_stub_json_config(0, NULL); + get_dom0_uuid(&uuid); + + if (!libxl_uuid_is_nil(&uuid) && + xc_domain_sethandle(xch, 0, libxl_uuid_bytearray(&uuid))) { + fprintf(stderr, "failed to set Dom0 UUID, errno %d\n", errno); + rc = 1; + goto out; + } + + rc = gen_stub_json_config(0, &uuid); if (rc) goto out; @@ -55,6 +113,7 @@ out: free(domid_string); free(domname_string); xs_close(xsh); + xc_interface_close(xch); return rc; } -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |