| #include <u.h> |
| #include <libc.h> |
| #include <bio.h> |
| #include <regexp.h> |
| #include "hash.h" |
| |
| Hash hash; |
| |
| void |
| usage(void) |
| { |
| fprint(2, "addhash [-o out] file scale [file scale]...\n"); |
| exits("usage"); |
| } |
| |
| void |
| main(int argc, char **argv) |
| { |
| int i, fd, n; |
| char err[ERRMAX], *out; |
| Biobuf *b, bout; |
| |
| out = nil; |
| ARGBEGIN{ |
| case 'o': |
| out = EARGF(usage()); |
| break; |
| default: |
| usage(); |
| }ARGEND; |
| |
| if(argc==0 || argc%2) |
| usage(); |
| |
| while(argc > 0){ |
| if((b = Bopenlock(argv[0], OREAD)) == nil) |
| sysfatal("open %s: %r", argv[0]); |
| n = atoi(argv[1]); |
| if(n == 0) |
| sysfatal("0 scale given"); |
| Breadhash(b, &hash, n); |
| Bterm(b); |
| argv += 2; |
| argc -= 2; |
| } |
| |
| fd = 1; |
| if(out){ |
| for(i=0; i<120; i++){ |
| if((fd = create(out, OWRITE, 0666|DMEXCL)) >= 0) |
| break; |
| rerrstr(err, sizeof err); |
| if(strstr(err, "file is locked")==nil && strstr(err, "exclusive lock")==nil) |
| break; |
| sleep(1000); |
| } |
| if(fd < 0) |
| sysfatal("could not open %s: %r\n", out); |
| } |
| |
| Binit(&bout, fd, OWRITE); |
| Bwritehash(&bout, &hash); |
| Bterm(&bout); |
| exits(0); |
| } |
| |