From: Karel Zak Date: Thu, 14 Feb 2013 14:59:28 +0000 (+0100) Subject: lslocks: use libmount to parse mountinfo X-Git-Tag: v2.23-rc1~214 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=07c916cfddba7b912248b2ceb3a6476a43115c00;p=thirdparty%2Futil-linux.git lslocks: use libmount to parse mountinfo 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 Signed-off-by: Karel Zak --- diff --git a/misc-utils/Makemodule.am b/misc-utils/Makemodule.am index bc11d520cc..1421fb4382 100644 --- a/misc-utils/Makemodule.am +++ b/misc-utils/Makemodule.am @@ -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 diff --git a/misc-utils/lslocks.c b/misc-utils/lslocks.c index 0a82129e0a..e837b014e4 100644 --- a/misc-utils/lslocks.c +++ b/misc-utils/lslocks.c @@ -32,6 +32,8 @@ #include #include +#include + #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; }