};
 
 #define SOCK_MAX (SOCK_PACKET + 1)
+/* Mask which covers at least up to SOCK_MASK-1.  The
+ *  * remaining bits are used as flags. */
+#define SOCK_TYPE_MASK 0xf
+
+/* Flags for socket, socketpair, paccept */
+#define SOCK_CLOEXEC   O_CLOEXEC
+#define SOCK_NONBLOCK  O_NONBLOCK
 
 #define ARCH_HAS_SOCKET_TYPES 1
 
 
 
 #include <linux/wait.h>
 #include <linux/socket.h>
+#include <linux/fcntl.h>       /* For O_CLOEXEC */
 #include <asm/socket.h>
 
 struct poll_table_struct;
 };
 
 #define SOCK_MAX (SOCK_PACKET + 1)
+/* Mask which covers at least up to SOCK_MASK-1.  The
+ * remaining bits are used as flags. */
+#define SOCK_TYPE_MASK 0xf
+
+/* Flags for socket, socketpair, paccept */
+#define SOCK_CLOEXEC   O_CLOEXEC
 
 #endif /* ARCH_HAS_SOCKET_TYPES */
 
                                  size_t len);
 extern int          sock_recvmsg(struct socket *sock, struct msghdr *msg,
                                  size_t size, int flags);
-extern int          sock_map_fd(struct socket *sock);
+extern int          sock_map_fd(struct socket *sock, int flags);
 extern struct socket *sockfd_lookup(int fd, int *err);
 #define                     sockfd_put(sock) fput(sock->file)
 extern int          net_ratelimit(void);
 
  *     but we take care of internal coherence yet.
  */
 
-static int sock_alloc_fd(struct file **filep)
+static int sock_alloc_fd(struct file **filep, int flags)
 {
        int fd;
 
-       fd = get_unused_fd();
+       fd = get_unused_fd_flags(flags);
        if (likely(fd >= 0)) {
                struct file *file = get_empty_filp();
 
        return 0;
 }
 
-int sock_map_fd(struct socket *sock)
+int sock_map_fd(struct socket *sock, int flags)
 {
        struct file *newfile;
-       int fd = sock_alloc_fd(&newfile);
+       int fd = sock_alloc_fd(&newfile, flags);
 
        if (likely(fd >= 0)) {
                int err = sock_attach_fd(sock, newfile);
 {
        int retval;
        struct socket *sock;
+       int flags;
+
+       flags = type & ~SOCK_TYPE_MASK;
+       if (flags & ~SOCK_CLOEXEC)
+               return -EINVAL;
+       type &= SOCK_TYPE_MASK;
 
        retval = sock_create(family, type, protocol, &sock);
        if (retval < 0)
                goto out;
 
-       retval = sock_map_fd(sock);
+       retval = sock_map_fd(sock, flags & O_CLOEXEC);
        if (retval < 0)
                goto out_release;
 
        struct socket *sock1, *sock2;
        int fd1, fd2, err;
        struct file *newfile1, *newfile2;
+       int flags;
+
+       flags = type & ~SOCK_TYPE_MASK;
+       if (flags & ~SOCK_CLOEXEC)
+               return -EINVAL;
+       type &= SOCK_TYPE_MASK;
 
        /*
         * Obtain the first socket and check if the underlying protocol
        if (err < 0)
                goto out_release_both;
 
-       fd1 = sock_alloc_fd(&newfile1);
+       fd1 = sock_alloc_fd(&newfile1, flags & O_CLOEXEC);
        if (unlikely(fd1 < 0)) {
                err = fd1;
                goto out_release_both;
        }
 
-       fd2 = sock_alloc_fd(&newfile2);
+       fd2 = sock_alloc_fd(&newfile2, flags & O_CLOEXEC);
        if (unlikely(fd2 < 0)) {
                err = fd2;
                put_filp(newfile1);
         */
        __module_get(newsock->ops->owner);
 
-       newfd = sock_alloc_fd(&newfile);
+       newfd = sock_alloc_fd(&newfile, 0);
        if (unlikely(newfd < 0)) {
                err = newfd;
                sock_release(newsock);