]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - share/examples/sunrpc/dir/dir_proc.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / share / examples / sunrpc / dir / dir_proc.c
1 /* @(#)dir_proc.c       2.1 88/08/02 4.0 RPCSRC */
2 /*
3  * dir_proc.c: remote readdir implementation
4  */
5 #include <rpc/rpc.h>
6 #include <sys/dir.h>
7 #include "dir.h"
8
9 extern int errno;
10 extern char *malloc();
11 extern char *strcpy();
12
13 readdir_res *
14 readdir_1(dirname)
15         nametype *dirname;
16 {
17         DIR *dirp;
18         struct direct *d;
19         namelist nl;
20         namelist *nlp;
21         static readdir_res res; /* must be static! */
22
23         /*
24          * Open directory
25          */
26         dirp = opendir(*dirname);
27         if (dirp == NULL) {
28                 res.errno = errno;
29                 return (&res);
30         }
31
32         /*
33          * Free previous result
34          */
35         xdr_free(xdr_readdir_res, &res);
36
37         /*
38          * Collect directory entries
39          */
40         nlp = &res.readdir_res_u.list;
41         while (d = readdir(dirp)) {
42                 nl = *nlp = (namenode *) malloc(sizeof(namenode));
43                 nl->name = malloc(strlen(d->d_name)+1);
44                 strcpy(nl->name, d->d_name);
45                 nlp = &nl->next;
46         }
47         *nlp = NULL;
48
49         /*
50          * Return the result
51          */
52         res.errno = 0;
53         closedir(dirp);
54         return (&res);
55 }