|
|
1.1 root 1: #include <sys/types.h>
2: #include <sys/stat.h>
3: #ifndef SEQUENT
4: #include <ndir.h>
5: #else
6: #include <dir.h>
7: #endif
8:
9: #ifdef SEQUENT
10: #define DIRSIZE MAXNAMELEN
11: #else
12: #define DIRSIZE 14
13: #endif
14: #ifndef MAXNAMELEN
15: #define MAXNAMELEN 255
16: #endif
17: #ifndef DIRSIZ
18: #define DIRSIZ(dp) \
19: ((sizeof(struct direct) - MAXNAMLEN + (dp)->d_namlen + sizeof(ino_t) - 1) &\
20: ~(sizeof(ino_t) - 1))
21: #endif
22:
23: extern char *strncpy(), *malloc();
24:
25: DIR *
26: opendir(name)
27: register char *name;
28: {
29: DIR dirbuf, *dirp;
30: struct stat statb;
31: char buf[MAXNAMELEN+1];
32: register char *s;
33:
34: strncpy(buf, name, MAXNAMELEN);
35: buf[MAXNAMELEN-1] = 0;
36: if ((dirbuf.dd_fd = open(buf, 0)) < 0)
37: return((DIR *)0);
38: if (fstat(dirbuf.dd_fd, &statb)!=0 || (statb.st_mode & S_IFMT)!=S_IFDIR){
39: close(dirbuf.dd_fd);
40: return((DIR *)0);
41: }
42: dirbuf.dd_loc = 0;
43: dirp = (DIR *)malloc(sizeof(DIR));
44: *dirp = dirbuf;
45: return(dirp);
46: }
47:
48: void
49: closedir(dirp)
50: DIR *dirp;
51: {
52: close(dirp->dd_fd);
53: free((char *)dirp);
54: }
55:
56: /*
57: * read an old stlye directory entry and present it as a new one
58: */
59: #define ODIRSIZ 14
60:
61: struct olddirect {
62: ino_t d_ino;
63: char d_name[ODIRSIZ];
64: #ifdef CRAY
65: char d_pad[10];
66: #endif
67: };
68:
69: /*
70: * get next entry in a directory.
71: */
72: struct direct *
73: readdir(dirp)
74: register DIR *dirp;
75: {
76: register struct olddirect *dp;
77: static struct direct dir;
78:
79: for (;;) {
80: if (dirp->dd_loc == 0) {
81: dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
82: DIRBLKSIZ);
83: if (dirp->dd_size <= 0)
84: return((struct direct *)0);
85: }
86: if (dirp->dd_loc >= dirp->dd_size) {
87: dirp->dd_loc = 0;
88: continue;
89: }
90: dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
91: dirp->dd_loc += sizeof(struct olddirect);
92: if (dp->d_ino == 0)
93: continue;
94: dir.d_ino = dp->d_ino;
95: strncpy(dir.d_name, dp->d_name, ODIRSIZ);
96: dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */
97: dir.d_namlen = strlen(dir.d_name);
98: dir.d_reclen = DIRSIZ(&dir);
99: return (&dir);
100: }
101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.