14246b616SDavid du Colombier #include <u.h>
24246b616SDavid du Colombier #include <libc.h>
34246b616SDavid du Colombier #include <bio.h>
44246b616SDavid du Colombier #include <regexp.h>
54246b616SDavid du Colombier #include "hash.h"
64246b616SDavid du Colombier
74246b616SDavid du Colombier Hash hash;
84246b616SDavid du Colombier
94246b616SDavid du Colombier void
usage(void)104246b616SDavid du Colombier usage(void)
114246b616SDavid du Colombier {
124246b616SDavid du Colombier fprint(2, "addhash [-o out] file scale [file scale]...\n");
134246b616SDavid du Colombier exits("usage");
144246b616SDavid du Colombier }
154246b616SDavid du Colombier
164246b616SDavid du Colombier void
main(int argc,char ** argv)174246b616SDavid du Colombier main(int argc, char **argv)
184246b616SDavid du Colombier {
194246b616SDavid du Colombier int i, fd, n;
204246b616SDavid du Colombier char err[ERRMAX], *out;
214246b616SDavid du Colombier Biobuf *b, bout;
224246b616SDavid du Colombier
234246b616SDavid du Colombier out = nil;
244246b616SDavid du Colombier ARGBEGIN{
254246b616SDavid du Colombier case 'o':
264246b616SDavid du Colombier out = EARGF(usage());
274246b616SDavid du Colombier break;
284246b616SDavid du Colombier default:
294246b616SDavid du Colombier usage();
304246b616SDavid du Colombier }ARGEND;
314246b616SDavid du Colombier
324246b616SDavid du Colombier if(argc==0 || argc%2)
334246b616SDavid du Colombier usage();
344246b616SDavid du Colombier
354246b616SDavid du Colombier while(argc > 0){
364246b616SDavid du Colombier if((b = Bopenlock(argv[0], OREAD)) == nil)
374246b616SDavid du Colombier sysfatal("open %s: %r", argv[0]);
384246b616SDavid du Colombier n = atoi(argv[1]);
394246b616SDavid du Colombier if(n == 0)
404246b616SDavid du Colombier sysfatal("0 scale given");
414246b616SDavid du Colombier Breadhash(b, &hash, n);
424246b616SDavid du Colombier Bterm(b);
434246b616SDavid du Colombier argv += 2;
444246b616SDavid du Colombier argc -= 2;
454246b616SDavid du Colombier }
464246b616SDavid du Colombier
474246b616SDavid du Colombier fd = 1;
484246b616SDavid du Colombier if(out){
494246b616SDavid du Colombier for(i=0; i<120; i++){
504246b616SDavid du Colombier if((fd = create(out, OWRITE, 0666|DMEXCL)) >= 0)
514246b616SDavid du Colombier break;
524246b616SDavid du Colombier rerrstr(err, sizeof err);
53375daca8SDavid du Colombier if(strstr(err, "file is locked")==nil && strstr(err, "exclusive lock")==nil)
544246b616SDavid du Colombier break;
554246b616SDavid du Colombier sleep(1000);
564246b616SDavid du Colombier }
574246b616SDavid du Colombier if(fd < 0)
58*14cc0f53SDavid du Colombier sysfatal("could not open %s: %r", out);
594246b616SDavid du Colombier }
604246b616SDavid du Colombier
614246b616SDavid du Colombier Binit(&bout, fd, OWRITE);
624246b616SDavid du Colombier Bwritehash(&bout, &hash);
634246b616SDavid du Colombier Bterm(&bout);
644246b616SDavid du Colombier exits(0);
654246b616SDavid du Colombier }
664246b616SDavid du Colombier
67