Annotation of researchv10dc/libc/gen/tmp/pdirread.c, revision 1.1.1.1

1.1       root        1: /* simulate new system call */
                      2: /* output is up to cnt bytes (up to some max)
                      3:  * each directory entry gets a string which is
                      4:  * the ascii representation of the inode number, a tab, and the
                      5:  * zero-terminated file name.  these zero-terminated strings are packed together
                      6:  * This implementation freely returns short reads.  End of directory
                      7:  * is a 0 length read, -1 and ENOSPC indicate that cnt couldn't hold
                      8:  * even the next entry
                      9:  */
                     10: #include "sys/types.h"
                     11: #include "sys/dir.h"
                     12: #include "errno.h"
                     13: 
                     14: char mb[4096], ncnv[23];
                     15: pdirread(fd, buf, cnt)
                     16: char *buf;
                     17: {      int n, m, j, loc;
                     18:        char *p, *lp;
                     19:        struct direct *d;
                     20: 
                     21:        loc = lseek(fd, 0, 1);
                     22:        n = read(fd, mb, sizeof(mb));
                     23:        if(n <= 0)
                     24:                return(n);
                     25:        lp = p = buf;
                     26:        d = (struct direct *) mb;
                     27: loop:
                     28:        if(d->d_ino == 0)
                     29:                goto incr;
                     30:        for(m = d->d_ino, j = 22; m; j--) {
                     31:                ncnv[j] = m % 10 + '0';
                     32:                m /= 10;
                     33:        }
                     34:        for(++j; j < 23 && p < buf + cnt; )
                     35:                *p++ = ncnv[j++];
                     36:        if(j != 23 || p >= buf + cnt)
                     37:                goto early;
                     38:        *p++ = '\t';
                     39:        for(j = 0; d->d_name[j] && j < DIRSIZ && p < buf + cnt; j++)
                     40:                *p++ = d->d_name[j];
                     41:        if(p >= buf + cnt)
                     42:                goto early;
                     43:        *p++ = 0;
                     44: incr:
                     45:        lp = p;
                     46:        n -= sizeof(*d);
                     47:        d++;
                     48:        if(lp < buf + cnt && n > 0)
                     49:                goto loop;
                     50: done:
                     51:        lseek(fd, loc + (char *)d - mb, 0);
                     52:        return(lp - buf);
                     53: early:
                     54:        *lp = 0;
                     55:        if((char *)d != mb)
                     56:                goto done;
                     57:        errno = ENOSPC;
                     58:        return(-1);
                     59: }

unix.superglobalmegacorp.com

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