]> err.no Git - util-linux/commitdiff
losetup: add --sizelimit option
authorShachar Shemesh <shachar@debian.org>
Tue, 15 Apr 2008 10:57:35 +0000 (12:57 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 15 Apr 2008 10:57:35 +0000 (12:57 +0200)
[kzak@redhat.com: split the original patch to small patches]
Signed-off-by: Shachar Shemesh <shachar@debian.org>
Signed-off-by: Karel Zak <kzak@redhat.com>
AUTHORS
mount/lomount.c
mount/lomount.h
mount/losetup.8
mount/mount.c

diff --git a/AUTHORS b/AUTHORS
index 2c25a0ecf42626bed768ab06c4442b3a9faf9a9c..334a5e491045ab174ea9594aedf6091f3e6e86f5 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -102,6 +102,7 @@ CONTRIBUTORS:
       Samuel Thibault <samuel.thibault@ens-lyon.org>
       Santiago Vila Doncel <sanvila@unex.es>
       Sascha Sommer <ssommer@suse.de>
+      Shachar Shemesh <shachar@lingnu.com>
       Simon Mihevc <simonmihevc@email.si>
       Stefan Krah <stefan@bytereef.org>
       Stepan Kasal <skasal@redhat.com>
index ac379c0db52982742dc3cd4df9b40102bc3056f8..953fe86b151c9a3968581f2b154cd4263b040123 100644 (file)
@@ -609,7 +609,7 @@ digits_only(const char *s) {
 
 int
 set_loop(const char *device, const char *file, unsigned long long offset,
-        const char *encryption, int pfd, int *options) {
+        unsigned long long sizelimit, const char *encryption, int pfd, int *options) {
        struct loop_info64 loopinfo64;
        int fd, ffd, mode, i;
        char *pass;
@@ -657,6 +657,7 @@ set_loop(const char *device, const char *file, unsigned long long offset,
        }
 
        loopinfo64.lo_offset = offset;
+       loopinfo64.lo_sizelimit = sizelimit;
 
 #ifdef MCL_FUTURE
        /*
@@ -758,8 +759,8 @@ set_loop(const char *device, const char *file, unsigned long long offset,
                close (fd);
 
        if (verbose > 1)
-               printf(_("set_loop(%s,%s,%llu): success\n"),
-                      device, filename, offset);
+               printf(_("set_loop(%s,%s,%llu,%llu): success\n"),
+                      device, filename, offset, sizelimit);
        if (file != filename)
                free(filename);
        return 0;
@@ -795,8 +796,9 @@ mutter(void) {
 }
 
 int
-set_loop (const char *device, const char *file, unsigned long long offset,
-         const char *encryption, int *loopro) {
+set_loop(const char *device, const char *file, unsigned long long offset,
+         unsigned long long sizelimit, const char *encryption, int pfd, int *loopro,
+         int keysz, int hash_pass) {
        mutter();
        return 1;
 }
@@ -835,6 +837,7 @@ usage(void) {
   " -e | --encryption <type> enable data encryption with specified <name/num>\n"
   " -h | --help              this help\n"
   " -o | --offset <num>      start at offset <num> into file\n"
+  "      --sizelimit <num>   loop limited to only <num> bytes of the file\n"
   " -p | --pass-fd <num>     read passphrase from file descriptor <num>\n"
   " -r | --read-only         setup read-only loop device\n"
   " -s | --show              print device name (with -f <file>)\n"
@@ -845,13 +848,13 @@ usage(void) {
 
 int
 main(int argc, char **argv) {
-       char *p, *offset, *encryption, *passfd, *device, *file, *assoc;
+       char *p, *offset, *sizelimit, *encryption, *passfd, *device, *file, *assoc;
        int delete, find, c, all;
        int res = 0;
        int showdev = 0;
        int ro = 0;
        int pfd = -1;
-       unsigned long long off;
+       unsigned long long off, slimit;
        struct option longopts[] = {
                { "all", 0, 0, 'a' },
                { "detach", 0, 0, 'd' },
@@ -860,6 +863,7 @@ main(int argc, char **argv) {
                { "help", 0, 0, 'h' },
                { "associated", 1, 0, 'j' },
                { "offset", 1, 0, 'o' },
+               { "sizelimit", 1, 0, 128 },
                { "pass-fd", 1, 0, 'p' },
                { "read-only", 0, 0, 'r' },
                { "show", 0, 0, 's' },
@@ -873,7 +877,8 @@ main(int argc, char **argv) {
 
        delete = find = all = 0;
        off = 0;
-       assoc = offset = encryption = passfd = NULL;
+        slimit = 0;
+       assoc = offset = sizelimit = encryption = passfd = NULL;
 
        progname = argv[0];
        if ((p = strrchr(progname, '/')) != NULL)
@@ -913,6 +918,11 @@ main(int argc, char **argv) {
                case 'v':
                        verbose = 1;
                        break;
+
+               case 128:                       /* --sizelimit */
+                       sizelimit = optarg;
+                        break;
+
                default:
                        usage();
                }
@@ -921,7 +931,7 @@ main(int argc, char **argv) {
        if (argc == 1) {
                usage();
        } else if (delete) {
-               if (argc != optind+1 || encryption || offset ||
+               if (argc != optind+1 || encryption || offset || sizelimit ||
                                find || all || showdev || assoc || ro)
                        usage();
        } else if (find) {
@@ -941,6 +951,9 @@ main(int argc, char **argv) {
        if (offset && sscanf(offset, "%llu", &off) != 1)
                usage();
 
+       if (sizelimit && sscanf(sizelimit, "%llu", &slimit) != 1)
+               usage();
+
        if (all)
                return show_used_loop_devices();
        else if (assoc)
@@ -972,7 +985,7 @@ main(int argc, char **argv) {
                if (passfd && sscanf(passfd, "%d", &pfd) != 1)
                        usage();
                do {
-                       res = set_loop(device, file, off, encryption, pfd, &ro);
+                       res = set_loop(device, file, off, slimit, encryption, pfd, &ro);
                        if (res == 2 && find) {
                                if (verbose)
                                        printf("stolen loop=%s...trying again\n",
index a5c1ae8dbf40d3859d355c07a36ac4c68764cd42..f332a70d14fb20bb3cbfac975f793cf6d45ff7a9 100644 (file)
@@ -1,4 +1,4 @@
-extern int set_loop(const char *, const char *, unsigned long long,
+extern int set_loop(const char *, const char *, unsigned long long, unsigned long long,
                    const char *, int, int *);
 extern int del_loop(const char *);
 extern int is_loop_device(const char *);
index 400ec2cab34e55feecc717d8f7e89b4c687e1f5f..c6ba75f16ec6307ac1695be6cc1c217eb8e2354c 100644 (file)
@@ -35,6 +35,8 @@ Setup loop device:
 .IR encryption ]
 .RB [ \-o
 .IR offset ]
+.RB [ \-\-sizelimit
+.IR limit ]
 .RB [ \-p
 .IR pfd ]
 .RB [ \-r ]
@@ -84,6 +86,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\-p, \-\-pass-fd \fInum\fP"
 read the passphrase from file descriptor with number
 .I num
index fcc5531bcd07600bc01f00c1b693703adfc6bd23..7445314f98e85efd76a7a043a24dbd301e176bb2 100644 (file)
@@ -927,7 +927,7 @@ loop_check(const char **spec, const char **type, int *flags,
        if (verbose)
          printf(_("mount: going to use the loop device %s\n"), *loopdev);
 
-       if ((res = set_loop(*loopdev, *loopfile, offset,
+       if ((res = set_loop(*loopdev, *loopfile, offset, 0,
                            opt_encryption, pfd, &loop_opts))) {
          if (res == 2) {
             /* loop dev has been grabbed by some other process,