From: Masatake YAMATO Date: Fri, 24 Sep 2021 19:32:27 +0000 (+0900) Subject: lsfd: introduce --source filter option X-Git-Tag: v2.38-rc1~144^2~78 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aed101f0113f024b3c8634d543596d7307097835;p=thirdparty%2Futil-linux.git lsfd: introduce --source filter option Reflecting the review comment: add filter by SOURCE (lsfd --source sda1) Example output: # ./lsfd --source proc | head COMMAND PID USER ASSOC MODE TYPE SOURCE MNTID INODE NAME systemd 1 root 10 r-- REG proc 23 18542 /proc/1/mountinfo systemd 1 root 14 r-- REG proc 23 4026532082 /proc/swaps systemd-resolve 856 root 7 r-- REG proc 254 24841 /proc/sys/kernel/hostname low-memory-moni 898 root 7 rw- REG proc 425 4026532073 /proc/pressure/memory low-memory-moni 898 root 8 rw- REG proc 425 4026532073 /proc/pressure/memory low-memory-moni 898 root 9 rw- REG proc 425 4026532073 /proc/pressure/memory packagekitd 25205 root 12 r-- REG proc 23 69645 /proc/25205/mountinfo systemd 26466 root 10 r-- REG proc 23 71813 /proc/26466/mountinfo systemd 26466 root 14 r-- REG proc 23 4026532082 /proc/swaps # ./lsfd --source proc -Q '(PID == 898)' COMMAND PID USER ASSOC MODE TYPE SOURCE MNTID INODE NAME low-memory-moni 898 root 7 rw- REG proc 425 4026532073 /proc/pressure/memory low-memory-moni 898 root 8 rw- REG proc 425 4026532073 /proc/pressure/memory low-memory-moni 898 root 9 rw- REG proc 425 4026532073 /proc/pressure/memory Signed-off-by: Masatake YAMATO --- diff --git a/misc-utils/lsfd.c b/misc-utils/lsfd.c index 1662cf9698..8da659fbc3 100644 --- a/misc-utils/lsfd.c +++ b/misc-utils/lsfd.c @@ -941,6 +941,7 @@ static void __attribute__((__noreturn__)) usage(void) fputs(_(" --sysroot use specified directory as system root\n"), out); fputs(_(" -u, --notruncate don't truncate text in columns\n"), out); fputs(_(" -Q, --filter apply display filter\n"), out); + fputs(_(" --source add filter by SOURCE\n"), out); fputs(USAGE_SEPARATOR, out); printf(USAGE_HELP_OPTIONS(23)); @@ -965,6 +966,28 @@ static void xstrappend(char **a, const char *b) err(EXIT_FAILURE, _("failed to allocate memory for string")); } +static char * quote_filter_expr(char *expr) +{ + char c[] = {'\0', '\0'}; + char *r = strdup(""); + while (*expr) { + switch (*expr) { + case '\'': + xstrappend(&r, "\\'"); + break; + case '"': + xstrappend(&r, "\\\""); + break; + default: + c[0] = *expr; + xstrappend(&r, c); + break; + } + expr++; + } + return r; +} + static void append_filter_expr(char **a, const char *b, bool and) { if (*a == NULL) { @@ -995,7 +1018,8 @@ int main(int argc, char *argv[]) char *filter_expr = NULL; enum { - OPT_SYSROOT = CHAR_MAX + 1 + OPT_SYSROOT = CHAR_MAX + 1, + OPT_SOURCE, }; static const struct option longopts[] = { { "noheadings", no_argument, NULL, 'n' }, @@ -1008,6 +1032,7 @@ int main(int argc, char *argv[]) { "notruncate", no_argument, NULL, 'u' }, { "sysroot", required_argument, NULL, OPT_SYSROOT }, { "filter", required_argument, NULL, 'Q' }, + { "source", required_argument, NULL, OPT_SOURCE }, { NULL, 0, NULL, 0 }, }; @@ -1042,6 +1067,17 @@ int main(int argc, char *argv[]) case 'Q': append_filter_expr(&filter_expr, optarg, true); break; + case OPT_SOURCE: { + char * quoted_source = quote_filter_expr(optarg); + char * source_expr = NULL; + xstrappend(&source_expr, "(SOURCE == '"); + xstrappend(&source_expr, quoted_source); + xstrappend(&source_expr, "')"); + append_filter_expr(&filter_expr, source_expr, true); + free(source_expr); + free(quoted_source); + break; + } case 'V': print_version(EXIT_SUCCESS);