marcandre.lur...@redhat.com writes: > From: Marc-André Lureau <marcandre.lur...@redhat.com> > > The function takes care of setting CLOEXEC, and reporting error. > > The reported error message will differ, from: > "failed to open file 'foo' (mode: 'r')" > to: > "Failed to open file 'foo'" > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > Reviewed-by: Markus Armbruster <arm...@redhat.com> > --- > qga/commands-posix.c | 13 ++++++------- > 1 file changed, 6 insertions(+), 7 deletions(-) > > diff --git a/qga/commands-posix.c b/qga/commands-posix.c > index 8ee149e550..28fe19d932 100644 > --- a/qga/commands-posix.c > +++ b/qga/commands-posix.c > @@ -27,6 +27,7 @@ > #include "qemu/cutils.h" > #include "commands-common.h" > #include "block/nvme.h" > +#include "cutils.h" > > #ifdef HAVE_UTMPX > #include <utmpx.h> > @@ -339,6 +340,7 @@ find_open_flag(const char *mode_str, Error **errp) > static FILE * > safe_open_or_create(const char *path, const char *mode, Error **errp) > { > + ERRP_GUARD(); > int oflag; > int fd = -1; > FILE *f = NULL; > @@ -370,20 +372,17 @@ safe_open_or_create(const char *path, const char *mode, > Error **errp) > * open() is decisive and its third argument is ignored, and the second > * open() and the fchmod() are never called. > */ > - fd = open(path, oflag | ((oflag & O_CREAT) ? O_EXCL : 0), 0); > + fd = qga_open_cloexec(path, oflag | ((oflag & O_CREAT) ? O_EXCL : 0), 0, > errp);
Long line. > if (fd == -1 && errno == EEXIST) { > + error_free(*errp); > + *errp = NULL; > oflag &= ~(unsigned)O_CREAT; > - fd = open(path, oflag); > + fd = qga_open_cloexec(path, oflag, 0, errp); > } > if (fd == -1) { > - error_setg_errno(errp, errno, > - "failed to open file '%s' (mode: '%s')", > - path, mode); > goto end; > } > > - qemu_set_cloexec(fd); > - > if ((oflag & O_CREAT) && fchmod(fd, DEFAULT_NEW_FILE_MODE) == -1) { > error_setg_errno(errp, errno, "failed to set permission " > "0%03o on new file '%s' (mode: '%s')", Simpler: diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 8ee149e550..516658a7f6 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -27,6 +27,7 @@ #include "qemu/cutils.h" #include "commands-common.h" #include "block/nvme.h" +#include "cutils.h" #ifdef HAVE_UTMPX #include <utmpx.h> @@ -370,10 +371,10 @@ safe_open_or_create(const char *path, const char *mode, Error **errp) * open() is decisive and its third argument is ignored, and the second * open() and the fchmod() are never called. */ - fd = open(path, oflag | ((oflag & O_CREAT) ? O_EXCL : 0), 0); + fd = qga_open_cloexec(path, oflag | ((oflag & O_CREAT) ? O_EXCL : 0), 0, NULL); if (fd == -1 && errno == EEXIST) { oflag &= ~(unsigned)O_CREAT; - fd = open(path, oflag); + fd = qga_open_cloexec(path, oflag, 0, NULL); } if (fd == -1) { error_setg_errno(errp, errno, @@ -382,8 +383,6 @@ safe_open_or_create(const char *path, const char *mode, Error **errp) goto end; } - qemu_set_cloexec(fd); - if ((oflag & O_CREAT) && fchmod(fd, DEFAULT_NEW_FILE_MODE) == -1) { error_setg_errno(errp, errno, "failed to set permission " "0%03o on new file '%s' (mode: '%s')", qga_open_cloexec()'s parameter @errp then has no user, and can be dropped. Recommendation, not demand.