Add outline of 'debug' command.
authorRichard W.M. Jones <rjones@redhat.com>
Thu, 23 Apr 2009 13:39:18 +0000 (14:39 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Thu, 23 Apr 2009 13:39:18 +0000 (14:39 +0100)
daemon/Makefile.am
daemon/configure.ac
daemon/debug.c [new file with mode: 0644]
libguestfs.spec.in
src/generator.ml

index 4f7ce24..1f517c2 100644 (file)
@@ -25,6 +25,7 @@ guestfsd_SOURCES = \
        checksum.c \
        command.c \
        daemon.h \
+       debug.c \
        devsparts.c \
        dir.c \
        file.c \
index 0bd37b0..e8aebc9 100644 (file)
@@ -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 (file)
index 0000000..22baa9b
--- /dev/null
@@ -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 <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#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 */
index 5ba0b32..7d369ed 100644 (file)
@@ -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
index 9f6ed77..d2be559 100755 (executable)
@@ -1467,6 +1467,18 @@ This is the same as the C<guestfs_mount> command, but it
 allows you to set both the mount options and the vfstype
 as for the L<mount(8)> I<-o> and I<-t> flags.");
 
+  ("debug", (RString "result", [String "subcmd"; StringList "extraargs"]), 76, [],
+   [],
+   "debugging and internals",
+   "\
+The C<guestfs_debug> command exposes some internals of
+C<guestfsd> (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<daemon/debug.c> in the libguestfs source
+to find out what you can do.");
+
 ]
 
 let all_functions = non_daemon_functions @ daemon_functions