&& scols_line_set_data(ln, column_index, file->name))
err(EXIT_FAILURE, _("failed to add output data"));
return true;
+ case COL_STTYPE:
case COL_TYPE:
ftype = file->stat.st_mode & S_IFMT;
if (scols_line_set_data(ln, column_index, strftype(ftype)))
struct sock *sock = (struct sock *)file;
switch(column_id) {
case COL_TYPE:
- if (scols_line_set_data(ln, column_index, "SOCK"))
- err(EXIT_FAILURE, _("failed to add output data"));
- return true;
+ if (!sock->protoname)
+ return false;
+ /* FALL THROUGH */
case COL_PROTONAME:
if (sock->protoname)
if (scols_line_set_data(ln, column_index, sock->protoname))
}
return false;
case COL_TYPE:
- if (scols_line_set_data(ln, column_index, "UNKN"))
- err(EXIT_FAILURE, _("failed to add output data"));
- return true;
+ if (!unkn->anon_ops)
+ return false;
+ /* FALL THROUGH */
case COL_AINODECLASS:
if (unkn->anon_ops) {
str = anon_get_class(unkn);
SOURCE <``string``>::
File system, partition, or device containing the file.
+STTYPE <``string``>::
+Raw file types returned from stat(2): BLK, CHR, DIR, FIFO, LINK, REG, SOCK, or UNKN.
+
TID <``number``>::
Thread ID of the process opening the file.
TYPE <``string``>::
-File types: BLK, CHR, DIR, FIFO, LINK, REG, SOCK, or UNKN.
+Cooked version of STTYPE. It is same as STTYPE with exceptions.
+For SOCK, print the value for PROTONAME.
+For UNKN, print the value for AINODECLASS if SOURCE is anon_inodefs.
UID <``number``>::
User ID number.
*lsof*(8)
*pidof*(1)
*proc*(5)
+*stat*(2)
include::man-common/bugreports.adoc[]
N_("file size"), },
[COL_SOURCE] = { "SOURCE", 0, SCOLS_FL_RIGHT, SCOLS_JSON_STRING,
N_("file system, partition, or device containing file") },
+ [COL_STTYPE] = { "STTYPE", 0, SCOLS_FL_RIGHT, SCOLS_JSON_STRING,
+ N_("file type (raw)") },
[COL_TID] = { "TID", 5, SCOLS_FL_RIGHT, SCOLS_JSON_NUMBER,
N_("thread ID of the process opening the file") },
[COL_TYPE] = { "TYPE", 0, SCOLS_FL_RIGHT, SCOLS_JSON_STRING,
- N_("file type") },
+ N_("file type (cooked)") },
[COL_UID] = { "UID", 0, SCOLS_FL_RIGHT, SCOLS_JSON_NUMBER,
N_("user ID number of the process") },
[COL_USER] = { "USER", 0, SCOLS_FL_RIGHT, SCOLS_JSON_STRING,
},
{
.name = N_("regular files"),
- .expr = "(FD >= 0) && (TYPE == 'REG')",
+ .expr = "(FD >= 0) && (_TYPE == 'REG')",
},
{
.name = N_("directories"),
- .expr = "(FD >= 0) && (TYPE == 'DIR')",
+ .expr = "(FD >= 0) && (_TYPE == 'DIR')",
},
{
.name = N_("sockets"),
- .expr = "(FD >= 0) && (TYPE == 'SOCK')",
+ .expr = "(FD >= 0) && (_TYPE == 'SOCK')",
},
{
.name = N_("fifos/pipes"),
- .expr = "(FD >= 0) && (TYPE == 'FIFO')",
+ .expr = "(FD >= 0) && (_TYPE == 'FIFO')",
},
{
.name = N_("character devices"),
- .expr = "(FD >= 0) && (TYPE == 'CHR')",
+ .expr = "(FD >= 0) && (_TYPE == 'CHR')",
},
{
.name = N_("block devices"),
- .expr = "(FD >= 0) && (TYPE == 'BLK')",
+ .expr = "(FD >= 0) && (_TYPE == 'BLK')",
},
{
.name = N_("unknown types"),
- .expr = "(FD >= 0) && (TYPE == 'UNKN')",
+ .expr = "(FD >= 0) && (_TYPE == 'UNKN')",
}
};
COL_RDEV,
COL_SIZE,
COL_SOURCE,
+ COL_STTYPE,
COL_TID,
COL_TYPE,
COL_UID, /* process */
- 3 UNKN pidfd
-pidfd:ASSOC,TYPE,AINODECLASS: 0
- 3 UNKN inotify
-inotify:ASSOC,TYPE,AINODECLASS: 0
+ 3 UNKN pidfd
+pidfd:ASSOC,STTYPE,AINODECLASS: 0
+ 3 UNKN inotify
+inotify:ASSOC,STTYPE,AINODECLASS: 0
--- /dev/null
+ 3 REG REG
+ro-regular-file:ASSOC,STTYPE,TYPE: 0
+ 3 UNKN pidfd
+pidfd:ASSOC,STTYPE,TYPE: 0
+ 3 UNKN inotify
+inotify:ASSOC,STTYPE,TYPE: 0
+ 3 SOCK UNIX
+socketpair:ASSOC,STTYPE,TYPE: 0
- 3 UNKN anon_inodefs pidfd: pid=1 comm=systemd nspid=1
-ASSOC,TYPE,SOURCE,NAME: 0
+ 3 UNKN anon_inodefs pidfd: pid=1 comm=systemd nspid=1
+ASSOC,STTYPE,SOURCE,NAME: 0
- 3 rw- SOCK sockfs UNIX
- 4 rw- SOCK sockfs UNIX
-ASSOC,MODE,TYPE,SOURCE,PROTONAME: 0
+ 3 rw- SOCK sockfs UNIX
+ 4 rw- SOCK sockfs UNIX
+ASSOC,MODE,STTYPE,SOURCE,PROTONAME: 0
for C in pidfd inotify; do
coproc MKFDS { "$TS_HELPER_MKFDS" $C $FD ; }
if read -u ${MKFDS[0]} PID; then
- ${TS_CMD_LSFD} -n -o ASSOC,TYPE,AINODECLASS -p "${PID}" -Q "${EXPR}"
- echo "$C"':ASSOC,TYPE,AINODECLASS': $?
+ ${TS_CMD_LSFD} -n -o ASSOC,STTYPE,AINODECLASS -p "${PID}" -Q "${EXPR}"
+ echo "$C"':ASSOC,STTYPE,AINODECLASS': $?
kill -CONT ${PID}
wait ${MKFDS_PID}
--- /dev/null
+#!/bin/bash
+#
+# Copyright (C) 2022 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="TYPE and STTYPE column"
+
+. $TS_TOPDIR/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD=3
+EXPR="(FD == 3)"
+
+{
+ for C in ro-regular-file pidfd inotify socketpair; do
+ coproc MKFDS {
+ case $C in
+ socketpair)
+ argv="$((FD + 1)) socktype=DGRAM"
+ esac
+ "$TS_HELPER_MKFDS" $C $FD ${argv}
+ }
+ if read -u ${MKFDS[0]} PID; then
+ ${TS_CMD_LSFD} -n -o ASSOC,STTYPE,TYPE -p "${PID}" -Q "${EXPR}"
+ echo "$C"':ASSOC,STTYPE,TYPE': $?
+
+ kill -CONT ${PID}
+ wait ${MKFDS_PID}
+ fi
+ done
+} > $TS_OUTPUT 2>&1
+
+ts_finalize
{
coproc MKFDS { "$TS_HELPER_MKFDS" mapped-packet-socket $FD interface=${INTERFACE}; }
if read -u ${MKFDS[0]} PID; then
- EXPR='(ASSOC == "shm") and (TYPE == "SOCK") and (MODE == "-w-")'
+ EXPR='(ASSOC == "shm") and (STTYPE == "SOCK") and (MODE == "-w-")'
${TS_CMD_LSFD} -p "$PID" -n -o PROTONAME -Q "${EXPR}"
echo 'PROTONAME': $?
fi
{
coproc MKFDS { "$TS_HELPER_MKFDS" pidfd $FD target-pid=${TARGET} ; }
if read -u ${MKFDS[0]} PID; then
- ${TS_CMD_LSFD} -n -o ASSOC,TYPE,SOURCE,NAME -p "${PID}" -p ${TARGET} -Q "${EXPR}"
- echo 'ASSOC,TYPE,SOURCE,NAME': $?
+ ${TS_CMD_LSFD} -n -o ASSOC,STTYPE,SOURCE,NAME -p "${PID}" -p ${TARGET} -Q "${EXPR}"
+ echo 'ASSOC,STTYPE,SOURCE,NAME': $?
kill -CONT ${PID}
wait ${MKFDS_PID}
coproc MKFDS { "$TS_HELPER_MKFDS" socketpair $FD0 $FD1 socktype=DGRAM; }
if read -u ${MKFDS[0]} PID; then
EXPR='(PID == '"${PID}"') and ((FD == '"$FD0"') or (FD == '"$FD1"'))'
- ${TS_CMD_LSFD} -n -o ASSOC,MODE,TYPE,SOURCE,PROTONAME -Q "${EXPR}" | sed -e 's/UNIX-DGRAM/UNIX/'
- echo 'ASSOC,MODE,TYPE,SOURCE,PROTONAME': $?
+ ${TS_CMD_LSFD} -n -o ASSOC,MODE,STTYPE,SOURCE,PROTONAME -Q "${EXPR}" | sed -e 's/UNIX-DGRAM/UNIX/'
+ echo 'ASSOC,MODE,STTYPE,SOURCE,PROTONAME': $?
kill -CONT ${PID}
wait ${MKFDS_PID}