+
+/**
+ * Creates a socket file descriptor. The new file descriptor has the
+ * close-on-exec flag set.
+ * @param pf protocol family
+ * @param type socket type
+ * @param proto network protocol
+ * @param nonblock true to create a non-blocking socket
+ * @return a new file descriptor or -1
+ */
+int vlc_socket (int pf, int type, int proto, bool nonblock)
+{
+ int fd;
+
+#ifdef SOCK_CLOEXEC
+ type |= SOCK_CLOEXEC;
+ if (nonblock)
+ type |= SOCK_NONBLOCK;
+ fd = socket (pf, type | SOCK_NONBLOCK | SOCK_CLOEXEC, proto);
+ if (fd != -1 || errno != EINVAL)
+ return fd;
+
+ type &= ~(SOCK_CLOEXEC|SOCK_NONBLOCK);
+#endif
+
+ fd = socket (pf, type, proto);
+ if (fd == -1)
+ return -1;
+
+#ifndef WIN32
+ fcntl (fd, F_SETFD, FD_CLOEXEC);
+ if (nonblock)
+ fcntl (fd, F_SETFL, fcntl (fd, F_GETFL, 0) | O_NONBLOCK);
+#else
+ if (nonblock)
+ ioctlsocket (fd, FIONBIO, &(unsigned long){ 1 });
+#endif
+ return fd;
+}