xl: Add subcommand 'xl dmesg'

Can be used to read and/or clear dmesg buffer.

Signed-off-by: Yu Zhiguo <yuzg@cn.fujitsu.com>
This commit is contained in:
Keir Fraser committed 2010-05-26 07:45:51 +01:00
1 parent e5fd1f6505
commit 4024bae739
5 files changed
+129

No files matched your search

+66
View File
@@ -2827,6 +2827,72 @@ int libxl_send_debug_keys(struct libxl_ctx *ctx, char *keys)
return xc_send_debug_keys(ctx->xch, keys);
}
struct libxl_xen_console_reader *
libxl_xen_console_read_start(struct libxl_ctx *ctx, int clear)
{
struct libxl_xen_console_reader *cr;
unsigned int size = 16384;
char *buf = malloc(size);
if (!buf) {
XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "cannot malloc buffer for libxl_xen_console_reader,"
" size is %u", size);
return NULL;
}
cr = malloc(sizeof(struct libxl_xen_console_reader));
if (!cr) {
XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "cannot malloc libxl_xen_console_reader");
return NULL;
}
memset(cr, 0, sizeof(struct libxl_xen_console_reader));
cr->buffer = buf;
cr->size = size;
cr->count = size;
cr->clear = clear;
cr->incremental = 1;
return cr;
}
/* return values: *line_r
* 1 success, whole line obtained from buffer non-0
* 0 no more lines available right now 0
* negative error code ERROR_* 0
* On success *line_r is updated to point to a nul-terminated
* string which is valid until the next call on the same console
* reader. The libxl caller may overwrite parts of the string
* if it wishes. */
int libxl_xen_console_read_line(struct libxl_ctx *ctx,
struct libxl_xen_console_reader *cr,
char **line_r)
{
int ret;
memset(cr->buffer, 0, cr->size);
ret = xc_readconsolering(ctx->xch, &cr->buffer, &cr->count,
cr->clear, cr->incremental, &cr->index);
if (!ret) {
if (cr->count) {
*line_r = cr->buffer;
ret = 1;
} else {
*line_r = NULL;
ret = 0;
}
}
return ret;
}
void libxl_xen_console_read_finish(struct libxl_ctx *ctx,
struct libxl_xen_console_reader *cr)
{
free(cr->buffer);
free(cr);
}
uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid)
{
char *dompath = libxl_xs_get_dompath(ctx, domid);
+18
View File
@@ -512,6 +512,24 @@ int libxl_send_trigger(struct libxl_ctx *ctx, uint32_t domid,
char *trigger_name, uint32_t vcpuid);
int libxl_send_sysrq(struct libxl_ctx *ctx, uint32_t domid, char sysrq);
int libxl_send_debug_keys(struct libxl_ctx *ctx, char *keys);
struct libxl_xen_console_reader {
char *buffer;
unsigned int size;
unsigned int count;
unsigned int clear;
unsigned int incremental;
unsigned int index;
};
struct libxl_xen_console_reader *
libxl_xen_console_read_start(struct libxl_ctx *ctx, int clear);
int libxl_xen_console_read_line(struct libxl_ctx *ctx,
struct libxl_xen_console_reader *cr,
char **line_r);
void libxl_xen_console_read_finish(struct libxl_ctx *ctx,
struct libxl_xen_console_reader *cr);
uint32_t libxl_vm_get_start_time(struct libxl_ctx *ctx, uint32_t domid);
char *libxl_tmem_list(struct libxl_ctx *ctx, uint32_t domid, int use_long);
+38
View File
@@ -3246,6 +3246,44 @@ int main_debug_keys(int argc, char **argv)
exit(0);
}
int main_dmesg(int argc, char **argv)
{
unsigned int clear = 0;
struct libxl_xen_console_reader *cr;
char *line;
int opt, ret = 1;
while ((opt = getopt(argc, argv, "hc")) != -1) {
switch (opt) {
case 'c':
clear = 1;
break;
case 'h':
help("dmesg");
exit(0);
default:
fprintf(stderr, "option not supported\n");
break;
}
}
cr = libxl_xen_console_read_start(&ctx, clear);
if (!cr)
goto finish;
while (1) {
ret = libxl_xen_console_read_line(&ctx, cr, &line);
if (ret > 0)
printf(line);
else
break;
}
finish:
libxl_xen_console_read_finish(&ctx, cr);
exit(ret);
}
int main_top(int argc, char **argv)
{
int opt;
+1
View File
@@ -45,6 +45,7 @@ int main_rename(int argc, char **argv);
int main_trigger(int argc, char **argv);
int main_sysrq(int argc, char **argv);
int main_debug_keys(int argc, char **argv);
int main_dmesg(int argc, char **argv);
int main_top(int argc, char **argv);
int main_networkattach(int argc, char **argv);
int main_networklist(int argc, char **argv);
+6
View File
@@ -191,6 +191,12 @@ struct cmd_spec cmd_table[] = {
"Send debug keys to Xen",
"<Keys>",
},
{ "dmesg",
&main_dmesg,
"Read and/or clear dmesg buffer",
"[-c]",
" -c Clear dmesg buffer as well as printing it",
},
{ "top",
&main_top,
"Monitor a host and the domains in real time",
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.