| #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); | 
 | } | 
 |  |