10edbfbe3SMarc-André Lureau /*
20edbfbe3SMarc-André Lureau * This work is licensed under the terms of the GNU GPL, version 2 or later.
30edbfbe3SMarc-André Lureau * See the COPYING file in the top-level directory.
40edbfbe3SMarc-André Lureau */
50edbfbe3SMarc-André Lureau
6*c12a9848SMarkus Armbruster #include "qemu/osdep.h"
7*c12a9848SMarkus Armbruster #include "cutils.h"
80edbfbe3SMarc-André Lureau #include "qapi/error.h"
90edbfbe3SMarc-André Lureau
100edbfbe3SMarc-André Lureau /**
110edbfbe3SMarc-André Lureau * qga_open_cloexec:
120edbfbe3SMarc-André Lureau * @name: the pathname to open
130edbfbe3SMarc-André Lureau * @flags: as in open()
140edbfbe3SMarc-André Lureau * @mode: as in open()
150edbfbe3SMarc-André Lureau *
160edbfbe3SMarc-André Lureau * A wrapper for open() function which sets O_CLOEXEC.
170edbfbe3SMarc-André Lureau *
180edbfbe3SMarc-André Lureau * On error, -1 is returned.
190edbfbe3SMarc-André Lureau */
qga_open_cloexec(const char * name,int flags,mode_t mode)200edbfbe3SMarc-André Lureau int qga_open_cloexec(const char *name, int flags, mode_t mode)
210edbfbe3SMarc-André Lureau {
220edbfbe3SMarc-André Lureau int ret;
230edbfbe3SMarc-André Lureau
240edbfbe3SMarc-André Lureau #ifdef O_CLOEXEC
250edbfbe3SMarc-André Lureau ret = open(name, flags | O_CLOEXEC, mode);
260edbfbe3SMarc-André Lureau #else
270edbfbe3SMarc-André Lureau ret = open(name, flags, mode);
280edbfbe3SMarc-André Lureau if (ret >= 0) {
290edbfbe3SMarc-André Lureau qemu_set_cloexec(ret);
300edbfbe3SMarc-André Lureau }
310edbfbe3SMarc-André Lureau #endif
320edbfbe3SMarc-André Lureau
330edbfbe3SMarc-André Lureau return ret;
340edbfbe3SMarc-André Lureau }
35