Annotation of researchv10no/cmd/worm/wpoke.c, revision 1.1.1.1

1.1       root        1: #include       <libc.h>
                      2: #include       "worm.h"
                      3: 
                      4: main(argc, argv)
                      5:        char **argv;
                      6: {
                      7:        Superblock s;
                      8:        char *e, *vol_id = 0;
                      9:        char *dev = "/dev/worm0";
                     10:        int c;
                     11:        long nf = 0;
                     12:        int vflag = 0;
                     13:        Superblock ss;
                     14:        extern char *optarg;
                     15:        extern int optind;
                     16:        extern long atol();
                     17: 
                     18:        while((c = getopt(argc, argv, "vF:f:")) != -1)
                     19:                switch(c)
                     20:                {
                     21:                case 'f':       dev = optarg; break;
                     22:                case 'F':       nf = atol(optarg); break;
                     23:                case 'v':       vflag = 1; break;
                     24:                case '?':       usage();
                     25:                }
                     26:        if(optind < argc){
                     27:                vol_id = argv[optind++];
                     28:                if(optind != argc)
                     29:                        usage();
                     30:        }
                     31:        dev = mapdev(dev);
                     32:        if((s.fd = open(dev, 0)) < 0){
                     33:                perror(dev);
                     34:                exit(2);
                     35:        }
                     36:        if(read(s.fd, &ss, sizeof ss) != sizeof ss){
                     37:                if(errno == ENXIO)
                     38:                        print("unwritten block zero\n");
                     39:                else
                     40:                        perror("block zero");
                     41:        } else {
                     42:                if(ss.magic == SMAGIC){
                     43:                        print("appears to be a good superblock at zero\n");
                     44:                        exit(0);
                     45:                } else if(ss.magic == 0){
                     46:                        print("appears to be a zero'ed block at zero.\n");
                     47:                } else
                     48:                        print("ignoring bogus block at zero\n");
                     49:        }
                     50:        vlink(s.fd, 1);
                     51:        exit(0);
                     52: }
                     53: 
                     54: usage()
                     55: {
                     56:        print("Usage: worm poke [-v] [-fdevice] [-Fnfree] [vol_id]\n");
                     57:        exit(2);
                     58: }
                     59: 
                     60: vlink(fd, blk)
                     61: {
                     62:        Superblock s;
                     63:        int i, n;
                     64: 
                     65:        while(blk < 1650000){
                     66: loop:
                     67: print("reading sb at %d\n", blk);
                     68:                bigseek(fd, blk, 1024, 0);
                     69:                if(read(fd, &s, sizeof s) == sizeof s){
                     70:                        if(s.magic == SMAGIC){
                     71:                                blk = s.nextsb;
                     72:                                continue;
                     73:                        }
                     74:                        print("apparent garbage at supposed superblock@%ld\n", blk);
                     75:                } else {
                     76:                        print("bad read at blk %ld, errno=%d\n", blk, errno);
                     77:                        lseek(fd, 1024, 1);
                     78:                        blk++;
                     79:                }
                     80:                for(i = 0; i < 50; i++){
                     81:                        n = read(fd, &s, sizeof s);
                     82:                        if(n < 0){
                     83:                                lseek(fd, 1024, 1);
                     84:                                continue;
                     85:                        }
                     86:                        if((n == sizeof s) && (s.magic == SMAGIC)){
                     87:                                blk += i;
                     88:                                print("after error, skipped %d blocks to apparent superblock at %ld\n", i, blk);
                     89:                                goto loop;
                     90:                        }
                     91:                }
                     92:                print("after error, no superblock after %d tries\n", i);
                     93:                blk += i;
                     94:        }
                     95: }

unix.superglobalmegacorp.com

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