Annotation of researchv10no/libc/gen/readdir.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1982 Regents of the University of California */
                      2: /* and modified by pjw in 1986 and 1987, dmg in 1989 */
                      3: 
                      4: #include <sys/types.h> /* only for ino_t */
                      5: #include "ndir.h"
                      6: #include <ctype.h>
                      7: 
                      8: /*
                      9:  * get next entry in a directory.
                     10:  *
                     11:  * subtlety:
                     12:  * ino_t is still a 16-bit type,
                     13:  * but i-numbers returned by dirread or pdirread may be larger.
                     14:  * stat returns an ino_t in st_ino.
                     15:  * d_ino is a long.
                     16:  * if d_ino has 32 significant bits, programs like pwd may fail.
                     17:  * if it is truncated to 16, information is lost.
                     18:  * it would be helpful to fix stat, but it wouldn't be a magic cure;
                     19:  * the i-number from dirread may have more than 32 bits!
                     20:  * truncate for now, via dir.d_ino = (ino_t) ...
                     21:  *
                     22:  * most of the tedious code below is error checking
                     23:  */
                     24: struct direct *
                     25: readdir(dirp)
                     26: register DIR *dirp;
                     27: {
                     28:        static struct direct dir;
                     29:        register char *p;
                     30:        register int i;
                     31: 
                     32: loop:
                     33:        if (dirp->dd_size <= 0 || dirp->dd_loc >= dirp->dd_size) {
                     34:                dirp->dd_offset++;      /* see seekdir.c */
                     35:                dirp->dd_size = dirread(dirp->dd_fd, dirp->dd_buf, DIRBLKSIZ-1);
                     36:                if(dirp->dd_size < 0)
                     37:                        dirp->dd_size = pdirread(dirp->dd_fd, dirp->dd_buf,
                     38:                                DIRBLKSIZ-1);
                     39:                if(dirp->dd_size <= 0)
                     40:                        return(0);
                     41:                dirp->dd_loc = 0;
                     42:                dirp->dd_buf[dirp->dd_size] = 0;        /* sentinel */
                     43:        }
                     44:        p = dirp->dd_buf + dirp->dd_loc;
                     45:        dir.d_ino = 0;
                     46:        while (isdigit(*p))
                     47:                dir.d_ino = dir.d_ino*10 + *p++ - '0';
                     48:        dir.d_ino = (ino_t)dir.d_ino;
                     49:        while (*p != '\t')      /* in case we add fields someday */
                     50:                if (*p++ == 0) {        /* badly formed */
                     51:                        dirp->dd_loc = p - dirp->dd_buf;
                     52:                        goto loop;
                     53:                }
                     54:        p++;
                     55:        for (i = 0; i < MAXNAMLEN; i++)
                     56:                if ((dir.d_name[i] = *p++) == 0)
                     57:                        break;
                     58:        if (i >= MAXNAMLEN && *p++ != 0) {      /* name too long */
                     59:                while (*p++)
                     60:                        ;
                     61:                dirp->dd_loc = p - dirp->dd_buf;
                     62:                goto loop;
                     63:        }
                     64:        dir.d_name[i] = 0;
                     65:        dir.d_namlen = i;
                     66:        dir.d_reclen = sizeof(dir);     /* bogus, but who cares? */
                     67:        dirp->dd_loc = p - dirp->dd_buf;
                     68:        if (dirp->dd_loc > dirp->dd_size)       /* hit the sentinel */
                     69:                goto loop;
                     70:        return (&dir);
                     71: }

unix.superglobalmegacorp.com

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