Annotation of researchv8dc/netfs/sub.c, revision 1.1

1.1     ! root        1: #include "fserv.h"
        !             2: #include "errno.h"
        !             3: #include "sys/neta.h"
        !             4: 
        !             5: extern char *realloc();
        !             6: /* temporary static alloc of devtab */
        !             7: 
        !             8: struct tdev devtab[NDEV];
        !             9: struct stat rootstat;
        !            10: int ndev, dev;
        !            11: extern int alive;
        !            12: char *cmdnames[] = {"0?", "stat", "wrt", "read", "free", "trunc", "updat",
        !            13:        "get", "nami", "put", "10?"};
        !            14: char *buf, *nbuf;
        !            15: int buflen, nbuflen;
        !            16: 
        !            17: #define NF     100
        !            18: /* temporary static alloc of netftab */
        !            19: netf netftab[NF];
        !            20: int nnetf;
        !            21: 
        !            22: #define MASK   0x0
        !            23: 
        !            24: ourdev(n)
        !            25: {      int i;
        !            26:        for(i = 0; i < ndev; i++)
        !            27:                if(devtab[i].his == n)
        !            28:                        return(devtab[i].ours);
        !            29:        return(-1);
        !            30: }
        !            31: 
        !            32: hisdev(n)
        !            33: {      int i;
        !            34:        for(i = 0; i < ndev; i++)
        !            35:                if(devtab[i].ours == n)
        !            36:                        return(devtab[i].his);
        !            37:        return(-1);
        !            38: }
        !            39: 
        !            40: newdev(n)
        !            41: {      struct tdev *p;
        !            42:        p = devtab + ndev++;
        !            43:        p->ours = n;
        !            44:        p->his = dev++;
        !            45:        debug1("\tnewdev %d %d", p->ours, p->his);
        !            46: }
        !            47: 
        !            48: netf *
        !            49: gettag(n)
        !            50: long n;
        !            51: {      int i;
        !            52:        for(i = 0; i < nnetf; i++)
        !            53:                if(netftab[i].tag == n)
        !            54:                        return(netftab + i);
        !            55:        errno = ENOENT;
        !            56:        return(0);
        !            57: }
        !            58: 
        !            59: netf *
        !            60: getnetf(d, i)  /* either root of netfs, or in the table */
        !            61: {      int j;
        !            62:        netf *p;
        !            63:        if(i == 0) {
        !            64:                errno = ENOENT;
        !            65:                return(0);
        !            66:        }
        !            67:        for(j = 0; j < nnetf; j++)
        !            68:                if(netftab[j].ino == i && netftab[j].dev == d)
        !            69:                        return(netftab + j);
        !            70:        debug2("\tgetnetf(%d,%d)", d, i);
        !            71:        for(p = netftab, j = 0; j < nnetf; j++, p++) {
        !            72:                debug2("\t%d %d %d %s", p->tag, p->dev, p->ino, p->name?p->name:"");
        !            73:        }
        !            74:        return(0);
        !            75: }
        !            76: netf *
        !            77: oldnetf(s)     /* special case for nami/NDEL */
        !            78: char *s;
        !            79: {      netf *p;
        !            80:        struct stat stb;
        !            81:        if(xstat(s, &stb) < 0)
        !            82:                return(0);
        !            83:        if(p = getnetf(hisdev(stb.st_dev), stb.st_ino)) {
        !            84:                p->statb = stb;
        !            85:                return(p);
        !            86:        }
        !            87:        return(0);
        !            88: }
        !            89: 
        !            90: netf *
        !            91: newnetf(s, fd, how)
        !            92: char *s;
        !            93: {      int i;
        !            94:        netf *p;
        !            95:        struct stat stb;
        !            96:        if(xstat(s, &stb) < 0)
        !            97:                return(0);
        !            98:        if(p = getnetf(hisdev(stb.st_dev), stb.st_ino)) {
        !            99:                p->statb = stb;
        !           100:                return(p);
        !           101:        }
        !           102:        for(i = 0; i < nnetf; i++)
        !           103:                if(netftab[i].ino == 0)
        !           104:                        goto found;
        !           105:        i = nnetf++;
        !           106:        if(nnetf > NF) {
        !           107:                errno = ENOMEM;
        !           108:                return(0);
        !           109:        }
        !           110: found:
        !           111:        alive++;
        !           112:        p = netftab + i;
        !           113:        p->name = malloc(strlen(s) + 1);
        !           114:        strcpy(p->name, s);
        !           115:        p->statb = stb;
        !           116:        if(fd < 0) {
        !           117:                if(ftype(p) != S_IFLNK && ftype(p) != S_IFCHR && ftype(p) != S_IFBLK)
        !           118:                        p->fd = open(p->name, 0);       /* this better work */
        !           119:                else
        !           120:                        p->fd = -1;
        !           121:                p->how = 0;
        !           122:        }
        !           123:        else {
        !           124:                p->fd = fd;
        !           125:                p->how = how;
        !           126:        }
        !           127:        p->dev = hisdev(p->statb.st_dev);
        !           128:        if(p->dev == -1) {
        !           129:                newdev(p->statb.st_dev);
        !           130:                p->dev = hisdev(p->statb.st_dev);
        !           131:        }
        !           132:        p->ino = p->statb.st_ino;
        !           133:        p->tag = (p->dev << 16) ^ p->ino ^ MASK;
        !           134:        debug2("\tnew %d %d %s", p->dev, p->ino, p->name);
        !           135:        debug2("\tnew 0%o %d %d", p->statb.st_mode, p->statb.st_uid, p->statb.st_gid);
        !           136:        debug2("\tnew %d", nnetf);
        !           137:        return(p);
        !           138: }
        !           139: 
        !           140: clrnetf(n)
        !           141: {      netf *p;
        !           142:        p = gettag(n);
        !           143:        if(p == 0) {
        !           144:                debug("\tclr net got 0 (x%x)", n);
        !           145:                dumpstate();
        !           146:                leave(8);       /* shut it down */
        !           147:                return;
        !           148:        }
        !           149:        if(p->ino == 2 && p->dev == devtab[0].his)
        !           150:                return;         /* hold on to the root */
        !           151:        if(p->tag != n) {
        !           152:                debug("\tclr weird %d %d", n, p->tag);
        !           153:                errno = EIO;
        !           154:                dumpstate();
        !           155:                return;
        !           156:        }
        !           157:        debug1("\tclear %d %s", p->tag, p->name);
        !           158:        if(p->fd != -1) {
        !           159:                close(p->fd);
        !           160:                p->fd = -1;
        !           161:                p->how = 0;
        !           162:        }
        !           163:        p->tag = p->dev = p->ino = 0;
        !           164:        if(p->name)
        !           165:                free(p->name);
        !           166:        p->name = 0;
        !           167:        alive--;
        !           168: }
        !           169: 
        !           170: opennf(p, fl)  /* fl: 0-read, 1-write, 2-trunc */
        !           171: netf *p;
        !           172: {      int i;
        !           173:        if(p->fd != -1 && p->how == fl)
        !           174:                return(0);
        !           175:        if(fl == 2) {
        !           176:                errno = EPERM;
        !           177:                return(1);
        !           178:        }
        !           179:        i = open(p->name, fl);
        !           180:        if(p->fd != -1)
        !           181:                close(p->fd);
        !           182:        p->fd = i;
        !           183:        debug1("\topennf %s %d", p->name, p->fd);
        !           184:        if(p->fd == -1)
        !           185:                return(1);
        !           186:        p->how = fl;
        !           187:        return(0);
        !           188: }
        !           189: 
        !           190: truncnf(n)
        !           191: long n;
        !           192: {      netf *p;
        !           193:        int fd;
        !           194:        p = gettag(n);
        !           195:        if(p == 0) {
        !           196:                debug("\ttrunc %d", n);
        !           197:                errno = EIO;
        !           198:                dumpstate();
        !           199:                return;
        !           200:        }
        !           201:        if(p->fd != -1)
        !           202:                close(p->fd);
        !           203:        fd = creat(p->name, 0);
        !           204:        p->fd = fd;
        !           205:        p->how = 1;
        !           206: }
        !           207: 
        !           208: isroot(p)
        !           209: netf *p;
        !           210: {
        !           211:        debug2("\tisroot(dev=%d ino=%d), ourde=%d", p->dev, p->ino, ourdev(p->dev));
        !           212:        return(p->ino == rootstat.st_ino && ourdev(p->dev) == rootstat.st_dev);
        !           213: }
        !           214: 
        !           215: prcmd(x)
        !           216: struct senda *x;
        !           217: {
        !           218:        debug1("got %s %d %d %d", cmdnames[x->cmd], major(x->dev), minor(x->dev), x->ino);
        !           219: }
        !           220: 
        !           221: getbuf(n)
        !           222: {
        !           223:        if(n < buflen)
        !           224:                return;
        !           225:        if(buflen == 0)
        !           226:                buf = malloc(buflen = n);
        !           227:        else
        !           228:                buf = realloc(buf, buflen = n);
        !           229:        if(buf)
        !           230:                return;
        !           231:        debug("getbuf failed");
        !           232:        leave(6);
        !           233: }
        !           234: 
        !           235: getnbuf(n)
        !           236: long n;
        !           237: {
        !           238:        if(n < nbuflen)
        !           239:                return;
        !           240:        if(nbuflen == 0)
        !           241:                nbuf = malloc(nbuflen = n);
        !           242:        else
        !           243:                nbuf = realloc(nbuf, nbuflen = n);
        !           244:        if(nbuf)
        !           245:                return;
        !           246:        debug("nbuf failed");
        !           247:        leave(7);
        !           248: }
        !           249: /* the current name is a full path name, buf contains another component */
        !           250: fixnbuf(name, count, buf, flag)
        !           251: char *name, *buf;
        !           252: {      int i, n;
        !           253:        for(i = 0; i < count && buf[i]; i++)
        !           254:                ;
        !           255:        count = i;
        !           256:        n = strlen(name);
        !           257:        getnbuf(n + count + 2);
        !           258:        strcpy(nbuf, name);
        !           259:        if(count > 2 || flag == NLINK || flag == NDEL) {
        !           260: ok:
        !           261:                nbuf[n++] = '/';
        !           262:                for(i = 0; i < count; i++)
        !           263:                        nbuf[n++] = *buf++;
        !           264:                nbuf[n] = 0;
        !           265:                return;
        !           266:        }
        !           267:        if(count == 0)
        !           268:                return;
        !           269:        if(count == 1)
        !           270:                if(buf[0] == '.')
        !           271:                        return; /* do we know that name is a directory? */
        !           272:                else
        !           273:                        goto ok;
        !           274:        if(buf[0] != '.' || buf[1] != '.')
        !           275:                goto ok;
        !           276:        while(n > 0 && nbuf[n] != '/')
        !           277:                n--;
        !           278:        nbuf[n] = 0;
        !           279:        if(nbuf[0] != '/')
        !           280:                strcpy(nbuf, "/..");
        !           281: }

unix.superglobalmegacorp.com

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