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

1.1     ! root        1: #include       <libc.h>
        !             2: #include       <fio.h>
        !             3: #include       "sym.h"
        !             4: #include       "worm.h"
        !             5: #include       <sys/types.h>
        !             6: #include       <sys/stat.h>
        !             7: 
        !             8: char *prefix = "";
        !             9: int dflag = 0;
        !            10: int quiet = 0;
        !            11: int mflag = 0;
        !            12: 
        !            13: main(argc, argv)
        !            14:        char **argv;
        !            15: {
        !            16:        Superblock s;
        !            17:        char *e;
        !            18:        int c;
        !            19:        char *dev = "/dev/worm0";
        !            20:        extern char *optarg;
        !            21:        extern int optind;
        !            22: 
        !            23:        while((c = getopt(argc, argv, "dmf:p:s")) != -1)
        !            24:                switch(c)
        !            25:                {
        !            26:                case 'd':       dflag = 1; break;
        !            27:                case 'f':       dev = optarg; break;
        !            28:                case 'm':       mflag = 1; break;
        !            29:                case 'p':       prefix = optarg; break;
        !            30:                case 's':       quiet = 1; break;
        !            31:                case '?':       usage();
        !            32:                }
        !            33:        if(optind >= argc)
        !            34:                usage();
        !            35:        dev = mapdev(dev);
        !            36:        if((s.fd = open(dev, 0)) < 0){
        !            37:                perror(dev);
        !            38:                exit(1);
        !            39:        }
        !            40:        if(e = openinode(&s, DO_INODE|SPIN_DOWN)){
        !            41:                fprint(2, "%s: %s\n", dev, e);
        !            42:                exit(1);
        !            43:        }
        !            44:        if(strcmp(s.vol_id, argv[optind])){
        !            45:                fprint(2, "vol_id mismatch: wanted %s, got %s\n", argv[optind], s.vol_id);
        !            46:                exit(1);
        !            47:        }
        !            48:        optind++;
        !            49:        c = 0;
        !            50:        if(optind >= argc){
        !            51:                while(e = Frdline(0))
        !            52:                        if(pr(&s, e))
        !            53:                                c = 1;
        !            54:        } else {
        !            55:                while(optind < argc)
        !            56:                        if(pr(&s, argv[optind++]))
        !            57:                                c = 1;
        !            58:        }
        !            59:        exit(c);
        !            60: }
        !            61: 
        !            62: usage()
        !            63: {
        !            64:        fprint(2, "Usage: worm read [-fdevice] [-pprefix] [-dm] vol_id [files ...]\n");
        !            65:        exit(1);
        !            66: }
        !            67: 
        !            68: pr(s, name)
        !            69:        Superblock *s;
        !            70:        char *name;
        !            71: {
        !            72:        register Inode *i;
        !            73:        char b[63*1024L];
        !            74:        register long len, n;
        !            75:        long nb;
        !            76:        int fd;
        !            77:        char buf[4096];
        !            78: 
        !            79:        if((i = inodeof(name)) == 0){
        !            80:                fprint(2, "%s not found\n", name);
        !            81:                return(1);
        !            82:        }
        !            83:        sprint(buf, "%s%s", prefix, name);
        !            84:        name = buf;
        !            85:        if((fd = create(name, i->mode, i->uid, i->gid, i->ctime)) < 0){
        !            86:                if(dflag){
        !            87:                        createdirs(name);
        !            88:                        fd = create(name, i->mode, i->uid, i->gid, i->ctime);
        !            89:                }
        !            90:                if(fd < 0){
        !            91:                        perror(name);
        !            92:                        if(errno == ENOSPC)
        !            93:                                exit(1);
        !            94:                        return(1);
        !            95:                }
        !            96:        }
        !            97:        if(fd == 0)     /* a directory */
        !            98:                return(0);
        !            99:        nb = sizeof b / s->blocksize;
        !           100:        Seek(s, i->block);
        !           101:        for(n = i->nbytes, len = nb*s->blocksize; n > 0;){
        !           102:                if(len > n){
        !           103:                        len = n;
        !           104:                        nb = (len+s->blocksize-1)/s->blocksize;
        !           105:                }
        !           106:                if(Read(s, b, nb)){
        !           107:                        fprint(2, "while writing %s: ", name);
        !           108:                        perror("read");
        !           109:                        exit(1);
        !           110:                }
        !           111:                if(write(fd, b, (int)len) != len){
        !           112:                        fprint(2, "while writing %s: ", name);
        !           113:                        perror("write");
        !           114:                        exit(1);
        !           115:                }
        !           116:                n -= len;
        !           117:        }
        !           118:        close(fd);
        !           119:        if(mflag){
        !           120:                time_t tp[2];
        !           121: 
        !           122:                tp[0] = tp[1] = i->ctime;
        !           123:                utime(name, tp);
        !           124:        }
        !           125:        return(0);
        !           126: }
        !           127: 
        !           128: createdirs(s)
        !           129:        char *s;
        !           130: {
        !           131:        char *ls, *ss;
        !           132: 
        !           133:        for(ls = s; *ls == '/'; ls++)
        !           134:                ;
        !           135:        for(; *ls && (ss = strchr(ls, '/')); ls = ss+1){
        !           136:                *ss = 0;
        !           137:                if(access(s, 0) < 0){
        !           138:                        if(mkdir(s, 0777) < 0){
        !           139:                                perror(s);
        !           140:                                return;
        !           141:                        } else if(!quiet)
        !           142:                                fprint(2, "created %s\n", s);
        !           143:                }
        !           144:                *ss = '/';
        !           145:        }
        !           146: }
        !           147: 
        !           148: create(name, mode, uid, gid, t)
        !           149:        char *name;
        !           150:        time_t t;
        !           151: {
        !           152:        time_t tp[2];
        !           153: 
        !           154:        tp[0] = tp[1] = t;
        !           155:        if((mode&S_IFMT) == S_IFDIR){
        !           156:                if(access(name, 0) >= 0){
        !           157:                        if(chmod(name, mode) < 0){
        !           158:                                perror(name);
        !           159:                                return(-1);
        !           160:                        }
        !           161:                } else {
        !           162:                        if(mkdir(name, mode) < 0){
        !           163:                                perror(name);
        !           164:                                return(-1);
        !           165:                        }
        !           166:                }
        !           167:                chown(name, uid, gid);
        !           168:                utime(name, tp);
        !           169:                return(0);
        !           170:        } else {
        !           171:                int fd;
        !           172: 
        !           173:                if((fd = creat(name, mode)) >= 0){
        !           174:                        chown(name, uid, gid);
        !           175:                        utime(name, tp);
        !           176:                }
        !           177:                return(fd);
        !           178:        }
        !           179: }

unix.superglobalmegacorp.com

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