]> err.no Git - util-linux/commitdiff
losetup: canonicalize loopfile name
authorKarel Zak <kzak@redhat.com>
Thu, 25 Oct 2007 10:29:51 +0000 (12:29 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 25 Oct 2007 23:02:12 +0000 (01:02 +0200)
When setting up a loop device, canonicalize the loop file
name. This simplifies a later identification of loop file names
when querying the loop devices.

Co-Author: Matthias Koenig <mkoenig@suse.de>
Signed-off-by: Matthias Koenig <mkoenig@suse.de>
Signed-off-by: Karel Zak <kzak@redhat.com>
mount/Makefile.am
mount/lomount.c

index 57a5af8d1066d12ef0350801ff0e5d9a152701eb..46bcb5abe3fb655f0faed043b8a11a8216ab56df 100644 (file)
@@ -25,8 +25,8 @@ umount_LDFLAGS = $(SUID_LDFLAGS) $(AM_LDFLAGS)
 
 swapon_SOURCES = swapon.c swap_constants.h $(utils_common)
 
-losetup_SOURCES = lomount.c sundries.c xmalloc.c loop.h lomount.h xmalloc.h \
-       sundries.h
+losetup_SOURCES = lomount.c sundries.c xmalloc.c realpath.c \
+       loop.h lomount.h xmalloc.h sundries.h realpath.h
 losetup_CPPFLAGS = -DMAIN $(AM_CPPFLAGS)
 
 mount_LDADD = $(LDADD_common)
index cea3aed4460567f87224dc274d1f5cac2becce86..b3c16fb6b7159a2b485330d27a0b41bdf6184376 100644 (file)
@@ -24,6 +24,7 @@
 #include "nls.h"
 #include "sundries.h"
 #include "xmalloc.h"
+#include "realpath.h"
 
 #define SIZE(a) (sizeof(a)/sizeof(a[0]))
 
@@ -276,6 +277,7 @@ set_loop(const char *device, const char *file, unsigned long long offset,
        struct loop_info64 loopinfo64;
        int fd, ffd, mode, i;
        char *pass;
+       char *filename;
 
        mode = (*loopro ? O_RDONLY : O_RDWR);
        if ((ffd = open(file, mode)) < 0) {
@@ -294,7 +296,9 @@ set_loop(const char *device, const char *file, unsigned long long offset,
 
        memset(&loopinfo64, 0, sizeof(loopinfo64));
 
-       xstrncpy((char *)loopinfo64.lo_file_name, file, LO_NAME_SIZE);
+       if (!(filename = canonicalize(file)))
+               filename = (char *) file;
+       xstrncpy((char *)loopinfo64.lo_file_name, filename, LO_NAME_SIZE);
 
        if (encryption && *encryption) {
                if (digits_only(encryption)) {
@@ -351,6 +355,8 @@ set_loop(const char *device, const char *file, unsigned long long offset,
 
                close(fd);
                close(ffd);
+               if (file != filename)
+                       free(filename);
                return rc;
        }
        close (ffd);
@@ -376,13 +382,17 @@ set_loop(const char *device, const char *file, unsigned long long offset,
        if (i) {
                ioctl (fd, LOOP_CLR_FD, 0);
                close (fd);
+               if (file != filename)
+                       free(filename);
                return 1;
        }
        close (fd);
 
        if (verbose > 1)
                printf(_("set_loop(%s,%s,%llu): success\n"),
-                      device, file, offset);
+                      device, filename, offset);
+       if (file != filename)
+               free(filename);
        return 0;
 }