fish: copy-in, copy-out, edit, more commands can use win:... prefix.
[libguestfs.git] / fish / edit.c
index a9539ba..80ae44b 100644 (file)
@@ -1,5 +1,5 @@
 /* guestfish - the filesystem interactive shell
- * Copyright (C) 2009 Red Hat Inc.
+ * Copyright (C) 2009-2011 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
@@ -37,6 +37,7 @@ run_edit (const char *cmd, size_t argc, char *argv[])
   TMP_TEMPLATE_ON_STACK (filename);
   char buf[256];
   const char *editor;
+  char *remotefilename;
   struct stat oldstat, newstat;
   int r, fd;
 
@@ -56,24 +57,32 @@ run_edit (const char *cmd, size_t argc, char *argv[])
       editor = "vi"; /* could be cruel here and choose ed(1) */
   }
 
+  /* Handle 'win:...' prefix. */
+  remotefilename = win_prefix (argv[0]);
+  if (remotefilename == NULL)
+    return -1;
+
   /* Download the file and write it to a temporary. */
   fd = mkstemp (filename);
   if (fd == -1) {
     perror ("mkstemp");
+    free (remotefilename);
     return -1;
   }
 
   snprintf (buf, sizeof buf, "/dev/fd/%d", fd);
 
-  if (guestfs_download (g, argv[0], buf) == -1) {
+  if (guestfs_download (g, remotefilename, buf) == -1) {
     close (fd);
     unlink (filename);
+    free (remotefilename);
     return -1;
   }
 
   if (close (fd) == -1) {
     perror (filename);
     unlink (filename);
+    free (remotefilename);
     return -1;
   }
 
@@ -81,6 +90,7 @@ run_edit (const char *cmd, size_t argc, char *argv[])
   if (stat (filename, &oldstat) == -1) {
     perror (filename);
     unlink (filename);
+    free (remotefilename);
     return -1;
   }
 
@@ -92,6 +102,7 @@ run_edit (const char *cmd, size_t argc, char *argv[])
   if (r != 0) {
     perror (buf);
     unlink (filename);
+    free (remotefilename);
     return -1;
   }
 
@@ -99,6 +110,7 @@ run_edit (const char *cmd, size_t argc, char *argv[])
   if (stat (filename, &newstat) == -1) {
     perror (filename);
     unlink (filename);
+    free (remotefilename);
     return -1;
   }
 
@@ -106,15 +118,18 @@ run_edit (const char *cmd, size_t argc, char *argv[])
   if (oldstat.st_ctime == newstat.st_ctime &&
       oldstat.st_size == newstat.st_size) {
     unlink (filename);
+    free (remotefilename);
     return 0;
   }
 
   /* Write new content. */
-  if (guestfs_upload (g, filename, argv[0]) == -1) {
+  if (guestfs_upload (g, filename, remotefilename) == -1) {
     unlink (filename);
+    free (remotefilename);
     return -1;
   }
 
   unlink (filename);
+  free (remotefilename);
   return 0;
 }