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@xxxxxxxxxx> --- tools/vsh.c | 25 +++++++++++++++++++------ tools/vsh.h | 3 +++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/tools/vsh.c b/tools/vsh.c index 4ec5e54b5d..bbde594967 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -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; } diff --git a/tools/vsh.h b/tools/vsh.h index e208d957bb..663dc1ffce 100644 --- a/tools/vsh.h +++ b/tools/vsh.h @@ -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); -- 2.35.1