]> www.infradead.org Git - mtd-utils.git/commitdiff
ubi-tools: sanify old and new tools a bit
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Wed, 20 Feb 2008 16:00:42 +0000 (18:00 +0200)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Wed, 20 Feb 2008 17:21:31 +0000 (19:21 +0200)
This commit adds compatible options to new ubimkvol, ubirmvol,
and ubiupdatevol and deletes corresponding old utilities.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
16 files changed:
ubi-utils/Makefile
ubi-utils/new-utils/Makefile
ubi-utils/new-utils/README
ubi-utils/new-utils/src/common.c
ubi-utils/new-utils/src/ubiattach.c [moved from ubi-utils/new-utils/src/ubi-attach.c with 99% similarity]
ubi-utils/new-utils/src/ubicrc32.c [moved from ubi-utils/new-utils/src/ubi-crc32.c with 98% similarity]
ubi-utils/new-utils/src/ubidetach.c [moved from ubi-utils/new-utils/src/ubi-detach.c with 99% similarity]
ubi-utils/new-utils/src/ubimkvol.c [moved from ubi-utils/new-utils/src/ubi-mkvol.c with 84% similarity]
ubi-utils/new-utils/src/ubinfo.c [moved from ubi-utils/new-utils/src/ubi-info.c with 99% similarity]
ubi-utils/new-utils/src/ubinize.c [moved from ubi-utils/new-utils/src/ubi-nize.c with 99% similarity]
ubi-utils/new-utils/src/ubirmvol.c [moved from ubi-utils/new-utils/src/ubi-rmvol.c with 70% similarity]
ubi-utils/new-utils/src/ubiupdatevol.c [moved from ubi-utils/new-utils/src/ubi-update.c with 76% similarity]
ubi-utils/src/ubicrc32.c [deleted file]
ubi-utils/src/ubimkvol.c [deleted file]
ubi-utils/src/ubirmvol.c [deleted file]
ubi-utils/src/ubiupdatevol.c [deleted file]

index 7c573e0d682b622da22be0c69e0014d9153f444f..8c1994c2f61be82d6f30507b21ecfa55c618b968 100644 (file)
@@ -14,8 +14,11 @@ CFLAGS := -I./inc -I./src -I$(KERNELHDR) $(OPTFLAGS) -Werror \
        -Wwrite-strings -W -std=gnu99 -DPACKAGE_VERSION=\"1.0\"
 
 PERLPROGS = mkpfi ubicrc32.pl
-TARGETS = ubiupdatevol ubimkvol ubirmvol pfiflash pddcustomize ubimirror \
-       bin2nand nand2bin ubigen mkbootenv unubi pfi2bin ubicrc32
+
+NTARGETS = ubiattach ubicrc32 ubidetach ubimkvol ubinfo ubinize \
+       ubirmvol ubiupdatevol
+TARGETS = pfiflash pddcustomize ubimirror bin2nand nand2bin ubigen \
+       mkbootenv unubi pfi2bin $(NTARGETS)
 
 vpath   %.c ./src
 
@@ -31,19 +34,14 @@ all: $(TARGETS)
 IGNORE=${wildcard .*.c.dep}
 -include ${IGNORE}
 
+$(NTARGETS):
+       make -C new-utils $@
+       mv new-utils/$@ $@
+
 clean:
        rm -rf *.o $(TARGETS) .*.c.dep
        make -C new-utils clean
 
-ubiupdatevol: ubiupdatevol.o error.o libubi.o
-       $(CC) $(LDFLAGS) -o $@ $^
-
-ubimkvol: ubimkvol.o error.o libubi.o
-       $(CC) $(LDFLAGS) -o $@ $^
-
-ubirmvol: ubirmvol.o error.o libubi.o
-       $(CC) $(LDFLAGS) -o $@ $^
-
 pddcustomize: pddcustomize.o error.o libubimirror.o bootenv.o hashmap.o \
                libubi.o crc32.o
        $(CC) $(LDFLAGS) -o $@ $^
@@ -75,17 +73,12 @@ pfi2bin: pfi2bin.o peb.o error.o list.o crc32.o libubigen.o bootenv.o \
                hashmap.o reader.o pfi.o
        $(CC) $(LDFLAGS) -o $@ $^
 
-ubicrc32: ubicrc32.o crc32.o
-       $(CC) $(LDFLAGS) -o $@ $^
-
 install: ${TARGETS}
        mkdir -p ${DESTDIR}/${SBINDIR}
        install -m0755 ${TARGETS} ${DESTDIR}/${SBINDIR}/
        (cd perl && install ${PERLPROGS} ${DESTDIR}/${SBINDIR}/)
-       make -C new-utils install
 
 uninstall:
        for file in ${TARGETS} ${PERLPROGS}; do \
                $(RM) ${DESTDIR}/${SBINDIR}/$$file; \
        done
-       make -C new-utils uninstall
index fe60ffea8655e8812feab07b1ecfe5012f7fc2af..2d073a91c63002a99101d059023d7b2e81b7223c 100644 (file)
@@ -13,8 +13,8 @@ CC := $(CROSS)gcc
 CFLAGS := -Iinclude -Isrc -I$(KERNELHDR) $(OPTFLAGS) -Werror -Wall
 
 LIBS = libubi libubigen libiniparser
-UTILS = ubi-update ubi-mkvol ubi-rmvol ubi-crc32 ubi-info ubi-attach \
-        ubi-detach ubi-nize
+UTILS = ubiupdatevol ubimkvol ubirmvol ubicrc32 ubinfo ubiattach \
+        ubidetach ubinize
 
 vpath %.c src
 
@@ -32,10 +32,10 @@ all: $(UTILS)
 %: libubi %.o common.o
        $(CC) $(CFLAGS) $(filter %.o, $^) -L. -lubi -o $@
 
-ubi-crc32: ubi-crc32.o crc32.o
+ubicrc32: ubicrc32.o crc32.o
        $(CC) $(CFLAGS) -o $@ $^
 
-ubi-nize: ubi-nize.o common.o crc32.o libiniparser libubigen
+ubinize: ubinize.o common.o crc32.o libiniparser libubigen
        $(CC) $(CFLAGS) $(filter %.o, $^) -L. -liniparser -lubigen -o $@
 
 libubi: libubi.o
