[git commit nptl_merge] Unbreak sem_open when UCLIBC_SUSV3_LEGACY is not defined

Mikhail Gusarov dottedmag at dottedmag.net
Mon Nov 9 21:17:04 UTC 2009


commit: http://git.uclibc.org/uClibc/commit/?id=0d1e9a17751ad7aa4ff61f3ca1f775e05eed6b60
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/nptl_merge

sem_open uses mktemp to create temporary file. Reimplement it
using __gen_tmpname, removing ugly while(1) loop. As a side-effect
remove the potential source of EAGAIN errors.

Signed-off-by: Mikhail Gusarov <dottedmag at dottedmag.net>
Signed-off-by: Austin Foxley <austinf at cetoncorp.com>
---
 libpthread/nptl/sem_open.c |   37 +++++--------------------------------
 1 files changed, 5 insertions(+), 32 deletions(-)

diff --git a/libpthread/nptl/sem_open.c b/libpthread/nptl/sem_open.c
index 3bada7d..b7279fa 100644
--- a/libpthread/nptl/sem_open.c
+++ b/libpthread/nptl/sem_open.c
@@ -34,6 +34,7 @@
 #include <sys/statfs.h>
 #include <linux_fsinfo.h>
 #include "semaphoreP.h"
+#include "../../misc/internals/tempname.h"
 
 
 /* Compatibility defines. */
@@ -327,39 +328,11 @@ sem_open (const char *name, int oflag, ...)
 
       tmpfname = (char *) alloca (mountpoint.dirlen + 6 + 1);
       char *xxxxxx = mempcpy (tmpfname, mountpoint.dir, mountpoint.dirlen);
+      strcpy (xxxxxx, "XXXXXX");
 
-      int retries = 0;
-#define NRETRIES 50
-      while (1)
-	{
-	  /* Add the suffix for mktemp.  */
-	  strcpy (xxxxxx, "XXXXXX");
-
-	  /* We really want to use mktemp here.  We cannot use mkstemp
-	     since the file must be opened with a specific mode.  The
-	     mode cannot later be set since then we cannot apply the
-	     file create mask.  */
-	  if (mktemp (tmpfname) == NULL)
-	    return SEM_FAILED;
-
-	  /* Open the file.  Make sure we do not overwrite anything.  */
-	  fd = __libc_open (tmpfname, O_RDWR | O_CREAT | O_EXCL, mode);
-	  if (fd == -1)
-	    {
-	      if (errno == EEXIST)
-		{
-		  if (++retries < NRETRIES)
-		    continue;
-
-		  __set_errno (EAGAIN);
-		}
-
-	      return SEM_FAILED;
-	    }
-
-	  /* We got a file.  */
-	  break;
-	}
+      fd = __gen_tempname (tmpfname, __GT_FILE, mode);
+      if (fd == -1)
+          return SEM_FAILED;
 
       if (TEMP_FAILURE_RETRY (__libc_write (fd, &initsem, sizeof (sem_t)))
 	  == sizeof (sem_t)
-- 
1.6.3.3



More information about the uClibc-cvs mailing list