Annotation of micropolis/src/tcl/compat/opendir.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

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