index 7113b6948dbf70751c10b4522c15871a44820e21..41c59576261475f1c6c61d4fecc782e39f4a2db9 100644 (file)
@@ -1,7 +1,6 @@
 This directory contains a new UBI toolchain which is intended to replace
-the old one. All the utilities start with "ubi-" to distinguish them from
-the old utilities. All support "-h" option which prints sufficient usage
-information. See the MTD web-site for more information.
+the old one. All utilities support "-h" option which prints sufficient
+usage information. See the MTD web-site for more information.
 
 Motivation for new tool-chain.
 
index fec640d783b012dcb862ab0d5fd35c1d32a3eeba..50859dc1eb135e1c67d7a1d70f1ead90218d3868 100644 (file)
@@ -52,6 +52,24 @@ static int get_multiplier(const char *str)
        if (!strcmp(str, "GiB"))
                return 1024 * 1024 * 1024;
 
+       /* Handle deprecated stuff */
+       if (!strcmp(str, "KB") || !strcmp(str, "Kib") || !strcmp(str, "kib") ||
+           !strcmp(str, "kiB")) {
+               fprintf(stderr, "Warning: use \"KiB\" instead of \"%s\" to "
+                       "specify Kilobytes - support will be removed\n", str);
+               return 1024;
+       }
+       if (!strcmp(str, "MB") || !strcmp(str, "Mib") || !strcmp(str, "mb")) {
+               fprintf(stderr, "Warning: use \"MiB\" instead of \"%s\", "
+                       "this support will be removed\n", str);
+               return 1024*1024;
+       }
+       if (!strcmp(str, "GB") || !strcmp(str, "Gib") || !strcmp(str, "gb")) {
+               fprintf(stderr, "Warning: use \"GiB\" instead of \"%s\", "
+                       "this support will be removed\n", str);
+               return 1024*1024*1024;
+       }
+
        return -1;
 }
 
similarity index 99%
rename from ubi-utils/new-utils/src/ubi-attach.c
rename to ubi-utils/new-utils/src/ubiattach.c
index 7b231a634a12a118b25b50ce79e003fdfba69760..b3d768a2f4796f6d4be75da8e2aa8201b0b1711d 100644 (file)
@@ -31,7 +31,7 @@
 #include "common.h"
 
 #define PROGRAM_VERSION "1.0"
