]> err.no Git - util-linux/commitdiff
losetup: add a new option -s
authorKarel Zak <kzak@redhat.com>
Mon, 18 Jun 2007 13:44:02 +0000 (15:44 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 18 Jun 2007 13:44:02 +0000 (15:44 +0200)
The losetup provides an -f option to discover an unused loop device.  As
implemented, it is racy. The problem is that -f prints the loop device
to stdout only when used standalone.  This means a script has to do:

 lodev=$(losetup -f)
 losetup $lodev $filename

which is racy if another script may be running.

This patch add a new option '-s'. The '-s' option prints device name
if the -f option and a file argument are present. For example:

 lodev=$(losetup -f -s $filename)

Signed-off-by: Karel Zak <kzak@redhat.com>
mount/lomount.c
mount/losetup.8

index 88214f71c12f83012d6626d3fa5bbeb2a287d8e9..4774a8539f594b319f17540397e5560336b8fd32 100644 (file)
@@ -444,7 +444,7 @@ usage(void) {
   "  %1$s -f                                                # find unused\n"
   "  %1$s -a                                                # list all used\n"
   "  %1$s -r                                                # read-only loop\n"
-  "  %1$s [-e encryption] [-o offset] [-r] {-f|loop_device} file # setup\n"),
+  "  %1$s [-e encryption] [-o offset] [-r] {-f [-s] |loop_device} file # setup\n"),
                progname);
        exit(1);
 }
@@ -481,6 +481,7 @@ main(int argc, char **argv) {
        char *p, *offset, *encryption, *passfd, *device, *file;
        int delete, find, c, all;
        int res = 0;
+       int showdev = 0;
        int ro = 0;
        int pfd = -1;
        unsigned long long off;
@@ -497,7 +498,7 @@ main(int argc, char **argv) {
        if ((p = strrchr(progname, '/')) != NULL)
                progname = p+1;
 
-       while ((c = getopt(argc, argv, "ade:E:fo:p:vr")) != -1) {
+       while ((c = getopt(argc, argv, "ade:E:fo:p:vrs")) != -1) {
                switch (c) {
                case 'a':
                        all = 1;
@@ -521,6 +522,9 @@ main(int argc, char **argv) {
                case 'p':
                        passfd = optarg;
                        break;
+               case 's':
+                       showdev = 1;
+                       break;
                case 'v':
                        verbose = 1;
                        break;
@@ -532,7 +536,7 @@ main(int argc, char **argv) {
        if (argc == 1) {
                usage();
        } else if (delete) {
-               if (argc != optind+1 || encryption || offset || find || all)
+               if (argc != optind+1 || encryption || offset || find || all || showdev)
                        usage();
        } else if (find) {
                if (all || argc < optind || argc > optind+1)
@@ -576,6 +580,9 @@ main(int argc, char **argv) {
                if (passfd && sscanf(passfd, "%d", &pfd) != 1)
                        usage();
                res = set_loop(device, file, off, encryption, pfd, &ro);
+               if (res == 0 && showdev && find) {
+                       printf("%s\n", device);
+               }
        }
        return res;
 }
index 1bfcf883c93370bdc89837d958a2a84b0f437143..5b44a4d8a877a4c4d3e704b04252057258000e7d 100644 (file)
@@ -37,7 +37,7 @@ Setup loop device:
 .IR pfd ]
 .RB [ \-r ]
 .in +8
-.RB { \-f | \fIloop_device\fP }
+.RB { \-f [ \-s ] | \fIloop_device\fP }
 .I file
 .in -13
 .ad b
@@ -90,6 +90,13 @@ Read the passphrase from file descriptor with number
 instead of from the terminal.
 .IP \fB\-r\fP
 Setup read-only loop device.
+.IP \fB\-s\fP
+Print device name if the
+.I -f
+option and a
+.I file
+argument are present.
+
 .SH RETURN VALUE
 .B losetup
 returns 0 on success, nonzero on failure. When