bus_set_watched_dirs: portability patch for systems which lack O_CLOEXEC

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=77032
Reviewed-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
This commit is contained in:
Patrick Welche 2014-06-06 14:03:39 +01:00 committed by Simon McVittie
parent d002a430cc
commit 5d91f615d1

View file

@ -202,6 +202,9 @@ bus_set_watched_dirs (BusContext *context, DBusList **directories)
DBusList *link;
int i, j, fd;
struct kevent ev;
#ifdef O_CLOEXEC
dbus_bool_t cloexec_done = 0;
#endif
if (!_init_kqueue (context))
goto out;
@ -259,7 +262,15 @@ bus_set_watched_dirs (BusContext *context, DBusList **directories)
/* FIXME - less lame error handling for failing to add a watch;
* we may need to sleep.
*/
#ifdef O_CLOEXEC
fd = open (new_dirs[i], O_RDONLY | O_CLOEXEC);
cloexec_done = (fd >= 0);
if (fd < 0 && errno == EINVAL)
#endif
{
fd = open (new_dirs[i], O_RDONLY);
}
if (fd < 0)
{
if (errno != ENOENT)
@ -274,6 +285,12 @@ bus_set_watched_dirs (BusContext *context, DBusList **directories)
continue;
}
}
#ifdef O_CLOEXEC
if (!cloexec_done)
#endif
{
_dbus_fd_set_close_on_exec (fd);
}
EV_SET (&ev, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR,
NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_RENAME, 0, 0);