[Libguestfs] [PATCH 07/13] fish: edit: bring backup extension to file editing w/ editor

Pino Toscano ptoscano at redhat.com
Thu Aug 28 13:21:10 UTC 2014


Bring the backup extension feature from the perl-like file mode
implementation, although currently not making use of it.
---
 fish/edit.c      |  2 +-
 fish/file-edit.c | 31 ++++++++++++++++++++++++++++++-
 fish/file-edit.h |  4 +++-
 3 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/fish/edit.c b/fish/edit.c
index 5b851e7..0170daf 100644
--- a/fish/edit.c
+++ b/fish/edit.c
@@ -58,7 +58,7 @@ run_edit (const char *cmd, size_t argc, char *argv[])
   if (remotefilename == NULL)
     return -1;
 
-  r = edit_file_editor (g, remotefilename, editor);
+  r = edit_file_editor (g, remotefilename, editor, NULL);
 
   return r;
 }
diff --git a/fish/file-edit.c b/fish/file-edit.c
index 408d20e..8efa452 100644
--- a/fish/file-edit.c
+++ b/fish/file-edit.c
@@ -35,9 +35,12 @@
 #include "guestfs-internal-frontend.h"
 
 static char *generate_random_name (const char *filename);
+static char *generate_backup_name (const char *filename,
+                                   const char *backup_extension);
 
 int
-edit_file_editor (guestfs_h *g, const char *filename, const char *editor)
+edit_file_editor (guestfs_h *g, const char *filename, const char *editor,
+                  const char *backup_extension)
 {
   CLEANUP_FREE char *tmpdir = guestfs_get_tmpdir (g);
   CLEANUP_UNLINK_FREE char *tmpfilename = NULL;
@@ -120,6 +123,17 @@ edit_file_editor (guestfs_h *g, const char *filename, const char *editor)
       GUESTFS_COPY_ATTRIBUTES_ALL, 1, -1) == -1)
     return -1;
 
+  /* Backup or overwrite the file. */
+  if (backup_extension) {
+    CLEANUP_FREE char *backupname = NULL;
+
+    backupname = generate_backup_name (filename, backup_extension);
+    if (backupname == NULL)
+      return -1;
+
+    if (guestfs_mv (g, filename, backupname) == -1)
+      return -1;
+  }
   if (guestfs_mv (g, newname, filename) == -1)
     return -1;
 
@@ -159,3 +173,18 @@ generate_random_name (const char *filename)
 
   return ret; /* caller will free */
 }
+
+static char *
+generate_backup_name (const char *filename, const char *backup_extension)
+{
+  char *ret;
+
+  assert (backup_extension != NULL);
+
+  if (asprintf (&ret, "%s%s", filename, backup_extension) == -1) {
+    perror ("asprintf");
+    return NULL;
+  }
+
+  return ret; /* caller will free */
+}
diff --git a/fish/file-edit.h b/fish/file-edit.h
index eff1c7d..6622b3a 100644
--- a/fish/file-edit.h
+++ b/fish/file-edit.h
@@ -23,10 +23,12 @@
 
 /**
  * Edit 'filename' using the specified 'editor' application.
+ * If 'backup_extension' is not null, then a copy of 'filename' is saved
+ * with 'backup_extension' appended to its file name.
  *
  * Returns -1 for failure, 0 otherwise.
  */
 extern int edit_file_editor (guestfs_h *g, const char *filename,
-                             const char *editor);
+                             const char *editor, const char *backup_extension);
 
 #endif
-- 
1.9.3




More information about the Libguestfs mailing list