Annotation of lucent/sys/src/9/port/devroot.c, revision 1.1.1.1

1.1       root        1: #include       "u.h"
                      2: #include       "../port/lib.h"
                      3: #include       "mem.h"
                      4: #include       "dat.h"
                      5: #include       "fns.h"
                      6: #include       "../port/error.h"
                      7: #include       "devtab.h"
                      8: 
                      9: enum{
                     10:        Qdir=   0,
                     11:        Qbin,
                     12:        Qdev,
                     13:        Qenv,
                     14:        Qproc,
                     15:        Qnet,
                     16:        Qboot,          /* readable files */
                     17: 
                     18:        Nfiles=13,      /* max root files */    
                     19: };
                     20: 
                     21: extern ulong   bootlen;
                     22: extern uchar   bootcode[];
                     23: 
                     24: Dirtab rootdir[Nfiles]={
                     25:                "bin",          {Qbin|CHDIR},   0,      0777,
                     26:                "dev",          {Qdev|CHDIR},   0,      0777,
                     27:                "env",          {Qenv|CHDIR},   0,      0777,
                     28:                "proc",         {Qproc|CHDIR},  0,      0777,
                     29:                "net",          {Qnet|CHDIR},   0,      0777,
                     30: };
                     31: 
                     32: static uchar   *rootdata[Nfiles];
                     33: static int     nroot = Qboot - 1;
                     34: 
                     35: /*
                     36:  *  add a root file
                     37:  */
                     38: void
                     39: addrootfile(char *name, uchar *contents, ulong len)
                     40: {
                     41:        Dirtab *d;
                     42:        
                     43: 
                     44:        if(nroot >= Nfiles)
                     45:                panic("too many root files");
                     46:        rootdata[nroot] = contents;
                     47:        d = &rootdir[nroot];
                     48:        strcpy(d->name, name);
                     49:        d->length = len;
                     50:        d->perm = 0555;
                     51:        d->qid.path = nroot+1;
                     52:        nroot++;
                     53: }
                     54: 
                     55: void
                     56: rootreset(void)
                     57: {
                     58:        addrootfile("boot", bootcode, bootlen); /* always have a boot file */
                     59: }
                     60: 
                     61: void
                     62: rootinit(void)
                     63: {
                     64: }
                     65: 
                     66: Chan*
                     67: rootattach(char *spec)
                     68: {
                     69:        return devattach('/', spec);
                     70: }
                     71: 
                     72: Chan*
                     73: rootclone(Chan *c, Chan *nc)
                     74: {
                     75:        return devclone(c, nc);
                     76: }
                     77: 
                     78: int     
                     79: rootwalk(Chan *c, char *name)
                     80: {
                     81:        if(strcmp(name, "..") == 0) {
                     82:                c->qid.path = Qdir|CHDIR;
                     83:                return 1;
                     84:        }
                     85:        if((c->qid.path & ~CHDIR) != Qdir)
                     86:                return 0;
                     87:        return devwalk(c, name, rootdir, nroot, devgen);
                     88: }
                     89: 
                     90: void    
                     91: rootstat(Chan *c, char *dp)
                     92: {
                     93:        devstat(c, dp, rootdir, nroot, devgen);
                     94: }
                     95: 
                     96: Chan*
                     97: rootopen(Chan *c, int omode)
                     98: {
                     99:        return devopen(c, omode, rootdir, nroot, devgen);
                    100: }
                    101: 
                    102: void    
                    103: rootcreate(Chan *c, char *name, int omode, ulong perm)
                    104: {
                    105:        USED(c, name, omode, perm);
                    106:        error(Eperm);
                    107: }
                    108: 
                    109: /*
                    110:  * sysremove() knows this is a nop
                    111:  */
                    112: void    
                    113: rootclose(Chan *c)
                    114: {
                    115:        USED(c);
                    116: }
                    117: 
                    118: long    
                    119: rootread(Chan *c, void *buf, long n, ulong offset)
                    120: {
                    121:        ulong t;
                    122:        Dirtab *d;
                    123:        uchar *data;
                    124: 
                    125:        t = c->qid.path & ~CHDIR;
                    126:        if(t == Qdir)
                    127:                return devdirread(c, buf, n, rootdir, nroot, devgen);
                    128:        if(t < Qboot)
                    129:                return 0;
                    130: 
                    131:        d = &rootdir[t-1];
                    132:        data = rootdata[t-1];
                    133:        if(offset >= d->length)
                    134:                return 0;
                    135:        if(offset+n > d->length)
                    136:                n = d->length - offset;
                    137:        memmove(buf, data+offset, n);
                    138:        return n;
                    139: }
                    140: 
                    141: long    
                    142: rootwrite(Chan *c, void *buf, long n, ulong offset)
                    143: {
                    144:        USED(c, buf, n, offset);
                    145:        error(Egreg);
                    146:        return 0;       /* not reached */
                    147: }
                    148: 
                    149: void    
                    150: rootremove(Chan *c)
                    151: {
                    152:        USED(c);
                    153:        error(Eperm);
                    154: }
                    155: 
                    156: void    
                    157: rootwstat(Chan *c, char *dp)
                    158: {
                    159:        USED(c, dp);
                    160:        error(Eperm);
                    161: }

unix.superglobalmegacorp.com

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