diff options
Diffstat (limited to 'udev/lib')
-rw-r--r-- | udev/lib/libudev-monitor.c | 3 | ||||
-rw-r--r-- | udev/lib/libudev-private.h | 1 | ||||
-rw-r--r-- | udev/lib/libudev-util.c | 12 |
3 files changed, 16 insertions, 0 deletions
diff --git a/udev/lib/libudev-monitor.c b/udev/lib/libudev-monitor.c index d006596e07..a8b1a4e2e5 100644 --- a/udev/lib/libudev-monitor.c +++ b/udev/lib/libudev-monitor.c @@ -92,6 +92,8 @@ struct udev_monitor *udev_monitor_new_from_socket(struct udev *udev, const char free(udev_monitor); return NULL; } + util_set_fd_cloexec(udev_monitor->sock); + dbg(udev, "monitor %p created with '%s'\n", udev_monitor, socket_path); return udev_monitor; } @@ -125,6 +127,7 @@ struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, const char free(udev_monitor); return NULL; } + util_set_fd_cloexec(udev_monitor->sock); udev_monitor->snl.nl_family = AF_NETLINK; udev_monitor->snl.nl_groups = group; diff --git a/udev/lib/libudev-private.h b/udev/lib/libudev-private.h index c7b74a4218..1e47d51080 100644 --- a/udev/lib/libudev-private.h +++ b/udev/lib/libudev-private.h @@ -172,4 +172,5 @@ extern size_t util_strlcat(char *dst, const char *src, size_t size); extern int udev_util_replace_whitespace(const char *str, char *to, size_t len); extern int udev_util_replace_chars(char *str, const char *white); extern int udev_util_encode_string(const char *str, char *str_enc, size_t len); +extern void util_set_fd_cloexec(int fd); #endif diff --git a/udev/lib/libudev-util.c b/udev/lib/libudev-util.c index 867a41d211..b628fdd44c 100644 --- a/udev/lib/libudev-util.c +++ b/udev/lib/libudev-util.c @@ -448,3 +448,15 @@ int udev_util_encode_string(const char *str, char *str_enc, size_t len) err: return -1; } + +void util_set_fd_cloexec(int fd) +{ + int flags; + + flags = fcntl(fd, F_GETFD); + if (flags < 0) + flags = FD_CLOEXEC; + else + flags |= FD_CLOEXEC; + fcntl(fd, F_SETFD, flags); +} |