[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] [v4] libxl: Add API to retrieve domain console tty
On Wed, 2012-06-06 at 08:09 +0100, Bamvor Jian Zhang wrote: > 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 <bjzhang@xxxxxxxx> Applied, thanks. I trimmed a bunch of trailing whitespace, please watch out next time. > Changes since v3: > * leave variable uninitialised at the top of the function in order to avoid > hiding the useful compiler warnings. > * using libxl__strdup instead of strdup in libxl_console_get_tty. benefit > from > the error handling behavior. > libxl__strdup(0, tty) should be replaced by libxl__strdup(NOGC, tty) after > Ian Jackson commit his patch: "Do not pass NULL as gc_opt; introduce NOGC." I introduced a "#define NOGC NULL" in an earlier patch so we don't miss converting any new instances to the proper scheme when Ian J's patch goes in. I did s/0/NOGC on this patch as I applied it. Hope that's ok. > > diff -r 6bea63e6c780 -r 2586692a6d74 tools/libxl/libxl.c > --- a/tools/libxl/libxl.c Sat Jun 02 08:39:45 2012 +0100 > +++ b/tools/libxl/libxl.c Wed Jun 06 14:35:01 2012 +0800 > @@ -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(0, 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 -r 6bea63e6c780 -r 2586692a6d74 tools/libxl/libxl.h > --- a/tools/libxl/libxl.h Sat Jun 02 08:39:45 2012 +0100 > +++ b/tools/libxl/libxl.h Wed Jun 06 14:35:01 2012 +0800 > @@ -570,6 +570,18 @@ int libxl_console_exec(libxl_ctx *ctx, u > * 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); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |