__getdirentries (fd, buf, nbytes, basep) int fd; char *buf; size_t nbytes; off_t *basep;
__getdirentries (int fd, char *buf, size_t nbytes, off_t *basep)
__getdirentries (fd, buf, nbytes, basep)     int fd;     char *buf;     size_t nbytes;     off_t *basep;{  off_t base = __lseek (fd, (off_t) 0, SEEK_CUR);  off_t last_offset = base;  size_t red_nbytes;  struct kernel_dirent *skdp, *kdp;  struct dirent *dp;  int retval;  const size_t size_diff = (offsetof (struct dirent, d_name)			    - offsetof (struct kernel_dirent, d_name));  red_nbytes = nbytes - ((nbytes / (offsetof (struct dirent, d_name) + 14))			 * size_diff);  dp = (struct dirent *) buf;  skdp = kdp = __alloca (red_nbytes);  retval = __getdents (fd, (char *) kdp, red_nbytes);  while ((char *) kdp < (char *) skdp + retval)    {      const size_t alignment = __alignof__ (struct dirent);      /* Since kdp->d_reclen is already aligned for the kernel structure	 this may compute a value that is bigger than necessary.  */      size_t new_reclen = ((kdp->d_reclen + size_diff + alignment - 1)			   & ~(alignment - 1));      if ((char *) dp + new_reclen > buf + nbytes)	{	  /* Our heuristic failed.  We read too many entries.  Reset	     the stream.  */	  __lseek (fd, last_offset, SEEK_SET);	  break;	}      last_offset = kdp->d_off;      dp->d_ino = kdp->d_ino;      dp->d_off = kdp->d_off;      dp->d_reclen = new_reclen;      dp->d_type = DT_UNKNOWN;      memcpy (dp->d_name, kdp->d_name,	      kdp->d_reclen - offsetof (struct kernel_dirent, d_name));      dp = (struct dirent *) ((char *) dp + new_reclen);      kdp = (struct kernel_dirent *) (((char *) kdp) + kdp->d_reclen);    }  if (basep)    *basep = base;  return (char *) dp - buf;}