Author: sthibault
Date: 2011-11-03 01:06:44 +0000 (Thu, 03 Nov 2011)
New Revision: 5034

Added:
   glibc-package/trunk/debian/patches/hurd-i386/tg-dup3.diff
Modified:
   glibc-package/trunk/debian/changelog
   glibc-package/trunk/debian/patches/hurd-i386/submitted-dup2-fix.diff
   glibc-package/trunk/debian/patches/series
Log:
patches/hurd-i386/tg-dup3.diff: New patch from Hurd topgit to implement dup3.
patches/hurd-i386/submitted-dup2-fix.diff: Trivially port to dup3.


Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog        2011-11-01 23:35:34 UTC (rev 
5033)
+++ glibc-package/trunk/debian/changelog        2011-11-03 01:06:44 UTC (rev 
5034)
@@ -42,6 +42,8 @@
     patches/hurd-i386/cvs-ldsodefs.h.diff
   * patches/hurd-i386/submitted-sgttyb.diff: New patch to fix sgttyb ioctls
     values.
+  * patches/hurd-i386/tg-dup3.diff: New patch from Hurd topgit to implement 
dup3.
+  * patches/hurd-i386/submitted-dup2-fix.diff: Trivially port to dup3.
 
   [ Petr Salinger ]
   * kfreebsd/local-sysdeps.diff: update to revision 3763 (from glibc-bsd).

Modified: glibc-package/trunk/debian/patches/hurd-i386/submitted-dup2-fix.diff
===================================================================
--- glibc-package/trunk/debian/patches/hurd-i386/submitted-dup2-fix.diff        
2011-11-01 23:35:34 UTC (rev 5033)
+++ glibc-package/trunk/debian/patches/hurd-i386/submitted-dup2-fix.diff        
2011-11-03 01:06:44 UTC (rev 5034)
@@ -2,15 +2,13 @@
 
 http://sources.redhat.com/ml/libc-alpha/2009-01/msg00030.html
 
-TODO: merge with t/dup3.
-
 ---
- sysdeps/mach/hurd/dup2.c |    7 +++----
+ sysdeps/mach/hurd/dup3.c |    7 +++----
  1 file changed, 3 insertions(+), 4 deletions(-)
 
---- a/sysdeps/mach/hurd/dup2.c
-+++ b/sysdeps/mach/hurd/dup2.c
-@@ -68,15 +68,14 @@
+--- a/sysdeps/mach/hurd/dup3.c
++++ b/sysdeps/mach/hurd/dup3.c
+@@ -71,15 +71,14 @@
          /* Get a hold of the destination descriptor.  */
          struct hurd_fd *d2;
  
@@ -28,7 +26,7 @@
              d2 = _hurd_alloc_fd (NULL, fd2);
              if (d2)
                __spin_unlock (&d2->port.lock);
-@@ -96,6 +95,7 @@
+@@ -99,6 +98,7 @@
                                                         MACH_PORT_NULL);
                }
            }
@@ -36,7 +34,7 @@
  
          if (d2 == NULL)
            {
-@@ -119,7 +119,6 @@
+@@ -126,7 +126,6 @@
              _hurd_port_locked_set (&d2->port, port); /* Unlocks D2.  */
            }
        }

Added: glibc-package/trunk/debian/patches/hurd-i386/tg-dup3.diff
===================================================================
--- glibc-package/trunk/debian/patches/hurd-i386/tg-dup3.diff                   
        (rev 0)
