Back to index

glibc  2.9
Defines | Functions
readdir.c File Reference
#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>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.


#define __READDIR   __readdir
#define __GETDENTS   __getdents
#define DIRENT_TYPE   struct dirent



Define Documentation

#define __GETDENTS   __getdents

Definition at line 32 of file readdir.c.

#define __READDIR   __readdir

Definition at line 31 of file readdir.c.


Definition at line 34 of file readdir.c.

#define DIRENT_TYPE   struct dirent

Definition at line 33 of file readdir.c.

Function Documentation


Definition at line 39 of file readdir.c.

  int saved_errno = errno;

#ifndef NOT_IN_libc
  __libc_lock_lock (dirp->lock);

      size_t reclen;

      if (dirp->offset >= dirp->size)
         /* We've emptied out our buffer.  Refill it.  */

         size_t maxread;
         ssize_t bytes;

         /* Fixed-size struct; must read one at a time (see below).  */
         maxread = sizeof *dp;
         maxread = dirp->allocation;

         bytes = __GETDENTS (dirp->fd, dirp->data, maxread);
         if (bytes <= 0)
             /* On some systems getdents fails with ENOENT when the
               open directory has been rmdir'd already.  POSIX.1
               requires that we treat this condition like normal EOF.  */
             if (bytes < 0 && errno == ENOENT)
              bytes = 0;

             /* Don't modifiy errno when reaching EOF.  */
             if (bytes == 0)
              __set_errno (saved_errno);
             dp = NULL;
         dirp->size = (size_t) bytes;

         /* Reset the offset into the buffer.  */
         dirp->offset = 0;

      dp = (DIRENT_TYPE *) &dirp->data[dirp->offset];

      reclen = dp->d_reclen;
      /* 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 jst one entry at a time above so we know that byte will not
        be used later.  */
      dp->d_name[sizeof dp->d_name] = '\0';

      dirp->offset += reclen;

      dirp->filepos = dp->d_off;
      dirp->filepos += reclen;

      /* Skip deleted files.  */
    } while (dp->d_ino == 0);

#ifndef NOT_IN_libc
  __libc_lock_unlock (dirp->lock);

  return dp;