diff options
Diffstat (limited to 'sys-block/f3/files/f3-6.0-use-argp_parse.patch')
-rw-r--r-- | sys-block/f3/files/f3-6.0-use-argp_parse.patch | 417 |
1 files changed, 0 insertions, 417 deletions
diff --git a/sys-block/f3/files/f3-6.0-use-argp_parse.patch b/sys-block/f3/files/f3-6.0-use-argp_parse.patch deleted file mode 100644 index b73fbff8c7a2..000000000000 --- a/sys-block/f3/files/f3-6.0-use-argp_parse.patch +++ /dev/null @@ -1,417 +0,0 @@ -From fb187b4c710714a56d74af8a50adccd6118445e7 Mon Sep 17 00:00:00 2001 -From: zwpwjwtz <zwpwjwtz@126.com> -Date: Tue, 29 Mar 2016 15:36:04 +0800 -Subject: [PATCH] Replace parse_args() with argp_parse() from argp.h - ---- - f3read.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- - f3write.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----- - utils.c | 92 ---------------------------------------------------- - utils.h | 5 --- - 4 files changed, 200 insertions(+), 113 deletions(-) - -diff --git a/f3read.c b/f3read.c -index 2dc6942..683232d 100644 ---- a/f3read.c -+++ b/f3read.c -@@ -12,8 +12,100 @@ - #include <unistd.h> - #include <err.h> - #include <sys/time.h> -+#include <limits.h> -+#include <argp.h> - - #include "utils.h" -+#include "version.h" -+ -+/* Argp's global variables. */ -+const char *argp_program_version = "F3 Read " F3_STR_VERSION; -+ -+/* Arguments. */ -+static char adoc[] = "<PATH>"; -+ -+static char doc[] = "F3 Read -- test real flash memory capacity\n" -+ "Copyright (C) 2010 Digirati Internet LTDA.\n" -+ "This is free software; see the source for copying conditions.\n"; -+ -+static struct argp_option options[] = { -+ {"start-at", 's', "NUM", 0, -+ "Disk type of the partition table", 0}, -+ {"end-at", 'e', "NUM", 0, -+ "Type of the file system of the partition", 0}, -+ {"progress", 'p', NULL, 0, -+ "Show progress of the operation (default)", 0}, -+ { 0 } -+}; -+ -+struct args { -+ long start_at; -+ long end_at; -+ int show_progress; -+ const char *dev_path; -+}; -+ -+static error_t parse_opt(int key, char *arg, struct argp_state *state) -+{ -+ struct args *args = state->input; -+ char *endptr; -+ -+ switch (key) { -+ case 's': -+ args->start_at = strtol(arg, &endptr, 10); -+ if (*endptr != '\0') -+ argp_error(state, "Option --start-at must be a number"); -+ break; -+ -+ case 'e': -+ args->end_at = strtol(arg, &endptr, 10); -+ if (*endptr != '\0') -+ argp_error(state, "Option --end-at must be a number"); -+ break; -+ -+ case 'p': -+ args->show_progress = 1; -+ break; -+ -+ case ARGP_KEY_INIT: -+ args->dev_path = NULL; -+ args->start_at = 0; -+ args->end_at = LONG_MAX; -+ args->show_progress = 0; -+ break; -+ -+ case ARGP_KEY_ARG: -+ if (args->dev_path) -+ argp_error(state, -+ "Wrong number of arguments; only one is allowed"); -+ args->dev_path = arg; -+ break; -+ -+ case ARGP_KEY_END: -+ if (!args->dev_path) -+ argp_error(state, -+ "The disk path was not specified"); -+ -+ if (args->start_at < 0) -+ argp_error(state, -+ "Option --start-at must be greater than 0"); -+ -+ if (args->end_at < 0) -+ argp_error(state, -+ "Option --end-at must be greater than 0"); -+ -+ if (args->start_at > args->end_at) -+ argp_error(state, -+ "Option --start-at must be less or equal to option --end-at"); -+ break; -+ -+ default: -+ return ARGP_ERR_UNKNOWN; -+ } -+ return 0; -+} -+ -+static struct argp argp = {options, parse_opt, adoc, doc, NULL, NULL, NULL}; - - static inline void update_dt(struct timeval *dt, const struct timeval *t1, - const struct timeval *t2) -@@ -228,20 +320,21 @@ static void iterate_files(const char *path, const long *files, - - int main(int argc, char **argv) - { -- long start_at, end_at; -- const char *path; - const long *files; -- int progress; -+ struct args args; - int rc; -- -- rc = parse_args("read", argc, argv, &start_at, &end_at, &path); -+ rc = argp_parse(&argp, argc, argv, 0, NULL, &args); - if (rc) - return rc; - -- files = ls_my_files(path, start_at, end_at); - /* If stdout isn't a terminal, supress progress. */ -- progress = isatty(STDOUT_FILENO); -- iterate_files(path, files, start_at, end_at, progress); -+ if (!args.show_progress) -+ args.show_progress = isatty(STDOUT_FILENO); -+ -+ files = ls_my_files(args.dev_path, args.start_at, args.end_at); -+ /* If stdout isn't a terminal, supress progress. */ -+ -+ iterate_files(args.dev_path, files, args.start_at, args.end_at, args.show_progress); - free((void *)files); - return 0; - } -diff --git a/f3write.c b/f3write.c -index b964059..bfef27e 100644 ---- a/f3write.c -+++ b/f3write.c -@@ -15,8 +15,99 @@ - #include <unistd.h> - #include <err.h> - #include <math.h> -+#include <argp.h> - - #include "utils.h" -+#include "version.h" -+ -+/* Argp's global variables. */ -+const char *argp_program_version = "F3 Write " F3_STR_VERSION; -+ -+/* Arguments. */ -+static char adoc[] = "<PATH>"; -+ -+static char doc[] = "F3 Write -- test real flash memory capacity\n" -+ "Copyright (C) 2010 Digirati Internet LTDA.\n" -+ "This is free software; see the source for copying conditions.\n"; -+ -+static struct argp_option options[] = { -+ {"start-at", 's', "NUM", 0, -+ "Disk type of the partition table", 0}, -+ {"end-at", 'e', "NUM", 0, -+ "Type of the file system of the partition", 0}, -+ {"progress", 'p', NULL, 0, -+ "Show progress of the operation (default)", 0}, -+ { 0 } -+}; -+ -+struct args { -+ long start_at; -+ long end_at; -+ int show_progress; -+ const char *dev_path; -+}; -+ -+static error_t parse_opt(int key, char *arg, struct argp_state *state) -+{ -+ struct args *args = state->input; -+ char *endptr; -+ -+ switch (key) { -+ case 's': -+ args->start_at = strtol(arg, &endptr, 10); -+ if (*endptr != '\0') -+ argp_error(state, "Option --start-at must be a number"); -+ break; -+ -+ case 'e': -+ args->end_at = strtol(arg, &endptr, 10); -+ if (*endptr != '\0') -+ argp_error(state, "Option --end-at must be a number"); -+ break; -+ -+ case 'p': -+ args->show_progress = 1; -+ break; -+ -+ case ARGP_KEY_INIT: -+ args->dev_path = NULL; -+ args->start_at = 0; -+ args->end_at = LONG_MAX; -+ args->show_progress = 0; -+ break; -+ -+ case ARGP_KEY_ARG: -+ if (args->dev_path) -+ argp_error(state, -+ "Wrong number of arguments; only one is allowed"); -+ args->dev_path = arg; -+ break; -+ -+ case ARGP_KEY_END: -+ if (!args->dev_path) -+ argp_error(state, -+ "The disk path was not specified"); -+ -+ if (args->start_at < 0) -+ argp_error(state, -+ "Option --start-at must be greater than 0"); -+ -+ if (args->end_at < 0) -+ argp_error(state, -+ "Option --end-at must be greater than 0"); -+ -+ if (args->start_at > args->end_at) -+ argp_error(state, -+ "Option --start-at must be less or equal to option --end-at"); -+ break; -+ -+ default: -+ return ARGP_ERR_UNKNOWN; -+ } -+ return 0; -+} -+ -+static struct argp argp = {options, parse_opt, adoc, doc, NULL, NULL, NULL}; - - static uint64_t fill_buffer(void *buf, size_t size, uint64_t offset) - { -@@ -464,17 +555,17 @@ static void unlink_old_files(const char *path, long start_at, long end_at) - - int main(int argc, char **argv) - { -- long start_at, end_at; -- const char *path; -- int progress; -+ struct args args; - int rc; -- -- rc = parse_args("write", argc, argv, &start_at, &end_at, &path); -+ rc = argp_parse(&argp, argc, argv, 0, NULL, &args); - if (rc) - return rc; - -- unlink_old_files(path, start_at, end_at); -+ unlink_old_files(args.dev_path, args.start_at, args.end_at); -+ - /* If stdout isn't a terminal, supress progress. */ -- progress = isatty(STDOUT_FILENO); -- return fill_fs(path, start_at, end_at, progress); -+ if (!args.show_progress) -+ args.show_progress = isatty(STDOUT_FILENO); -+ -+ return fill_fs(args.dev_path, args.start_at, args.end_at, args.show_progress); - } -diff --git a/utils.c b/utils.c -index a30ea3b..6aaceff 100644 ---- a/utils.c -+++ b/utils.c -@@ -13,13 +13,11 @@ - #include <string.h> - #include <ctype.h> - #include <assert.h> --#include <limits.h> - #include <sys/types.h> - #include <dirent.h> - #include <errno.h> - #include <err.h> - --#include "version.h" - #include "utils.h" - - const char *adjust_unit(double *ptr_bytes) -@@ -60,87 +58,6 @@ char *full_fn_from_number(const char **filename, const char *path, long num) - return str; - } - --/* Parse @param and return the start-at parameter. -- * The string must be of the format "--start-at=NUM"; otherwise it returns -1. -- */ --#define START_AT_TEXT "--start-at=" --#define END_AT_TEXT "--end-at=" -- --static inline int is_param(const char *text, const char *param) --{ -- return !strncmp(param, text, strlen(text)); --} -- --static long parse_long_param(const char *param) --{ -- char *endptr; -- long value; -- -- /* Skip text. */ -- while (*param != '=') { -- if (*param == '\0') -- return -1; -- param++; -- } -- param++; /* Skip '='. */ -- -- value = strtol(param, &endptr, 10); -- if (*endptr != '\0') -- return -1; -- -- return (value <= 0 || value == LONG_MAX) ? -1 : value - 1; --} -- --static int parse_param(const char *param, long *pstart_at, long *pend_at) --{ -- if (is_param(START_AT_TEXT, param)) -- *pstart_at = parse_long_param(param); -- else if (is_param(END_AT_TEXT, param)) -- *pend_at = parse_long_param(param); -- else -- return 1; -- return 0; --} -- --int parse_args(const char *name, int argc, char **argv, -- long *pstart_at, long *pend_at, const char **ppath) --{ -- *pstart_at = 0; -- *pend_at = LONG_MAX - 1; -- -- switch (argc) { -- case 2: -- *ppath = argv[1]; -- break; -- -- case 3: -- if (parse_param(argv[1], pstart_at, pend_at)) -- goto error; -- *ppath = argv[2]; -- break; -- -- case 4: -- if (parse_param(argv[1], pstart_at, pend_at)) -- goto error; -- if (parse_param(argv[2], pstart_at, pend_at)) -- goto error; -- *ppath = argv[3]; -- break; -- -- default: -- goto error; -- } -- -- if (*pstart_at >= 0 && *pend_at >= 0 && *pstart_at <= *pend_at) -- return 0; -- --error: -- print_header(stderr, name); -- fprintf(stderr, "Usage: f3%s [%sNUM] [%sNUM] <PATH>\n", -- name, START_AT_TEXT, END_AT_TEXT); -- return 1; --} -- - static long number_from_filename(const char *filename) - { - const char *p; -@@ -218,15 +135,6 @@ const long *ls_my_files(const char *path, long start_at, long end_at) - return ret; - } - --void print_header(FILE *f, const char *name) --{ -- fprintf(f, -- "F3 %s " F3_STR_VERSION "\n" -- "Copyright (C) 2010 Digirati Internet LTDA.\n" -- "This is free software; see the source for copying conditions.\n" -- "\n", name); --} -- - #if __APPLE__ && __MACH__ - - /* This function is a _rough_ approximation of fdatasync(2). */ -diff --git a/utils.h b/utils.h -index 6b7c92f..4fdbce2 100644 ---- a/utils.h -+++ b/utils.h -@@ -22,13 +22,8 @@ static inline long delay_ms(const struct timeval *t1, const struct timeval *t2) - (t2->tv_usec - t1->tv_usec) / 1000; - } - --int parse_args(const char *name, int argc, char **argv, -- long *pstart_at, long *pend_at, const char **ppath); -- - const long *ls_my_files(const char *path, long start_at, long end_at); - --void print_header(FILE *f, const char *name); -- - static inline uint64_t random_number(uint64_t prv_number) - { - return prv_number * 4294967311ULL + 17; |