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