mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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:
1 parent
e5fd1f6505
commit
4024bae739
5 files changed
+129
No files matched your search
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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",
|
||||
|
||||