Guestfish: Add 'reopen' command to reopen the libguestfs handle.

This commit is contained in:
Richard W.M. Jones
2009-07-11 21:20:17 +01:00
parent b48dea6217
commit 625d0bd561
5 changed files with 98 additions and 4 deletions

View File

@@ -29,6 +29,7 @@ guestfish_SOURCES = \
glob.c \
lcd.c \
more.c \
reopen.c \
time.c
guestfish_CFLAGS = \

View File

@@ -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
@@ -768,6 +770,8 @@ list_builtin_commands (void)
"glob", _("expand wildcards in command"));
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"));
@@ -831,6 +835,10 @@ display_builtin_command (const char *cmd)
" Glob runs <command> 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 <command> [<args> ...]\n"

View File

@@ -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 */

70
fish/reopen.c Normal file
View File

@@ -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 <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#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;
}

View File

@@ -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...