shithub: npe

ref: fd731d3c833d9241fdff618b6c949453fb5c0f31
dir: /dirent.c/

View raw version
#include <dirent.h>

struct DIR {
	Dir *d;
	struct dirent de;
	int fd;
	long n; /* number of entries in d */
	long i; /* current entry to return from readdir */
};

struct dirent *
readdir(DIR *d)
{
	if(d->i >= d->n){
		free(d->d);
		if((d->n = dirread(d->fd, &d->d)) <= 0)
			return nil;
		d->i = 0;
	}

	d->de.d_type = (d->d[d->i].qid.type & QTDIR) ? DT_DIR : DT_FILE;
	d->de.d_name = d->d[d->i].name;
	d->i++;

	return &d->de;
}

DIR *
opendir(char *name)
{
	Dir *dir;
	DIR *d;
	int fd;

	dir = nil;
	d = nil;
	if((fd = open(name, OREAD|OCEXEC)) >= 0 &&
	    (dir = dirfstat(fd)) != nil &&
	    (dir->qid.type & QTDIR) != 0 &&
	    (d = calloc(1, sizeof(*d))) != nil){
		d->fd = fd;
	}

	free(dir);
	if(d == nil)
		close(fd);

	return d;
}

int
closedir(DIR *d)
{
	free(d->d);
	close(d->fd);
	free(d);

	return 0;
}