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, 417 insertions, 0 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 new file mode 100644 index 000000000000..b73fbff8c7a2 --- /dev/null +++ b/sys-block/f3/files/f3-6.0-use-argp_parse.patch @@ -0,0 +1,417 @@ +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; |