dir_proc.c revision 1906
152419Sjulian/* @(#)dir_proc.c	2.1 88/08/02 4.0 RPCSRC */
252419Sjulian/*
352419Sjulian * dir_proc.c: remote readdir implementation
452419Sjulian */
552419Sjulian#include <rpc/rpc.h>
652419Sjulian#include <sys/dir.h>
752419Sjulian#include "dir.h"
852419Sjulian
952419Sjulianextern int errno;
1052419Sjulianextern char *malloc();
1152419Sjulianextern char *strcpy();
1252419Sjulian
1352419Sjulianreaddir_res *
1452419Sjulianreaddir_1(dirname)
1552419Sjulian	nametype *dirname;
1652419Sjulian{
1752419Sjulian	DIR *dirp;
1852419Sjulian	struct direct *d;
1952419Sjulian	namelist nl;
2052419Sjulian	namelist *nlp;
2152419Sjulian	static readdir_res res; /* must be static! */
2252419Sjulian
2352419Sjulian	/*
2452419Sjulian	 * Open directory
2552419Sjulian	 */
2652419Sjulian	dirp = opendir(*dirname);
2752419Sjulian	if (dirp == NULL) {
2852419Sjulian		res.errno = errno;
2952419Sjulian		return (&res);
3052419Sjulian	}
3152419Sjulian
3252419Sjulian	/*
3352419Sjulian	 * Free previous result
3452419Sjulian	 */
3552419Sjulian	xdr_free(xdr_readdir_res, &res);
3652419Sjulian
3752419Sjulian	/*
3852419Sjulian	 * Collect directory entries
3952419Sjulian	 */
4052752Sjulian	nlp = &res.readdir_res_u.list;
4152419Sjulian	while (d = readdir(dirp)) {
4252419Sjulian		nl = *nlp = (namenode *) malloc(sizeof(namenode));
4352419Sjulian		nl->name = malloc(strlen(d->d_name)+1);
4452419Sjulian		strcpy(nl->name, d->d_name);
4552419Sjulian		nlp = &nl->next;
4652419Sjulian	}
4752419Sjulian	*nlp = NULL;
4852419Sjulian
4952419Sjulian	/*
5052419Sjulian	 * Return the result
5152419Sjulian	 */
5252419Sjulian	res.errno = 0;
5352419Sjulian	closedir(dirp);
5452419Sjulian	return (&res);
5552419Sjulian}
5652419Sjulian