Annotation of researchv10no/cmd/worm/wwrite.c, revision 1.1

1.1     ! root        1: #include       <libc.h>
        !             2: #include       <fio.h>
        !             3: #include       <sys/types.h>
        !             4: #include       <sys/stat.h>
        !             5: #include       <signal.h>
        !             6: #include       "worm.h"
        !             7: 
        !             8: main(argc, argv)
        !             9:        char **argv;
        !            10: {
        !            11:        Superblock s;
        !            12:        char *e;
        !            13:        char buf[4096];
        !            14:        int n;
        !            15:        int c;
        !            16:        char *dev = "/dev/worm0";
        !            17:        extern char *optarg;
        !            18:        extern int optind;
        !            19: 
        !            20:        argout = argv[0];
        !            21:        while((c = getopt(argc, argv, "f:")) != -1)
        !            22:                switch(c)
        !            23:                {
        !            24:                case 'f':       dev = optarg; break;
        !            25:                case '?':       usage();
        !            26:                }
        !            27: 
        !            28:        if(optind >= argc)
        !            29:                usage();
        !            30:        dev = mapdev(dev);
        !            31:        if((s.fd = open(dev, 2)) < 0){
        !            32:                perror(*argv);
        !            33:                exit(1);
        !            34:        }
        !            35:        if(e = openinode(&s, SPIN_DOWN)){
        !            36:                fprint(2, "%s: %s\n", *argv, e);
        !            37:                exit(1);
        !            38:        }
        !            39:        if(strcmp(s.vol_id, argv[optind])){
        !            40:                fprint(2, "vol_id mismatch: wanted %s, got %s\n", argv[optind], s.vol_id);
        !            41:                exit(1);
        !            42:        }
        !            43:        if(s.nfree == 0){
        !            44:                fprint(2, "%s: can't write any more!\n", dev);
        !            45:                exit(1);
        !            46:        }
        !            47:        if(s.version != VLINK){
        !            48:                fprint(2, "%s: can't write on a b-tree disk\n", s.vol_id);
        !            49:                exit(1);
        !            50:        }
        !            51:        for(n = 1; n <= NSIG; n++)
        !            52:                signal(n, SIG_IGN);
        !            53:        ininit();
        !            54:        if(++optind < argc)
        !            55:                while(optind < argc)
        !            56:                        proc(&s, argv[optind++]);
        !            57:        else
        !            58:                while(e = Frdline(0))
        !            59:                        proc(&s, e);
        !            60:        if(bad)
        !            61:                exit(1);
        !            62:        nfiles = nbytes = 0;
        !            63:        inwrite(&s, (void *)0);
        !            64:        if(bad)
        !            65:                exit(1);
        !            66:        fprint(1, "%d files, %.6fMb\n", nfiles, nbytes/1e6);
        !            67:        exit(0);
        !            68: }
        !            69: 
        !            70: usage()
        !            71: {
        !            72:        fprint(2, "Usage: worm write [-fdevice] vol_id [files]\n");
        !            73:        exit(1);
        !            74: }
        !            75: 
        !            76: proc(s, file)
        !            77:        Superblock *s;
        !            78:        char *file;
        !            79: {
        !            80:        struct stat sbuf;
        !            81:        unsigned short mode;
        !            82:        Inode i;
        !            83: 
        !            84:        memset((char *)&i, 0, sizeof(i));
        !            85:        if(stat(file, &sbuf) < 0){
        !            86:                perror(file);
        !            87:                return;
        !            88:        }
        !            89:        mode = sbuf.st_mode&S_IFMT;
        !            90:        if((mode == S_IFREG) || (mode == S_IFDIR)){
        !            91:                i.magic = DMAGIC;
        !            92:                i.block = 0;
        !            93:                i.nbytes = sbuf.st_size;
        !            94:                nbytes += i.nbytes;
        !            95:                i.ctime = sbuf.st_ctime;
        !            96:                i.name.n = file;
        !            97:                i.mode = sbuf.st_mode;
        !            98:                i.uid = sbuf.st_uid;
        !            99:                i.gid = sbuf.st_gid;
        !           100:                if(inadd(s, &i))
        !           101:                        bad = 1;
        !           102:        } else
        !           103:                fprint(2, "%s is not a file\n", file);
        !           104: }
        !           105: 
        !           106: writeout(s, i, blk)
        !           107:        Superblock *s;
        !           108:        Inode *i;
        !           109:        long *blk;
        !           110: {
        !           111:        char b[63*1024L];
        !           112:        int fd;
        !           113:        long n, len, blen;
        !           114:        char *name;
        !           115: 
        !           116:        n = (i->nbytes+s->blocksize-1)/s->blocksize;
        !           117:        *blk += n;
        !           118:        blkdone += n;
        !           119:        blen = sizeof b/s->blocksize;
        !           120:        len = blen*s->blocksize;
        !           121:        nbytes += i->nbytes;
        !           122:        nfiles++;
        !           123:        name = i->name.n;
        !           124:        if((fd = open(name, 0)) < 0)
        !           125:                goto out;
        !           126:        for(n = i->nbytes; n > len; n -= len){
        !           127:                if(read(fd, (char *)b, (int)len) != len){
        !           128:        out:
        !           129:                        perror(name);
        !           130:                        bad = 1;
        !           131:                        return;
        !           132:                }
        !           133:                if(Write(s, b, blen)){
        !           134: fprint(2, "nb=%d, n=%d len=%d blen=%d\n", i->nbytes, n, len, blen);
        !           135:                        perror("data write");
        !           136:                        exit(1);
        !           137:                }
        !           138:        }
        !           139:        if(n){
        !           140:                memset(b, 0, sizeof b);
        !           141:                if(read(fd, (char *)b, (int)n) != n)
        !           142:                        goto out;
        !           143:                n += s->blocksize-1;
        !           144:                n /= s->blocksize;
        !           145:                if(Write(s, b, n)){
        !           146:                        perror("data write");
        !           147:                        exit(1);
        !           148:                }
        !           149:        }
        !           150:        close(fd);
        !           151: }

unix.superglobalmegacorp.com

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