]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm tools: Add option to list rootfs in 'kvm list'
authorSasha Levin <levinsasha928@gmail.com>
Thu, 13 Oct 2011 09:32:46 +0000 (11:32 +0200)
committerPekka Enberg <penberg@kernel.org>
Thu, 13 Oct 2011 16:39:00 +0000 (19:39 +0300)
Previously we would only list running instances, now that we create
rootfs instances it's appropriate to add a method to list them as
well.

Suggested-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
tools/kvm/builtin-list.c

index fcf9bb0ec29d2b3dee311e644cdd3feec8ba8360..3e116d66491650adbf1b5fdd4711d292dfbc5aca 100644 (file)
@@ -4,6 +4,7 @@
 #include <kvm/kvm.h>
 #include <kvm/parse-options.h>
 
+#include <dirent.h>
 #include <stdio.h>
 #include <string.h>
 #include <signal.h>
 
 #define PROCESS_NAME "kvm"
 
+static bool run;
+static bool rootfs;
+
 static const char * const list_usage[] = {
        "kvm list",
        NULL
 };
 
 static const struct option list_options[] = {
+       OPT_GROUP("General options:"),
+       OPT_BOOLEAN('i', "run", &run, "List running instances"),
+       OPT_BOOLEAN('r', "rootfs", &rootfs, "List rootfs instances"),
        OPT_END()
 };
 
@@ -58,9 +65,66 @@ cleanup:
        return 0;
 }
 
-int kvm_cmd_list(int argc, const char **argv, const char *prefix)
+static int kvm_list_running_instances(void)
 {
        printf("  PID GUEST\n");
 
        return kvm__enumerate_instances(print_guest);
 }
+
+static int kvm_list_rootfs(void)
+{
+       char name[PATH_MAX];
+       DIR *dir;
+       struct dirent *dirent;
+
+       snprintf(name, PATH_MAX, "%s%s", HOME_DIR, KVM_PID_FILE_PATH);
+       dir = opendir(name);
+       if (dir == NULL)
+               return -1;
+
+       printf("  ROOTFS\n");
+
+       while ((dirent = readdir(dir))) {
+               if (dirent->d_type == DT_DIR &&
+                       strcmp(dirent->d_name, ".") &&
+                       strcmp(dirent->d_name, ".."))
+                       printf("%s\n", dirent->d_name);
+       }
+
+       return 0;
+}
+
+static void parse_setup_options(int argc, const char **argv)
+{
+       while (argc != 0) {
+               argc = parse_options(argc, argv, list_options, list_usage,
+                               PARSE_OPT_STOP_AT_NON_OPTION);
+               if (argc != 0)
+                       kvm_list_help();
+       }
+}
+
+int kvm_cmd_list(int argc, const char **argv, const char *prefix)
+{
+       int r;
+
+       parse_setup_options(argc, argv);
+
+       if (!run && !rootfs)
+               kvm_list_help();
+
+       if (run) {
+               r = kvm_list_running_instances();
+               if (r < 0)
+                       perror("Error listing instances");
+       }
+
+       if (rootfs) {
+               r = kvm_list_rootfs();
+               if (r < 0)
+                       perror("Error listing rootfs");
+       }
+
+       return 0;
+}