diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2015-02-06 08:59:21 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2015-02-12 09:33:43 +0100 |
commit | 39f6392d93a81daeaaad1496b27fc157d1aa9333 (patch) | |
tree | 003fd4532870bb9d9012d3b54a5efd7ba8948139 /commands | |
parent | 7649473f40fc037263c1c0a9f54ffa5434080d78 (diff) | |
download | barebox-39f6392d93a81daeaaad1496b27fc157d1aa9333.tar.gz barebox-39f6392d93a81daeaaad1496b27fc157d1aa9333.tar.xz |
move cmdline partition parsing code to separate file
So it's no longer local to the addpart/delpart code and can be used
from other code.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands')
-rw-r--r-- | commands/partition.c | 81 |
1 files changed, 4 insertions, 77 deletions
diff --git a/commands/partition.c b/commands/partition.c index ef6d9c9e2c..c95433f3e0 100644 --- a/commands/partition.c +++ b/commands/partition.c @@ -35,82 +35,9 @@ #include <linux/stat.h> #include <libgen.h> #include <getopt.h> +#include <cmdlinepart.h> #include <linux/err.h> -#define SIZE_REMAINING ((ulong)-1) - -#define PART_ADD_DEVNAME (1 << 0) - -static int mtd_part_do_parse_one(char *devname, const char *partstr, - char **endp, loff_t *offset, - loff_t devsize, size_t *retsize, - unsigned int pflags) -{ - loff_t size; - char *end; - char buf[PATH_MAX] = {}; - unsigned long flags = 0; - int ret = 0; - struct cdev *cdev; - - memset(buf, 0, PATH_MAX); - - if (*partstr == '-') { - size = SIZE_REMAINING; - end = (char *)partstr + 1; - } else { - size = strtoull_suffix(partstr, &end, 0); - } - - if (*end == '@') - *offset = strtoull_suffix(end+1, &end, 0); - - if (size == SIZE_REMAINING) - size = devsize - *offset; - - partstr = end; - - if (*partstr == '(') { - partstr++; - end = strchr((char *) partstr, ')'); - if (!end) { - printf("could not find matching ')'\n"); - return -EINVAL; - } - - if (pflags & PART_ADD_DEVNAME) - sprintf(buf, "%s.", devname); - memcpy(buf + strlen(buf), partstr, end - partstr); - - end++; - } - - if (size + *offset > devsize) { - printf("%s: partition end is beyond device\n", buf); - return -EINVAL; - } - - partstr = end; - - if (*partstr == 'r' && *(partstr + 1) == 'o') { - flags |= DEVFS_PARTITION_READONLY; - end = (char *)(partstr + 2); - } - - if (endp) - *endp = end; - - *retsize = size; - - cdev = devfs_add_partition(devname, *offset, size, flags, buf); - if (IS_ERR(cdev)) { - ret = PTR_ERR(cdev); - printf("cannot create %s: %s\n", buf, strerror(-ret)); - } - - return ret; -} - static int do_addpart(int argc, char *argv[]) { char *devname; @@ -119,12 +46,12 @@ static int do_addpart(int argc, char *argv[]) loff_t devsize; struct stat s; int opt; - unsigned int flags = PART_ADD_DEVNAME; + unsigned int flags = CMDLINEPART_ADD_DEVNAME; while ((opt = getopt(argc, argv, "n")) > 0) { switch (opt) { case 'n': - flags &= ~PART_ADD_DEVNAME; + flags &= ~CMDLINEPART_ADD_DEVNAME; break; } } @@ -145,7 +72,7 @@ static int do_addpart(int argc, char *argv[]) while (1) { size_t size = 0; - if (mtd_part_do_parse_one(devname, endp, &endp, &offset, + if (cmdlinepart_do_parse_one(devname, endp, &endp, &offset, devsize, &size, flags)) return 1; |