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 void10 usage(void)11 {12 fprint(2, "addhash [-o out] file scale [file scale]...\n");13 exits("usage");14 }16 void17 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 }