r5034 - in glibc-package/trunk/debian: . patches patches/hurd-i386
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 <thomas@schwinge.name>
+Subject: [PATCH] dup3
+
+2008-12-19 Thomas Schwinge <tschwinge@gnu.org>
+
+ 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
Reply to: