#ifdef O_CLOEXEC
if ((fd = open(fn, flags|O_CLOEXEC, mode)) >= 0)
- return fd;
+ goto finish;
if (errno != EINVAL)
return fd;
if ((fd = open(fn, flags, mode)) < 0)
return fd;
+finish:
+ /* Some implementations might simply ignore O_CLOEXEC if it is not
+ * understood, make sure FD_CLOEXEC is enabled anyway */
+
pa_make_fd_cloexec(fd);
return fd;
}
#ifdef SOCK_CLOEXEC
if ((fd = socket(domain, type | SOCK_CLOEXEC, protocol)) >= 0)
- return fd;
+ goto finish;
if (errno != EINVAL)
return fd;
if ((fd = socket(domain, type, protocol)) < 0)
return fd;
+finish:
+ /* Some implementations might simply ignore SOCK_CLOEXEC if it is
+ * not understood, make sure FD_CLOEXEC is enabled anyway */
+
pa_make_fd_cloexec(fd);
return fd;
}
#ifdef HAVE_PIPE2
if ((r = pipe2(pipefd, O_CLOEXEC)) >= 0)
- return r;
+ goto finish;
if (errno != EINVAL && errno != ENOSYS)
return r;
if ((r = pipe(pipefd)) < 0)
return r;
+finish:
pa_make_fd_cloexec(pipefd[0]);
pa_make_fd_cloexec(pipefd[1]);