From 296c49305ba8ce8add4b4c3555ce4eb1305f2a2c Mon Sep 17 00:00:00 2001 From: Bamvor Jian Zhang Date: Wed, 6 Jun 2012 12:46:18 +0100 Subject: [PATCH] libxl: Add API to retrieve domain console tty This api retrieve domain console from xenstore. With this new api, it is easy to implement "virsh console" command in libvirt libxl driver. Signed-off-by: Bamvor Jian Zhang Acked-by: Ian Campbell [ ijc -- use NOGC instead of 0 to allow improvements to this infrastructure in the future ] Committed-by: Ian Campbell --- tools/libxl/libxl.c | 103 +++++++++++++++++++++++++++++++++++++++----- tools/libxl/libxl.h | 12 ++++++ 2 files changed, 105 insertions(+), 10 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 1f7ccc4aea..c5c634378d 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1217,7 +1217,8 @@ out: return rc; } -int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_console_type type) +int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, + libxl_console_type type) { GC_INIT(ctx); char *p = libxl__sprintf(gc, "%s/xenconsole", libxl__private_bindir_path()); @@ -1243,34 +1244,116 @@ out: return ERROR_FAIL; } -int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm) +int libxl_console_get_tty(libxl_ctx *ctx, uint32_t domid, int cons_num, + libxl_console_type type, char **path) +{ + GC_INIT(ctx); + char *dom_path; + char *tty_path; + char *tty; + int rc; + + dom_path = libxl__xs_get_dompath(gc, domid); + if (!dom_path) { + rc = ERROR_FAIL; + goto out; + } + + switch (type) { + case LIBXL_CONSOLE_TYPE_SERIAL: + tty_path = GCSPRINTF("%s/serial/0/tty", dom_path); + break; + case LIBXL_CONSOLE_TYPE_PV: + if (cons_num == 0) + tty_path = GCSPRINTF("%s/console/tty", dom_path); + else + tty_path = GCSPRINTF("%s/device/console/%d/tty", dom_path, + cons_num); + break; + default: + rc = ERROR_INVAL; + goto out; + } + + tty = libxl__xs_read(gc, XBT_NULL, tty_path); + if (!tty) { + LOGE(ERROR,"unable to read console tty path `%s'",tty_path); + rc = ERROR_FAIL; + goto out; + } + + *path = libxl__strdup(NOGC, tty); + rc = 0; +out: + GC_FREE; + return rc; +} + +static int libxl__primary_console_find(libxl_ctx *ctx, uint32_t domid_vm, + uint32_t *domid, int *cons_num, + libxl_console_type *type) { GC_INIT(ctx); uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm); int rc; - if (stubdomid) - rc = libxl_console_exec(ctx, stubdomid, - STUBDOM_CONSOLE_SERIAL, LIBXL_CONSOLE_TYPE_PV); - else { + + if (stubdomid) { + *domid = stubdomid; + *cons_num = STUBDOM_CONSOLE_SERIAL; + *type = LIBXL_CONSOLE_TYPE_PV; + } else { switch (libxl__domain_type(gc, domid_vm)) { case LIBXL_DOMAIN_TYPE_HVM: - rc = libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSOLE_TYPE_SERIAL); + *domid = domid_vm; + *cons_num = 0; + *type = LIBXL_CONSOLE_TYPE_SERIAL; break; case LIBXL_DOMAIN_TYPE_PV: - rc = libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSOLE_TYPE_PV); + *domid = domid_vm; + *cons_num = 0; + *type = LIBXL_CONSOLE_TYPE_PV; break; case -1: - LOG(ERROR,"unable to get domain type for domid=%"PRIu32,domid_vm); - rc = ERROR_FAIL; + LOG(ERROR,"unable to get domain type for domid=%"PRIu32, domid_vm); + rc = ERROR_INVAL; + goto out; break; default: abort(); } } + + rc = 0; +out: GC_FREE; return rc; } +int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm) +{ + uint32_t domid; + int cons_num; + libxl_console_type type; + int rc; + + rc = libxl__primary_console_find(ctx, domid_vm, &domid, &cons_num, &type); + if ( rc ) return rc; + return libxl_console_exec(ctx, domid, cons_num, type); +} + +int libxl_primary_console_get_tty(libxl_ctx *ctx, uint32_t domid_vm, + char **path) +{ + uint32_t domid; + int cons_num; + libxl_console_type type; + int rc; + + rc = libxl__primary_console_find(ctx, domid_vm, &domid, &cons_num, &type); + if ( rc ) return rc; + return libxl_console_get_tty(ctx, domid, cons_num, type, path); +} + int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass) { GC_INIT(ctx); diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 53cba6fe77..05f0e01df5 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -570,6 +570,18 @@ int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_conso * guests using pygrub. */ int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm); +/* libxl_console_get_tty retrieves the specified domain's console tty path + * and stores it in path. Caller is responsible for freeing the memory. + */ +int libxl_console_get_tty(libxl_ctx *ctx, uint32_t domid, int cons_num, + libxl_console_type type, char **path); + +/* libxl_primary_console_get_tty retrieves the specified domain's primary + * console tty path and stores it in path. Caller is responsible for freeing + * the memory. + */ +int libxl_primary_console_get_tty(libxl_ctx *ctx, uint32_t domid_vm, char **path); + /* May be called with info_r == NULL to check for domain's existance */ int libxl_domain_info(libxl_ctx*, libxl_dominfo *info_r, uint32_t domid); -- 2.39.5