summaryrefslogtreecommitdiffstats
path: root/utils/mount/parse_opt.c
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2008-12-17 14:21:10 -0500
committerSteve Dickson <steved@redhat.com>2008-12-17 14:21:10 -0500
commitb5009d23525181846777349f2fc0e4a72b89d24d (patch)
tree62eb84001cfcd439ee4170e9fffa5597710750f8 /utils/mount/parse_opt.c
parenteb3a145789b9eedd39b56e1d76f412435abaa747 (diff)
downloadnfs-utils-b5009d23525181846777349f2fc0e4a72b89d24d.tar.gz
nfs-utils-b5009d23525181846777349f2fc0e4a72b89d24d.tar.xz
nfs-utils-b5009d23525181846777349f2fc0e4a72b89d24d.zip
text-based mount command: add function to parse numeric mount options
Introduce a function that is especially for parsing keyword mount options that take a numeric value. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/mount/parse_opt.c')
-rw-r--r--utils/mount/parse_opt.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/utils/mount/parse_opt.c b/utils/mount/parse_opt.c
index cb398bd..f61d0dd 100644
--- a/utils/mount/parse_opt.c
+++ b/utils/mount/parse_opt.c
@@ -36,6 +36,10 @@
*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include <ctype.h>
#include <unistd.h>
#include <stdio.h>
@@ -366,6 +370,57 @@ char *po_get(struct mount_options *options, char *keyword)
}
/**
+ * po_get_numeric - return numeric value of rightmost instance of keyword option
+ * @options: pointer to mount options
+ * @keyword: pointer to a C string containing option keyword for which to search
+ * @value: OUT: set to the value of the keyword
+ *
+ * This is specifically for parsing keyword options that take only a numeric
+ * value. If multiple instances of the same option are present in a mount
+ * option list, the rightmost instance is always the effective one.
+ *
+ * Returns:
+ * * PO_FOUND if the keyword was found and the value is numeric; @value is
+ * set to the keyword's value
+ * * PO_NOT_FOUND if the keyword was not found
+ * * PO_BAD_VALUE if the keyword was found, but the value is not numeric
+ *
+ * These last two are separate in case the caller wants to warn about bad mount
+ * options instead of silently using a default.
+ */
+#ifdef HAVE_STRTOL
+po_found_t po_get_numeric(struct mount_options *options, char *keyword, long *value)
+{
+ char *option, *endptr;
+ long tmp;
+
+ option = po_get(options, keyword);
+ if (option == NULL)
+ return PO_NOT_FOUND;
+
+ errno = 0;
+ tmp = strtol(option, &endptr, 10);
+ if (errno == 0 && endptr != option) {
+ *value = tmp;
+ return PO_FOUND;
+ }
+ return PO_BAD_VALUE;
+}
+#else /* HAVE_STRTOL */
+po_found_t po_get_numeric(struct mount_options *options, char *keyword, long *value)
+{
+ char *option;
+
+ option = po_get(options, keyword);
+ if (option == NULL)
+ return PO_NOT_FOUND;
+
+ *value = atoi(option);
+ return PO_FOUND;
+}
+#endif /* HAVE_STRTOL */
+
+/**
* po_rightmost - determine the relative position of two options
* @options: pointer to mount options
* @key1: pointer to a C string containing an option keyword