Added 'lcd' command to guestfish.
authorRichard Jones <rjones@redhat.com>
Mon, 8 Jun 2009 09:01:42 +0000 (10:01 +0100)
committerRichard Jones <rjones@redhat.com>
Mon, 8 Jun 2009 09:01:42 +0000 (10:01 +0100)
fish/Makefile.am
fish/fish.c
fish/fish.h
fish/lcd.c [new file with mode: 0644]

index b3782ec..5f88894 100644 (file)
@@ -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"'
index 96c1a81..da2d6d2 100644 (file)
@@ -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 <directory>\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"
index 13a2e5c..0dd1fc2 100644 (file)
@@ -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 (file)
index 0000000..359d178
--- /dev/null
@@ -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 <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#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;
+}