[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: