summary refs log tree commit diff
path: root/sysdeps/unix/readdir.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-07-09 14:49:13 +0000
committerRoland McGrath <roland@gnu.org>1996-07-09 14:49:13 +0000
commitc150923988933b5db75a974d4cc08cd7f7aaf3dc (patch)
tree93cbfeaafc3d720b353e4012a5a54c69a7fec55d /sysdeps/unix/readdir.c
parent089b2b8ad8bac143a3820e6c9b60f7c505ca8b49 (diff)
downloadglibc-c150923988933b5db75a974d4cc08cd7f7aaf3dc.tar.gz
glibc-c150923988933b5db75a974d4cc08cd7f7aaf3dc.tar.xz
glibc-c150923988933b5db75a974d4cc08cd7f7aaf3dc.zip
Tue Jul 9 09:37:55 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
	* sysdeps/mach/libc-lock.h: New file.
	* sysdeps/unix/readdir.c: Do locking.
	* sysdeps/unix/seekdir.c: Likewise.
	* sysdeps/unix/rewinddir.c:  Likewise.
	* sysdeps/unix/closedir.c: Likewise.
	* sysdeps/unix/bsd/telldir.c: Likewise.
	* sysdeps/mach/hurd/seekdir.c: Likewise.
	* sysdeps/mach/hurd/readdir.c: Likewise.
	* sysdeps/mach/hurd/closedir.c: Likewise.
	* sysdeps/mach/hurd/opendir.c: Initialize the lock.
	* sysdeps/unix/opendir.c: Likewise.
	* sysdeps/mach/hurd/dirstream.h: Include <libc-lock.h>.
	(struct __dirstream): Add lock member using __libc_lock_define.
	* sysdeps/unix/dirstream.h: Likewise.

	* sysdeps/stub/libc-lock.h (__libc_lock_fini): New macro.

	* stdlib/mbstowcs.c: Pass address of pointer to mbsrtowcs.

	* stdlib/wcstombs.c: Use wcsrtombs instead of mbsrtowcs.

Thu Jul  4 01:34:04 1996  Ulrich Drepper  <drepper@cygnus.com>

	* locale/programs/stringtrans.c: Fix typo in copyright.

	* stdio-common/printf-prs.c: Add casts to prevent
        signed<->unsigned warnings.

	* stdio-common/printf-parse.h: Initialize state variable before
	calling mbrlen.
	* stdio-common/printf-prs.c: Don't initialize state variable here.
	* stdio-common/vfprintf.c: Don't initialize state variable.
	(vfprintf): While determining length of multibyte string don't
	try to be clever in determining characters to use for first
	call.

	Add real implementation of multibyte<->wide char conversion
	functions.  The functions always convert between the fixed wide
	char format (ISO 10646 in UCS4) and the UTF8 representation of
	this character set.  Conversion between the currently used
	8bit character set and ISO 10646 will not take place.  This is
	what iconv() is for.
	* wcsmbs/wchar.h (mbstate_t): Define as structure to replace
	dummy definition.
	Add optimized version of `mbrlen' function.
	* wcsmbs/btowc.c (btowc): Restrict range of legal characters
	to 0...0x7f.
	* wcsmbs/wctob.c (wctob): Restrict range of legal characters
	to 0..0x7f.
	* wcsmbs/mbrlen.c: Make mbrlen a weak alias of __mbrlen.
	This is needed in the wchar.h header.
	* wcsmbs/mbrtowc.c: Replace dummy implementation.  Convert UTF8
	encoded character to UCS4.
	* wcsmbs/mbsinit.c: Replace dummy implementation.  Test COUNT
	element of `mbstate_t' for initial state.
	* wcsmbs/mbsrtowcs.c: Replace dummy implementation.  Convert UTF8
	encoded string to UCS4 string.
	* wcsmbs/wcrtomb.c: Replace dummy implementation.  Convert UCS4
	character to UTF8 encoded form.
	* wcsmbs/wcsrtombs.c: Replace dummy implementation.  Convert UCS4
	encoded string to UTF8 encoded form.
Diffstat (limited to 'sysdeps/unix/readdir.c')
-rw-r--r--sysdeps/unix/readdir.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/sysdeps/unix/readdir.c b/sysdeps/unix/readdir.c
index 00446a2d2b..5d0c40fdc1 100644
--- a/sysdeps/unix/readdir.c
+++ b/sysdeps/unix/readdir.c
@@ -40,6 +40,8 @@ readdir (DIR *dirp)
       return NULL;
     }
 
+  __libc_lock_lock (dirp->lock);
+
   do
     {
       size_t reclen;
@@ -62,7 +64,10 @@ readdir (DIR *dirp)
 	  base = dirp->filepos;
 	  bytes = __getdirentries (dirp->fd, dirp->data, maxread, &base);
 	  if (bytes <= 0)
-	    return NULL;
+	    {
+	      dp = NULL;
+	      break;
+	    }
 	  dirp->size = (size_t) bytes;
 
 	  /* Reset the offset into the buffer.  */
@@ -96,5 +101,7 @@ readdir (DIR *dirp)
       /* Skip deleted files.  */
     } while (dp->d_ino == 0);
 
+  __libc_lock_unlock (dirp->lock);
+
   return dp;
 }