|
|
1.1 ! root 1: /* Copyright (c) 1982 Regents of the University of California */ ! 2: /* and modified by pjw in 1986 */ ! 3: #include <sys/types.h> ! 4: #include "ndir.h" ! 5: ! 6: /* ! 7: * read any style directory entry and present it as a bsd one ! 8: */ ! 9: /* classical unix */ ! 10: #define ODIRSIZ 14 ! 11: struct olddirect { ! 12: ino_t d_ino; ! 13: char d_name[ODIRSIZ]; ! 14: }; ! 15: /* current cray */ ! 16: #define CDIRSIZ 24 ! 17: struct craydirect { ! 18: long x; ! 19: long d_ino; ! 20: char d_name[CDIRSIZ]; ! 21: }; ! 22: ! 23: /* ! 24: * get next entry in a directory. ! 25: */ ! 26: struct direct * ! 27: readdir(dirp) ! 28: register DIR *dirp; ! 29: { ! 30: register struct olddirect *dp; ! 31: register struct craydirect *cp; ! 32: register struct direct *np; ! 33: static struct direct dir; ! 34: ! 35: loop: ! 36: if (dirp->dd_loc == 0) { ! 37: dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, ! 38: DIRBLKSIZ); ! 39: if (dirp->dd_size <= 0) ! 40: return NULL; ! 41: } ! 42: if (dirp->dd_loc >= dirp->dd_size) { ! 43: dirp->dd_loc = 0; ! 44: goto loop; ! 45: } ! 46: switch(dirp->dd_type) { ! 47: case TCRAY: ! 48: cp = (struct craydirect *) (dirp->dd_buf + dirp->dd_loc); ! 49: dirp->dd_loc += sizeof(struct craydirect); ! 50: if(cp->d_ino == 0) ! 51: goto loop; ! 52: strncpy(dir.d_name, cp->d_name, CDIRSIZ); ! 53: dir.d_name[CDIRSIZ] = 0; ! 54: dir.d_ino = (ino_t) dir_rev4(cp->d_ino); ! 55: break; ! 56: default: ! 57: case TUNK: ! 58: return(0); ! 59: case TOLD: ! 60: dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc); ! 61: dirp->dd_loc += sizeof(struct olddirect); ! 62: if (dp->d_ino == 0) ! 63: goto loop; ! 64: dir.d_ino = (ino_t) dp->d_ino; ! 65: strncpy(dir.d_name, dp->d_name, ODIRSIZ); ! 66: dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */ ! 67: break; ! 68: case TSUN: ! 69: np = (struct direct *)(dirp->dd_buf + dirp->dd_loc); ! 70: dirp->dd_loc += dir_rev2(np->d_reclen); ! 71: if(np->d_ino == 0) ! 72: goto loop; ! 73: dir.d_ino = (ino_t) dir_rev4(np->d_ino); ! 74: strcpy(dir.d_name, np->d_name); ! 75: break; ! 76: case TBSD: ! 77: np = (struct direct *)(dirp->dd_buf + dirp->dd_loc); ! 78: dirp->dd_loc += np->d_reclen; ! 79: if(np->d_ino == 0) ! 80: goto loop; ! 81: dir.d_ino = (ino_t) np->d_ino; ! 82: strcpy(dir.d_name, np->d_name); ! 83: break; ! 84: } ! 85: dir.d_namlen = strlen(dir.d_name); ! 86: dir.d_reclen = DIRSIZ(&dir); ! 87: return (&dir); ! 88: } ! 89: ! 90: dir_rev2(n) ! 91: { union { ! 92: short x; ! 93: unsigned char b[2]; ! 94: } u; ! 95: u.b[1] = n & 0xff; ! 96: u.b[0] = (n >> 8) & 0xff; ! 97: return(u.x); ! 98: } ! 99: ! 100: dir_rev4(n) ! 101: { union { ! 102: long x; ! 103: unsigned char b[4]; ! 104: } u; ! 105: u.b[3] = n & 0xff; ! 106: u.b[2] = (n >> 8) & 0xff; ! 107: u.b[1] = (n >> 16) & 0xff; ! 108: u.b[0] = (n >> 24) & 0xff; ! 109: return(u.x); ! 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.