Annotation of lucent/sys/src/9/port/devsrv.c, revision 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: 
        !             8: #include       "devtab.h"
        !             9: 
        !            10: typedef struct Srv Srv;
        !            11: struct Srv
        !            12: {
        !            13:        char    name[NAMELEN];
        !            14:        char    owner[NAMELEN];
        !            15:        ulong   perm;
        !            16:        Chan    *chan;
        !            17:        Srv     *link;
        !            18:        ulong   path;
        !            19: };
        !            20: 
        !            21: static QLock   srvlk;
        !            22: static Srv     *srv;
        !            23: static int     path;
        !            24: 
        !            25: int
        !            26: srvgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp)
        !            27: {
        !            28:        Srv *sp;
        !            29: 
        !            30:        USED(tab);
        !            31:        USED(ntab);
        !            32:        qlock(&srvlk);
        !            33:        for(sp = srv; sp && s; sp = sp->link)
        !            34:                s--;
        !            35: 
        !            36:        if(sp == 0) {
        !            37:                qunlock(&srvlk);
        !            38:                return -1;
        !            39:        }
        !            40:        devdir(c, (Qid){sp->path, 0}, sp->name, 0, sp->owner, sp->perm, dp);
        !            41:        qunlock(&srvlk);
        !            42:        return 1;
        !            43: }
        !            44: 
        !            45: void
        !            46: srvinit(void)
        !            47: {
        !            48:        path = 1;
        !            49: }
        !            50: 
        !            51: void
        !            52: srvreset(void)
        !            53: {
        !            54: }
        !            55: 
        !            56: Chan*
        !            57: srvattach(char *spec)
        !            58: {
        !            59:        return devattach('s', spec);
        !            60: }
        !            61: 
        !            62: Chan*
        !            63: srvclone(Chan *c, Chan *nc)
        !            64: {
        !            65:        return devclone(c, nc);
        !            66: }
        !            67: 
        !            68: int
        !            69: srvwalk(Chan *c, char *name)
        !            70: {
        !            71:        return devwalk(c, name, 0, 0, srvgen);
        !            72: }
        !            73: 
        !            74: void
        !            75: srvstat(Chan *c, char *db)
        !            76: {
        !            77:        devstat(c, db, 0, 0, srvgen);
        !            78: }
        !            79: 
        !            80: Chan*
        !            81: srvopen(Chan *c, int omode)
        !            82: {
        !            83:        Srv *sp;
        !            84: 
        !            85:        if(c->qid.path == CHDIR){
        !            86:                if(omode != OREAD)
        !            87:                        error(Eisdir);
        !            88:                c->mode = omode;
        !            89:                c->flag |= COPEN;
        !            90:                c->offset = 0;
        !            91:                return c;
        !            92:        }
        !            93:        qlock(&srvlk);
        !            94:        if(waserror()){
        !            95:                qunlock(&srvlk);
        !            96:                nexterror();
        !            97:        }
        !            98: 
        !            99:        for(sp = srv; sp; sp = sp->link)
        !           100:                if(sp->path == c->qid.path)
        !           101:                        break;
        !           102: 
        !           103:        if(sp == 0 || sp->chan == 0)
        !           104:                error(Eshutdown);
        !           105: 
        !           106:        if(omode&OTRUNC)
        !           107:                error(Eperm);
        !           108:        if(omode!=sp->chan->mode && sp->chan->mode!=ORDWR)
        !           109:                error(Eperm);
        !           110: 
        !           111:        close(c);
        !           112:        incref(sp->chan);
        !           113:        qunlock(&srvlk);
        !           114:        poperror();
        !           115:        return sp->chan;
        !           116: }
        !           117: 
        !           118: void
        !           119: srvcreate(Chan *c, char *name, int omode, ulong perm)
        !           120: {
        !           121:        Srv *sp;
        !           122: 
        !           123:        if(omode != OWRITE)
        !           124:                error(Eperm);
        !           125: 
        !           126:        sp = malloc(sizeof(Srv));
        !           127:        if(sp == 0)
        !           128:                error(Enomem);
        !           129: 
        !           130:        qlock(&srvlk);
        !           131:        if(waserror()){
        !           132:                qunlock(&srvlk);
        !           133:                nexterror();
        !           134:        }
        !           135:        sp->path = path++;
        !           136:        sp->link = srv;
        !           137:        c->qid.path = sp->path;
        !           138:        srv = sp;
        !           139:        qunlock(&srvlk);
        !           140:        poperror();
        !           141: 
        !           142:        strncpy(sp->name, name, NAMELEN);
        !           143:        strncpy(sp->owner, u->p->user, NAMELEN);
        !           144:        sp->perm = perm&0777;
        !           145: 
        !           146:        c->flag |= COPEN;
        !           147:        c->mode = OWRITE;
        !           148: }
        !           149: 
        !           150: void
        !           151: srvremove(Chan *c)
        !           152: {
        !           153:        Srv *sp, **l;
        !           154: 
        !           155:        if(c->qid.path == CHDIR)
        !           156:                error(Eperm);
        !           157: 
        !           158:        qlock(&srvlk);
        !           159:        if(waserror()){
        !           160:                qunlock(&srvlk);
        !           161:                nexterror();
        !           162:        }
        !           163:        l = &srv;
        !           164:        for(sp = *l; sp; sp = sp->link) {
        !           165:                if(sp->path == c->qid.path)
        !           166:                        break;
        !           167: 
        !           168:                l = &sp->link;
        !           169:        }
        !           170:        if(sp == 0)
        !           171:                error(Enonexist);
        !           172: 
        !           173:        if(strcmp(sp->name, "boot") == 0)
        !           174:                error(Eperm);
        !           175: 
        !           176:        *l = sp->link;
        !           177:        qunlock(&srvlk);
        !           178:        poperror();
        !           179: 
        !           180:        if(sp->chan)
        !           181:                close(sp->chan);
        !           182:        free(sp);
        !           183: }
        !           184: 
        !           185: void
        !           186: srvwstat(Chan *c, char *dp)
        !           187: {
        !           188:        USED(c, dp);
        !           189:        error(Egreg);
        !           190: }
        !           191: 
        !           192: void
        !           193: srvclose(Chan *c)
        !           194: {
        !           195:        USED(c);
        !           196: }
        !           197: 
        !           198: long
        !           199: srvread(Chan *c, void *va, long n, ulong offset)
        !           200: {
        !           201:        USED(offset);
        !           202:        isdir(c);
        !           203:        return devdirread(c, va, n, 0, 0, srvgen);
        !           204: }
        !           205: 
        !           206: long
        !           207: srvwrite(Chan *c, void *va, long n, ulong offset)
        !           208: {
        !           209:        Srv *sp;
        !           210:        Chan *c1;
        !           211:        int fd;
        !           212:        char buf[32];
        !           213: 
        !           214:        USED(offset);
        !           215:        if(n >= sizeof buf)
        !           216:                error(Egreg);
        !           217:        memmove(buf, va, n);    /* so we can NUL-terminate */
        !           218:        buf[n] = 0;
        !           219:        fd = strtoul(buf, 0, 0);
        !           220: 
        !           221:        c1 = fdtochan(fd, -1, 0, 1);    /* error check only */
        !           222: 
        !           223:        qlock(&srvlk);
        !           224:        if(waserror()) {
        !           225:                qunlock(&srvlk);
        !           226:                close(c1);
        !           227:                nexterror();
        !           228:        }
        !           229:        for(sp = srv; sp; sp = sp->link)
        !           230:                if(sp->path == c->qid.path)
        !           231:                        break;
        !           232: 
        !           233:        if(sp == 0)
        !           234:                error(Enonexist);
        !           235: 
        !           236:        if(sp->chan)
        !           237:                panic("srvwrite");
        !           238: 
        !           239:        sp->chan = c1;
        !           240:        qunlock(&srvlk);
        !           241:        poperror();
        !           242:        return n;
        !           243: }

unix.superglobalmegacorp.com

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