update from main archive 961001
authordrepper <drepper>
Wed, 2 Oct 1996 01:39:21 +0000 (01:39 +0000)
committerdrepper <drepper>
Wed, 2 Oct 1996 01:39:21 +0000 (01:39 +0000)
sysdeps/stub/chflags.c
sysdeps/stub/fchflags.c
sysdeps/stub/sstk.c
sysdeps/unix/Makefile
sysdeps/unix/alpha/sysdep.S
sysdeps/unix/readdir.c
sysdeps/unix/readdir_r.c [new file with mode: 0644]

index 9380108..18100ca 100644 (file)
@@ -21,6 +21,9 @@ Cambridge, MA 02139, USA.  */
 #include <sys/stat.h>
 
 /* Change the flags of FILE to FLAGS.  */
+
+int chflags __P ((const char *file, int flags));
+
 int
 chflags (file, flags)
      const char *file;
index 4f59ad3..21a66e8 100644 (file)
@@ -21,6 +21,9 @@ Cambridge, MA 02139, USA.  */
 #include <sys/stat.h>
 
 /* Change the flags of the file FD refers to to FLAGS.  */
+
+int fchflags __P ((int fd, int flags));
+
 int
 fchflags (fd, flags)
      int fd;
index d748673..aa1bfb2 100644 (file)
@@ -20,6 +20,9 @@ Cambridge, MA 02139, USA.  */
 
 /* Increase the size of the stack by INCREMENT,
    and return the address of the bottom of the stack.  */
+
+void *sstk __P ((int increment));
+
 void *
 sstk (increment)
      int increment;
index d3cc46a..78eecd5 100644 (file)
@@ -302,7 +302,8 @@ ifndef no_deps
 endif
 endif
 
-$(common-objpfx)s-proto.d: $(..)sysdeps/unix/s-proto.S $(before-compile)
+$(common-objpfx)s-proto.d: $(common-objpfx)%.d: $(..)sysdeps/unix/%.S \
+                          $(before-compile)
        $(+make-deps)
 
 endif
index 8d70bda..08dc3b4 100644 (file)
@@ -27,6 +27,8 @@ errno:        .space 4
        .type errno, @object
        .size errno, 4
 #endif
+       .globl __errno
+__errno = errno
 
        .text
        .align 2
@@ -44,7 +46,10 @@ __syscall_error:
        .mask   0x4000001, -16
        .prologue 1
 
-       /* Find our pre-thread errno address  */
+       /* Store into the "real" variable.  */
+       stl     v0, errno
+
+       /* Find our per-thread errno address  */
        jsr     ra, __errno_location
 
        /* Store the error value.  */
index 491469b..97956ec 100644 (file)
@@ -34,12 +34,6 @@ __readdir (DIR *dirp)
 {
   struct dirent *dp;
 
-  if (dirp == NULL || dirp->data == NULL)
-    {
-      __set_errno (EINVAL);
-      return NULL;
-    }
-
   __libc_lock_lock (dirp->lock);
 
   do
diff --git a/sysdeps/unix/readdir_r.c b/sysdeps/unix/readdir_r.c
new file mode 100644 (file)
index 0000000..ef75c36
--- /dev/null
@@ -0,0 +1,108 @@
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 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 Library General Public License as
+published by the Free Software Foundation; either version 2 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <errno.h>
+#include <limits.h>
+#include <stddef.h>
+#include <string.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <assert.h>
+
+#include <dirstream.h>
+
+
+/* Read a directory entry from DIRP.  */
+int
+__readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result)
+{
+  struct dirent *dp;
+
+  __libc_lock_lock (dirp->lock);
+
+  do
+    {
+      size_t reclen;
+
+      if (dirp->offset >= dirp->size)
+       {
+         /* We've emptied out our buffer.  Refill it.  */
+
+         size_t maxread;
+         off_t base;
+         ssize_t bytes;
+
+#ifndef _DIRENT_HAVE_D_RECLEN
+         /* Fixed-size struct; must read one at a time (see below).  */
+         maxread = sizeof *dp;
+#else
+         maxread = dirp->allocation;
+#endif
+
+         base = dirp->filepos;
+         bytes = __getdirentries (dirp->fd, dirp->data, maxread, &base);
+         if (bytes <= 0)
+           {
+             dp = NULL;
+             break;
+           }
+         dirp->size = (size_t) bytes;
+
+         /* Reset the offset into the buffer.  */
+         dirp->offset = 0;
+       }
+
+      dp = (struct dirent *) &dirp->data[dirp->offset];
+
+#ifdef _DIRENT_HAVE_D_RECLEN
+      reclen = dp->d_reclen;
+#else
+      /* The only version of `struct dirent' that lacks `d_reclen'
+        is fixed-size.  */
+      assert (sizeof dp->d_name > 1);
+      reclen = sizeof *dp;
+      /* The name is not terminated if it is the largest possible size.
+        Clobber the following byte to ensure proper null termination.  We
+        read just one entry at a time above so we know that byte will not
+        be used later.  */
+      dp->d_name[sizeof dp->d_name] = '\0';
+#endif
+
+      dirp->offset += reclen;
+
+#ifdef _DIRENT_HAVE_D_OFF
+      dirp->filepos = dp->d_off;
+#else
+      dirp->filepos += reclen;
+#endif
+
+      /* Skip deleted files.  */
+    } while (dp->d_ino == 0);
+
+  if (dp != NULL)
+    {
+      *entry = *dp;
+      *result = entry;
+    }
+
+  __libc_lock_unlock (dirp->lock);
+
+  return dp != NULL ? 0 : -1;
+}
+weak_alias (__readdir_r, readdir_r)