Annotation of researchv10no/netfs/serv/libdir.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * read a directory, with the directory library routines
                      3:  *
                      4:  * fill the buffer with directory entries of the form
                      5:  *     nnnn tab filename NUL
                      6:  * nnnn is the i-number, in decimal ascii
                      7:  *
                      8:  * return the number of bytes used in the buffer, or 0 (EOF) or -1 (error)
                      9:  * leave *offp set to something we'll want to use next time.
                     10:  */
                     11: 
                     12: #include <rf.h>
                     13: #include "zarf.h"
                     14: #include <sys/types.h>
                     15: #include <dirent.h>
                     16: 
                     17: #define        NULL    0
                     18: 
                     19: /*
                     20:  * our private context
                     21:  */
                     22: #define        MAXDIRS 128
                     23: typedef struct {
                     24:        Rfile *f;
                     25:        DIR *dfile;
                     26: } Dirfile;
                     27: static Dirfile dirfiles[MAXDIRS];
                     28: static Dirfile *ftod();
                     29: 
                     30: dodirread(f, buf, size, off, offp)
                     31: Rfile *f;
                     32: char *buf;
                     33: register int size;
                     34: long off;
                     35: long *offp;
                     36: {
                     37:        extern int errno;
                     38:        static char tbuf[MAXNAMLEN+1+20];       /* room for NUL and some digits */
                     39:        register struct dirent *dp;
                     40:        register Dirfile *dirf;
                     41:        register int n;
                     42:        register char *p;
                     43: 
                     44:        dirf = ftod(f);
                     45:        if (dirf == NULL) {
                     46:                fserrno = RFEINVAL;
                     47:                return (-1);
                     48:        }
                     49:        if (dirf->f == NULL) {
                     50:                if ((dirf->dfile = opendir(fsp(f)->name)) == NULL) {
                     51:                        fserrno = errno;        /* hope it's correct */
                     52:                        return (-1);
                     53:                }
                     54:                dirf->f = f;
                     55:        }
                     56:        seekdir(dirf->dfile, off);
                     57:        p = buf;
                     58:        for (;;) {
                     59:                if ((dp = readdir(dirf->dfile)) == NULL)
                     60:                        break;
                     61:                sprintf(tbuf, "%d\t%s", dp->d_ino, dp->d_name);
                     62:                n = strlen(tbuf) + 1;
                     63:                if (size < n)
                     64:                        break;
                     65:                strcpy(p, tbuf);
                     66:                p += n;
                     67:                size -= n;
                     68:                off = telldir(dirf->dfile);
                     69:        }
                     70:        if (dp != NULL && p == buf) {   /* no room for anything */
                     71:                fserrno = RFENOSPC;
                     72:                return (-1);
                     73:        }
                     74:        *offp = off;
                     75:        return (p - buf);
                     76: }
                     77: 
                     78: static Dirfile *
                     79: ftod(f)
                     80: register Rfile *f;
                     81: {
                     82:        register Dirfile *dirf;
                     83:        register Dirfile *empty;
                     84: 
                     85:        empty = NULL;
                     86:        for (dirf = dirfiles; dirf < &dirfiles[MAXDIRS]; dirf++) {
                     87:                if (dirf->f == f)
                     88:                        return (dirf);
                     89:                if (empty == NULL && dirf->f == NULL)
                     90:                        empty = dirf;
                     91:        }
                     92:        return (empty);
                     93: }
                     94: 
                     95: dodircleanup(f)
                     96: Rfile *f;
                     97: {
                     98:        register Dirfile *dirf;
                     99: 
                    100:        if ((dirf = ftod(f)) == NULL || dirf->f == NULL)
                    101:                return;
                    102:        closedir(dirf->dfile);
                    103:        dirf->f = NULL;
                    104: }

unix.superglobalmegacorp.com

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