From ba3809b01233e6afb24e90018700b3f145c2aee7 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 18 Jun 2007 15:44:02 +0200 Subject: [PATCH] losetup: add a new option -s 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 --- mount/lomount.c | 13 ++++++++++--- mount/losetup.8 | 9 ++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/mount/lomount.c b/mount/lomount.c index 88214f71..4774a853 100644 --- a/mount/lomount.c +++ b/mount/lomount.c @@ -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; } diff --git a/mount/losetup.8 b/mount/losetup.8 index 1bfcf883..5b44a4d8 100644 --- a/mount/losetup.8 +++ b/mount/losetup.8 @@ -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 -- 2.39.5