56 lines
918 B
C
56 lines
918 B
C
/* @(#)dir_proc.c 2.1 88/08/02 4.0 RPCSRC */
|
|
/*
|
|
* dir_proc.c: remote readdir implementation
|
|
*/
|
|
#include <rpc/rpc.h>
|
|
#include <sys/dir.h>
|
|
#include "dir.h"
|
|
|
|
extern int errno;
|
|
extern char *malloc();
|
|
extern char *strcpy();
|
|
|
|
readdir_res *
|
|
readdir_1(dirname)
|
|
nametype *dirname;
|
|
{
|
|
DIR *dirp;
|
|
struct direct *d;
|
|
namelist nl;
|
|
namelist *nlp;
|
|
static readdir_res res; /* must be static! */
|
|
|
|
/*
|
|
* Open directory
|
|
*/
|
|
dirp = opendir(*dirname);
|
|
if (dirp == NULL) {
|
|
res.errno = errno;
|
|
return (&res);
|
|
}
|
|
|
|
/*
|
|
* Free previous result
|
|
*/
|
|
xdr_free(xdr_readdir_res, &res);
|
|
|
|
/*
|
|
* Collect directory entries
|
|
*/
|
|
nlp = &res.readdir_res_u.list;
|
|
while (d = readdir(dirp)) {
|
|
nl = *nlp = (namenode *) malloc(sizeof(namenode));
|
|
nl->name = malloc(strlen(d->d_name)+1);
|
|
strcpy(nl->name, d->d_name);
|
|
nlp = &nl->next;
|
|
}
|
|
*nlp = NULL;
|
|
|
|
/*
|
|
* Return the result
|
|
*/
|
|
res.errno = 0;
|
|
closedir(dirp);
|
|
return (&res);
|
|
}
|