]> err.no Git - util-linux/commitdiff
mount: support suffixes for offset= and sizelimit=
authorKarel Zak <kzak@redhat.com>
Tue, 30 Mar 2010 14:15:44 +0000 (16:15 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 30 Mar 2010 14:15:44 +0000 (16:15 +0200)
Note that the offset= and sizelimit= values in /etc/mtab are
always in the final format -- it means without suffix).

Signed-off-by: Karel Zak <kzak@redhat.com>
mount/Makefile.am
mount/mount.c

index b20fe1b31de24967db76d0d792ce22756dca3630..8465d11e9bf4ca81ff430acbad2b33f4e2cc3ac3 100644 (file)
@@ -26,7 +26,7 @@ ldadd_static =
 cflags_common = $(AM_CFLAGS)
 ldflags_static = -all-static
 
-mount_SOURCES = mount.c $(srcs_mount) ../lib/setproctitle.c
+mount_SOURCES = mount.c $(srcs_mount) ../lib/setproctitle.c ../lib/strtosize.c
 mount_CFLAGS = $(SUID_CFLAGS) $(cflags_common)
 mount_LDFLAGS = $(SUID_LDFLAGS) $(AM_LDFLAGS)
 mount_LDADD = $(ldadd_common)
index f75a1fbd47b3ed0e99899c64726c7b6d1091706a..7a5ea06d6d2f68b7f37e4cca024fafff67ecceb8 100644 (file)
@@ -41,6 +41,7 @@
 #include "env.h"
 #include "nls.h"
 #include "blkdev.h"
+#include "strtosize.h"
 
 #define DO_PS_FIDDLING
 
@@ -1070,12 +1071,27 @@ is_mounted_same_loopfile(const char *node0, const char *loopfile, unsigned long
        return res;
 }
 
+static int
+parse_offset(const char **opt, uintmax_t *val)
+{
+       char *tmp;
+
+       if (strtosize(*opt, val))
+               return -1;
+
+       tmp = xmalloc(32);
+       snprintf(tmp, 32, "%jd", *val);
+       my_free(*opt);
+       *opt = tmp;
+       return 0;
+}
+
 static int
 loop_check(const char **spec, const char **type, int *flags,
           int *loop, const char **loopdev, const char **loopfile,
           const char *node) {
   int looptype;
-  unsigned long long offset = 0, sizelimit = 0;
+  uintmax_t offset = 0, sizelimit = 0;
 
   /*
    * In the case of a loop mount, either type is of the form lo@/dev/loop5
@@ -1127,33 +1143,17 @@ loop_check(const char **spec, const char **type, int *flags,
     } else {
       int loop_opts = SETLOOP_AUTOCLEAR; /* always attempt autoclear */
       int res;
-      char *endptr = NULL;
-      long long xnum;
 
       if (*flags & MS_RDONLY)
         loop_opts |= SETLOOP_RDONLY;
 
-      if (opt_offset) {
-        errno = 0;
-        xnum = strtoll(opt_offset, &endptr, 0);
-        if ((endptr && *endptr) ||
-            (errno != 0 && (xnum == LLONG_MAX || xnum == 0)) ||
-             xnum < 0) {
-          error(_("mount: invalid offset '%s' specified"), opt_offset);
-          return EX_FAIL;
-        }
-        offset = xnum;
+      if (opt_offset && parse_offset(&opt_offset, &offset)) {
+        error(_("mount: invalid offset '%s' specified"), opt_offset);
+        return EX_FAIL;
       }
-      if (opt_sizelimit) {
-        errno = 0;
-        xnum = strtoll(opt_sizelimit, &endptr, 0);
-        if ((endptr && *endptr) ||
-           (errno != 0 && (xnum == LLONG_MAX || xnum == 0)) ||
-             xnum < 0) {
-          error(_("mount: invalid sizelimit '%s' specified"), opt_sizelimit);
-          return EX_FAIL;
-        }
-       sizelimit = xnum;
+      if (opt_sizelimit && parse_offset(&opt_sizelimit, &sizelimit)) {
+        error(_("mount: invalid sizelimit '%s' specified"), opt_sizelimit);
+        return EX_FAIL;
       }
 
       if (is_mounted_same_loopfile(node, *loopfile, offset)) {