]> err.no Git - util-linux/commitdiff
losetup: support suffixes and hex numbers for --offset and --sizelimit
authorKarel Zak <kzak@redhat.com>
Tue, 30 Mar 2010 12:40:33 +0000 (14:40 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 30 Mar 2010 13:09:41 +0000 (15:09 +0200)
Reported-By: Liu Aleaxander <aleaxander@gmail.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
mount/Makefile.am
mount/lomount.c
mount/losetup.8

index 8ae87129dde966aa3338249c70288302d9e292d8..b20fe1b31de24967db76d0d792ce22756dca3630 100644 (file)
@@ -42,7 +42,7 @@ swapon_SOURCES = swapon.c swap_constants.h ../lib/linux_version.c \
 swapon_CFLAGS = $(cflags_common)
 swapon_LDADD = $(ldadd_common)
 
-losetup_SOURCES = lomount.c $(srcs_common) loop.h lomount.h
+losetup_SOURCES = lomount.c $(srcs_common) loop.h lomount.h ../lib/strtosize.c
 losetup_CPPFLAGS = -DMAIN $(AM_CPPFLAGS)
 
 mount_static_LDADD =
index 67712c610a6de879bfb42883fc2bf29306947039..6130be1dd58c1d2dd3d7ad6d39d2e02562d92ec4 100644 (file)
@@ -881,6 +881,8 @@ find_unused_loop_device (void) {
 #include <getopt.h>
 #include <stdarg.h>
 
+#include "strtosize.h"
+
 static void
 usage(void) {
        fprintf(stderr, _("\nUsage:\n"
@@ -913,7 +915,7 @@ main(int argc, char **argv) {
        int showdev = 0;
        int ro = 0;
        int pfd = -1;
-       unsigned long long off, slimit;
+       uintmax_t off = 0, slimit = 0;
        struct option longopts[] = {
                { "all", 0, 0, 'a' },
                { "set-capacity", 0, 0, 'c' },
@@ -936,8 +938,6 @@ main(int argc, char **argv) {
        textdomain(PACKAGE);
 
        capacity = delete = find = all = 0;
-       off = 0;
-        slimit = 0;
        assoc = offset = sizelimit = encryption = passfd = NULL;
 
        progname = argv[0];
@@ -1015,11 +1015,15 @@ main(int argc, char **argv) {
                        usage();
        }
 
-       if (offset && sscanf(offset, "%llu", &off) != 1)
+       if (offset && strtosize(offset, &off)) {
+               error(_("%s: invalid offset '%s' specified"), progname, offset);
                usage();
-
-       if (sizelimit && sscanf(sizelimit, "%llu", &slimit) != 1)
+       }
+       if (sizelimit && strtosize(sizelimit, &slimit)) {
+               error(_("%s: invalid sizelimit '%s' specified"),
+                                       progname, sizelimit);
                usage();
+       }
 
        if (all)
                return show_used_loop_devices();
index 8ccab6cef1dcb8b21c53a9ef3c1c8c204689e132..fe8b8b839df5db9e2c707fe927e17fa2c21bfe85 100644 (file)
@@ -39,7 +39,7 @@ Setup loop device:
 .RB [ \-o
 .IR offset ]
 .RB [ \-\-sizelimit
-.IR limit ]
+.IR size ]
 .in +8
 .RB [ \-p
 .IR pfd ]
@@ -78,6 +78,10 @@ When the cryptoloop module is loaded (or compiled in), it uses number 18.
 This cryptoloop module will take the name of an arbitrary encryption type
 and find the module that knows how to perform that encryption.
 .SH OPTIONS
+The \fIsize\fR and \fIoffset\fR arguments may be followed by binary (2^N)
+suffixes KiB, MiB, GiB, TiB, PiB and EiB (the "iB" is optional, e.g. "K" has the
+same meaning as "KiB") or decimal (10^N) suffixes KB, MB, GB, PB and EB.
+
 .IP "\fB\-a, \-\-all\fP"
 show status of all loop devices
 .IP "\fB\-c, \-\-set-capacity\fP \fIloopdev\fP
@@ -98,8 +102,8 @@ show status of all loop devices associated with given
 .IP "\fB\-o, \-\-offset \fIoffset\fP"
 the data start is moved \fIoffset\fP bytes into the specified file or
 device
-.IP "\fB\-\-sizelimit \fIlimit\fP"
-the data end is set to no more than \fIsizelimit\fP bytes after the data start
+.IP "\fB\-\-sizelimit \fIsize\fP"
+the data end is set to no more than \fIsize\fP bytes after the data start
 .IP "\fB\-p, \-\-pass-fd \fInum\fP"
 read the passphrase from file descriptor with number
 .I num