Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <regexp.h>
5 #include "hash.h"
7 Hash hash;
9 void
10 usage(void)
11 {
12 fprint(2, "addhash [-o out] file scale [file scale]...\n");
13 exits("usage");
14 }
16 void
17 main(int argc, char **argv)
18 {
19 int i, fd, n;
20 char err[ERRMAX], *out;
21 Biobuf *b, bout;
23 out = nil;
24 ARGBEGIN{
25 case 'o':
26 out = EARGF(usage());
27 break;
28 default:
29 usage();
30 }ARGEND;
32 if(argc==0 || argc%2)
33 usage();
35 while(argc > 0){
36 if((b = Bopenlock(argv[0], OREAD)) == nil)
37 sysfatal("open %s: %r", argv[0]);
38 n = atoi(argv[1]);
39 if(n == 0)
40 sysfatal("0 scale given");
41 Breadhash(b, &hash, n);
42 Bterm(b);
43 argv += 2;
44 argc -= 2;
45 }
47 fd = 1;
48 if(out){
49 for(i=0; i<120; i++){
50 if((fd = create(out, OWRITE, 0666|DMEXCL)) >= 0)
51 break;
52 rerrstr(err, sizeof err);
53 if(strstr(err, "file is locked")==nil && strstr(err, "exclusive lock")==nil)
54 break;
55 sleep(1000);
56 }
57 if(fd < 0)
58 sysfatal("could not open %s: %r\n", out);
59 }
61 Binit(&bout, fd, OWRITE);
62 Bwritehash(&bout, &hash);
63 Bterm(&bout);
64 exits(0);
65 }