|
|
1.1 ! root 1: /* ! 2: * opendir.c -- ! 3: * ! 4: * This file provides dirent-style directory-reading procedures ! 5: * for V7 Unix systems that don't have such procedures. The ! 6: * origin of this code is unclear, but it seems to have come ! 7: * originally from Larry Wall. ! 8: * ! 9: */ ! 10: ! 11: #include <tclint.h> ! 12: #include <tclunix.h> ! 13: ! 14: #undef DIRSIZ ! 15: #define DIRSIZ(dp) \ ! 16: ((sizeof (struct dirent) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3)) ! 17: ! 18: /* ! 19: * open a directory. ! 20: */ ! 21: DIR * ! 22: opendir(name) ! 23: char *name; ! 24: { ! 25: register DIR *dirp; ! 26: register int fd; ! 27: char *myname; ! 28: ! 29: myname = ((*name == '\0') ? "." : name); ! 30: if ((fd = open(myname, 0, 0)) == -1) ! 31: return NULL; ! 32: if ((dirp = (DIR *)ckalloc(sizeof(DIR))) == NULL) { ! 33: close (fd); ! 34: return NULL; ! 35: } ! 36: dirp->dd_fd = fd; ! 37: dirp->dd_loc = 0; ! 38: return dirp; ! 39: } ! 40: ! 41: /* ! 42: * read an old style directory entry and present it as a new one ! 43: */ ! 44: #ifndef pyr ! 45: #define ODIRSIZ 14 ! 46: ! 47: struct olddirect { ! 48: ino_t od_ino; ! 49: char od_name[ODIRSIZ]; ! 50: }; ! 51: #else /* a Pyramid in the ATT universe */ ! 52: #define ODIRSIZ 248 ! 53: ! 54: struct olddirect { ! 55: long od_ino; ! 56: short od_fill1, od_fill2; ! 57: char od_name[ODIRSIZ]; ! 58: }; ! 59: #endif ! 60: ! 61: /* ! 62: * get next entry in a directory. ! 63: */ ! 64: struct dirent * ! 65: readdir(dirp) ! 66: register DIR *dirp; ! 67: { ! 68: register struct olddirect *dp; ! 69: static struct dirent dir; ! 70: ! 71: for (;;) { ! 72: if (dirp->dd_loc == 0) { ! 73: dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, ! 74: DIRBLKSIZ); ! 75: if (dirp->dd_size <= 0) ! 76: return NULL; ! 77: } ! 78: if (dirp->dd_loc >= dirp->dd_size) { ! 79: dirp->dd_loc = 0; ! 80: continue; ! 81: } ! 82: dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc); ! 83: dirp->dd_loc += sizeof(struct olddirect); ! 84: if (dp->od_ino == 0) ! 85: continue; ! 86: dir.d_ino = dp->od_ino; ! 87: strncpy(dir.d_name, dp->od_name, ODIRSIZ); ! 88: dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */ ! 89: dir.d_namlen = strlen(dir.d_name); ! 90: dir.d_reclen = DIRSIZ(&dir); ! 91: return (&dir); ! 92: } ! 93: } ! 94: ! 95: /* ! 96: * close a directory. ! 97: */ ! 98: void ! 99: closedir(dirp) ! 100: register DIR *dirp; ! 101: { ! 102: close(dirp->dd_fd); ! 103: dirp->dd_fd = -1; ! 104: dirp->dd_loc = 0; ! 105: ckfree((char *) dirp); ! 106: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.