-#define PROGRAM_NAME    "ubi-attach"
+#define PROGRAM_NAME    "ubiattach"
 
 /* The variables below are set by command line arguments */
 struct args {
similarity index 98%
rename from ubi-utils/new-utils/src/ubi-crc32.c
rename to ubi-utils/new-utils/src/ubicrc32.c
index d3d313604dd575466a29dc5699f6eb82aebbaf97..100b3cd4722fc1004852f4cc70590d8968306e53 100644 (file)
@@ -36,7 +36,7 @@
 #define BUFSIZE 4096
 
 #define PROGRAM_VERSION "1.0"
-#define PROGRAM_NAME    "ubi-crc32"
+#define PROGRAM_NAME    "ubicrc32"
 
 static const char *doc = PROGRAM_NAME " version " PROGRAM_VERSION
                         " - a tool to calculate CRC32 with UBI start value (0xFFFFFFFF)";
similarity index 99%
rename from ubi-utils/new-utils/src/ubi-detach.c
rename to ubi-utils/new-utils/src/ubidetach.c
index 0ee7954c552e739f2ab565cf417dd2018c58f136..cd4836811e97991673a3d7f60f15a496c3f5a365 100644 (file)
@@ -31,7 +31,7 @@
 #include "common.h"
 
 #define PROGRAM_VERSION "1.0"
-#define PROGRAM_NAME    "ubi-detach"
+#define PROGRAM_NAME    "ubidetach"
 
 /* The variables below are set by command line arguments */
 struct args {
similarity index 84%
rename from ubi-utils/new-utils/src/ubi-mkvol.c
rename to ubi-utils/new-utils/src/ubimkvol.c
index 49d19052f0276f12dd6d2e0dcddd5a0ea3ee4f9d..7da788bd2316bbf40b239517f4f3458e0a5549d3 100644 (file)
@@ -33,7 +33,7 @@
 #include "common.h"
 
 #define PROGRAM_VERSION "1.0"
-#define PROGRAM_NAME    "ubi-mkvol"
+#define PROGRAM_NAME    "ubimkvol"
 
 /* The variables below are set by command line arguments */
 struct args {
@@ -46,6 +46,9 @@ struct args {
        int nlen;
        const char *node;
        int maxavs;
+       /* For deprecated -d option handling */
+       int devn;
+       char dev_name[256];
 };
 
 static struct args args = {
@@ -54,10 +57,7 @@ static struct args args = {
        .lebs = -1,
        .alignment = 1,
        .vol_id = UBI_VOL_NUM_AUTO,
-       .name = NULL,
-       .nlen = 0,
-       .node = NULL,
-       .maxavs = 0,
+       .devn = -1,
 };
 
 static const char *doc = PROGRAM_NAME " version " PROGRAM_VERSION
@@ -74,8 +74,13 @@ static const char *optionsstr =
 "                              eraseblocks\n"
 "-m, --maxavsize               set volume size to maximum available size\n"
 "-t, --type=<static|dynamic>   volume type (dynamic, static), default is dynamic\n"
-"-h, --help                    print help message\n"
-"-V, --version                 print program version";
+"-h, -?, --help                print help message\n"
+"-V, --version                 print program version\n\n"
+"The following is a compatibility option which is deprecated, do not use it\n"
+"-d, --devn=<devn>             UBI device number - may be used instead of the UBI\n"
+"                              device node name in which case the utility assumes\n"
+"                              that the device node is \"/dev/ubi<devn>\"";
+
 
 static const char *usage =
 "Usage: " PROGRAM_NAME " <UBI device node file name> [-h] [-a <alignment>] [-n <volume ID>] [-N <name>]\n"
@@ -96,6 +101,8 @@ static const struct option long_options[] = {
        { .name = "help",      .has_arg = 0, .flag = NULL, .val = 'h' },
        { .name = "version",   .has_arg = 0, .flag = NULL, .val = 'V' },
        { .name = "maxavsize", .has_arg = 0, .flag = NULL, .val = 'm' },
+       /* Deprecated -d option */
+       { .name = "devn",      .has_arg = 1, .flag = NULL, .val = 'd' },
        { NULL, 0, NULL, 0},
 };
 
@@ -127,7 +134,7 @@ static int parse_opt(int argc, char * const argv[])
                int key;
                char *endp;
 
-               key = getopt_long(argc, argv, "a:n:N:s:S:t:hVm", long_options, NULL);
+               key = getopt_long(argc, argv, "a:n:N:s:S:t:h?Vmd:", long_options, NULL);
                if (key == -1)
                        break;
 
@@ -165,12 +172,21 @@ static int parse_opt(int argc, char * const argv[])
                                return errmsg("bad volume ID: " "\"%s\"", optarg);
                        break;
 
+               case 'd':
+                       /* Handle deprecated -d option */
+                       warnmsg("-d is depricated and will be removed, do not use it");
+                       args.devn = strtoul(optarg, &endp, 0);
+                       if (*endp != '\0' || endp == optarg || args.devn < 0)
+                               return errmsg("bad UBI device number: " "\"%s\"", optarg);
+                       break;
+
                case 'N':
                        args.name = optarg;
                        args.nlen = strlen(args.name);
                        break;
 
                case 'h':
+               case '?':
                        fprintf(stderr, "%s\n\n", doc);
                        fprintf(stderr, "%s\n\n", usage);
                        fprintf(stderr, "%s\n", optionsstr);
@@ -193,12 +209,18 @@ static int parse_opt(int argc, char * const argv[])
                }
        }
 
-       if (optind == argc)
-               return errmsg("UBI device name was not specified (use -h for help)");
-       else if (optind != argc - 1)
-               return errmsg("more then one UBI device specified (use -h for help)");
-
-       args.node = argv[optind];
+       /* Handle deprecated -d option */
+       if (args.devn != -1) {
+               sprintf(args.dev_name, "/dev/ubi%d", args.devn);
+               args.node = args.dev_name;
+       } else {
+               if (optind == argc)
+                       return errmsg("UBI device name was not specified (use -h for help)");
+               else if (optind != argc - 1)
+                       return errmsg("more then one UBI device specified (use -h for help)");
+
+               args.node = argv[optind];
+       }
 
        if (param_sanity_check())
                return -1;
similarity index 99%
rename from ubi-utils/new-utils/src/ubi-info.c
rename to ubi-utils/new-utils/src/ubinfo.c
index d469a1a6e9477eadb1d1e3f0a34c6dc4c39fc264..185caae9643b0e5438465c946427b96b95bcc530 100644 (file)
@@ -31,7 +31,7 @@
 #include "common.h"
 
 #define PROGRAM_VERSION "1.0"
-#define PROGRAM_NAME    "ubi-nfo"
+#define PROGRAM_NAME    "ubinfo"
 
 /* The variables below are set by command line arguments */
 struct args {
similarity index 99%
rename from ubi-utils/new-utils/src/ubi-nize.c
rename to ubi-utils/new-utils/src/ubinize.c
index 532b19343a427a5b59c2c353b6829821870d604f..a78199e3a0c9562fc61b3f1f050d3232b8380993 100644 (file)
@@ -37,7 +37,7 @@
 #include "common.h"
 
 #define PROGRAM_VERSION "1.0"
-#define PROGRAM_NAME    "ubi-nize"
+#define PROGRAM_NAME    "ubinize"
 
 static const char *doc = PROGRAM_NAME " version " PROGRAM_VERSION
 " - a tool to generate UBI images. An UBI image may contain one or more UBI "
similarity index 70%
rename from ubi-utils/new-utils/src/ubi-rmvol.c
rename to ubi-utils/new-utils/src/ubirmvol.c
index 72bf0697f207098f6a00c426defe0344b8b1be8f..5822aa079062a383e633187acdbac9c63481ad2e 100644 (file)
 #include "common.h"
 
 #define PROGRAM_VERSION "1.0"
-#define PROGRAM_NAME    "ubi-rmvol"
+#define PROGRAM_NAME    "ubirmvol"
 
 /* The variables below are set by command line arguments */
 struct args {
        int vol_id;
        const char *node;
+       /* For deprecated -d option handling */
+       int devn;
+       char dev_name[256];
 };
 
 static struct args args = {
        .vol_id = -1,
-       .node = NULL,
+       .devn = -1,
 };
 
 static const char *doc = PROGRAM_NAME " version " PROGRAM_VERSION
                                 " - a tool to remove UBI volumes.";
 
 static const char *optionsstr =
-"  -n, --vol_id=<volume id>   volume ID to remove\n"
-"  -h, --help                 print help message\n"
-"  -V, --version              print program version";
+"-n, --vol_id=<volume id>   volume ID to remove\n"
+"-h, -?, --help             print help message\n"
+"-V, --version              print program version\n\n"
+"The following is a compatibility option which is deprecated, do not use it\n"
+"-d, --devn=<devn>          UBI device number - may be used instead of the UBI\n"
+"                           device node name in which case the utility assumes\n"
+"                           that the device node is \"/dev/ubi<devn>\"";
 
 static const char *usage =
 "Usage: " PROGRAM_NAME " <UBI device node file name> [-n <volume id>] [--vol_id=<volume id>] [-h] [--help]\n\n"
@@ -63,6 +70,8 @@ static const struct option long_options[] = {
        { .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' },
+       /* Deprecated -d option */
+       { .name = "devn",    .has_arg = 1, .flag = NULL, .val = 'd' },
        { NULL, 0, NULL, 0},
 };
 
@@ -82,7 +91,7 @@ static int parse_opt(int argc, char * const argv[])
                int key;
                char *endp;
 
-               key = getopt_long(argc, argv, "n:hV", long_options, NULL);
+               key = getopt_long(argc, argv, "n:h?Vd:", long_options, NULL);
                if (key == -1)
                        break;
 
@@ -97,11 +106,20 @@ static int parse_opt(int argc, char * const argv[])
                        break;
 
                case 'h':
+               case '?':
                        fprintf(stderr, "%s\n\n", doc);
                        fprintf(stderr, "%s\n\n", usage);
                        fprintf(stderr, "%s\n", optionsstr);
                        exit(EXIT_SUCCESS);
 
+               case 'd':
+                       /* Handle deprecated -d option */
+                       warnmsg("-d is depricated and will be removed, do not use it");
+                       args.devn = strtoul(optarg, &endp, 0);
+                       if (*endp != '\0' || endp == optarg || args.devn < 0)
+                               return errmsg("bad UBI device number: " "\"%s\"", optarg);
+                       break;
+
                case 'V':
                        fprintf(stderr, "%s\n", PROGRAM_VERSION);
                        exit(EXIT_SUCCESS);
@@ -116,15 +134,22 @@ static int parse_opt(int argc, char * const argv[])
                }
        }
 
-       if (optind == argc) {
-               errmsg("UBI device name was not specified (use -h for help)");
-               return -1;
-       } else if (optind != argc - 1) {
-               errmsg("more then one UBI device specified (use -h for help)");
-               return -1;
+       /* Handle deprecated -d option */
+       if (args.devn != -1) {
+               sprintf(args.dev_name, "/dev/ubi%d", args.devn);
+               args.node = args.dev_name;
+       } else {
+               if (optind == argc) {
+                       errmsg("UBI device name was not specified (use -h for help)");
+                       return -1;
+               } else if (optind != argc - 1) {
+                       errmsg("more then one UBI device specified (use -h for help)");
+                       return -1;
+               }
+
+               args.node = argv[optind];
        }
 
-       args.node = argv[optind];
 
        if (param_sanity_check())
                return -1;
similarity index 76%
rename from ubi-utils/new-utils/src/ubi-update.c
rename to ubi-utils/new-utils/src/ubiupdatevol.c
index bf548a977ba07a7a52938ef831cb46f29720497f..76d9f4eb54051bd4f44d6a784949f6a6537faef9 100644 (file)
 #include <libubi.h>
 #include "common.h"
 
-#define PROGRAM_VERSION "1.0"
-#define PROGRAM_NAME    "ubi-update"
+#define PROGRAM_VERSION "1.1"
+#define PROGRAM_NAME    "ubiupdatevol"
 
 struct args {
        int truncate;
        const char *node;
        const char *img;
+       /* For deprecated -d and -B options handling */
+       int devn;
+       char dev_name[256];
+       int broken_update;
 };
 
 static struct args args = {
-       .truncate = 0,
-       .node = NULL,
-       .img = NULL,
+       .devn = -1,
 };
 
 static const char *doc = PROGRAM_NAME " version " PROGRAM_VERSION
@@ -59,11 +61,16 @@ static const char *optionsstr =
 "-n, --vol_id=<volume id>   ID of UBI volume to update\n"
 "-t, --truncate             truncate volume (wipe it out)\n"
 "-h, --help                 print help message\n"
-"-V, --version              print program version";
+"-V, --version              print program version\n\n"
+"The following are compatibility options which are deprecated, do not use them\n"
+"-d, --devn=<devn>          UBI device number - may be used instead of the UBI\n"
+"                           device node name in which case the utility assumes\n"
+"                           that the device node is \"/dev/ubi<devn>\"\n"
+"-B, --broken-update        broken update, this is for testing";
 
 static const char *usage =
 "Usage: " PROGRAM_NAME " <UBI volume node file name> [-t] [-h] [-V] [--truncate] [--help]\n"
-"\t\t[--version] <image file>\n\n"
+"\t\t\t[--version] <image file>\n\n"
 "Example 1: " PROGRAM_NAME " /dev/ubi0_1 fs.img - write file \"fs.img\" to UBI volume /dev/ubi0_1\n"
 "Example 2: " PROGRAM_NAME " /dev/ubi0_1 -t - wipe out UBI volume /dev/ubi0_1";
 
@@ -71,6 +78,9 @@ struct option long_options[] = {
        { .name = "truncate", .has_arg = 0, .flag = NULL, .val = 't' },
        { .name = "help",     .has_arg = 0, .flag = NULL, .val = 'h' },
        { .name = "version",  .has_arg = 0, .flag = NULL, .val = 'V' },
+       /* Deprecated -d and -B options */
+       { .name = "devn",     .has_arg = 1, .flag = NULL, .val = 'd' },
+       { .name = "broken-update", .has_arg = 1, .flag = NULL, .val = 'B' },
        { NULL, 0, NULL, 0}
 };
 
@@ -79,7 +89,7 @@ static int parse_opt(int argc, char * const argv[])
        while (1) {
                int key;
 
-               key = getopt_long(argc, argv, "n:thV", long_options, NULL);
+               key = getopt_long(argc, argv, "n:th?Vd:", long_options, NULL);
                if (key == -1)
                        break;
 
@@ -89,11 +99,30 @@ static int parse_opt(int argc, char * const argv[])
                        break;
 
                case 'h':
+               case '?':
                        fprintf(stderr, "%s\n\n", doc);
                        fprintf(stderr, "%s\n\n", usage);
                        fprintf(stderr, "%s\n", optionsstr);
                        exit(EXIT_SUCCESS);
 
+               case 'd':
+               {
+                       char *endp;
+
+                       /* Handle deprecated -d option */
+                       warnmsg("-d is depricated and will be removed, do not use it");
+                       args.devn = strtoul(optarg, &endp, 0);
+                       if (*endp != '\0' || endp == optarg || args.devn < 0)
+                               return errmsg("bad UBI device number: " "\"%s\"", optarg);
+                       break;
+               }
+
+               case 'B':
+                       /* Handle deprecated -B option */
+                       warnmsg("-B is depricated and will be removed, do not use it");
+                       args.broken_update = 1;
+                       break;
+
                case 'V':
                        fprintf(stderr, "%s\n", PROGRAM_VERSION);
                        exit(EXIT_SUCCESS);
@@ -107,11 +136,17 @@ static int parse_opt(int argc, char * const argv[])
                }
        }
 
-       if (optind == argc)
-               return errmsg("UBI device name was not specified (use -h for help)");
-       else if (optind != argc - 2)
-               return errmsg("specify UBI device name and image file name as first 2 "
-                             "parameters (use -h for help)");
+       /* Handle deprecated -d option */
+       if (args.devn != -1) {
+               sprintf(args.dev_name, "/dev/ubi%d", args.devn);
+               args.node = args.dev_name;
+       } else {
+               if (optind == argc)
+                       return errmsg("UBI device name was not specified (use -h for help)");
+               else if (optind != argc - 2)
+                       return errmsg("specify UBI device name and image file name as first 2 "
+                                     "parameters (use -h for help)");
+       }
 
        args.node = argv[optind];
        args.img  = argv[optind + 1];
@@ -187,6 +222,10 @@ static int update_volume(libubi_t libubi, struct ubi_vol_info *vol_info)
                goto out_free;
        }
 
+       /* A hack to handle deprecated -B option */
+       if (args.broken_update)
+               bytes = 1;
+
        fd = open(args.node, O_RDWR);
        if (fd == -1) {
                sys_errmsg("cannot open UBI volume \"%s\"", args.node);
diff --git a/ubi-utils/src/ubicrc32.c b/ubi-utils/src/ubicrc32.c
deleted file mode 100644 (file)
index 7e3f045..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) International Business Machines Corp., 2006
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * Author: Oliver Lohmann
- *
- * Calculate CRC32 with UBI start value for a given binary image.
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <getopt.h>
-#include <argp.h>
-#include <unistd.h>
-#include <errno.h>
-#include <mtd/ubi-header.h>
-
-#include "config.h"
-#include "crc32.h"
-
-#define BUFSIZE 4096
-
-const char *argp_program_version = PACKAGE_VERSION;
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
-static char doc[] = "\nVersion: " PACKAGE_VERSION "\n"
-       "ubicrc32 - calculates the UBI CRC32 value and prints it to stdout.\n";
-
-static const char copyright [] __attribute__((unused)) =
-       "FIXME: insert license type"; /* FIXME */
-
-
-static struct argp_option options[] = {
-       { name: "copyright", key: 'c', arg: NULL,    flags: 0,
-         doc: "Print copyright information.",
-         group: 1 },
-
-       { name: NULL, key: 0, arg: NULL, flags: 0, doc: NULL, group: 0 },
-};
-
-typedef struct myargs {
-       FILE* fp_in;
-
-       char *arg1;
-       char **options;                 /* [STRING...] */
-} myargs;
-
-static error_t
-parse_opt(int key, char *arg, struct argp_state *state)
-{
-       int err = 0;
-
-       myargs *args = state->input;
-
-       switch (key) {
-       case 'c':
-               fprintf(stderr, "%s\n", copyright);
-               exit(0);
-               break;
-       case ARGP_KEY_ARG:
-               args->fp_in = fopen(arg, "rb");
-               if ((args->fp_in) == NULL) {
-                       fprintf(stderr,
-                       "Cannot open file %s for input\n", arg);
-                       exit(1);
-               }
-               args->arg1 = arg;
-               args->options = &state->argv[state->next];
-               state->next = state->argc;
-               break;
-       case ARGP_KEY_END:
-               if (err) {
-                       fprintf(stderr, "\n");
-                       argp_usage(state);
-                       exit(1);
-               }
-               break;
-       default:
-               return(ARGP_ERR_UNKNOWN);
-       }
-
-       return 0;
-}
-
-static struct argp argp = {
-       options:     options,
-       parser:      parse_opt,
-       args_doc:    "[file]",
-       doc:         doc,
-       children:    NULL,
-       help_filter: NULL,
-       argp_domain: NULL,
-};
-
-int
-main(int argc, char **argv) {
-       int rc = 0;
-       uint32_t crc32_table[256];
-       uint8_t buf[BUFSIZE];
-       size_t read;
-       uint32_t crc32;
-
-       myargs args = {
-               .fp_in = stdin,
-               .arg1 = NULL,
-               .options = NULL,
-       };
-
-       argp_parse(&argp, argc, argv, ARGP_IN_ORDER, 0, &args);
-
-       init_crc32_table(crc32_table);
-       crc32 = UBI_CRC32_INIT;
-       while (!feof(args.fp_in)) {
-               read = fread(buf, 1, BUFSIZE, args.fp_in);
-               if (ferror(args.fp_in)) {
-                       fprintf(stderr, "I/O Error.");
-                       exit(EXIT_FAILURE);
-               }
-               crc32 = clc_crc32(crc32_table, crc32, buf, read);
-       }
-
-       if (args.fp_in != stdin) {
-               fclose(args.fp_in);
-       }
-
-       fprintf(stdout, "0x%08x\n", crc32);
-       return rc;
-}
diff --git a/ubi-utils/src/ubimkvol.c b/ubi-utils/src/ubimkvol.c
deleted file mode 100644 (file)
index bff6068..0000000
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright (c) International Business Machines Corp., 2006
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- * An utility to create UBI volumes.
- *
- * Author: Artem B. Bityutskiy <dedekind@linutronix.de>
- *         Frank Haverkamp <haver@vnet.ibm.com>
- *
- * 1.0 Initial release
- * 1.1 Does not support erase blocks anymore. This is replaced by
- *     the number of bytes.
- * 1.2 Reworked the user-interface to use argp.
- * 1.3 Removed argp because we want to use uClibc.
- * 1.4 Minor cleanups
- * 1.5 Use a different libubi
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <getopt.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include <config.h>
-#include <libubi.h>
-
-#define PROGRAM_VERSION "1.5"
-
-/*
- * The variables below are set by command line arguments.
- */
-struct args {
-       int devn;
-       int vol_id;
-       int vol_type;
-       long long bytes;
-       int alignment;
-       char *name;
-       int nlen;
-       char node[256];
-       int maxavs;
-
-       /* special stuff needed to get additional arguments */
-       char *arg1;
-       char **options;         /* [STRING...] */
-};
-
-static struct args myargs = {
-       .vol_type = UBI_DYNAMIC_VOLUME,
-       .devn = -1,
-       .bytes = 0,
-       .alignment = 1,
-       .vol_id = UBI_VOL_NUM_AUTO,
-       .name = NULL,
-       .nlen = 0,
-       .maxavs = 0,
-};
-
-static int param_sanity_check(struct args *args, libubi_t libubi);
-
-static char doc[] = "\nVersion: " PROGRAM_VERSION "\n"
-       "ubinkvol - make UBI Volume.\n";
-
-static const char *optionsstr =
-"  -a, --alignment=<alignment>   volume alignment (default is 1)\n"
-"  -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"
-"  -N, --name=<name>          volume name\n"
-"  -s, --size=<bytes>         volume size volume size in bytes, kilobytes (KiB)\n"
-"                             or megabytes (MiB)\n"
-"  -m, --maxavsize            set volume size to maximum available size\n"
-"  -t, --type=<static|dynamic>   volume type (dynamic, static), default is\n"
-"                             dynamic\n"
-"  -?, --help                 Give this help list\n"
-"      --usage                Give a short usage message\n"
-"  -V, --version              Print program version\n";
-
-static const char *usage =
-"Usage: ubimkvol [-?V] [-a <alignment>] [-d <devn>] [-n <volume id>]\n"
-"            [-N <name>] [-s <bytes>] [-t <static|dynamic>] [-m]\n"
-"            [--alignment=<alignment>] [--devn=<devn>] [--vol_id=<volume id>]\n"
-"            [--name=<name>] [--size=<bytes>] [--type=<static|dynamic>] [--help]\n"
-"            [--usage] [--version] [--maxavsize]\n";
-
-struct option long_options[] = {
-       { .name = "alignment", .has_arg = 1, .flag = NULL, .val = 'a' },
-       { .name = "devn", .has_arg = 1, .flag = NULL, .val = 'd' },
-       { .name = "vol_id", .has_arg = 1, .flag = NULL, .val = 'n' },
-       { .name = "name", .has_arg = 1, .flag = NULL, .val = 'N' },
-       { .name = "size", .has_arg = 1, .flag = NULL, .val = 's' },
-       { .name = "type", .has_arg = 1, .flag = NULL, .val = 't' },
-       { .name = "help", .has_arg = 0, .flag = NULL, .val = '?' },
-       { .name = "usage", .has_arg = 0, .flag = NULL, .val = 0 },
-       { .name = "version", .has_arg = 0, .flag = NULL, .val = 'V' },
-       { .name = "maxavsize", .has_arg = 0, .flag = NULL, .val = 'm' },
-       { 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)
-{
-       char *endp;
-
-       while (1) {
-               int key;
-
-               key = getopt_long(argc, argv, "a:d:n:N:s:t:?Vm", long_options, NULL);
-               if (key == -1)
-                       break;
-
-               switch (key) {
-                       case 't':
-                               if (!strcmp(optarg, "dynamic"))
-                                       args->vol_type = UBI_DYNAMIC_VOLUME;
-                               else if (!strcmp(optarg, "static"))
-                                       args->vol_type = UBI_STATIC_VOLUME;
-                               else {
-                                       fprintf(stderr,
-                                               "Bad volume type: \"%s\"\n",
-                                               optarg);
-                                       goto out;
-                               }
-                               break;
-                       case 's':
-                               args->bytes = strtoull(optarg, &endp, 0);
-                               if (endp == optarg || args->bytes < 0) {
-                                       fprintf(stderr,
-                                               "Bad volume size: \"%s\"\n",
-                                               optarg);
-                                       goto out;
-                               }
-                               if (endp != '\0') {
-                                       if (strcmp(endp, "KiB") == 0)
-                                               args->bytes *= 1024;
-                                       else if (strcmp(endp, "MiB") == 0)
-                                               args->bytes *= 1024*1024;
-                               }
-                               break;
-                       case 'a':
-                               args->alignment = strtoul(optarg, &endp, 0);
-                               if (*endp != '\0' || endp == optarg ||
-                                               args->alignment <= 0) {
-                                       fprintf(stderr, "Bad volume alignment: "
-                                                       "\"%s\"\n", optarg);
-                                       goto out;
-                               }
-                               break;
-                       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 'N':
-                               args->name = optarg;
-                               args->nlen = strlen(args->name);
-                               break;
-
-                       case ':':
-                               fprintf(stderr, "Parameter is missing\n");
-                               goto out;
-
-                       case '?': /* help */
-                               fprintf(stderr,
-                                       "Usage: ubimkvol [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;
-
-                       case 'm':
-                               args->maxavs = 1;
-                               break;
-
-                       default:
-                               fprintf(stderr, "%s", usage);
-                               exit(-1);
-               }
-       }
-
-       return 0;
- out:
-       return -1;
-}
-
-static int param_sanity_check(struct args *args, libubi_t libubi)
-{
-       int err, len;
-       struct ubi_info ubi;
-
-       if (args->bytes == 0 && !args->maxavs) {
-               fprintf(stderr, "Volume size was not specified\n");
-               goto out;
-       }
-
-       if (args->name == NULL) {
-               fprintf(stderr, "Volume name was not specified\n");
-               goto out;
-       }
-
-       err = ubi_get_info(libubi, &ubi);
-       if (err)
-               return -1;
-
-       if (args->devn >= (int)ubi.dev_count) {
-               fprintf(stderr, "Device %d does not exist\n", args->devn);
-               goto out;
-       }
-
-       len = strlen(args->name);
-       if (len > UBI_MAX_VOLUME_NAME) {
-               fprintf(stderr, "Too long name (%d symbols), max is %d\n",
-                       len, UBI_MAX_VOLUME_NAME);
-               goto out;
-       }
-
-       return 0;
-out:
-       errno = EINVAL;
-       return -1;
-}
-
-int main(int argc, char * const argv[])
-{
-       int err;
-       libubi_t libubi;
-       struct ubi_mkvol_request req;
-
-       err = parse_opt(argc, (char **)argv, &myargs);
-       if (err) {
-               fprintf(stderr, "Wrong options ...\n");
-               return err == 1 ? 0 : -1;
-       }
-
-       if (myargs.devn == -1) {
-               fprintf(stderr, "Device number was not specified\n");
-               fprintf(stderr, "Use -h option for help\n");
-               return -1;
-       }
-
-       libubi = libubi_open();
-       if (libubi == NULL) {
-               perror("Cannot open libubi");
-               return -1;
-       }
-
-       err = param_sanity_check(&myargs, libubi);
-       if (err) {
-               perror("Input parameters check");
-               fprintf(stderr, "Use -h option for help\n");
-               goto out_libubi;
-       }
-
-       req.vol_id = myargs.vol_id;
-       req.alignment = myargs.alignment;
-
-       if (myargs.maxavs) {
-               struct ubi_dev_info ubi_dev;
-
-               err = ubi_get_dev_info1(libubi, myargs.devn, &ubi_dev);
-               if (err) {
-                       perror("Can't get UBI device info");
-                       goto out_libubi;
-               }
-               req.bytes = ubi_dev.avail_bytes;
-               if (!req.bytes) {
-                       fprintf(stderr, "There is no available free space on device!\n");
-                       goto out_libubi;
-               }
-               printf("Setting the volume size to %lld\n", req.bytes);
-       } else
-               req.bytes = myargs.bytes;
-
-       req.vol_type = myargs.vol_type;
-       req.name = myargs.name;
-
-       err = ubi_mkvol(libubi, myargs.node, &req);
-       if (err < 0) {
-               perror("Cannot create volume");
-               fprintf(stderr, "  err=%d\n", err);
-               goto out_libubi;
-       }
-
-       /*
-        * This is hacky, but we want to wait until udev has created device
-        * nodes. There is probably better way do do this, though.
-        */
-       if (system("udevsettle")) {
-               /* Well, this is to keep GCC silent */
-       }
-
-       /* printf("Created volume %d, %lld bytes, type %s, name %s\n",
-          vol_id, bytes, vol_type == UBI_DYNAMIC_VOLUME ?
-          "dynamic" : "static", name); */
-
-       myargs.vol_id = err;
-       libubi_close(libubi);
-       return 0;
-
-out_libubi:
-       libubi_close(libubi);
-       return -1;
-}
diff --git a/ubi-utils/src/ubirmvol.c b/ubi-utils/src/ubirmvol.c
deleted file mode 100644 (file)
index 6dd16ba..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (c) International Business Machines Corp., 2006
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- * 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
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <getopt.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include <config.h>
-#include <libubi.h>
-
-#define PROGRAM_VERSION "1.4"
-
-/*
- * The below variables are set by command line options.
- */
-struct args {
-       int devn;
-       int vol_id;
-       char node[256];
-
-       /* special stuff needed to get additional arguments */
-       char *arg1;
-       char **options;         /* [STRING...] */
-};
-
-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 *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";
-
-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 },
-       { .name = "version", .has_arg = 0, .flag = NULL, .val = 'V' },
-       { 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)
-{
-       char *endp;
-
-       while (1) {
-               int key;
-
-               key = getopt_long(argc, argv, "d:n:?V", 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);
-               }
-       }
-
-       return 0;
- out:
-       return -1;
-}
-
-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;
-       }
-
-       err = ubi_get_info(libubi, &ubi);
-       if (err)
-               return -1;
-
-       if (args->devn >= (int)ubi.dev_count) {
-               fprintf(stderr, "Device %d does not exist\n", args->devn);
-               goto out;
-       }
-
-       return 0;
-
-out:
-       errno = EINVAL;
-       return -1;
-}
-
-int main(int argc, char * const argv[])
-{
-       int err, old_errno;
-       libubi_t libubi;
-
-       err = parse_opt(argc, (char **)argv, &myargs);
-       if (err)
-               return err == 1 ? 0 : -1;
-
-       if (myargs.devn == -1) {
-               fprintf(stderr, "Device number was not specified\n");
-               fprintf(stderr, "Use -h option for help\n");
-               return -1;
-       }
-
-       libubi = libubi_open();
-       if (libubi == NULL) {
-               perror("Cannot open libubi");
-               return -1;
-       }
-
-       err = param_sanity_check(&myargs, libubi);
-       if (err) {
-               perror("Input parameters check");
-               fprintf(stderr, "Use -h option for help\n");
-               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);
-               goto out_libubi;
-       }
-
-       libubi_close(libubi);
-       return 0;
-
-out_libubi:
-       libubi_close(libubi);
-       return -1;
-}
diff --git a/ubi-utils/src/ubiupdatevol.c b/ubi-utils/src/ubiupdatevol.c
deleted file mode 100644 (file)
index 807b961..0000000
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright (c) International Business Machines Corp., 2006
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- * An utility to update UBI volumes.
- *
- * Author: Frank Haverkamp
- *         Joshua W. Boyer
- *
- * 1.0 Reworked the userinterface to use argp.
- * 1.1 Removed argp parsing because we want to use uClib.
- * 1.2 Minor cleanups
- * 1.3 Use a different libubi
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <getopt.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
-#include <config.h>
-#include <libubi.h>
-
-#define PROGRAM_VERSION "1.3"
-
-#define MAXPATH                1024
-#define BUFSIZE                128 * 1024
-#define MIN(x,y)       ((x)<(y)?(x):(y))
-
-struct args {
-       int devn;
-       int vol_id;
-       int truncate;
-       int broken_update;
-       int bufsize;
-
-       /* special stuff needed to get additional arguments */
-       char *arg1;
-       char **options;         /* [STRING...] */
-};
-
-static struct args myargs = {
-       .devn = -1,
-       .vol_id = -1,
-       .truncate = 0,
-       .broken_update = 0,
-       .bufsize = BUFSIZE,
-       .arg1 = NULL,
-       .options = NULL,
-};
-
-static int verbose = 0;
-
-static char doc[] = "\nVersion: " PROGRAM_VERSION "\n"
-       "ubiupdatevol - write to UBI Volume.\n";
-
-static const char *optionsstr =
-"  -B, --broken-update        broken update, this is for testing\n"
-"  -d, --devn=<devn>          UBI device\n"
-"  -n, --vol_id=<volume id>   UBI volume id\n"
-"  -t, --truncate             truncate volume\n"
-"  -?, --help                 Give this help list\n"
-"      --usage                Give a short usage message\n"
-"  -V, --version              Print program version\n";
-
-static const char *usage =
-"Usage: ubiupdatevol [-Bt?V] [-d <devn>] [-n <volume id>] [--broken-update]\n"
-"            [--devn=<devn>] [--vol_id=<volume id>] [--truncate] [--help]\n"
-"            [--usage] [--version] <image file>\n";
-
-struct option long_options[] = {
-       { .name = "broken-update", .has_arg = 0, .flag = NULL, .val = 'B' },
-       { .name = "devn", .has_arg = 1, .flag = NULL, .val = 'd' },
-       { .name = "vol_id", .has_arg = 1, .flag = NULL, .val = 'n' },
-       { .name = "truncate", .has_arg = 0, .flag = NULL, .val = 't' },
-       { .name = "help", .has_arg = 0, .flag = NULL, .val = '?' },
-       { .name = "usage", .has_arg = 0, .flag = NULL, .val = 0 },
-       { .name = "version", .has_arg = 0, .flag = NULL, .val = 'V' },
-       { NULL, 0, NULL, 0}
-};
-
-/*
- * @brief Parse the arguments passed into the test case.
- */
-static int
-parse_opt(int argc, char **argv, struct args *args)
-{
-       while (1) {
-               int key;
-
-               key = getopt_long(argc, argv, "Bd:n:t?V", long_options, NULL);
-               if (key == -1)
-                       break;
-
-               switch (key) {
-                       case 'v': /* --verbose=<level> */
-                               verbose = strtoul(optarg, (char **)NULL, 0);
-                               break;
-
-                       case 'n': /* --vol_id=<volume id> */
-                               args->vol_id = strtol(optarg, (char **)NULL, 0);
-                               break;
-
-                       case 'd': /* --devn=<device number> */
-                               args->devn = strtol(optarg, (char **)NULL, 0);
-                               break;
-
-                       case 'b': /* --bufsize=<bufsize> */
-                               args->bufsize = strtol(optarg, (char **)NULL, 0);
-                               if (args->bufsize <= 0)
-                                       args->bufsize = BUFSIZE;
-                               break;
-
-                       case 't': /* --truncate */
-                               args->truncate = 1;
-                               break;
-
-                       case 'B': /* --broken-update */
-                               args->broken_update = 1;
-                               break;
-
-                       case '?': /* help */
-                               fprintf(stderr, "Usage: "
-                                       "ubiupdatevol [OPTION...] <image file>\n%s%s"
-                                       "\nReport bugs to %s\n",
-                                       doc, optionsstr, PACKAGE_BUGREPORT);
-                               exit(EXIT_SUCCESS);
-                               break;
-
-                       case 'V':
-                               fprintf(stderr, "%s\n", PROGRAM_VERSION);
-                               exit(0);
-                               break;
-
-                       default:
-                               fprintf(stderr, "%s", usage);
-                               exit(EXIT_FAILURE);
-               }
-       }
-
-       if (optind < argc) {
-               /* only one additional argument required */
-               args->arg1 = argv[optind++];
-       }
-       return 0;
-}
-
-/**
- * @bytes bytes must be always 0, if not 0 this is a testcase for a
- * broken volume update where data is promissed to be written, but for
- * some reason nothing is written. The volume is unusable after this.
- */
-static int
-ubi_truncate_volume(struct args *args, int64_t bytes,libubi_t libubi)
-{
-       int rc, ofd;
-       char path[MAXPATH];
-       int old_errno;
-
-       snprintf(path, MAXPATH-1, "/dev/ubi%d_%d", args->devn, args->vol_id);
-       path[MAXPATH-1] = '\0';
-
-       ofd = open(path, O_RDWR);
-       if (ofd < 0) {
-               fprintf(stderr, "Cannot open volume %s\n", path);
-               exit(EXIT_FAILURE);
-       }
-       rc = ubi_update_start(libubi, ofd, bytes);
-       old_errno = errno;
-       if (rc < 0) {
-               perror("UBI volume update ioctl");
-               fprintf(stderr, "    rc=%d errno=%d\n", rc, old_errno);
-               exit(EXIT_FAILURE);
-       }
-       close(ofd);
-       return 0;
-}
-
-static ssize_t ubi_write(int fd, const void *buf, size_t count)
-{
-       int rc;
-       int len = count;
-
-       while (len) {
-               rc = write(fd, buf, len);
-               if (rc == -1) {
-                       if (errno == EINTR)
-                               continue; /* try again */
-                       perror("write error");
-                       return rc;
-               }
-
-               len -= rc;
-               buf += rc;
-       }
-       return count;
-}
-
-static int
-ubi_update_volume(struct args *args, libubi_t libubi)
-{
-       int rc, ofd;
-       FILE *ifp = NULL;
-       struct stat st;
-       int size = 0;
-       char *fname = args->arg1;
-       char path[MAXPATH];
-       char *buf;
-       int64_t bytes = 0;
-       int old_errno;
-
-       buf = malloc(args->bufsize);
-       if (!buf) {
-               perror("Out of memory");
-               exit(EXIT_FAILURE);
-       }
-
-       if (fname == NULL) {
-               fprintf(stderr, "Please specify an existing image file.\n");
-               exit(EXIT_FAILURE);
-       }
-
-       rc = stat(fname, &st);
-       if (rc < 0) {
-               fprintf(stderr, "Cannot stat input file %s\n", fname);
-               exit(EXIT_FAILURE);
-       }
-       bytes = size = st.st_size;
-
-       ifp = fopen(fname, "r");
-       if (!ifp)
-               exit(EXIT_FAILURE);
-
-       snprintf(path, MAXPATH-1, "/dev/ubi%d_%d", args->devn, args->vol_id);
-       path[MAXPATH-1] = '\0';
-
-       ofd = open(path, O_RDWR);
-       if (ofd < 0) {
-               fprintf(stderr, "Cannot open UBI volume %s\n", path);
-               exit(EXIT_FAILURE);
-       }
-
-       rc = ubi_update_start(libubi, ofd, bytes);
-       old_errno = errno;
-       if (rc < 0) {
-               perror("UBI volume update ioctl");
-               fprintf(stderr, "    rc=%d errno=%d\n", rc, old_errno);
-               exit(EXIT_FAILURE);
-       }
-
-       while (size > 0) {
-               ssize_t tocopy = MIN(args->bufsize, size);
-
-               rc = fread(buf, tocopy, 1, ifp);
-               if (rc != 1) {
-                       perror("Could not read everything.");
-                       exit(EXIT_FAILURE);
-               }
-
-               rc = ubi_write(ofd, buf, tocopy);
-               old_errno = errno;
-               if (rc != tocopy) {
-                       perror("Could not write to device");
-                       fprintf(stderr, "    rc=%d errno=%d\n", rc, old_errno);
-                       exit(EXIT_FAILURE);
-               }
-               size -= tocopy;
-       }
-
-       free(buf);
-       fclose(ifp);
-       rc = close(ofd);
-       if (rc != 0) {
-               perror("UBI volume close failed");
-               exit(EXIT_FAILURE);
-       }
-       return 0;
-}
-
-int
-main(int argc, char *argv[])
-{
-       int rc;
-       libubi_t libubi;
-
-       parse_opt(argc, argv, &myargs);
-
-       libubi = libubi_open();
-       if (libubi == NULL) {
-               perror("Cannot open libubi");
-               return -1;
-       }
-
-       if (myargs.truncate) {
-               rc = ubi_truncate_volume(&myargs, 0LL, libubi);
-               if (rc < 0)
-                       goto out_libubi;
-       }
-       else if (myargs.broken_update) {
-               rc = ubi_truncate_volume(&myargs, 1LL, libubi);
-               if (rc < 0)
-                       goto out_libubi;
-       } else {
-               rc = ubi_update_volume(&myargs, libubi);
-               if (rc < 0)
-                       goto out_libubi;
-       }
-
-       libubi_close(libubi);
-       return 0;
-       
-out_libubi:
-       libubi_close(libubi);
-       return -1;
-}