From e70f2f30feac99513ed45b00b6b1460a3d05dcab Mon Sep 17 00:00:00 2001 From: Miles Bader Date: Sat, 14 Sep 1996 17:49:46 +0000 Subject: (main): Limit reads to 1M, and iterate until done. Use store_parsed_name to get store name for errors. Add program description. --- libstore/storecat.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/libstore/storecat.c b/libstore/storecat.c index 895b44e8..99a29063 100644 --- a/libstore/storecat.c +++ b/libstore/storecat.c @@ -11,21 +11,41 @@ main (int argc, char **argv) { error_t err; struct store *s; - char buf[4096], *data = buf; - size_t data_len = sizeof (buf); + char *name; struct store_parsed *parsed; + off_t addr; + size_t left; + const struct argp *parents[] = { &store_argp, 0 }; + struct argp argp = + { 0, 0, 0, "Write the contents of a store to stdout", parents }; - argp_parse (&store_argp, argc, argv, 0, 0, &parsed); - err = store_parsed_open (parsed, STORE_READONLY, 0, &s); + argp_parse (&argp, argc, argv, 0, 0, &parsed); + err = store_parsed_name (parsed, &name); if (err) - error (4, err, "store_parsed_open"); + error (2, err, "store_parsed_name"); - err = store_read (s, 0, s->size, &data, &data_len); + err = store_parsed_open (parsed, STORE_READONLY, 0, &s); if (err) - error (5, err, s->name ? "%s" : "", s->name); + error (4, err, "%s", name); + + addr = 0; + left = s->size; + while (left > 0) + { + size_t read = left > 1024*1024 ? 1024*1024 : left; + char buf[4096]; + void *data = buf; + size_t data_len = sizeof (buf); + + err = store_read (s, addr, read, &data, &data_len); + if (err) + error (5, err, "%s", name); + if (write (1, data, data_len) < 0) + error (6, errno, "stdout"); - if (write (1, data, data_len) < 0) - error (6, errno, "stdout"); + addr += data_len >> s->log2_block_size; + left -= data_len; + } exit (0); } -- cgit v1.2.3