diff options
author | Mikhail Gusarov <dottedmag@dottedmag.net> | 2009-11-08 02:33:16 +0600 |
---|---|---|
committer | Austin Foxley <austinf@cetoncorp.com> | 2009-11-09 15:24:25 -0800 |
commit | 0d1e9a17751ad7aa4ff61f3ca1f775e05eed6b60 (patch) | |
tree | 3664cfde1c16e36f2418a498b5437db7b8155c57 /libpthread/nptl/sem_open.c | |
parent | 8d74517c1619e3f688ad543717cee25d0b166a6e (diff) |
Unbreak sem_open when UCLIBC_SUSV3_LEGACY is not defined
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@dottedmag.net>
Signed-off-by: Austin Foxley <austinf@cetoncorp.com>
Diffstat (limited to 'libpthread/nptl/sem_open.c')
-rw-r--r-- | 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 3bada7d46..b7279fa78 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) |