diff options
Diffstat (limited to 'ubi-utils/src/ubirmvol.c')
-rw-r--r-- | ubi-utils/src/ubirmvol.c | 219 |
1 files changed, 102 insertions, 117 deletions
diff --git a/ubi-utils/src/ubirmvol.c b/ubi-utils/src/ubirmvol.c index 6dd16ba..b6fb8ef 100644 --- a/ubi-utils/src/ubirmvol.c +++ b/ubi-utils/src/ubirmvol.c @@ -19,13 +19,8 @@ /* * An utility to remove UBI volumes. * - * Author: Artem B. Bityutskiy <dedekind@linutronix.de> - * Frank Haverkamp <haver@vnet.ibm.com> - * - * 1.1 Reworked the userinterface to use argp. - * 1.2 Removed argp because we want to use uClibc. - * 1.3 Minor cleanups - * 1.4 Use a different libubi + * Authors: Artem B. Bityutskiy <dedekind@infradead.org> + * Frank Haverkamp <haver@vnet.ibm.com> */ #include <stdio.h> @@ -37,119 +32,98 @@ #include <config.h> #include <libubi.h> +#include "common.h" -#define PROGRAM_VERSION "1.4" +#define PROGRAM_VERSION "1.5" +#define PROGRAM_NAME "ubirmvol" -/* - * The below variables are set by command line options. - */ +/* The variables below is set by command line arguments */ struct args { int devn; int vol_id; - char node[256]; - - /* special stuff needed to get additional arguments */ - char *arg1; - char **options; /* [STRING...] */ + char node[MAX_NODE_LEN + 1]; }; static struct args myargs = { .devn = -1, .vol_id = -1, - - .arg1 = NULL, - .options = NULL, }; static int param_sanity_check(struct args *args, libubi_t libubi); -static char doc[] = "\nVersion: " PROGRAM_VERSION "\n" - "ubirmvol - make UBI Volume.\n"; +static const char *doc = "Version: " PROGRAM_VERSION "\n" + PROGRAM_NAME " - a tool to remove UBI volumes."; static const char *optionsstr = -" -d, --devn=<devn> UBI device\n" -" -n, --vol_id=<volume id> UBI volume id, if not specified, the volume ID\n" -" will be assigned automatically\n" -" -?, --help Give this help list\n" -" --usage Give a short usage message\n" -" -V, --version Print program version\n"; +" -n, --vol_id=<volume id> volume ID to remove\n" +" -h, --help print help message\n" +" -V, --version print program version"; static const char *usage = -"Usage: ubirmvol [-?V] [-d <devn>] [-n <volume id>] [--devn=<devn>]\n" -" [--vol_id=<volume id>] [--help] [--usage] [--version]\n"; - -struct option long_options[] = { - { .name = "devn", .has_arg = 1, .flag = NULL, .val = 'd' }, - { .name = "vol_id", .has_arg = 1, .flag = NULL, .val = 'n' }, - { .name = "help", .has_arg = 0, .flag = NULL, .val = '?' }, - { .name = "usage", .has_arg = 0, .flag = NULL, .val = 0 }, +"Usage: " PROGRAM_NAME " <UBI device node file name> [-n <volume id>] [--vol_id=<volume id>] [-h] [--help]\n\n" +"Example: " PROGRAM_NAME "/dev/ubi0 -n 1 - remove UBI volume 1 from UBI device corresponding\n" +" to the node file /dev/ubi0."; + +static const struct option long_options[] = { + { .name = "devn", .has_arg = 1, .flag = NULL, .val = 'd' }, + { .name = "vol_id", .has_arg = 1, .flag = NULL, .val = 'n' }, + { .name = "help", .has_arg = 0, .flag = NULL, .val = 'h' }, { .name = "version", .has_arg = 0, .flag = NULL, .val = 'V' }, - { NULL, 0, NULL, 0} + { NULL, 0, NULL, 0}, }; -/* - * @brief Parse the arguments passed into the test case. - * - * @param argc The number of arguments - * @param argv The list of arguments - * @param args Pointer to argument structure - * - * @return error - * - */ -static int -parse_opt(int argc, char **argv, struct args *args) +static int parse_opt(int argc, char * const argv[], struct args *args) { char *endp; while (1) { int key; - key = getopt_long(argc, argv, "d:n:?V", long_options, NULL); + key = getopt_long(argc, argv, "d:n:hV", long_options, NULL); if (key == -1) break; switch (key) { - case 'd': /* --devn=<device number> */ - args->devn = strtoul(optarg, &endp, 0); - if (*endp != '\0' || endp == optarg || - args->devn < 0) { - fprintf(stderr, - "Bad UBI device number: " - "\"%s\"\n", optarg); - goto out; - } - sprintf(args->node, "/dev/ubi%d", args->devn); - break; - case 'n': /* --volid=<volume id> */ - args->vol_id = strtoul(optarg, &endp, 0); - if (*endp != '\0' || endp == optarg || - (args->vol_id < 0 && - args->vol_id != UBI_DYNAMIC_VOLUME)) { - fprintf(stderr, "Bad volume ID: " - "\"%s\"\n", optarg); - goto out; - } - break; - case ':': - fprintf(stderr, "Parameter is missing\n"); - goto out; - case '?': /* help */ - fprintf(stderr, - "Usage: ubirmvol [OPTION...]\n"); - fprintf(stderr, "%s", doc); - fprintf(stderr, "%s", optionsstr); - fprintf(stderr, "\nReport bugs to %s\n", - PACKAGE_BUGREPORT); - exit(0); - break; - case 'V': - fprintf(stderr, "%s\n", PROGRAM_VERSION); - exit(0); - break; - default: - fprintf(stderr, "%s", usage); - exit(-1); + + case 'd': + args->devn = strtoul(optarg, &endp, 0); + if (*endp != '\0' || endp == optarg || args->devn < 0) { + errmsg("bad UBI device number: \"%s\"", optarg); + return -1; + } + + warnmsg("'-d' and '--devn' options are deprecated and will be " + "removed. Specify UBI device node name instead!\n" + "Example: " PROGRAM_NAME " /dev/ubi0, instead of " + PROGRAM_NAME " -d 0"); + sprintf(args->node, "/dev/ubi%d", args->devn); + break; + + case 'n': + args->vol_id = strtoul(optarg, &endp, 0); + if (*endp != '\0' || endp == optarg || args->vol_id < 0) { + errmsg("bad volume ID: " "\"%s\"", optarg); + return -1; + } + break; + + case 'h': + fprintf(stderr, "%s\n\n", doc); + fprintf(stderr, "%s\n\n", usage); + fprintf(stderr, "%s\n", optionsstr); + exit(0); + + case 'V': + fprintf(stderr, "%s\n", PROGRAM_VERSION); + exit(0); + + case ':': + errmsg("parameter is missing"); + goto out; + + default: + fprintf(stderr, "Use -h for help\n"); + exit(-1); } } @@ -161,62 +135,73 @@ parse_opt(int argc, char **argv, struct args *args) static int param_sanity_check(struct args *args, libubi_t libubi) { int err; - struct ubi_info ubi; - if (args->vol_id == -1) { - fprintf(stderr, "Volume ID was not specified\n"); - goto out; + if (strlen(args->node) > MAX_NODE_LEN) { + errmsg("too long device node name: \"%s\" (%d characters), max. is %d", + args->node, strlen(args->node), MAX_NODE_LEN); + return -1; } - err = ubi_get_info(libubi, &ubi); - if (err) + if (args->vol_id == -1) { + errmsg("volume ID is was not specified"); return -1; + } + + if (args->devn != -1) { + struct ubi_info ubi; + + err = ubi_get_info(libubi, &ubi); + if (err) { + errmsg("cannot get UBI information"); + perror("ubi_get_info"); + return -1; + } - if (args->devn >= (int)ubi.dev_count) { - fprintf(stderr, "Device %d does not exist\n", args->devn); - goto out; + if (args->devn >= ubi.dev_count) { + errmsg("UBI device %d does not exist", args->devn); + return -1; + } } return 0; - -out: - errno = EINVAL; - return -1; } int main(int argc, char * const argv[]) { - int err, old_errno; + int err; libubi_t libubi; - err = parse_opt(argc, (char **)argv, &myargs); + strncpy(myargs.node, argv[1], MAX_NODE_LEN); + + err = parse_opt(argc, argv, &myargs); if (err) - return err == 1 ? 0 : -1; + return -1; + + if (argc < 2) { + errmsg("UBI device name was not specified (use -h for help)"); + return -1; + } - if (myargs.devn == -1) { - fprintf(stderr, "Device number was not specified\n"); - fprintf(stderr, "Use -h option for help\n"); + if (argc < 3) { + errmsg("too few arguments (use -h for help)"); return -1; } libubi = libubi_open(); if (libubi == NULL) { - perror("Cannot open libubi"); + errmsg("cannot open libubi"); + perror("libubi_open"); return -1; } err = param_sanity_check(&myargs, libubi); - if (err) { - perror("Input parameters check"); - fprintf(stderr, "Use -h option for help\n"); + if (err) goto out_libubi; - } err = ubi_rmvol(libubi, myargs.node, myargs.vol_id); - old_errno = errno; - if (err < 0) { - perror("Cannot remove volume"); - fprintf(stderr, " err=%d errno=%d\n", err, old_errno); + if (err) { + errmsg("cannot UBI remove volume"); + perror("ubi_rmvol"); goto out_libubi; } |