virFileRewrite: Move error reporting into callback

When rewriting a file using virFileRewrite() and error occurs
while writing into a temporary file it's actually the callback
that can report the most accurate error. Move error reporting
into very few callback we have currently. Those callbacks are
trivial so the benefit of this change is not obvious, but this
will change shortly when slightly more complicated callback is
introduced.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Michal Privoznik 2022-02-09 13:43:19 +01:00
parent 04ed251850
commit d295c14258
3 changed files with 29 additions and 12 deletions

View File

@ -497,7 +497,8 @@ int virFileUnlock(int fd G_GNUC_UNUSED,
* temporary file on a side and renaming it to the desired name. * temporary file on a side and renaming it to the desired name.
* The temporary file is created using supplied @mode and * The temporary file is created using supplied @mode and
* @uid:@gid (pass -1 for current uid/gid) and written by * @uid:@gid (pass -1 for current uid/gid) and written by
* @rewrite callback. * @rewrite callback. It's callback's responsibility to report
* errors.
* *
* Returns: 0 on success, * Returns: 0 on success,
* -1 otherwise (with error reported) * -1 otherwise (with error reported)
@ -512,6 +513,7 @@ virFileRewrite(const char *path,
g_autofree char *newfile = NULL; g_autofree char *newfile = NULL;
int fd = -1; int fd = -1;
int ret = -1; int ret = -1;
int rc;
newfile = g_strdup_printf("%s.new", path); newfile = g_strdup_printf("%s.new", path);
@ -524,9 +526,7 @@ virFileRewrite(const char *path,
goto cleanup; goto cleanup;
} }
if (rewrite(fd, opaque) < 0) { if ((rc = rewrite(fd, newfile, opaque)) < 0) {
virReportSystemError(errno, _("cannot write data to file '%s'"),
newfile);
goto cleanup; goto cleanup;
} }
@ -558,12 +558,18 @@ virFileRewrite(const char *path,
static int static int
virFileRewriteStrHelper(int fd, const void *opaque) virFileRewriteStrHelper(int fd,
const char *path,
const void *opaque)
{ {
const char *data = opaque; const char *data = opaque;
if (safewrite(fd, data, strlen(data)) < 0) if (safewrite(fd, data, strlen(data)) < 0) {
virReportSystemError(errno,
_("cannot write data to file '%s'"),
path);
return -1; return -1;
}
return 0; return 0;
} }

View File

@ -123,7 +123,9 @@ int virFileLock(int fd, bool shared, off_t start, off_t len, bool waitForLock)
int virFileUnlock(int fd, off_t start, off_t len) int virFileUnlock(int fd, off_t start, off_t len)
G_GNUC_NO_INLINE; G_GNUC_NO_INLINE;
typedef int (*virFileRewriteFunc)(int fd, const void *opaque); typedef int (*virFileRewriteFunc)(int fd,
const char *path,
const void *opaque);
int virFileRewrite(const char *path, int virFileRewrite(const char *path,
mode_t mode, mode_t mode,
uid_t uid, gid_t gid, uid_t uid, gid_t gid,

View File

@ -1172,17 +1172,26 @@ struct virXMLRewriteFileData {
}; };
static int static int
virXMLRewriteFile(int fd, const void *opaque) virXMLRewriteFile(int fd,
const char *path,
const void *opaque)
{ {
const struct virXMLRewriteFileData *data = opaque; const struct virXMLRewriteFileData *data = opaque;
if (data->warnCommand) { if (data->warnCommand &&
if (virXMLEmitWarning(fd, data->warnName, data->warnCommand) < 0) virXMLEmitWarning(fd, data->warnName, data->warnCommand) < 0) {
return -1; virReportSystemError(errno,
_("cannot write data to file '%s'"),
path);
return -1;
} }
if (safewrite(fd, data->xml, strlen(data->xml)) < 0) if (safewrite(fd, data->xml, strlen(data->xml)) < 0) {
virReportSystemError(errno,
_("cannot write data to file '%s'"),
path);
return -1; return -1;
}
return 0; return 0;
} }