[PATCH 02/18] flag parameters: paccept - Kernel

This is a discussion on [PATCH 02/18] flag parameters: paccept - Kernel ; This patch is by far the most complex in the series. It adds a new syscall paccept. This syscall differs from accept in that it adds (at the userlevel) two additional parameters: - a signal mask - a flags value ...

+ Reply to Thread
Results 1 to 8 of 8

Thread: [PATCH 02/18] flag parameters: paccept

  1. [PATCH 02/18] flag parameters: paccept

    This patch is by far the most complex in the series. It adds a new syscall
    paccept. This syscall differs from accept in that it adds (at the userlevel)
    two additional parameters:

    - a signal mask
    - a flags value

    The flags parameter can be used to set flag like SOCK_CLOEXEC. This is
    imlpemented here as well. Some people argued that this is a property
    which should be inherited from the file desriptor for the server but
    this is against POSIX. Additionally, we really want the signal mask
    parameter as well (similar to pselect, ppoll, etc). So an interface
    change in inevitable.

    The flag value is the same as for socket and socketpair. I think
    diverging here will only create confusion. Similar to the filesystem
    interfaces where the use of the O_* constants differs, it is acceptable
    here.

    The signal mask is handled as for pselect etc. The mask is temporarily
    installed for the thread and removed before the call returns. I modeled
    the code after pselect. If there is a problem it's likely also in
    pselect.

    For architectures which use socketcall I maintained this interface
    instead of adding a system call. The symmetry shouldn't be broken.

    The following test must be adjusted for architectures other than x86 and
    x86-64 and in case the syscall numbers changed.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #ifndef __NR_paccept
    # ifdef __x86_64__
    # define __NR_paccept 288
    # elif defined __i386__
    # define SYS_PACCEPT 18
    # define USE_SOCKETCALL 1
    # else
    # error "need __NR_paccept"
    # endif
    #endif

    #ifdef USE_SOCKETCALL
    # define paccept(fd, addr, addrlen, mask, flags) \
    ({ long args[6] = { \
    (long) fd, (long) addr, (long) addrlen, (long) mask, 8, (long) flags }; \
    syscall (__NR_socketcall, SYS_PACCEPT, args); })
    #else
    # define paccept(fd, addr, addrlen, mask, flags) \
    syscall (__NR_paccept, fd, addr, addrlen, mask, 8, flags)
    #endif

    #define PORT 57392

    #define SOCK_CLOEXEC O_CLOEXEC

    static pthread_barrier_t b;

    static void *
    tf (void *arg)
    {
    pthread_barrier_wait (&b);
    int s = socket (AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
    sin.sin_port = htons (PORT);
    connect (s, (const struct sockaddr *) &sin, sizeof (sin));
    close (s);

    pthread_barrier_wait (&b);
    s = socket (AF_INET, SOCK_STREAM, 0);
    sin.sin_port = htons (PORT);
    connect (s, (const struct sockaddr *) &sin, sizeof (sin));
    close (s);
    pthread_barrier_wait (&b);

    pthread_barrier_wait (&b);
    sleep (2);
    pthread_kill ((pthread_t) arg, SIGUSR1);

    return NULL;
    }

    static void
    handler (int s)
    {
    }

    int
    main (void)
    {
    pthread_barrier_init (&b, NULL, 2);

    struct sockaddr_in sin;
    pthread_t th;
    if (pthread_create (&th, NULL, tf, (void *) pthread_self ()) != 0)
    {
    puts ("pthread_create failed");
    return 1;
    }

    int s = socket (AF_INET, SOCK_STREAM, 0);
    int reuse = 1;
    setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof (reuse));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
    sin.sin_port = htons (PORT);
    bind (s, (struct sockaddr *) &sin, sizeof (sin));
    listen (s, SOMAXCONN);

    pthread_barrier_wait (&b);

    int s2 = paccept (s, NULL, 0, NULL, 0);
    if (s2 < 0)
    {
    puts ("paccept(0) failed");
    return 1;
    }

    int coe = fcntl (s2, F_GETFD);
    if (coe & FD_CLOEXEC)
    {
    puts ("paccept(0) set close-on-exec-flag");
    return 1;
    }
    close (s2);

    pthread_barrier_wait (&b);

    s2 = paccept (s, NULL, 0, NULL, SOCK_CLOEXEC);
    if (s2 < 0)
    {
    puts ("paccept(SOCK_CLOEXEC) failed");
    return 1;
    }

    coe = fcntl (s2, F_GETFD);
    if ((coe & FD_CLOEXEC) == 0)
    {
    puts ("paccept(SOCK_CLOEXEC) does not set close-on-exec flag");
    return 1;
    }
    close (s2);

    pthread_barrier_wait (&b);

    struct sigaction sa;
    sa.sa_handler = handler;
    sa.sa_flags = 0;
    sigemptyset (&sa.sa_mask);
    sigaction (SIGUSR1, &sa, NULL);

    sigset_t ss;
    pthread_sigmask (SIG_SETMASK, NULL, &ss);
    sigaddset (&ss, SIGUSR1);
    pthread_sigmask (SIG_SETMASK, &ss, NULL);

    sigdelset (&ss, SIGUSR1);
    alarm (4);
    pthread_barrier_wait (&b);

    errno = 0 ;
    s2 = paccept (s, NULL, 0, &ss, 0);
    if (s2 != -1 || errno != EINTR)
    {
    puts ("paccept did not fail with EINTR");
    return 1;
    }

    close (s);

    puts ("OK");

    return 0;
    }
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~

    include/asm-x86/unistd_64.h | 2 +
    include/linux/net.h | 3 +
    include/linux/syscalls.h | 2 +
    net/compat.c | 52 +++++++++++++++++++++++++++++---
    net/socket.c | 71 +++++++++++++++++++++++++++++++++++++++-----
    5 files changed, 118 insertions(+), 12 deletions(-)


    Signed-off-by: Ulrich Drepper

    diff --git a/include/asm-x86/unistd_64.h b/include/asm-x86/unistd_64.h
    index fe26e36..d751135 100644
    --- a/include/asm-x86/unistd_64.h
    +++ b/include/asm-x86/unistd_64.h
    @@ -639,6 +639,8 @@ __SYSCALL(__NR_fallocate, sys_fallocate)
    __SYSCALL(__NR_timerfd_settime, sys_timerfd_settime)
    #define __NR_timerfd_gettime 287
    __SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime)
    +#define __NR_paccept 288
    +__SYSCALL(__NR_paccept, sys_paccept)


    #ifndef __NO_STUBS
    diff --git a/include/linux/net.h b/include/linux/net.h
    index 0c1ad01..b4ad432 100644
    --- a/include/linux/net.h
    +++ b/include/linux/net.h
    @@ -47,6 +47,7 @@ struct net;
    #define SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */
    #define SYS_SENDMSG 16 /* sys_sendmsg(2) */
    #define SYS_RECVMSG 17 /* sys_recvmsg(2) */
    +#define SYS_PACCEPT 18 /* sys_paccept(2) */

    typedef enum {
    SS_FREE = 0, /* not allocated */
    @@ -219,6 +220,8 @@ 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);
    +extern long do_accept(int fd, struct sockaddr __user *upeer_sockaddr,
    + int __user *upeer_addrlen, int flags);

    #define net_random() random32()
    #define net_srandom(seed) srandom32((__force u32)seed)
    diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
    index 0522f36..e022405 100644
    --- a/include/linux/syscalls.h
    +++ b/include/linux/syscalls.h
    @@ -409,6 +409,8 @@ asmlinkage long sys_getsockopt(int fd, int level, int optname,
    asmlinkage long sys_bind(int, struct sockaddr __user *, int);
    asmlinkage long sys_connect(int, struct sockaddr __user *, int);
    asmlinkage long sys_accept(int, struct sockaddr __user *, int __user *);
    +asmlinkage long sys_paccept(int, struct sockaddr __user *, int __user *,
    + const sigset_t *, size_t, int);
    asmlinkage long sys_getsockname(int, struct sockaddr __user *, int __user *);
    asmlinkage long sys_getpeername(int, struct sockaddr __user *, int __user *);
    asmlinkage long sys_send(int, void __user *, size_t, unsigned);
    diff --git a/net/compat.c b/net/compat.c
    index c823f6f..c9a507c 100644
    --- a/net/compat.c
    +++ b/net/compat.c
    @@ -722,9 +722,10 @@ EXPORT_SYMBOL(compat_mc_getsockopt);

    /* Argument list sizes for compat_sys_socketcall */
    #define AL(x) ((x) * sizeof(u32))
    -static unsigned char nas[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
    +static unsigned char nas[19]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
    AL(3),AL(3),AL(4),AL(4),AL(4),AL(6),
    - AL(6),AL(2),AL(5),AL(5),AL(3),AL(3)};
    + AL(6),AL(2),AL(5),AL(5),AL(3),AL(3),
    + AL(6)};
    #undef AL

    asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags)
    @@ -737,13 +738,52 @@ asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, uns
    return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
    }

    +asmlinkage long compat_sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
    + int __user *upeer_addrlen,
    + const compat_sigset_t __user *sigmask,
    + compat_size_t sigsetsize, int flags)
    +{
    + compat_sigset_t ss32;
    + sigset_t ksigmask, sigsaved;
    + int ret;
    +
    + if (sigmask) {
    + if (sigsetsize != sizeof(compat_sigset_t))
    + return -EINVAL;
    + if (copy_from_user(&ss32, sigmask, sizeof(ss32)))
    + return -EFAULT;
    + sigset_from_compat(&ksigmask, &ss32);
    +
    + sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP));
    + sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
    + }
    +
    + ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
    +
    + if (ret == -ERESTARTNOHAND) {
    + /*
    + * Don't restore the signal mask yet. Let do_signal() deliver
    + * the signal on the way back to userspace, before the signal
    + * mask is restored.
    + */
    + if (sigmask) {
    + memcpy(&current->saved_sigmask, &sigsaved,
    + sizeof(sigsaved));
    + set_thread_flag(TIF_RESTORE_SIGMASK);
    + }
    + } else if (sigmask)
    + sigprocmask(SIG_SETMASK, &sigsaved, NULL);
    +
    + return ret;
    +}
    +
    asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
    {
    int ret;
    u32 a[6];
    u32 a0, a1;

    - if (call < SYS_SOCKET || call > SYS_RECVMSG)
    + if (call < SYS_SOCKET || call > SYS_PACCEPT)
    return -EINVAL;
    if (copy_from_user(a, args, nas[call]))
    return -EFAULT;
    @@ -764,7 +804,7 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
    ret = sys_listen(a0, a1);
    break;
    case SYS_ACCEPT:
    - ret = sys_accept(a0, compat_ptr(a1), compat_ptr(a[2]));
    + ret = do_accept(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
    break;
    case SYS_GETSOCKNAME:
    ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
    @@ -804,6 +844,10 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
    case SYS_RECVMSG:
    ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
    break;
    + case SYS_PACCEPT:
    + ret = compat_sys_paccept(a0, compat_ptr(a1), compat_ptr(a[2]),
    + compat_ptr(a[3]), a[4], a[5]);
    + break;
    default:
    ret = -EINVAL;
    break;
    diff --git a/net/socket.c b/net/socket.c
    index 6d6f406..634ad83 100644
    --- a/net/socket.c
    +++ b/net/socket.c
    @@ -1412,14 +1412,17 @@ asmlinkage long sys_listen(int fd, int backlog)
    * clean when we restucture accept also.
    */

    -asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
    - int __user *upeer_addrlen)
    +long do_accept(int fd, struct sockaddr __user *upeer_sockaddr,
    + int __user *upeer_addrlen, int flags)
    {
    struct socket *sock, *newsock;
    struct file *newfile;
    int err, len, newfd, fput_needed;
    char address[MAX_SOCK_ADDR];

    + if (flags & ~SOCK_CLOEXEC)
    + return -EINVAL;
    +
    sock = sockfd_lookup_light(fd, &err, &fput_needed);
    if (!sock)
    goto out;
    @@ -1437,7 +1440,7 @@ asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
    */
    __module_get(newsock->ops->owner);

    - newfd = sock_alloc_fd(&newfile, 0);
    + newfd = sock_alloc_fd(&newfile, flags & O_CLOEXEC);
    if (unlikely(newfd < 0)) {
    err = newfd;
    sock_release(newsock);
    @@ -1490,6 +1493,50 @@ out_fd:
    goto out_put;
    }

    +asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
    + int __user *upeer_addrlen,
    + const sigset_t __user *sigmask,
    + size_t sigsetsize, int flags)
    +{
    + sigset_t ksigmask, sigsaved;
    + int ret;
    +
    + if (sigmask) {
    + /* XXX: Don't preclude handling different sized sigset_t's. */
    + if (sigsetsize != sizeof(sigset_t))
    + return -EINVAL;
    + if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask)))
    + return -EFAULT;
    +
    + sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP));
    + sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
    + }
    +
    + ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
    +
    + if (ret < 0 && signal_pending(current)) {
    + /*
    + * Don't restore the signal mask yet. Let do_signal() deliver
    + * the signal on the way back to userspace, before the signal
    + * mask is restored.
    + */
    + if (sigmask) {
    + memcpy(&current->saved_sigmask, &sigsaved,
    + sizeof(sigsaved));
    + set_thread_flag(TIF_RESTORE_SIGMASK);
    + }
    + } else if (sigmask)
    + sigprocmask(SIG_SETMASK, &sigsaved, NULL);
    +
    + return ret;
    +}
    +
    +asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
    + int __user *upeer_addrlen)
    +{
    + return do_accept(fd, upeer_sockaddr, upeer_addrlen, 0);
    +}
    +
    /*
    * Attempt to connect to a socket with the server address. The address
    * is in user space so we verify it is OK and move it to kernel space.
    @@ -2000,10 +2047,11 @@ out:

    /* Argument list sizes for sys_socketcall */
    #define AL(x) ((x) * sizeof(unsigned long))
    -static const unsigned char nargs[18]={
    +static const unsigned char nargs[19]={
    AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
    AL(3),AL(3),AL(4),AL(4),AL(4),AL(6),
    - AL(6),AL(2),AL(5),AL(5),AL(3),AL(3)
    + AL(6),AL(2),AL(5),AL(5),AL(3),AL(3),
    + AL(6)
    };

    #undef AL
    @@ -2022,7 +2070,7 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
    unsigned long a0, a1;
    int err;

    - if (call < 1 || call > SYS_RECVMSG)
    + if (call < 1 || call > SYS_PACCEPT)
    return -EINVAL;

    /* copy_from_user should be SMP safe. */
    @@ -2051,8 +2099,8 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
    break;
    case SYS_ACCEPT:
    err =
    - sys_accept(a0, (struct sockaddr __user *)a1,
    - (int __user *)a[2]);
    + do_accept(a0, (struct sockaddr __user *)a1,
    + (int __user *)a[2], 0);
    break;
    case SYS_GETSOCKNAME:
    err =
    @@ -2099,6 +2147,13 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
    case SYS_RECVMSG:
    err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]);
    break;
    + case SYS_PACCEPT:
    + err =
    + sys_paccept(a0, (struct sockaddr __user *)a1,
    + (int __user *)a[2],
    + (const sigset_t __user *) a[3],
    + a[4], a[5]);
    + break;
    default:
    err = -EINVAL;
    break;
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. Re: [PATCH 02/18] flag parameters: paccept

    On Tue, 6 May 2008 17:18:07 -0400
    Ulrich Drepper wrote:

    > This patch is by far the most complex in the series. It adds a new syscall
    > paccept. This syscall differs from accept in that it adds (at the userlevel)
    > two additional parameters:
    >
    > - a signal mask
    > - a flags value
    >
    > The flags parameter can be used to set flag like SOCK_CLOEXEC. This is
    > imlpemented here as well. Some people argued that this is a property
    > which should be inherited from the file desriptor for the server but
    > this is against POSIX. Additionally, we really want the signal mask
    > parameter as well (similar to pselect, ppoll, etc). So an interface
    > change in inevitable.
    >
    > The flag value is the same as for socket and socketpair. I think
    > diverging here will only create confusion. Similar to the filesystem
    > interfaces where the use of the O_* constants differs, it is acceptable
    > here.
    >
    > The signal mask is handled as for pselect etc. The mask is temporarily
    > installed for the thread and removed before the call returns. I modeled
    > the code after pselect. If there is a problem it's likely also in
    > pselect.
    >
    > For architectures which use socketcall I maintained this interface
    > instead of adding a system call. The symmetry shouldn't be broken.
    >
    > The following test must be adjusted for architectures other than x86 and
    > x86-64 and in case the syscall numbers changed.
    >


    I have a bit of a mystery going on here.

    > ...
    >
    > +asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
    > + int __user *upeer_addrlen,
    > + const sigset_t __user *sigmask,
    > + size_t sigsetsize, int flags)
    > +{
    > + sigset_t ksigmask, sigsaved;
    > + int ret;
    > +
    > + if (sigmask) {
    > + /* XXX: Don't preclude handling different sized sigset_t's. */
    > + if (sigsetsize != sizeof(sigset_t))
    > + return -EINVAL;
    > + if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask)))
    > + return -EFAULT;
    > +
    > + sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP));
    > + sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
    > + }
    > +
    > + ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags);
    > +
    > + if (ret < 0 && signal_pending(current)) {
    > + /*
    > + * Don't restore the signal mask yet. Let do_signal() deliver
    > + * the signal on the way back to userspace, before the signal
    > + * mask is restored.
    > + */
    > + if (sigmask) {
    > + memcpy(&current->saved_sigmask, &sigsaved,
    > + sizeof(sigsaved));
    > + set_thread_flag(TIF_RESTORE_SIGMASK);
    > + }
    > + } else if (sigmask)
    > + sigprocmask(SIG_SETMASK, &sigsaved, NULL);
    > +
    > + return ret;
    > +}


    Some architectures (including x86) do not implement TIF_RESTORE_SIGMASK.

    Ah, you must have prepared the patches against something prehistoric like
    2.6.25. Please prefer to prepare 2.6.x patches against the 2.6.x tree, not
    the 2.6.x-1 tree?

    Whatever you're trying to do here, we'll need to find a non-arch-specific
    way of doing it.

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  3. Re: [PATCH 02/18] flag parameters: paccept

    From: Roland McGrath
    Date: Thu, 8 May 2008 15:50:43 -0700 (PDT)

    > It's now spelled:
    >
    > set_restore_sigmask();
    >
    > For the other syscalls that depend on this (e.g. sys_ppoll),
    > we just put the whole definition in #ifdef HAVE_SET_RESTORE_SIGMASK.
    >
    > The few machines that don't have RESTORE_SIGMASK support of some flavor,
    > also have not assigned numbers to the syscalls that need it.


    I notice that this macro also sets the sigpending bit, although
    some paths that end up calling set_restore_sigmask() already
    do that.
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  4. Re: [PATCH 02/18] flag parameters: paccept

    > Some architectures (including x86) do not implement TIF_RESTORE_SIGMASK.

    It's now spelled:

    set_restore_sigmask();

    For the other syscalls that depend on this (e.g. sys_ppoll),
    we just put the whole definition in #ifdef HAVE_SET_RESTORE_SIGMASK.

    The few machines that don't have RESTORE_SIGMASK support of some flavor,
    also have not assigned numbers to the syscalls that need it.


    Thanks,
    Roland
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  5. Re: [PATCH 02/18] flag parameters: paccept

    From: Andrew Morton
    Date: Thu, 8 May 2008 15:38:22 -0700

    > Whatever you're trying to do here, we'll need to find a non-arch-specific
    > way of doing it.


    Probably: set_restore_sigmask();
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  6. Re: [PATCH 02/18] flag parameters: paccept

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    Andrew Morton wrote:
    > Ah, you must have prepared the patches against something prehistoric like
    > 2.6.25. Please prefer to prepare 2.6.x patches against the 2.6.x tree, not
    > the 2.6.x-1 tree?


    Well, pre-historic == before 2008-4-30. That's apparently when Roland's
    patch to change this went in. Yes, I wrote the code before that day and
    didn't notice the pselect implementation changed. Sorry.

    - --
    ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.9 (GNU/Linux)
    Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

    iEYEARECAAYFAkgkBOkACgkQ2ijCOnn/RHSrgACeP1pFdt4QDnE6OOJHy/d7D5H+
    sHQAoLpnEb3FwKh89viFtWXOVfDaVyWf
    =tiZM
    -----END PGP SIGNATURE-----
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  7. Re: [PATCH 02/18] flag parameters: paccept

    On Tue, 6 May 2008 17:18:07 -0400 Ulrich Drepper wrote:

    > This patch is by far the most complex in the series. It adds a new syscall
    > paccept. This syscall differs from accept in that it adds (at the userlevel)
    > two additional parameters:
    >
    > - a signal mask
    > - a flags value
    >
    > The flags parameter can be used to set flag like SOCK_CLOEXEC. This is
    > imlpemented here as well. Some people argued that this is a property
    > which should be inherited from the file desriptor for the server but
    > this is against POSIX. Additionally, we really want the signal mask
    > parameter as well (similar to pselect, ppoll, etc). So an interface
    > change in inevitable.
    >
    > The flag value is the same as for socket and socketpair. I think
    > diverging here will only create confusion. Similar to the filesystem
    > interfaces where the use of the O_* constants differs, it is acceptable
    > here.
    >
    > The signal mask is handled as for pselect etc. The mask is temporarily
    > installed for the thread and removed before the call returns. I modeled
    > the code after pselect. If there is a problem it's likely also in
    > pselect.
    >
    > For architectures which use socketcall I maintained this interface
    > instead of adding a system call. The symmetry shouldn't be broken.
    >
    > The following test must be adjusted for architectures other than x86 and
    > x86-64 and in case the syscall numbers changed.


    Am getting moderately bored of these patches

    arm exploded thusly:

    net/socket.c: In function `sys_paccept':
    net/socket.c:1534: error: implicit declaration of function `set_restore_sigmask'

    because afacit arm doesn't implement set_restore_sigmask() and nor does
    it need to, because it doesn't set HAVE_SET_RESTORE_SIGMASK.

    I will continue to fumble along in the rc2-mm1 direction. Fixes against that
    kernel would suit, thanks.
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  8. Re: [PATCH 02/18] flag parameters: paccept

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1

    Andrew Morton wrote:
    > because afacit arm doesn't implement set_restore_sigmask() and nor does
    > it need to, because it doesn't set HAVE_SET_RESTORE_SIGMASK.


    pselect isn't define if HAVE_SET_RESTORE_SIGMASK isn't defined. That's
    fine since pselect offers nothing over select except the signal
    handling. For paccept we'll have to be a bit more sophisticated, I'm
    afraid. Patch in a few minutes.

    - --
    ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.7 (GNU/Linux)

    iD8DBQFIKRw32ijCOnn/RHQRArz0AJ9RXoICEi/1Wmc2g/Xg7QMpaRfMjACggwhC
    ON/2WP6i03QBerzu6qe/iPs=
    =S2H+
    -----END PGP SIGNATURE-----
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

+ Reply to Thread