qga: flatten safe_open_or_create()

There is a bit too much nesting in the function, this can be simplified
a bit to improve readability.

This also helps with the following error handling changes.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20220525144140.591926-5-marcandre.lureau@redhat.com>
This commit is contained in:
Marc-André Lureau 2022-05-25 16:41:29 +02:00
parent 56b6dab274
commit 69f56c140d

View File

@ -339,12 +339,14 @@ find_open_flag(const char *mode_str, Error **errp)
static FILE * static FILE *
safe_open_or_create(const char *path, const char *mode, Error **errp) safe_open_or_create(const char *path, const char *mode, Error **errp)
{ {
Error *local_err = NULL;
int oflag; int oflag;
int fd = -1;
FILE *f = NULL;
oflag = find_open_flag(mode, &local_err); oflag = find_open_flag(mode, errp);
if (local_err == NULL) { if (oflag < 0) {
int fd; goto end;
}
/* If the caller wants / allows creation of a new file, we implement it /* If the caller wants / allows creation of a new file, we implement it
* with a two step process: open() + (open() / fchmod()). * with a two step process: open() + (open() / fchmod()).
@ -373,39 +375,37 @@ safe_open_or_create(const char *path, const char *mode, Error **errp)
oflag &= ~(unsigned)O_CREAT; oflag &= ~(unsigned)O_CREAT;
fd = open(path, oflag); fd = open(path, oflag);
} }
if (fd == -1) { if (fd == -1) {
error_setg_errno(&local_err, errno, "failed to open file '%s' " error_setg_errno(errp, errno,
"(mode: '%s')", path, mode); "failed to open file '%s' (mode: '%s')",
} else { path, mode);
goto end;
}
qemu_set_cloexec(fd); qemu_set_cloexec(fd);
if ((oflag & O_CREAT) && fchmod(fd, DEFAULT_NEW_FILE_MODE) == -1) { if ((oflag & O_CREAT) && fchmod(fd, DEFAULT_NEW_FILE_MODE) == -1) {
error_setg_errno(&local_err, errno, "failed to set permission " error_setg_errno(errp, errno, "failed to set permission "
"0%03o on new file '%s' (mode: '%s')", "0%03o on new file '%s' (mode: '%s')",
(unsigned)DEFAULT_NEW_FILE_MODE, path, mode); (unsigned)DEFAULT_NEW_FILE_MODE, path, mode);
} else { goto end;
FILE *f; }
f = fdopen(fd, mode); f = fdopen(fd, mode);
if (f == NULL) { if (f == NULL) {
error_setg_errno(&local_err, errno, "failed to associate " error_setg_errno(errp, errno, "failed to associate stdio stream with "
"stdio stream with file descriptor %d, " "file descriptor %d, file '%s' (mode: '%s')",
"file '%s' (mode: '%s')", fd, path, mode); fd, path, mode);
} else {
return f;
}
} }
end:
if (f == NULL && fd != -1) {
close(fd); close(fd);
if (oflag & O_CREAT) { if (oflag & O_CREAT) {
unlink(path); unlink(path);
} }
} }
} return f;
error_propagate(errp, local_err);
return NULL;
} }
int64_t qmp_guest_file_open(const char *path, bool has_mode, const char *mode, int64_t qmp_guest_file_open(const char *path, bool has_mode, const char *mode,