11905Swollman/* @(#)dir_proc.c	2.1 88/08/02 4.0 RPCSRC */
21905Swollman/*
31905Swollman * dir_proc.c: remote readdir implementation
41905Swollman */
51905Swollman#include <rpc/rpc.h>
61905Swollman#include <sys/dir.h>
71905Swollman#include "dir.h"
81905Swollman
91905Swollmanextern int errno;
101905Swollmanextern char *malloc();
111905Swollmanextern char *strcpy();
121905Swollman
131905Swollmanreaddir_res *
141905Swollmanreaddir_1(dirname)
151905Swollman	nametype *dirname;
161905Swollman{
171905Swollman	DIR *dirp;
181905Swollman	struct direct *d;
191905Swollman	namelist nl;
201905Swollman	namelist *nlp;
211905Swollman	static readdir_res res; /* must be static! */
228875Srgrimes
231905Swollman	/*
241905Swollman	 * Open directory
251905Swollman	 */
261905Swollman	dirp = opendir(*dirname);
271905Swollman	if (dirp == NULL) {
281905Swollman		res.errno = errno;
291905Swollman		return (&res);
301905Swollman	}
311905Swollman
321905Swollman	/*
331905Swollman	 * Free previous result
341905Swollman	 */
351905Swollman	xdr_free(xdr_readdir_res, &res);
361905Swollman
371905Swollman	/*
381905Swollman	 * Collect directory entries
391905Swollman	 */
401905Swollman	nlp = &res.readdir_res_u.list;
411905Swollman	while (d = readdir(dirp)) {
421905Swollman		nl = *nlp = (namenode *) malloc(sizeof(namenode));
431905Swollman		nl->name = malloc(strlen(d->d_name)+1);
441905Swollman		strcpy(nl->name, d->d_name);
451905Swollman		nlp = &nl->next;
461905Swollman	}
471905Swollman	*nlp = NULL;
481905Swollman
491905Swollman	/*
501905Swollman	 * Return the result
511905Swollman	 */
521905Swollman	res.errno = 0;
531905Swollman	closedir(dirp);
541905Swollman	return (&res);
551905Swollman}
56