From 39f6392d93a81daeaaad1496b27fc157d1aa9333 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 6 Feb 2015 08:59:21 +0100 Subject: 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 --- lib/cmdlinepart.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 lib/cmdlinepart.c (limited to 'lib/cmdlinepart.c') diff --git a/lib/cmdlinepart.c b/lib/cmdlinepart.c new file mode 100644 index 0000000000..04749926c7 --- /dev/null +++ b/lib/cmdlinepart.c @@ -0,0 +1,95 @@ +/* + * command line partition parsing code + * + * Copyright (c) 2015 Sascha Hauer , Pengutronix + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * 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. + * + */ +#include +#include +#include +#include +#include + +#define SIZE_REMAINING ((size_t)-1) + +int cmdlinepart_do_parse_one(char *devname, const char *partstr, + char **endp, loff_t *offset, + loff_t devsize, size_t *retsize, + unsigned int partition_flags) +{ + 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 (partition_flags & CMDLINEPART_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; +} -- cgit v1.2.3