| #include "stdinc.h" |
| #include "dat.h" |
| #include "fns.h" |
| |
| void |
| usage(void) |
| { |
| fprint(2, "usage: fmtisect [-1Z] [-b blocksize] name file\n"); |
| threadexitsall(0); |
| } |
| |
| void |
| threadmain(int argc, char *argv[]) |
| { |
| int vers; |
| ISect *is; |
| Part *part; |
| char *file, *name; |
| int blocksize, setsize, zero; |
| |
| ventifmtinstall(); |
| statsinit(); |
| |
| blocksize = 8 * 1024; |
| setsize = 512 * 1024; |
| zero = -1; |
| vers = ISectVersion2; |
| ARGBEGIN{ |
| case 'b': |
| blocksize = unittoull(ARGF()); |
| if(blocksize == ~0) |
| usage(); |
| if(blocksize > MaxDiskBlock){ |
| fprint(2, "block size too large, max %d\n", MaxDiskBlock); |
| threadexitsall("usage"); |
| } |
| break; |
| case '1': |
| vers = ISectVersion1; |
| break; |
| case 'Z': |
| zero = 0; |
| break; |
| default: |
| usage(); |
| break; |
| }ARGEND |
| |
| if(zero == -1){ |
| if(vers == ISectVersion1) |
| zero = 1; |
| else |
| zero = 0; |
| } |
| |
| if(argc != 2) |
| usage(); |
| |
| name = argv[0]; |
| file = argv[1]; |
| |
| if(nameok(name) < 0) |
| sysfatal("illegal name %s", name); |
| |
| part = initpart(file, ORDWR|ODIRECT); |
| if(part == nil) |
| sysfatal("can't open partition %s: %r", file); |
| |
| if(zero) |
| zeropart(part, blocksize); |
| |
| is = newisect(part, vers, name, blocksize, setsize); |
| if(is == nil) |
| sysfatal("can't initialize new index: %r"); |
| |
| fprint(2, "fmtisect %s: %,d buckets of %,d entries, %,d bytes for index map\n", |
| file, is->blocks, is->buckmax, setsize); |
| |
| if(wbisect(is) < 0) |
| fprint(2, "can't write back index section header for %s: %r\n", file); |
| |
| threadexitsall(0); |
| } |