Annotation of 43BSDTahoe/new/news/src/ndir.c, revision 1.1.1.1

1.1       root        1: #include "defs.h"
                      2: #if !defined(BSD4_2) && !defined(BSD4_1C) && !defined(HP9K5)
                      3: #ifdef M_XENIX
                      4: #include <sys/types.h>
                      5: #endif /* M_XENIX */
                      6: #include <sys/param.h>
                      7: #include "ndir.h"
                      8: 
                      9: #ifdef SCCSID
                     10: static char    *SccsId = "@(#)ndir.c   1.12    10/15/87";
                     11: #endif /* SCCSID */
                     12: 
                     13: /*
                     14:  * support for Berkeley directory reading routine on a V7 file system
                     15:  */
                     16: 
                     17: extern char *malloc();
                     18: 
                     19: /*
                     20:  * open a directory.
                     21:  */
                     22: DIR *
                     23: opendir(name)
                     24: char *name;
                     25: {
                     26:        register DIR *dirp;
                     27:        register int fd;
                     28: 
                     29:        if ((fd = open(name, 0)) == -1)
                     30:                return NULL;
                     31:        if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) {
                     32:                close (fd);
                     33:                return NULL;
                     34:        }
                     35:        dirp->dd_fd = fd;
                     36:        dirp->dd_loc = 0;
                     37:        return dirp;
                     38: }
                     39: 
                     40: /*
                     41:  * read an old style directory entry and present it as a new one
                     42:  */
                     43: #ifdef pyr
                     44: /* Pyramid in the AT&T universe */
                     45: #define ODIRSIZ 248
                     46: struct olddirect {
                     47:        long    od_ino;
                     48:        short   od_fill1, od_fill2;
                     49:        char od_name[ODIRSIZ];
                     50: };
                     51: #else /* V7 file system */
                     52: #define        ODIRSIZ 14
                     53: 
                     54: struct olddirect {
                     55:        short   od_ino;
                     56:        char    od_name[ODIRSIZ];
                     57: };
                     58: #endif /* !pyr */
                     59: 
                     60: /*
                     61:  * get next entry in a directory.
                     62:  */
                     63: struct direct *
                     64: readdir(dirp)
                     65: register DIR *dirp;
                     66: {
                     67:        register struct olddirect *dp;
                     68:        static struct direct dir;
                     69: 
                     70:        for (;;) {
                     71:                if (dirp->dd_loc == 0) {
                     72:                        dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, 
                     73:                            DIRBLKSIZ);
                     74:                        if (dirp->dd_size <= 0)
                     75:                                return NULL;
                     76:                }
                     77:                if (dirp->dd_loc >= dirp->dd_size) {
                     78:                        dirp->dd_loc = 0;
                     79:                        continue;
                     80:                }
                     81:                dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
                     82:                dirp->dd_loc += sizeof(struct olddirect);
                     83:                if (dp->od_ino == 0)
                     84:                        continue;
                     85:                dir.d_ino = dp->od_ino;
                     86:                strncpy(dir.d_name, dp->od_name, ODIRSIZ);
                     87:                dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */
                     88:                dir.d_namlen = strlen(dir.d_name);
                     89:                dir.d_reclen = DIRSIZ(&dir);
                     90:                return (&dir);
                     91:        }
                     92: }
                     93: 
                     94: /*
                     95:  * close a directory.
                     96:  */
                     97: void
                     98: closedir(dirp)
                     99: register DIR *dirp;
                    100: {
                    101:        close(dirp->dd_fd);
                    102:        dirp->dd_fd = -1;
                    103:        dirp->dd_loc = 0;
                    104:        free((char *)dirp);
                    105: }
                    106: 
                    107: /*
                    108:  * seek to an entry in a directory.
                    109:  * Only values returned by "telldir" should be passed to seekdir.
                    110:  */
                    111: void
                    112: seekdir(dirp, loc)
                    113: register DIR *dirp;
                    114: long loc;
                    115: {
                    116:        long curloc, base, offset;
                    117:        struct direct *dp;
                    118:        long lseek(), telldir();
                    119: 
                    120:        curloc = telldir(dirp);
                    121:        if (loc == curloc)
                    122:                return;
                    123:        base = loc & ~(DIRBLKSIZ - 1);
                    124:        offset = loc & (DIRBLKSIZ - 1);
                    125:        (void) lseek(dirp->dd_fd, base, 0);
                    126:        dirp->dd_loc = 0;
                    127:        while (dirp->dd_loc < offset) {
                    128:                dp = readdir(dirp);
                    129:                if (dp == NULL)
                    130:                        return;
                    131:        }
                    132: }
                    133: 
                    134: /*
                    135:  * return a pointer into a directory
                    136:  */
                    137: long
                    138: telldir(dirp)
                    139: DIR *dirp;
                    140: {
                    141:        return lseek(dirp->dd_fd, 0L, 1) - dirp->dd_size + dirp->dd_loc;
                    142: }
                    143: #endif /* !BSD4_2 && !BSD4_1C && !HP9K5 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.