0
};
-#ifdef _EVENT_HAVE_SETFD
-#define FD_CLOSEONEXEC(x) do { \
- if (fcntl(x, F_SETFD, 1) == -1) \
- event_warn("fcntl(%d, F_SETFD)", x); \
-} while (0)
-#else
-#define FD_CLOSEONEXEC(x)
-#endif
-
#define INITIAL_NEVENT 32
#define MAX_NEVENT 4096
return (NULL);
}
- FD_CLOSEONEXEC(epfd);
+ evutil_make_socket_closeonexec(epfd);
if (!(epollop = mm_calloc(1, sizeof(struct epollop))))
return (NULL);
#endif
}
+int
+evutil_make_socket_closeonexec(evutil_socket_t fd)
+{
+#if !defined(WIN32) && defined(_EVENT_HAVE_SETFD)
+ long flags;
+ if ((flags = fcntl(fd, F_GETFD, NULL)) < 0) {
+ event_warn("fcntl(%d, F_GETFD)", fd);
+ return -1;
+ }
+ if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) {
+ event_warn("fcntl(%d, F_SETFD)", fd);
+ return -1;
+ }
+#endif
+ return 0;
+}
+
ev_int64_t
evutil_strtoll(const char *s, char **endptr, int base)
{
return (-1);
}
- if (evutil_make_socket_nonblocking(fd) < 0)
- goto out;
-
-#ifndef WIN32
- if (fcntl(fd, F_SETFD, 1) == -1) {
- event_warn("fcntl(F_SETFD)");
- goto out;
- }
-#endif
+ if (evutil_make_socket_nonblocking(fd) < 0)
+ goto out;
+ if (evutil_make_socket_closeonexec(fd) < 0)
+ goto out;
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&on, sizeof(on));
if (reuse)
@param sock The socket to make reusable
@return 0 on success, -1 on failure
*/
-int evutil_make_listen_socket_reuseable(evutil_socket_t);
+int evutil_make_listen_socket_reuseable(evutil_socket_t sock);
+
+/** Do platform-specific operations as needed to close a socket upon a
+ successful execution of one of the exec*() functions.
+
+ @param sock The socket to be closed
+ @return 0 on success, -1 on failure
+ */
+int evutil_make_socket_closeonexec(evutil_socket_t sock);
#ifdef WIN32
/** Do the platform-specific call needed to close a socket returned from
return NULL;
}
-#ifndef WIN32
if (flags & LEV_OPT_CLOSE_ON_EXEC) {
- if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
+ if (evutil_make_socket_closeonexec(fd) < 0) {
EVUTIL_CLOSESOCKET(fd);
return NULL;
}
}
-#endif
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&on, sizeof(on));
if (flags & LEV_OPT_REUSEABLE) {
event_sock_err(1, fd, "%s: read", __func__);
}
-#ifdef _EVENT_HAVE_SETFD
-#define FD_CLOSEONEXEC(x) do { \
- if (fcntl(x, F_SETFD, 1) == -1) \
- event_warn("fcntl(%d, F_SETFD)", x); \
-} while (0)
-#else
-#define FD_CLOSEONEXEC(x)
-#endif
-
int
evsig_init(struct event_base *base)
{
return -1;
}
- FD_CLOSEONEXEC(base->sig.ev_signal_pair[0]);
- FD_CLOSEONEXEC(base->sig.ev_signal_pair[1]);
+ evutil_make_socket_closeonexec(base->sig.ev_signal_pair[0]);
+ evutil_make_socket_closeonexec(base->sig.ev_signal_pair[1]);
base->sig.sh_old = NULL;
base->sig.sh_old_max = 0;
base->sig.evsig_caught = 0;