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

1.1       root        1: #include       <libc.h>
                      2: #include       "worm.h"
                      3: #include       <sys/types.h>
                      4: #include       <sys/udaioc.h>
                      5: 
                      6: usage()
                      7: {
                      8:        fprint(2, "Usage: worm mkfs [-fdevice] [-ccomments] [-bblksize] [-nnblks] [-vnewvol_id] vol_id\n");
                      9:        fprint(2, "e.g. worm mkfs -f1 -c\"512x512x24 movies\" tdmovies1a\n");
                     10:        exit(1);
                     11: }
                     12: 
                     13: main(argc, argv)
                     14:        char **argv;
                     15: {
                     16:        Superblock s, os;
                     17:        char *b;
                     18:        long sb;
                     19:        int c;
                     20:        char *volid;
                     21:        char *dev = "/dev/worm0";
                     22:        char *nblks = 0;
                     23:        char *bsize = 0;
                     24:        char *nvolid = 0;
                     25:        char *comments = 0;
                     26:        char *e;
                     27:        int virgin;
                     28:        extern optind;
                     29:        extern char *optarg;
                     30: 
                     31:        while((c = getopt(argc, argv, "f:n:b:c:v:")) != -1)
                     32:                switch(c)
                     33:                {
                     34:                case 'b':       bsize = optarg; break;
                     35:                case 'c':       comments = optarg; break;
                     36:                case 'f':       dev = optarg; break;
                     37:                case 'n':       nblks = optarg; break;
                     38:                case 'v':       nvolid = optarg; break;
                     39:                case '?':       usage();
                     40:                }
                     41:        if(optind != argc-1)
                     42:                usage();
                     43:        volid = argv[optind];
                     44:        if(strlen(volid) > sizeof(s.vol_id)-1)
                     45:                volid[sizeof(s.vol_id)-1] = 0;
                     46:        c = volid[strlen(volid)-1];
                     47:        if((c != 'a') && (c != 'b')){
                     48:                if(nvolid == 0){
                     49:                        fprint(2, "worm mkfs: vol_id '%s' must end in 'a' or 'b'\n", volid);
                     50:                        exit(1);
                     51:                }
                     52:                fprint(2, "worm mkfs: warning: vol_id '%s' should end in 'a' or 'b'\n", volid);
                     53:        }
                     54:        if(nvolid){
                     55:                if(strlen(nvolid) > sizeof(s.vol_id)-1)
                     56:                        nvolid[sizeof(s.vol_id)-1] = 0;
                     57:                c = nvolid[strlen(nvolid)-1];
                     58:                if((c != 'a') && (c != 'b')){
                     59:                        fprint(2, "worm mkfs: vol_id '%s' must end in 'a' or 'b'\n", nvolid);
                     60:                        exit(1);
                     61:                }
                     62:        }
                     63:        dev = mapdev(dev);
                     64:        if((s.fd = open(dev, 2)) < 0){
                     65:                perror(dev);
                     66:                exit(1);
                     67:        }
                     68:        /*
                     69:                now, do we read the current superblock or make one up?
                     70:                this is hard to answer in general, push the answer off to virginal()
                     71:        */
                     72:        virgin = virginal(&s);
                     73:        if(virgin){
                     74:                setdefaults(&s, nblks);
                     75:                if((s.blocksize < 512) || (s.blocksize%512)){
                     76:                        fprint(2, "worm mkfs: bad blocksize '%s'\n", bsize);
                     77:                        exit(1);
                     78:                }
                     79:                strcpy(s.vol_id, volid);
                     80:        } else {
                     81:                if(strcmp(volid, s.vol_id)){
                     82:                        fprint(2, "worm mkfs: volid mismatch; expected %s, got %s\n",
                     83:                                volid, s.vol_id);
                     84:                        exit(1);
                     85:                }
                     86:        }
                     87:        /* set any new parameters */
                     88:        if(nvolid)
                     89:                strcpy(s.vol_id, nvolid);
                     90:        if(bsize)
                     91:                s.blocksize = atoi(bsize);
                     92:        if(s.blocksize < 512){
                     93:                fprint(2, "wormmkfs: bad nblocks = '%s'\n", nblks);
                     94:                exit(1);
                     95:        }
                     96:        if(s.blocksize % sizeof(Inode)){
                     97:                fprint(2, "worm mkfs: sizeof(Inode)=%d does not divide blocksize %d\n",
                     98:                        sizeof(Inode), s.blocksize);
                     99:                exit(1);
                    100:        }
                    101:        if(comments){
                    102:                if(strlen(comments) > sizeof(s.comment)-1)
                    103:                        comments[sizeof(s.comment)-1] = 0;
                    104:                strcpy(s.comment, comments);
                    105:        }
                    106:        /* only check if we are changing it */
                    107:        if(nblks && !virgin){
                    108:                s.nblocks = atoi(nblks);
                    109:                s.nfree = s.nblocks - s.nextffree;
                    110:                if(s.nfree <= 1){
                    111:                        fprint(2, "worm mkfs: new nblocks(%d) is too small\n", s.nblocks);
                    112:                        exit(1);
                    113:                }
                    114:        }
                    115:        /* now allocate the new superblock */
                    116:        sb = s.nextsb;
                    117:        s.myblock = sb;
                    118:        s.nextsb = sb+1;
                    119:        s.nextffree = sb+2;
                    120:        s.nfree -= 1;
                    121:        s.ninodes = 0;
                    122:        s.ninochars = 0;
                    123:        s.binodes = 0;
                    124:        time(&s.ctime);
                    125:        /* write it */
                    126:        if((b = malloc(s.blocksize)) == 0){
                    127:                fprint(2, "worm mkfs: cannot malloc buffer %d bytes\n", s.blocksize);
                    128:                exit(1);
                    129:        }
                    130:        memset(b, 0, s.blocksize);
                    131:        memcpy(b, (char *)&s, sizeof(s));
                    132:        Seek(&s, sb);
                    133:        if(Write(&s, b, 1L))
                    134:                exit(1);
                    135:        ioctl(s.fd, UIOSPDW);
                    136:        exit(0);
                    137: }
                    138: 
                    139: setdefaults(s, nblks)
                    140:        Superblock *s;
                    141:        char *nblks;
                    142: {
                    143:        struct ud_unit sz;
                    144:        char buf[1024];
                    145: 
                    146:        s->magic = SMAGIC;
                    147:        s->blocksize = 1024;
                    148:        s->version = VLINK;
                    149:        if(nblks){
                    150:                s->nblocks = atoi(nblks);
                    151:                if(s->nblocks <= 2){
                    152:                        fprint(2, "worm mkfs: nblocks(%d) too small\n", s->nblocks);
                    153:                        exit(1);
                    154:                }
                    155:        } else {
                    156:                read(s->fd, buf, sizeof buf);   /* ignore error */
                    157:                if(ioctl(s->fd, UIOCHAR, &sz) >= 0){
                    158:                        switch(sz.radsize)
                    159:                        {               /* note below figures/2 used in scsi/volid.c */
                    160:                        case 3275999:           /* sony 12in clv single density */
                    161:                                s->nblocks = 1600000;
                    162:                                break;
                    163:                        case 6551999:           /* sony 12in clv double density */
                    164:                                s->nblocks = 3250000;
                    165:                                break;
                    166:                        default:
                    167:                                fprint(2, "worm mkfs: unknown size %d\n", sz.radsize);
                    168:                                exit(1);
                    169:                        }
                    170:                } else
                    171:                        s->nblocks = 1600000;
                    172:                fprint(2, "worm mkfs: using disk size %d\n", s->nblocks);
                    173:        }
                    174:        s->zero = 0;
                    175:        s->nfree = s->nblocks-1;
                    176:        s->nextffree = 0;
                    177:        s->nextsb = 1;
                    178:        s->vol_id[0] = 0;
                    179:        s->comment[0] = 0;
                    180:        s->myblock = 0;
                    181:        s->ctime = 0;
                    182: }
                    183: 
                    184: virginal(s)
                    185:        Superblock *s;
                    186: {
                    187:        char buf[1024];
                    188:        static char zeros[1024];
                    189:        long sb;
                    190:        char *e;
                    191:        extern char *getenv();
                    192: 
                    193:        if(e = getenv("WORMZERO"))
                    194:                sb = atoi(e);
                    195:        else
                    196:                sb = 1;
                    197:        bigseek(s->fd, sb, 1024, 0);
                    198:        errno = 0;
                    199:        if(read(s->fd, buf, 1024) == 1024)
                    200:                goto valid;
                    201:        if((errno != ENXIO) && (errno != 0) && memcmp(buf, zeros, 1024))
                    202:                goto invalid;
                    203:        errno = 0;
                    204:        if(read(s->fd, buf, 1024) == 1024){     /* try next block */
                    205: valid:
                    206:                if(e = openinode(s, SPIN_DOWN)){
                    207:                        fprint(2, "worm mkfs: %s\n", e);
                    208:                        exit(1);
                    209:                }
                    210:                return(0);
                    211:        } else {
                    212:                if((errno == ENXIO) || (errno == 0) || (memcmp(buf, zeros, 1024) == 0))
                    213:                        return(1);
                    214: invalid:
                    215:                perror("worm mkfs: I/O errors probing for superblock");
                    216:                exit(1);
                    217:        }
                    218: }

unix.superglobalmegacorp.com

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