Annotation of researchv9/libc/gen/opendir.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1982 Regents of the University of California, who write
                      2:        lousy code */
                      3: /* and modified by pjw in 1986 */
                      4: 
                      5: #include <sys/types.h>
                      6: #include <sys/stat.h>
                      7: #include "ndir.h"
                      8: 
                      9: /*
                     10:  * open a directory.
                     11:  */
                     12: DIR *
                     13: opendir(name)
                     14: char *name;
                     15: {      int i;
                     16:        register DIR *dirp;
                     17:        register char *p;
                     18: 
                     19:        dirp = (DIR *)malloc(sizeof(DIR));
                     20:        if(!dirp)
                     21:                return(0);
                     22:        dirp->dd_fd = open(name, 0);
                     23:        if (dirp->dd_fd == -1) {
                     24:                free(dirp);
                     25:                return(0);
                     26:        }
                     27:        dirp->dd_loc = 0;
                     28:        i = read(dirp->dd_fd, dirp->dd_buf, DIRBLKSIZ);
                     29:        if(i <= 0) {
                     30:                close(dirp->dd_fd);
                     31:                free(dirp);
                     32:                return(0);
                     33:        }
                     34:        lseek(dirp->dd_fd, 0L, 0);
                     35: /* the cray and the 68000 are big-endians, vax is not
                     36:   v9:  ??.0000000000000??..000000000000|||||||||
                     37:   cray:        ????????.00000000000000000000000????????..0000000000000000000000|||||||
                     38:   68k: ????0X01.000????0X02..00||||||||        X=12
                     39:   vaxn:        ????X010.000????X020..00|||||||
                     40:        /* shortest cray sys v dir is 64 bytes, shortest v8 is 32, and shortest
                     41:         * sun 4.2(68k) is 24 (except it's supposed to be a whole block long)
                     42:         */
                     43:        if(i < 24)      /* mysteriously short directory */
                     44:                goto old;
                     45:        p = dirp->dd_buf;
                     46:        if(p[8] != '.') {
                     47: old:
                     48:                dirp->dd_type = TOLD;
                     49:                return(dirp);
                     50:        }
                     51:        if(p[20] == '.' && p[21] == '.') {      /* bsd-like or bogus */
                     52:                if(p[4] == 0 && p[5] == 12) {
                     53:                        dirp->dd_type = TSUN;
                     54:                        return(dirp);
                     55:                }
                     56:                if(p[4] == 12 && p[5] == 0) {
                     57:                        dirp->dd_type = TBSD;
                     58:                        return(dirp);
                     59:                }
                     60:                dirp->dd_type = TUNK;
                     61:                return(dirp);
                     62:        }
                     63:        if(i >= 32 && p[9] == 0 && p[40] == '.' && p[41] == '.' && p[42] == 0) {
                     64:                dirp->dd_type = TCRAY;
                     65:                return(dirp);
                     66:        }
                     67:        dirp->dd_type = TUNK;
                     68:        return(dirp);
                     69: }

unix.superglobalmegacorp.com

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