/*
 * readdir.c: opendir/readdir/closedir
 */

#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/dirent.h>
#include <stdio.h>

#define __IO_DIR_DEFINED
struct _IO_dir {
  int fd;
  size_t bytes_left;
  struct dirent *next;
  /* Declaring this as an array of struct enforces correct alignment */
  struct dirent buffer[15];	/* 15 times max dirent size =~ 4K */
};

#include <dirent.h>

DIR *opendir(const char *name)
{
  DIR *dp = malloc(sizeof(DIR));

  if ( !dp )
    return NULL;

  dp->fd = open(name, O_DIRECTORY|O_RDONLY);

  if ( dp->fd < 0 ) {
    free(dp);
    return NULL;
  }

  dp->bytes_left = 0;

  return dp;
}

struct dirent *readdir(DIR *dir)
{
  struct dirent *dent;
  int rv;
  
  if ( !dir->bytes_left ) {
    rv = getdents(dir->fd, dir->buffer, sizeof(dir->buffer));
    if ( rv <= 0 )
      return NULL;
    dir->bytes_left = rv;
    dir->next = dir->buffer;
  }

  dent = dir->next;
  dir->next = (struct dirent *)((char *)dir->next + dent->d_reclen);
  dir->bytes_left -= dent->d_reclen;
  
  return dent;
}

int closedir(DIR *dir)
{
  int rv;
  rv = close(dir->fd);
  free(dir);
  return rv;
}
