From fa8cb5dac284bf463677380e5ef55370f447d870 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Mon, 8 Jun 2009 10:01:42 +0100 Subject: [PATCH] Added 'lcd' command to guestfish. --- fish/Makefile.am | 4 +++- fish/fish.c | 11 +++++++++++ fish/fish.h | 6 +++++- fish/lcd.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 fish/lcd.c diff --git a/fish/Makefile.am b/fish/Makefile.am index b3782ec..5f88894 100644 --- a/fish/Makefile.am +++ b/fish/Makefile.am @@ -24,7 +24,9 @@ guestfish_SOURCES = \ echo.c \ edit.c \ fish.c \ - fish.h + fish.h \ + lcd.c + guestfish_CFLAGS = \ -I$(top_builddir)/src -Wall \ -DGUESTFS_DEFAULT_PATH='"$(libdir)/guestfs"' diff --git a/fish/fish.c b/fish/fish.c index 96c1a81..da2d6d2 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -593,6 +593,8 @@ issue_command (const char *cmd, char *argv[]) strcasecmp (cmd, "vi") == 0 || strcasecmp (cmd, "emacs") == 0) return do_edit (cmd, argc, argv); + else if (strcasecmp (cmd, "lcd") == 0) + return do_lcd (cmd, argc, argv); else return run_action (cmd, argc, argv); } @@ -612,6 +614,8 @@ list_builtin_commands (void) "echo", _("display a line of text")); printf ("%-20s %s\n", "edit", _("edit a file in the image")); + printf ("%-20s %s\n", + "lcd", _("local change directory")); /* actions are printed after this (see list_commands) */ } @@ -659,6 +663,13 @@ 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, "lcd") == 0) + printf (_("lcd - local change directory\n" + " lcd \n" + "\n" + " Change guestfish's current directory. This command is\n" + " useful if you want to download files to a particular\n" + " place.\n")); else if (strcasecmp (cmd, "help") == 0) printf (_("help - display a list of commands or help on a command\n" " help cmd\n" diff --git a/fish/fish.h b/fish/fish.h index 13a2e5c..0dd1fc2 100644 --- a/fish/fish.h +++ b/fish/fish.h @@ -61,6 +61,9 @@ extern int do_echo (const char *cmd, int argc, char *argv[]); /* in edit.c */ extern int do_edit (const char *cmd, int argc, char *argv[]); +/* in lcd.c */ +extern int do_lcd (const char *cmd, int argc, char *argv[]); + /* This should just list all the built-in commands so they can * be added to the generated auto-completion code. */ @@ -69,6 +72,7 @@ extern int do_edit (const char *cmd, int argc, char *argv[]); "quit", "exit", "q", \ "alloc", "allocate", \ "echo", \ - "edit", "vi", "emacs" + "edit", "vi", "emacs" \ + "lcd" #endif /* FISH_H */ diff --git a/fish/lcd.c b/fish/lcd.c new file mode 100644 index 0000000..359d178 --- /dev/null +++ b/fish/lcd.c @@ -0,0 +1,44 @@ +/* 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" + +/* guestfish lcd command (similar to the lcd command in BSD ftp) */ + +int +do_lcd (const char *cmd, int argc, char *argv[]) +{ + if (argc != 1) { + fprintf (stderr, _("use 'lcd directory' to change local directory\n")); + return -1; + } + + if (chdir (argv[0]) == -1) { + perror (argv[0]); + return -1; + } + + return 0; +} -- 1.8.3.1