plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

addhash.c (1051B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <bio.h>
      4 #include <regexp.h>
      5 #include "hash.h"
      6 
      7 Hash hash;
      8 
      9 void
     10 usage(void)
     11 {
     12 	fprint(2, "addhash [-o out] file scale [file scale]...\n");
     13 	exits("usage");
     14 }
     15 
     16 void
     17 main(int argc, char **argv)
     18 {
     19 	int i, fd, n;
     20 	char err[ERRMAX], *out;
     21 	Biobuf *b, bout;
     22 
     23 	out = nil;
     24 	ARGBEGIN{
     25 	case 'o':
     26 		out = EARGF(usage());
     27 		break;
     28 	default:
     29 		usage();
     30 	}ARGEND;
     31 
     32 	if(argc==0 || argc%2)
     33 		usage();
     34 
     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 	}
     46 
     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 	}
     60 
     61 	Binit(&bout, fd, OWRITE);
     62 	Bwritehash(&bout, &hash);
     63 	Bterm(&bout);
     64 	exits(0);
     65 }