cdbget.c
changeset 0 eeadadee24f6
equal deleted inserted replaced
-1:000000000000 0:eeadadee24f6
       
     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 }