From 713283f4a67b3a1960ca96ce6608d046fc202d2d Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 23 Apr 2009 14:39:18 +0100 Subject: [PATCH] Add outline of 'debug' command. --- daemon/Makefile.am | 1 + daemon/configure.ac | 6 +++ daemon/debug.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++ libguestfs.spec.in | 1 + src/generator.ml | 12 +++++ 5 files changed, 158 insertions(+) create mode 100644 daemon/debug.c diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 4f7ce24..1f517c2 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -25,6 +25,7 @@ guestfsd_SOURCES = \ checksum.c \ command.c \ daemon.h \ + debug.c \ devsparts.c \ dir.c \ file.c \ diff --git a/daemon/configure.ac b/daemon/configure.ac index 0bd37b0..e8aebc9 100644 --- a/daemon/configure.ac +++ b/daemon/configure.ac @@ -27,6 +27,12 @@ AC_ARG_ENABLE([32bit], [export CC="gcc -m32"], [enable_32bit=no]) +dnl Enable 'debug' command. +AC_ARG_ENABLE([debug-command], + [AS_HELP_STRING([--enable-debug-command], [enable the 'debug' command])], + [AC_DEFINE_UNQUOTED([ENABLE_DEBUG_COMMAND],[1],[Enable the 'debug' command])], + []) + dnl Check for basic C environment. AC_PROG_CC AC_PROG_INSTALL diff --git a/daemon/debug.c b/daemon/debug.c new file mode 100644 index 0000000..22baa9b --- /dev/null +++ b/daemon/debug.c @@ -0,0 +1,138 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2009 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#include +#include +#include +#include + +#include "../src/guestfs_protocol.h" +#include "daemon.h" +#include "actions.h" + +/* This command exposes debugging information, internals and + * status. There is no comprehensive documentation for this + * command. You have to look at the source code in this file + * to find out what you can do. + * + * Commands always output a freeform string. + */ + +#if ENABLE_DEBUG_COMMAND +struct cmd { + const char *cmd; + char * (*f) (const char *subcmd, int argc, char *const *const argv); +}; + +static char *debug_help (const char *subcmd, int argc, char *const *const argv); +#if 0 +static char *debug_fds (const char *subcmd, int argc, char *const *const argv); +static char *debug_free (const char *subcmd, int argc, char *const *const argv); +static char *debug_mem (const char *subcmd, int argc, char *const *const argv); +static char *debug_ps (const char *subcmd, int argc, char *const *const argv); +#endif + +static struct cmd cmds[] = { + { "help", debug_help }, +#if 0 + { "fds", debug_fds }, + { "free", debug_free }, + { "mem", debug_mem }, + { "ps", debug_free }, +#endif + { NULL, NULL } +}; +#endif + +char * +do_debug (const char *subcmd, char *const *const argv) +{ +#if ENABLE_DEBUG_COMMAND + int argc, i; + + for (i = argc = 0; argv[i] != NULL; ++i) + argc++; + + for (i = 0; cmds[i].cmd != NULL; ++i) { + if (strcasecmp (subcmd, cmds[i].cmd) == 0) + return cmds[i].f (subcmd, argc, argv); + } + + reply_with_error ("use 'debug help' to list the supported commands"); + return NULL; +#else + reply_with_error ("guestfsd was not configured with --enable-debug-command"); + return NULL; +#endif +} + +#if ENABLE_DEBUG_COMMAND +static char * +debug_help (const char *subcmd, int argc, char *const *const argv) +{ + int len, i; + char *r, *p; + + r = strdup ("Commands supported:"); + if (!r) { + reply_with_perror ("strdup"); + return NULL; + } + + len = strlen (r); + for (i = 0; cmds[i].cmd != NULL; ++i) { + len += strlen (cmds[i].cmd) + 1; /* space + new command */ + p = realloc (r, len + 1); /* +1 for the final NUL */ + if (p == NULL) { + reply_with_perror ("realloc"); + free (r); + return NULL; + } + r = p; + + strcat (r, " "); + strcat (r, cmds[i].cmd); + } + + return r; +} + +#if 0 +static char * +debug_fds (const char *subcmd, int argc, char *const *const argv) +{ +} + +static char * +debug_free (const char *subcmd, int argc, char *const *const argv) +{ +} + +static char * +debug_mem (const char *subcmd, int argc, char *const *const argv) +{ +} + +static char * +debug_ps (const char *subcmd, int argc, char *const *const argv) +{ +} +#endif +#endif /* ENABLE_DEBUG_COMMAND */ diff --git a/libguestfs.spec.in b/libguestfs.spec.in index 5ba0b32..7d369ed 100644 --- a/libguestfs.spec.in +++ b/libguestfs.spec.in @@ -232,6 +232,7 @@ popd --prefix=%{_prefix} --libdir=%{_libdir} \ --with-java-home=%{java_home} \ --with-qemu="qemu-kvm qemu-system-%{_build_arch} qemu" \ + --enable-debug-command \ %{extra} # 'INSTALLDIRS' ensures that perl libs are installed in the vendor dir diff --git a/src/generator.ml b/src/generator.ml index 9f6ed77..d2be559 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -1467,6 +1467,18 @@ This is the same as the C command, but it allows you to set both the mount options and the vfstype as for the L I<-o> and I<-t> flags."); + ("debug", (RString "result", [String "subcmd"; StringList "extraargs"]), 76, [], + [], + "debugging and internals", + "\ +The C command exposes some internals of +C (the guestfs daemon) that runs inside the +qemu subprocess. + +There is no comprehensive help for this command. You have +to look at the file C in the libguestfs source +to find out what you can do."); + ] let all_functions = non_daemon_functions @ daemon_functions -- 1.8.3.1