]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
vsh: Add helper for auto-removing temporary file
authorPeter Krempa <pkrempa@redhat.com>
Tue, 1 Mar 2022 16:00:56 +0000 (17:00 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 3 Mar 2022 10:06:56 +0000 (11:06 +0100)
The vsh helpers for user-editing of contents use temporary files.
Introduce 'vshTempFile' type which automatically removes the file.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
tools/vsh.c
tools/vsh.h

index 4ec5e54b5d2ecf18b284d3955ea852b7cf6487e6..bbde594967ce548cdb8245dae31aa917e22dea7b 100644 (file)
@@ -2378,34 +2378,47 @@ vshAskReedit(vshControl *ctl,
 #endif /* WIN32 */
 
 
+void
+vshEditUnlinkTempfile(char *file)
+{
+    if (!file)
+        return;
+
+    ignore_value(unlink(file));
+    g_free(file);
+}
+
+
 /* Common code for the edit / net-edit / pool-edit functions which follow. */
 char *
 vshEditWriteToTempFile(vshControl *ctl, const char *doc)
 {
-    g_autofree char *ret = NULL;
+    g_autofree char *filename = NULL;
+    g_autoptr(vshTempFile) ret = NULL;
     const char *tmpdir;
     VIR_AUTOCLOSE fd = -1;
 
     tmpdir = getenv("TMPDIR");
-    if (!tmpdir) tmpdir = "/tmp";
-    ret = g_strdup_printf("%s/virshXXXXXX.xml", tmpdir);
-    fd = g_mkstemp_full(ret, O_RDWR | O_CLOEXEC, S_IRUSR | S_IWUSR);
+    if (!tmpdir)
+        tmpdir = "/tmp";
+    filename = g_strdup_printf("%s/virshXXXXXX.xml", tmpdir);
+    fd = g_mkstemp_full(filename, O_RDWR | O_CLOEXEC, S_IRUSR | S_IWUSR);
     if (fd == -1) {
         vshError(ctl, _("g_mkstemp_full: failed to create temporary file: %s"),
                  g_strerror(errno));
         return NULL;
     }
 
+    ret = g_steal_pointer(&filename);
+
     if (safewrite(fd, doc, strlen(doc)) == -1) {
         vshError(ctl, _("write: %s: failed to write to temporary file: %s"),
                  ret, g_strerror(errno));
-        unlink(ret);
         return NULL;
     }
     if (VIR_CLOSE(fd) < 0) {
         vshError(ctl, _("close: %s: failed to write or close temporary file: %s"),
                  ret, g_strerror(errno));
-        unlink(ret);
         return NULL;
     }
 
index e208d957bb21ccbbc94195ffac9dd5803b0a5bb7..663dc1ffce8e27b570ff24dc9bbe285c23c0fe50 100644 (file)
@@ -341,6 +341,9 @@ void vshSaveLibvirtError(void);
 void vshSaveLibvirtHelperError(void);
 
 /* file handling */
+void vshEditUnlinkTempfile(char *file);
+typedef char vshTempFile;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(vshTempFile, vshEditUnlinkTempfile);
 char *vshEditWriteToTempFile(vshControl *ctl, const char *doc);
 int vshEditFile(vshControl *ctl, const char *filename);
 char *vshEditReadBackFile(vshControl *ctl, const char *filename);