From 59a532c6f6c9ef784539da810614f5a5e04f7e78 Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Thu, 3 Aug 2017 17:29:17 +0200 Subject: [PATCH] rots-utils: add missing files --- include/info.h | 4 +++ source/info.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ source/pack.c | 4 ++- 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 include/info.h create mode 100644 source/info.c diff --git a/include/info.h b/include/info.h new file mode 100644 index 0000000..d2964e6 --- /dev/null +++ b/include/info.h @@ -0,0 +1,4 @@ +#pragma once + +int do_get_offset(int argc, char *argv[]); +int do_get_size(int argc, char *argv[]); diff --git a/source/info.c b/source/info.c new file mode 100644 index 0000000..3c73071 --- /dev/null +++ b/source/info.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +enum { + OPTION_HELP = 'h', + OPTION_IMAGE = 'i', +}; + +struct args { + const char *image; +}; + +static int parse_args(struct args *args, int argc, char *argv[]) +{ + struct option options[] = { + { "help", no_argument, NULL, OPTION_HELP }, + { "image", required_argument, 0, OPTION_IMAGE }, + { NULL, 0, 0, 0 }, + }; + int ret; + + while ((ret = getopt_long(argc, (char * const *)argv, "hi:d:k:", options, + NULL)) >= 0) { + switch (ret) { + case OPTION_HELP: return -1; + case OPTION_IMAGE: args->image = optarg; break; + default: break; + } + } + + return 0; +} + +int do_get_offset(int argc, char *argv[]) +{ + struct args args; + struct rots_hdr hdr; + FILE *fp; + + if (parse_args(&args, argc, argv) < 0) { + fprintf(stderr, "invalid\n"); + return -1; + } + + if (!(fp = fopen(args.image, "rb"))) { + fprintf(stderr, "error: file '%s' not found.\n", args.image); + return -1; + } + + if (rots_read_hdr(fp, &hdr) < 0) { + fprintf(stderr, "error: file '%s' is not a ROTS-image.\n", args.image); + goto err_close_fp; + } + + printf("%zu\n", ftell(fp)); + fclose(fp); + + return 0; + +err_close_fp: + fclose(fp); + return -1; +} + +int do_get_size(int argc, char *argv[]) +{ + struct args args; + struct rots_hdr hdr; + FILE *fp; + + if (parse_args(&args, argc, argv) < 0) { + fprintf(stderr, "invalid\n"); + return -1; + } + + if (!(fp = fopen(args.image, "rb"))) { + fprintf(stderr, "error: file '%s' not found.\n", args.image); + return -1; + } + + if (rots_read_hdr(fp, &hdr) < 0) { + fprintf(stderr, "error: file '%s' is not a ROTS-image.\n", args.image); + goto err_close_fp; + } + + printf("%zu\n", hdr.size); + fclose(fp); + + return 0; + +err_close_fp: + fclose(fp); + return -1; +} diff --git a/source/pack.c b/source/pack.c index d186916..c14466d 100644 --- a/source/pack.c +++ b/source/pack.c @@ -5,6 +5,7 @@ #include #include +#include #include enum { @@ -73,12 +74,13 @@ int do_pack(int argc, char *argv[]) get_file_size(&size, args.input); hdr.timestamp = (uint64_t)time(NULL); hdr.size = size; + printf("%zu\n", hdr.size); if (rots_write_hdr(output, &hdr) < 0) goto err_close_output; while (size) { - nbytes = fread(data, sizeof *data, sizeof data, input); + nbytes = fread(data, sizeof *data, min(sizeof data, size), input); if (nbytes == 0) { fprintf(stderr, "unable to read the next chunk\n");