From ba3809b01233e6afb24e90018700b3f145c2aee7 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 18 Jun 2007 15:44:02 +0200 Subject: 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 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'mount/lomount.c') diff --git a/mount/lomount.c b/mount/lomount.c index 88214f71c..4774a8539 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; } -- cgit v1.2.3-55-g7522