summaryrefslogtreecommitdiffstats
path: root/libmount/src
diff options
context:
space:
mode:
authorKarel Zak2011-09-29 17:48:03 +0200
committerKarel Zak2011-09-29 17:48:03 +0200
commitfd1eb7a72977f5bd054e25a864207786512e26af (patch)
treef506bf57b9242bbe10909d2dd3bb208e591b7fa8 /libmount/src
parentipcrm: fix wrong subject in error messages for -m, -q, -s id options (diff)
downloadkernel-qcow2-util-linux-fd1eb7a72977f5bd054e25a864207786512e26af.tar.gz
kernel-qcow2-util-linux-fd1eb7a72977f5bd054e25a864207786512e26af.tar.xz
kernel-qcow2-util-linux-fd1eb7a72977f5bd054e25a864207786512e26af.zip
libmount: add function to parse offsets/sizes
Diffstat (limited to 'libmount/src')
-rw-r--r--libmount/src/context_umount.c16
-rw-r--r--libmount/src/mountP.h2
-rw-r--r--libmount/src/utils.c18
3 files changed, 25 insertions, 11 deletions
diff --git a/libmount/src/context_umount.c b/libmount/src/context_umount.c
index bc08affc0..e271845e2 100644
--- a/libmount/src/context_umount.c
+++ b/libmount/src/context_umount.c
@@ -127,17 +127,11 @@ static int mnt_loopdev_associated_fs(const char *devname, struct libmnt_fs *fs)
/* check for offset option in @fs */
optstr = (char *) mnt_fs_get_user_options(fs);
- if (optstr && !mnt_optstr_get_option(optstr, "offset=", &val, &valsz)) {
- int rc;
-
- val = strndup(val, valsz);
- if (!val)
- return 0;
- rc = strtosize(val, &offset);
- free(val);
- if (rc)
- return 0;
- }
+
+ if (optstr &&
+ mnt_optstr_get_option(optstr, "offset", &val, &valsz) == 0 &&
+ mnt_parse_offset(val, valsz, &offset) != 0)
+ return 0;
/* TODO:
* if (mnt_loopdev_associated_file(devname, src, offset))
diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h
index 644e8e89b..92d0b26a5 100644
--- a/libmount/src/mountP.h
+++ b/libmount/src/mountP.h
@@ -118,6 +118,8 @@ extern int mnt_run_test(struct libmnt_test *tests, int argc, char *argv[]);
extern int endswith(const char *s, const char *sx);
extern int startswith(const char *s, const char *sx);
+extern int mnt_parse_offset(const char *str, size_t len, uintmax_t *res);
+
extern int mnt_chdir_to_parent(const char *target, char **filename);
extern char *mnt_get_username(const uid_t uid);
extern int mnt_get_uid(const char *username, uid_t *uid);
diff --git a/libmount/src/utils.c b/libmount/src/utils.c
index 7f2397ad1..f3a174ff1 100644
--- a/libmount/src/utils.c
+++ b/libmount/src/utils.c
@@ -53,6 +53,24 @@ int startswith(const char *s, const char *sx)
return !strncmp(s, sx, off);
}
+int mnt_parse_offset(const char *str, size_t len, uintmax_t *res)
+{
+ char *p;
+ int rc = 0;
+
+ if (!str && !*str)
+ return -EINVAL;
+
+ p = strndup(str, len);
+ if (!p)
+ return -errno;
+
+ if (strtosize(p, res))
+ rc = -EINVAL;
+ free(p);
+ return rc;
+}
+
/* returns basename and keeps dirname in the @path, if @path is "/" (root)
* then returns empty string */
static char *stripoff_last_component(char *path)