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