From 625d0bd56189450f48b6308371bf08ee6312d59f Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sat, 11 Jul 2009 21:20:17 +0100 Subject: [PATCH 1/1] Guestfish: Add 'reopen' command to reopen the libguestfs handle. --- fish/Makefile.am | 1 + fish/fish.c | 19 +++++++++++---- fish/fish.h | 4 ++++ fish/reopen.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ guestfish.pod | 8 +++++++ 5 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 fish/reopen.c diff --git a/fish/Makefile.am b/fish/Makefile.am index 1439a5d..03619f3 100644 --- a/fish/Makefile.am +++ b/fish/Makefile.am @@ -29,6 +29,7 @@ guestfish_SOURCES = \ glob.c \ lcd.c \ more.c \ + reopen.c \ time.c guestfish_CFLAGS = \ diff --git a/fish/fish.c b/fish/fish.c index 2ddf901..353c8b2 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -727,6 +727,8 @@ issue_command (const char *cmd, char *argv[], const char *pipecmd) else if (strcasecmp (cmd, "more") == 0 || strcasecmp (cmd, "less") == 0) r = do_more (cmd, argc, argv); + else if (strcasecmp (cmd, "reopen") == 0) + r = do_reopen (cmd, argc, argv); else if (strcasecmp (cmd, "time") == 0) r = do_time (cmd, argc, argv); else @@ -769,6 +771,8 @@ list_builtin_commands (void) printf ("%-20s %s\n", "more", _("view a file in the pager")); printf ("%-20s %s\n", + "reopen", _("close and reopen libguestfs handle")); + printf ("%-20s %s\n", "time", _("measure time taken to run command")); /* actions are printed after this (see list_commands) */ @@ -831,6 +835,10 @@ display_builtin_command (const char *cmd) " Glob runs with wildcards expanded in any\n" " command args. Note that the command is run repeatedly\n" " once for each expanded argument.\n")); + else if (strcasecmp (cmd, "help") == 0) + printf (_("help - display a list of commands or help on a command\n" + " help cmd\n" + " help\n")); else if (strcasecmp (cmd, "more") == 0 || strcasecmp (cmd, "less") == 0) printf (_("more - view a file in the pager\n" @@ -846,15 +854,18 @@ display_builtin_command (const char *cmd) "\n" " NOTE: This will not work reliably for large files\n" " (> 2 MB) or binary files containing \\0 bytes.\n")); - else if (strcasecmp (cmd, "help") == 0) - printf (_("help - display a list of commands or help on a command\n" - " help cmd\n" - " help\n")); else if (strcasecmp (cmd, "quit") == 0 || strcasecmp (cmd, "exit") == 0 || strcasecmp (cmd, "q") == 0) printf (_("quit - quit guestfish\n" " quit\n")); + else if (strcasecmp (cmd, "reopen") == 0) + printf (_("reopen - close and reopen the libguestfs handle\n" + " reopen\n" + "\n" + "Close and reopen the libguestfs handle. It is not necessary to use\n" + "this normally, because the handle is closed properly when guestfish\n" + "exits. However this is occasionally useful for testing.\n")); else if (strcasecmp (cmd, "time") == 0) printf (_("time - measure time taken to run command\n" " time [ ...]\n" diff --git a/fish/fish.h b/fish/fish.h index cad8073..d0dc7a9 100644 --- a/fish/fish.h +++ b/fish/fish.h @@ -77,6 +77,9 @@ extern int do_glob (const char *cmd, int argc, char *argv[]); /* in more.c */ extern int do_more (const char *cmd, int argc, char *argv[]); +/* in reopen.c */ +extern int do_reopen (const char *cmd, int argc, char *argv[]); + /* in time.c */ extern int do_time (const char *cmd, int argc, char *argv[]); @@ -92,6 +95,7 @@ extern int do_time (const char *cmd, int argc, char *argv[]); "lcd", \ "glob", \ "more", "less", \ + "reopen", \ "time" #endif /* FISH_H */ diff --git a/fish/reopen.c b/fish/reopen.c new file mode 100644 index 0000000..f2d35c7 --- /dev/null +++ b/fish/reopen.c @@ -0,0 +1,70 @@ +/* guestfish - the filesystem interactive shell + * 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 "fish.h" + +int +do_reopen (const char *cmd, int argc, char *argv[]) +{ + guestfs_h *g2; + int r; + const char *p; + + if (argc > 0) { + fprintf (stderr, _("'reopen' command takes no parameters\n")); + return -1; + } + + /* Open the new handle first, so we can copy the settings from the + * old one to the new one, and also so if it fails we still have an + * open handle. + */ + g2 = guestfs_create (); + if (g2 == NULL) { + fprintf (stderr, _("reopen: guestfs_create: failed to create handle\n")); + return -1; + } + + /* Now copy some of the settings from the old handle. The settings + * we copy are those which are set by guestfish itself. + */ + r = guestfs_get_verbose (g); + if (r >= 0) + guestfs_set_verbose (g2, r); + + r = guestfs_get_autosync (g); + if (r >= 0) + guestfs_set_autosync (g2, r); + + p = guestfs_get_path (g); + if (p) + guestfs_set_path (g2, p); + + /* Close the original handle. */ + guestfs_close (g); + g = g2; + + return 0; +} diff --git a/guestfish.pod b/guestfish.pod index 4341e2a..442b333 100644 --- a/guestfish.pod +++ b/guestfish.pod @@ -419,6 +419,14 @@ NOTE: This will not work reliably for large files This exits guestfish. You can also use C<^D> key. +=head2 reopen + + reopen + +Close and reopen the libguestfs handle. It is not necessary to use +this normally, because the handle is closed properly when guestfish +exits. However this is occasionally useful for testing. + =head2 time time command args... -- 1.8.3.1