about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--sysdeps/mach/hurd/readdir_r.c12
2 files changed, 15 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 1e674044d4..56b534a3e2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2001-01-06  Mark Kettenis  <kettenis@gnu.org>
 
+	* sysdeps/mach/hurd/readdir_r.c (__readdir_r): Return error number
+	instead of -1 on failure.  Don't forget to copy file name into
+	*ENTRY if successful.  Set *RESULT to NULL upon reaching the end
+	of the directory.
+
+2001-01-06  Mark Kettenis  <kettenis@gnu.org>
+
 	* sysdeps/mach/hurd/xstatconv.c (xstat64_conv): Don't forget to
 	copy st_atime member.
 
diff --git a/sysdeps/mach/hurd/readdir_r.c b/sysdeps/mach/hurd/readdir_r.c
index c8b8e4bc59..dad4a31d99 100644
--- a/sysdeps/mach/hurd/readdir_r.c
+++ b/sysdeps/mach/hurd/readdir_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 94, 95, 96, 1997, 2001 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
@@ -33,11 +33,12 @@ int
 __readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result)
 {
   struct dirent *dp;
+  error_t err = 0;
 
   if (dirp == NULL)
     {
       errno = EINVAL;
-      return -1;
+      return errno;
     }
 
   __libc_lock_lock (dirp->__lock);
@@ -50,7 +51,6 @@ __readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result)
 
 	  char *data = dirp->__data;
 	  int nentries;
-	  error_t err;
 
 	  if (err = HURD_FD_PORT_USE (dirp->__fd,
 				      __dir_readdir (port,
@@ -102,11 +102,15 @@ __readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result)
   if (dp)
     {
       *entry = *dp;
+      memcpy (entry->d_name, dp->d_name, dp->d_namlen + 1);
       *result = entry;
     }
+  else
+    *result = NULL;
 
   __libc_lock_unlock (dirp->__lock);
 
-  return dp ? 0 : -1;
+  return dp ? 0 : err ? errno : 0;
 }
+
 weak_alias (__readdir_r, readdir_r)