+++ glibc-package/trunk/debian/patches/hurd-i386/tg-dup3.diff   2011-11-03 
01:06:44 UTC (rev 5034)
@@ -0,0 +1,320 @@
+From: Thomas Schwinge <[email protected]>
+Subject: [PATCH] dup3
+
+2008-12-19  Thomas Schwinge  <[email protected]>
+
+       dup3 for GNU Hurd.
+       * include/unistd.h (__dup3): New hidden declaration.
+       * sysdeps/mach/hurd/dup3.c: New file, copy from dup2.c.  Evolve it to
+       implement dup3 and do some further code clean-ups.
+       * sysdeps/mach/hurd/dup2.c (__dup2): Reimplement using __dup3.
+       * sysdeps/mach/hurd/kernel-features.h (__ASSUME_DUP3): Define.
+
+---
+ sysdeps/mach/hurd/dup2.c            |  115 ++--------------------------
+ sysdeps/mach/hurd/dup3.c            |  140 +++++++++++++++++++++++++++++++++++
+ sysdeps/mach/hurd/kernel-features.h |    3 +-
+ 3 files changed, 151 insertions(+), 107 deletions(-)
+
+diff --git a/sysdeps/mach/hurd/dup2.c b/sysdeps/mach/hurd/dup2.c
+index 3abd30c..c837305 100644
+--- a/sysdeps/mach/hurd/dup2.c
++++ b/sysdeps/mach/hurd/dup2.c
+@@ -1,4 +1,6 @@
+-/* Copyright (C) 1991, 92, 93, 94, 95, 97, 2002 Free Software Foundation, Inc.
++/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1997, 2002, 2008 Free Software
++   Foundation, Inc.
++
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -16,119 +18,20 @@
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
+-#include <errno.h>
+-#include <fcntl.h>
+ #include <unistd.h>
+-#include <hurd.h>
+-#include <hurd/fd.h>
+ 
+ /* Duplicate FD to FD2, closing the old FD2 and making FD2 be
+    open on the same file as FD is.  Return FD2 or -1.  */
+ int
+-__dup2 (fd, fd2)
+-     int fd;
+-     int fd2;
++__dup2 (int fd, int fd2)
+ {
+-  struct hurd_fd *d;
+-
+-  /* Extract the ports and flags from FD.  */
+-  d = _hurd_fd_get (fd);
+-  if (d == NULL)
+-    {
+-      errno = EBADF;
+-      return -1;
+-    }
+-
+-  HURD_CRITICAL_BEGIN;
+-
+-  __spin_lock (&d->port.lock);
+-  if (d->port.port == MACH_PORT_NULL)
+-    {
+-      __spin_unlock (&d->port.lock);
+-      errno = EBADF;
+-      fd2 = -1;
+-    }
+-  else if (fd2 == fd)
+-    /* FD is valid and FD2 is already the same; just return it.  */
+-    __spin_unlock (&d->port.lock);
+-  else
+-    {
+-      struct hurd_userlink ulink, ctty_ulink;
+-      int flags = d->flags;
+-      io_t ctty = _hurd_port_get (&d->ctty, &ctty_ulink);
+-      io_t port = _hurd_port_locked_get (&d->port, &ulink); /* Unlocks D.  */
+-
+-      if (fd2 < 0)
+-      {
+-        errno = EBADF;
+-        fd2 = -1;
+-      }
+-      else
+-      {
+-        /* Get a hold of the destination descriptor.  */
+-        struct hurd_fd *d2;
+-
+-        if (fd2 >= _hurd_dtablesize)
+-          {
+-            /* The table is not large enough to hold the destination
+-               descriptor.  Enlarge it as necessary to allocate this
+-               descriptor.  */
+-            __mutex_unlock (&_hurd_dtable_lock);
+-            /* We still hold FD1's lock, but this is safe because
+-               _hurd_alloc_fd will only examine the cells starting
+-               at FD2.  */
+-            d2 = _hurd_alloc_fd (NULL, fd2);
+-            if (d2)
+-              __spin_unlock (&d2->port.lock);
+-            __mutex_lock (&_hurd_dtable_lock);
+-          }
+-        else
+-          {
+-            d2 = _hurd_dtable[fd2];
+-            if (d2 == NULL)
+-              {
+-                /* Must allocate a new one.  We don't initialize the port
+-                   cells with this call so that if it fails (out of
+-                   memory), we will not have already added user
+-                   references for the ports, which we would then have to
+-                   deallocate.  */
+-                d2 = _hurd_dtable[fd2] = _hurd_new_fd (MACH_PORT_NULL,
+-                                                       MACH_PORT_NULL);
+-              }
+-          }
+-
+-        if (d2 == NULL)
+-          {
+-            fd2 = -1;
+-            if (errno == EINVAL)
+-              errno = EBADF;  /* POSIX.1-1990 6.2.1.2 ll 54-55.  */
+-          }
+-        else
+-          {
+-            /* Give the ports each a user ref for the new descriptor.  */
+-            __mach_port_mod_refs (__mach_task_self (), port,
+-                                  MACH_PORT_RIGHT_SEND, 1);
+-            if (ctty != MACH_PORT_NULL)
+-              __mach_port_mod_refs (__mach_task_self (), ctty,
+-                                    MACH_PORT_RIGHT_SEND, 1);
+-
+-            /* Install the ports and flags in the new descriptor slot.  */
+-            __spin_lock (&d2->port.lock);
+-            d2->flags = flags & ~FD_CLOEXEC; /* Dup clears FD_CLOEXEC. */
+-            _hurd_port_set (&d2->ctty, ctty);
+-            _hurd_port_locked_set (&d2->port, port); /* Unlocks D2.  */
+-          }
+-      }
+-      __mutex_unlock (&_hurd_dtable_lock);
+-
+-      _hurd_port_free (&d->port, &ulink, port);
+-      if (ctty != MACH_PORT_NULL)
+-      _hurd_port_free (&d->ctty, &ctty_ulink, port);
+-    }
++  int flags = 0;
+ 
+-  HURD_CRITICAL_END;
++  if (fd2 == fd)
++    /* See the comment in dup3.  */
++    flags = -1;
+ 
+-  return fd2;
++  return dup3 (fd, fd2, flags);
+ }
+ libc_hidden_def (__dup2)
+ weak_alias (__dup2, dup2)
+diff --git a/sysdeps/mach/hurd/dup3.c b/sysdeps/mach/hurd/dup3.c
+new file mode 100644
+index 0000000..178ee16
+--- /dev/null
++++ b/sysdeps/mach/hurd/dup3.c
+@@ -0,0 +1,140 @@
++/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1997, 2002, 2008 Free Software
++   Foundation, Inc.
++
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++#include <errno.h>
++#include <fcntl.h>
++#include <unistd.h>
++#include <hurd.h>
++#include <hurd/fd.h>
++
++/* Duplicate FD to FD2, closing the old FD2 and making FD2 be
++   open on the same file as FD is, and setting FD2's flags according to FLAGS.
++   Return FD2 or -1.  */
++int
++dup3 (int fd, int fd2, int flags)
++{
++  struct hurd_fd *d;
++
++  /* Both passing flags different from O_CLOEXEC and FD2 being the same as FD
++     are invalid.  */
++  if ((flags & ~O_CLOEXEC
++       || fd2 == fd)
++      /* ... with the exception in case that dup2 behavior is requested: if FD
++       is valid and FD2 is already the same then just return it.  */   
++      && ! (flags == -1
++          && fd2 == fd))
++    return __hurd_fail (EINVAL);
++
++  /* Extract the ports and flags from FD.  */
++  d = _hurd_fd_get (fd);
++  if (d == NULL)
++    return __hurd_fail (EBADF);
++
++  HURD_CRITICAL_BEGIN;
++
++  __spin_lock (&d->port.lock);
++  if (d->port.port == MACH_PORT_NULL)
++    {
++      __spin_unlock (&d->port.lock);
++      fd2 = __hurd_fail (EBADF);
++    }
++  else if (fd2 == fd)
++    __spin_unlock (&d->port.lock);
++  else
++    {
++      struct hurd_userlink ulink, ctty_ulink;
++      int d_flags = d->flags;
++      io_t ctty = _hurd_port_get (&d->ctty, &ctty_ulink);
++      io_t port = _hurd_port_locked_get (&d->port, &ulink); /* Unlocks D.  */
++
++      if (fd2 < 0)
++      fd2 = __hurd_fail (EBADF);
++      else
++      {
++        /* Get a hold of the destination descriptor.  */
++        struct hurd_fd *d2;
++
++        if (fd2 >= _hurd_dtablesize)
++          {
++            /* The table is not large enough to hold the destination
++               descriptor.  Enlarge it as necessary to allocate this
++               descriptor.  */
++            __mutex_unlock (&_hurd_dtable_lock);
++            /* We still hold FD1's lock, but this is safe because
++               _hurd_alloc_fd will only examine the cells starting
++               at FD2.  */
++            d2 = _hurd_alloc_fd (NULL, fd2);
++            if (d2)
++              __spin_unlock (&d2->port.lock);
++            __mutex_lock (&_hurd_dtable_lock);
++          }
++        else
++          {
++            d2 = _hurd_dtable[fd2];
++            if (d2 == NULL)
++              {
++                /* Must allocate a new one.  We don't initialize the port
++                   cells with this call so that if it fails (out of
++                   memory), we will not have already added user
++                   references for the ports, which we would then have to
++                   deallocate.  */
++                d2 = _hurd_dtable[fd2] = _hurd_new_fd (MACH_PORT_NULL,
++                                                       MACH_PORT_NULL);
++              }
++          }
++
++        if (d2 == NULL)
++          {
++            fd2 = -1;
++            if (errno == EINVAL)
++              errno = EBADF;  /* POSIX.1-1990 6.2.1.2 ll 54-55.  */
++          }
++        else
++          {
++            /* Give the ports each a user ref for the new descriptor.  */
++            __mach_port_mod_refs (__mach_task_self (), port,
++                                  MACH_PORT_RIGHT_SEND, 1);
++            if (ctty != MACH_PORT_NULL)
++              __mach_port_mod_refs (__mach_task_self (), ctty,
++                                    MACH_PORT_RIGHT_SEND, 1);
++
++            /* Install the ports and flags in the new descriptor slot.  */
++            __spin_lock (&d2->port.lock);
++            if (flags & O_CLOEXEC)
++              d2->flags = d_flags | FD_CLOEXEC;
++            else
++              /* dup clears FD_CLOEXEC.  */
++              d2->flags = d_flags & ~FD_CLOEXEC;
++            _hurd_port_set (&d2->ctty, ctty);
++            _hurd_port_locked_set (&d2->port, port); /* Unlocks D2.  */
++          }
++      }
++      __mutex_unlock (&_hurd_dtable_lock);
++
++      _hurd_port_free (&d->port, &ulink, port);
++      if (ctty != MACH_PORT_NULL)
++      _hurd_port_free (&d->ctty, &ctty_ulink, port);
++    }
++
++  HURD_CRITICAL_END;
++
++  return fd2;
++}
++libc_hidden_def (dup3)
+diff --git a/sysdeps/mach/hurd/kernel-features.h 
b/sysdeps/mach/hurd/kernel-features.h
+index ad159aa..7eb7ea7 100644
+--- a/sysdeps/mach/hurd/kernel-features.h
++++ b/sysdeps/mach/hurd/kernel-features.h
+@@ -1,5 +1,5 @@
+ /* Set flags signalling availability of certain operating system features.
+-   Copyright (C) 2007 Free Software Foundation, Inc.
++   Copyright (C) 2007, 2011 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -29,3 +29,4 @@
+ #ifdef O_CLOEXEC
+ # define __ASSUME_O_CLOEXEC   1
+ #endif
++#define __ASSUME_DUP3         1
+-- 
+tg: (0234227..) t/dup3 (depends on: baseline)

Modified: glibc-package/trunk/debian/patches/series
===================================================================
--- glibc-package/trunk/debian/patches/series   2011-11-01 23:35:34 UTC (rev 
5033)
+++ glibc-package/trunk/debian/patches/series   2011-11-03 01:06:44 UTC (rev 
5034)
@@ -118,6 +118,7 @@
 hurd-i386/submitted-IPV6_PKTINFO.diff
 hurd-i386/tg-extern_inline.diff
 hurd-i386/submitted-critical-sections.diff
+hurd-i386/tg-dup3.diff
 hurd-i386/submitted-dup2-fix.diff
 hurd-i386/tg-check_native.diff
 hurd-i386/tg-dl-sysdep.c_SHARED.diff


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]
Archive: http://lists.debian.org/[email protected]

Reply via email to