|
|
1.1 root 1: /* @(#)dirdmp.c 1.2 90/01/03 NFS Rev 2 Testsuite
2: * 1.2 Lachman ONC Test Suite source
3: */
4:
5: #include <sys/param.h>
6: #ifndef major
7: #include <sys/types.h>
8: #endif
9: #ifdef SVR3
10: #include <dirent.h>
11: #else
12: #include <sys/dir.h>
13: #endif
14: #include <stdio.h>
15: #include <ctype.h>
16:
17: main(argc, argv)
18: int argc;
19: char *argv[];
20: {
21: argv++;
22: argc--;
23: while (argc--) {
24: print(*argv++);
25: }
26: }
27:
28: print(dir)
29: char *dir;
30: {
31: DIR *dirp;
32: #ifdef SVR3
33: struct dirent *dp;
34: #else
35: struct direct *dp;
36: #endif
37: int rec = 0;
38:
39: dirp = opendir(dir);
40: if (dirp == NULL) {
41: perror(dir);
42: return;
43: }
44: while ((dp = readdir(dirp)) != NULL) ;
45: closedir(dirp);
46: }
47:
48: #include <sys/stat.h>
49:
50: /*
51: * open a directory.
52: */
53: DIR *
54: opendir(name)
55: char *name;
56: {
57: register DIR *dirp;
58: register int fd;
59: struct stat sb;
60: extern char *malloc();
61:
62: if ((fd = open(name, 0)) == -1) {
63: printf("open failed\n");
64: return (NULL);
65: }
66: if (fstat(fd, &sb) == -1) {
67: printf("stat failed\n");
68: return (NULL);
69: }
70: /*
71: if ((sb.st_mode & S_IFMT) != S_IFDIR) {
72: printf("not a directory\n");
73: return (NULL);
74: }
75: */
76: printf("%s mode %o dir %o\n", name, sb.st_mode, S_IFDIR);
77: if (((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) ||
78: #ifdef SVR3
79: ((dirp->dd_buf = malloc(DIRBUF)) == NULL)) {
80: #else
81: ((dirp->dd_buf = malloc((int)sb.st_blksize)) == NULL)) {
82: #endif
83: if (dirp) {
84: if (dirp->dd_buf) {
85: free(dirp->dd_buf);
86: }
87: free(dirp);
88: }
89: close(fd);
90: return (NULL);
91: }
92: #ifndef SVR3
93: dirp->dd_bsize = sb.st_blksize;
94: dirp->dd_bbase = 0;
95: dirp->dd_entno = 0;
96: #endif
97: dirp->dd_fd = fd;
98: dirp->dd_loc = 0;
99: return (dirp);
100: }
101:
102: /*
103: * get next entry in a directory.
104: */
105: #ifdef SVR3
106: struct dirent *
107: #else
108: struct direct *
109: #endif
110: readdir(dirp)
111: register DIR *dirp;
112: {
113: #ifdef SVR3
114: register struct dirent *dp;
115: #else
116: register struct direct *dp;
117: #endif
118:
119: for (;;) {
120: if (dirp->dd_loc == 0) {
121: #ifdef SVR3
122: dirp->dd_size = getdents(dirp->dd_fd,
123: dirp->dd_buf, DIRBUF);
124: #else
125: dirp->dd_size = getdirentries(dirp->dd_fd,
126: dirp->dd_buf, dirp->dd_bsize, &dirp->dd_bbase);
127: #endif
128: if (dirp->dd_size <= 0) {
129: printf("EOF\n");
130: return (NULL);
131: }
132: #ifndef SVR3
133: dirp->dd_entno = 0;
134: #endif
135: }
136: if (dirp->dd_loc >= dirp->dd_size) {
137: printf("EOB offset %d\n", tell(dirp->dd_fd));
138: dirp->dd_loc = 0;
139: continue;
140: }
141: #ifdef SVR3
142: dp = (struct dirent *)(dirp->dd_buf + dirp->dd_loc);
143: #else
144: dp = (struct direct *)(dirp->dd_buf + dirp->dd_loc);
145: #endif
146: if (dp->d_reclen <= 0) {
147: printf("0 reclen\n");
148: return (NULL);
149: }
150: dirp->dd_loc += dp->d_reclen;
151: #ifndef SVR3
152: dirp->dd_entno++;
153: #endif
154: #ifdef SVR3
155: printf("%5d %5ld %5d %s\n",
156: dirp->dd_loc, dp->d_ino, dp->d_reclen,
157: dp->d_name);
158: #else
159: printf("%5d %5d %5d %5d %s\n",
160: dirp->dd_loc, dp->d_fileno, dp->d_reclen,
161: dp->d_namlen, dp->d_name);
162: #endif
163: #ifdef SVR3
164: if (dp->d_ino == 0) {
165: #else
166: if (dp->d_fileno == 0) {
167: #endif
168: continue;
169: }
170: return (dp);
171: }
172: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.