equal
deleted
inserted
replaced
|
1 #include "exit.h" |
|
2 #include "scan.h" |
|
3 #include "str.h" |
|
4 #include "buffer.h" |
|
5 #include "strerr.h" |
|
6 #include "cdb.h" |
|
7 |
|
8 #define FATAL "cdbget: fatal: " |
|
9 |
|
10 void die_read(void) |
|
11 { |
|
12 strerr_die2sys(111,FATAL,"unable to read input: "); |
|
13 } |
|
14 void die_write(void) |
|
15 { |
|
16 strerr_die2sys(111,FATAL,"unable to write output: "); |
|
17 } |
|
18 void die_usage(void) |
|
19 { |
|
20 strerr_die1x(111,"cdbget: usage: cdbget key [skip]"); |
|
21 } |
|
22 |
|
23 static struct cdb c; |
|
24 char buf[1024]; |
|
25 |
|
26 main(int argc,char **argv) |
|
27 { |
|
28 char *key; |
|
29 int r; |
|
30 uint32 pos; |
|
31 uint32 len; |
|
32 unsigned long u = 0; |
|
33 |
|
34 if (!*argv) die_usage(); |
|
35 |
|
36 if (!*++argv) die_usage(); |
|
37 key = *argv; |
|
38 |
|
39 if (*++argv) { |
|
40 scan_ulong(*argv,&u); |
|
41 } |
|
42 |
|
43 cdb_init(&c,0); |
|
44 cdb_findstart(&c); |
|
45 |
|
46 for (;;) { |
|
47 r = cdb_findnext(&c,key,str_len(key)); |
|
48 if (r == -1) die_read(); |
|
49 if (!r) _exit(100); |
|
50 if (!u) break; |
|
51 --u; |
|
52 } |
|
53 |
|
54 pos = cdb_datapos(&c); |
|
55 len = cdb_datalen(&c); |
|
56 |
|
57 while (len > 0) { |
|
58 r = sizeof buf; |
|
59 if (r > len) r = len; |
|
60 if (cdb_read(&c,buf,r,pos) == -1) die_read(); |
|
61 if (buffer_put(buffer_1small,buf,r) == -1) die_write(); |
|
62 pos += r; |
|
63 len -= r; |
|
64 } |
|
65 if (buffer_flush(buffer_1small) == -1) die_write(); |
|
66 _exit(0); |
|
67 } |