diff options
author | Miles Bader <miles@gnu.org> | 1996-01-17 18:55:17 +0000 |
---|---|---|
committer | Miles Bader <miles@gnu.org> | 1996-01-17 18:55:17 +0000 |
commit | 1b4447c7ad80cde20906c4104ca0d9107c580c91 (patch) | |
tree | 60a138eec724245916ed56442afa2a67a6c29321 /libstore | |
parent | 004394d9095dab709a93b17639586cd040dcf6fe (diff) |
Formerly storeread.c.~2~
Diffstat (limited to 'libstore')
-rw-r--r-- | libstore/storeread.c | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/libstore/storeread.c b/libstore/storeread.c index 613425c8..9a484096 100644 --- a/libstore/storeread.c +++ b/libstore/storeread.c @@ -1,16 +1,39 @@ #include <argp.h> +#include <error.h> +#include <unistd.h> +#include <hurd.h> +#include <sys/fcntl.h> #include "store.h" -struct argp_options options[] = { +struct argp_option options[] = { {0} }; -char *arg_doc = "FILE [OFFSET [LENGTH]]..."; -char *doc = "OFFSET defaults to 0, LENGTH to the remainder of FILE"; +char *arg_doc = "FILE [ADDR [LENGTH]]..."; +char *doc = "ADDR is in blocks, and defaults to 0; LENGTH is in bytes, and defaults to the remainder of FILE."; int main (int argc, char **argv) { + struct store *store = 0; + off_t addr = -1; + int dumped = 0; + + void dump (ssize_t addr, size_t len) + { + char buf[4096], *data = buf; + size_t data_len = sizeof (buf); + error_t err = + store_read (store, addr, len < 0 ? store->size : len, + &data, &data_len); + if (err) + error (5, err, store->name ? "%s" : "<store>", store->name); + if (write (1, data, data_len) <= 0) + error (6, errno, "stdout"); + if (data != buf) + vm_deallocate (mach_task_self (), (vm_address_t)data, data_len); + } + error_t parse_opt (int key, char *arg, struct argp_state *state) { switch (key) @@ -18,34 +41,39 @@ main (int argc, char **argv) case ARGP_KEY_ARG: if (! store) { + error_t err; file_t source = file_name_lookup (arg, O_READ, 0); - if (err) - error (err, 2, "%s", arg); + if (errno) + error (2, errno, "%s", arg); err = store_create (source, &store); if (err) error (err, 3, "%s", arg); mach_port_deallocate (mach_task_self (), source); } - else if (offset < 0) - offset = atoi (arg); + else if (addr < 0) + addr = atoi (arg); else - dump (store, offset, { - + dump (addr, atoi (arg)); + dumped = 1; + addr = -1; } break; + case ARGP_KEY_END: - if (offset < 0) - offset = 0; - if (length < 0) - dump ( + if (addr < 0) + dump (0, -1); + else if (! dumped) + dump (addr, -1); + break; + case ARGP_KEY_NO_ARGS: default: return EINVAL; } return 0; } - struct argp argp = {options, arg_doc, doc}; + struct argp argp = {options, parse_opt, arg_doc, doc}; argp_parse (&argp, argc, argv, 0, 0); exit (0); } |