diff options
-rw-r--r-- | ubi-utils/Makefile | 25 | ||||
-rw-r--r-- | ubi-utils/new-utils/Makefile | 8 | ||||
-rw-r--r-- | ubi-utils/new-utils/README | 5 | ||||
-rw-r--r-- | ubi-utils/new-utils/src/common.c | 18 | ||||
-rw-r--r-- | ubi-utils/new-utils/src/ubiattach.c (renamed from ubi-utils/new-utils/src/ubi-attach.c) | 2 | ||||
-rw-r--r-- | ubi-utils/new-utils/src/ubicrc32.c (renamed from ubi-utils/new-utils/src/ubi-crc32.c) | 2 | ||||
-rw-r--r-- | ubi-utils/new-utils/src/ubidetach.c (renamed from ubi-utils/new-utils/src/ubi-detach.c) | 2 | ||||
-rw-r--r-- | ubi-utils/new-utils/src/ubimkvol.c (renamed from ubi-utils/new-utils/src/ubi-mkvol.c) | 50 | ||||
-rw-r--r-- | ubi-utils/new-utils/src/ubinfo.c (renamed from ubi-utils/new-utils/src/ubi-info.c) | 2 | ||||
-rw-r--r-- | ubi-utils/new-utils/src/ubinize.c (renamed from ubi-utils/new-utils/src/ubi-nize.c) | 2 | ||||
-rw-r--r-- | ubi-utils/new-utils/src/ubirmvol.c (renamed from ubi-utils/new-utils/src/ubi-rmvol.c) | 51 | ||||
-rw-r--r-- | ubi-utils/new-utils/src/ubiupdatevol.c (renamed from ubi-utils/new-utils/src/ubi-update.c) | 65 | ||||
-rw-r--r-- | ubi-utils/src/ubicrc32.c | 141 | ||||
-rw-r--r-- | ubi-utils/src/ubimkvol.c | 354 | ||||
-rw-r--r-- | ubi-utils/src/ubirmvol.c | 229 | ||||
-rw-r--r-- | ubi-utils/src/ubiupdatevol.c | 336 |
16 files changed, 164 insertions, 1128 deletions
diff --git a/ubi-utils/Makefile b/ubi-utils/Makefile index 7c573e0..8c1994c 100644 --- a/ubi-utils/Makefile +++ b/ubi-utils/Makefile @@ -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 diff --git a/ubi-utils/new-utils/Makefile b/ubi-utils/new-utils/Makefile index fe60ffe..2d073a9 100644 --- a/ubi-utils/new-utils/Makefile +++ b/ubi-utils/new-utils/Makefile @@ -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 diff --git a/ubi-utils/new-utils/README b/ubi-utils/new-utils/README index 7113b69..41c5957 100644 --- a/ubi-utils/new-utils/README +++ b/ubi-utils/new-utils/README @@ -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. diff --git a/ubi-utils/new-utils/src/common.c b/ubi-utils/new-utils/src/common.c index fec640d..50859dc 100644 --- a/ubi-utils/new-utils/src/common.c +++ b/ubi-utils/new-utils/src/common.c @@ -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; } diff --git a/ubi-utils/new-utils/src/ubi-attach.c b/ubi-utils/new-utils/src/ubiattach.c index 7b231a6..b3d768a 100644 --- a/ubi-utils/new-utils/src/ubi-attach.c +++ b/ubi-utils/new-utils/src/ubiattach.c @@ -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 { diff --git a/ubi-utils/new-utils/src/ubi-crc32.c b/ubi-utils/new-utils/src/ubicrc32.c index d3d3136..100b3cd 100644 --- a/ubi-utils/new-utils/src/ubi-crc32.c +++ b/ubi-utils/new-utils/src/ubicrc32.c @@ -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)"; diff --git a/ubi-utils/new-utils/src/ubi-detach.c b/ubi-utils/new-utils/src/ubidetach.c index 0ee7954..cd48368 100644 --- a/ubi-utils/new-utils/src/ubi-detach.c +++ b/ubi-utils/new-utils/src/ubidetach.c @@ -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 { diff --git a/ubi-utils/new-utils/src/ubi-mkvol.c b/ubi-utils/new-utils/src/ubimkvol.c index 49d1905..7da788b 100644 --- a/ubi-utils/new-utils/src/ubi-mkvol.c +++ b/ubi-utils/new-utils/src/ubimkvol.c @@ -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; diff --git a/ubi-utils/new-utils/src/ubi-info.c b/ubi-utils/new-utils/src/ubinfo.c index d469a1a..185caae 100644 --- a/ubi-utils/new-utils/src/ubi-info.c +++ b/ubi-utils/new-utils/src/ubinfo.c @@ -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 { diff --git a/ubi-utils/new-utils/src/ubi-nize.c b/ubi-utils/new-utils/src/ubinize.c index 532b193..a78199e 100644 --- a/ubi-utils/new-utils/src/ubi-nize.c +++ b/ubi-utils/new-utils/src/ubinize.c @@ -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 " diff --git a/ubi-utils/new-utils/src/ubi-rmvol.c b/ubi-utils/new-utils/src/ubirmvol.c index 72bf069..5822aa0 100644 --- a/ubi-utils/new-utils/src/ubi-rmvol.c +++ b/ubi-utils/new-utils/src/ubirmvol.c @@ -33,26 +33,33 @@ #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; diff --git a/ubi-utils/new-utils/src/ubi-update.c b/ubi-utils/new-utils/src/ubiupdatevol.c index bf548a9..76d9f4e 100644 --- a/ubi-utils/new-utils/src/ubi-update.c +++ b/ubi-utils/new-utils/src/ubiupdatevol.c @@ -37,19 +37,21 @@ #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 index 7e3f045..0000000 --- a/ubi-utils/src/ubicrc32.c +++ /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 index bff6068..0000000 --- a/ubi-utils/src/ubimkvol.c +++ /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 index 6dd16ba..0000000 --- a/ubi-utils/src/ubirmvol.c +++ /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 index 807b961..0000000 --- a/ubi-utils/src/ubiupdatevol.c +++ /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; -} |