]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lslocks: use libmount to parse mountinfo
authorKarel Zak <kzak@redhat.com>
Thu, 14 Feb 2013 14:59:28 +0000 (15:59 +0100)
committerKarel Zak <kzak@redhat.com>
Thu, 14 Feb 2013 14:59:28 +0000 (15:59 +0100)
old version:
$ strace -e open lslocks 2>&1 | grep mountinfo | wc -l
118

new version:
strace -e open ./lslocks 2>&1 | grep mountinfo | wc -l
1

Reported-by: Bernhard Voelker <mail@bernhard-voelker.de>
Signed-off-by: Karel Zak <kzak@redhat.com>
misc-utils/Makemodule.am
misc-utils/lslocks.c

index bc11d520cc0022e70df1dc205bc4d3995410c470..1421fb4382170cf992e54b028fcc00df06d2b1ba 100644 (file)
@@ -55,8 +55,9 @@ endif
 if BUILD_LSLOCKS
 usrbin_exec_PROGRAMS += lslocks
 dist_man_MANS += misc-utils/lslocks.8
-lslocks_LDADD = $(LDADD) libcommon.la
+lslocks_LDADD = $(LDADD) libcommon.la libmount.la
 lslocks_SOURCES = misc-utils/lslocks.c
+lslocks_CFLAGS = $(AM_CFLAGS) -I$(ul_libmount_incdir)
 endif
 
 if BUILD_LSBLK
index 0a82129e0a66bf4295cf156c970b17038af41433..e837b014e432819452462fa300c8fb7c8ecc3556 100644 (file)
@@ -32,6 +32,8 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#include <libmount.h>
+
 #include "pathnames.h"
 #include "canonicalize.h"
 #include "nls.h"
@@ -79,6 +81,8 @@ static struct colinfo infos[] = {
 static int columns[NCOLS], ncolumns;
 static pid_t pid = 0;
 
+static struct libmnt_table *tab;               /* /proc/self/mountinfo */
+
 struct lock {
        struct list_head locks;
 
@@ -128,26 +132,19 @@ out:
  */
 static char *get_fallback_filename(dev_t dev)
 {
-       char buf[BUFSIZ], target[PATH_MAX], *ret = NULL;
-       int maj, min;
-       FILE *fp;
+       struct libmnt_fs *fs;
 
-       if (!(fp = fopen(_PATH_PROC_MOUNTINFO, "r")))
-               return NULL;
-
-       while (fgets(buf, sizeof(buf), fp)) {
-               sscanf(buf, "%*u %*u %u:%u %*s %s",
-                           &maj, &min, target);
+       if (!tab) {
+               tab = mnt_new_table_from_file(_PATH_PROC_MOUNTINFO);
+               if (!tab)
+                       return NULL;
+       }
 
-               if (dev == makedev(maj, min)) {
-                       ret = xstrdup(target);
-                       goto out;
+       fs = mnt_table_find_devno(tab, dev, MNT_ITER_BACKWARD);
+       if (!fs)
+               return NULL;
 
-               }
-       }
-out:
-       fclose(fp);
-       return ret;
+       return xstrdup(mnt_fs_get_target(fs));
 }
 
 /*
@@ -569,5 +566,6 @@ int main(int argc, char *argv[])
        if (!rc && !list_empty(&locks))
                rc = show_locks(&locks, tt_flags);
 
+       mnt_free_table(tab);
        return rc;
 }