|
|
1.1 root 1: /*
2: * read a directory, with the directory library routines
3: * bsd version: readdir header and structure have different names
4: *
5: * fill the buffer with directory entries of the form
6: * nnnn tab filename NUL
7: * nnnn is the i-number, in decimal ascii
8: *
9: * return the number of bytes used in the buffer, or 0 (EOF) or -1 (error)
10: * leave *offp set to something we'll want to use next time.
11: */
12:
13: #include <rf.h>
14: #include "zarf.h"
15: #include <sys/types.h> /* for pointless u_long and friends */
16: #include <sys/dir.h>
17: #define dirent direct
18:
19: /*
20: * our private context
21: */
22: #define MAXDIRS 128
23: typedef struct {
24: Rfile *f;
25: DIR *dfile;
26: } Dirfile;
27: static Dirfile dirfiles[MAXDIRS];
28: static Dirfile *ftod();
29:
30: dodirread(f, buf, size, off, offp)
31: Rfile *f;
32: char *buf;
33: register int size;
34: long off;
35: long *offp;
36: {
37: extern int errno;
38: static char tbuf[MAXNAMLEN+1+20]; /* room for NUL and some digits */
39: register struct dirent *dp;
40: register Dirfile *dirf;
41: register int n;
42: register char *p;
43:
44: dirf = ftod(f);
45: if (dirf == NULL) {
46: fserrno = RFEINVAL;
47: return (-1);
48: }
49: if (dirf->f == NULL) {
50: if ((dirf->dfile = opendir(fsp(f)->name)) == NULL) {
51: fserrno = errno; /* hope it's correct */
52: return (-1);
53: }
54: dirf->f = f;
55: }
56: seekdir(dirf->dfile, off);
57: p = buf;
58: for (;;) {
59: if ((dp = readdir(dirf->dfile)) == NULL)
60: break;
61: sprintf(tbuf, "%d\t%s", dp->d_ino, dp->d_name);
62: n = strlen(tbuf) + 1;
63: if (size < n)
64: break;
65: strcpy(p, tbuf);
66: p += n;
67: size -= n;
68: off = telldir(dirf->dfile);
69: }
70: if (dp != NULL && p == buf) { /* no room for anything */
71: fserrno = RFENOSPC;
72: return (-1);
73: }
74: *offp = off;
75: return (p - buf);
76: }
77:
78: static Dirfile *
79: ftod(f)
80: register Rfile *f;
81: {
82: register Dirfile *dirf;
83: register Dirfile *empty;
84:
85: empty = NULL;
86: for (dirf = dirfiles; dirf < &dirfiles[MAXDIRS]; dirf++) {
87: if (dirf->f == f)
88: return (dirf);
89: if (empty == NULL && dirf->f == NULL)
90: empty = dirf;
91: }
92: return (empty);
93: }
94:
95: dodircleanup(f)
96: Rfile *f;
97: {
98: register Dirfile *dirf;
99:
100: if ((dirf = ftod(f)) == NULL || dirf->f == NULL)
101: return;
102: closedir(dirf->dfile);
103: dirf->f = NULL;
104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.