From: Masatake YAMATO Date: Sat, 1 Oct 2022 20:16:54 +0000 (+0900) Subject: lsfd: add SOCKLISTENING column X-Git-Tag: v2.39-rc1~501^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45d61bffb2f8eb5c7c4192da0f5b202e717747a0;p=thirdparty%2Futil-linux.git lsfd: add SOCKLISTENING column Signed-off-by: Masatake YAMATO --- diff --git a/misc-utils/lsfd-sock-xinfo.c b/misc-utils/lsfd-sock-xinfo.c index ef994f191c..d675c49705 100644 --- a/misc-utils/lsfd-sock-xinfo.c +++ b/misc-utils/lsfd-sock-xinfo.c @@ -298,6 +298,14 @@ static char *unix_get_state(struct sock_xinfo *sock_xinfo, return strdup(str); } +static bool unix_get_listening(struct sock_xinfo *sock_xinfo, + struct sock *sock __attribute__((__unused__))) +{ + struct unix_xinfo *ux = (struct unix_xinfo *)sock_xinfo; + + return ux->acceptcon; +} + static bool unix_fill_column(struct proc *proc __attribute__((__unused__)), struct sock_xinfo *sock_xinfo, struct sock *sock __attribute__((__unused__)), @@ -325,6 +333,7 @@ static struct sock_xinfo_class unix_xinfo_class = { .get_name = unix_get_name, .get_type = unix_get_type, .get_state = unix_get_state, + .get_listening = unix_get_listening, .fill_column = unix_fill_column, .free = NULL, }; diff --git a/misc-utils/lsfd-sock.c b/misc-utils/lsfd-sock.c index 06201646dd..d1ed26d8c5 100644 --- a/misc-utils/lsfd-sock.c +++ b/misc-utils/lsfd-sock.c @@ -91,6 +91,14 @@ static bool sock_fill_column(struct proc *proc __attribute__((__unused__)), break; } return false; + case COL_SOCKLISTENING: + str = xstrdup((sock->xinfo + && sock->xinfo->class + && sock->xinfo->class->get_listening + && sock->xinfo->class->get_listening(sock->xinfo, sock)) + ? "1" + : "0"); + break; default: if (sock->xinfo && sock->xinfo->class && sock->xinfo->class->fill_column) { diff --git a/misc-utils/lsfd-sock.h b/misc-utils/lsfd-sock.h index 155bf819ef..00acf3d41a 100644 --- a/misc-utils/lsfd-sock.h +++ b/misc-utils/lsfd-sock.h @@ -51,6 +51,7 @@ struct sock_xinfo_class { char * (*get_name)(struct sock_xinfo *, struct sock *); char * (*get_type)(struct sock_xinfo *, struct sock *); char * (*get_state)(struct sock_xinfo *, struct sock *); + bool (*get_listening)(struct sock_xinfo *, struct sock *); /* Method for class specific columns. * Return true when the method fills the column. */ bool (*fill_column)(struct proc *, diff --git a/misc-utils/lsfd.1.adoc b/misc-utils/lsfd.1.adoc index b6db69583a..af939ac75a 100644 --- a/misc-utils/lsfd.1.adoc +++ b/misc-utils/lsfd.1.adoc @@ -257,6 +257,9 @@ Device ID (if special file). SIZE <``number``>:: File size. +SOCKLISTENING <``boolean``>:: +Listening socket. + SOCKNETS <``number``>:: Inode identifying network namespace where the socket belogs to. diff --git a/misc-utils/lsfd.c b/misc-utils/lsfd.c index d403513961..99193df760 100644 --- a/misc-utils/lsfd.c +++ b/misc-utils/lsfd.c @@ -185,6 +185,8 @@ static struct colinfo infos[] = { N_("device ID (if special file)") }, [COL_SIZE] = { "SIZE", 4, SCOLS_FL_RIGHT, SCOLS_JSON_NUMBER, N_("file size"), }, + [COL_SOCKLISTENING]={"SOCKLISTENING",0,SCOLS_FL_RIGHT,SCOLS_JSON_BOOLEAN, + N_("listening socket") }, [COL_SOCKNETNS]={"SOCKNETNS", 0, SCOLS_FL_RIGHT, SCOLS_JSON_NUMBER, N_("inode identifying network namespace where the socket belongs to") }, [COL_SOCKSTATE]={"SOCKSTATE", 0, SCOLS_FL_RIGHT, SCOLS_JSON_STRING, diff --git a/misc-utils/lsfd.h b/misc-utils/lsfd.h index 2ab17d27d3..3f7bc4ff36 100644 --- a/misc-utils/lsfd.h +++ b/misc-utils/lsfd.h @@ -67,6 +67,7 @@ enum { COL_PROTONAME, COL_RDEV, COL_SIZE, + COL_SOCKLISTENING, COL_SOCKNETNS, COL_SOCKSTATE, COL_SOCKTYPE, diff --git a/tests/expected/lsfd/mkfds-unix-dgram b/tests/expected/lsfd/mkfds-unix-dgram index 915b34396e..02eba974c9 100644 --- a/tests/expected/lsfd/mkfds-unix-dgram +++ b/tests/expected/lsfd/mkfds-unix-dgram @@ -1,6 +1,6 @@ - 3 SOCK state=connected path=test_mkfds-unix-dgram type=dgram connected dgram test_mkfds-unix-dgram - 4 SOCK state=connected type=dgram connected dgram -ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 - 3 SOCK state=connected path=@test_mkfds-unix-dgram type=dgram connected dgram @test_mkfds-unix-dgram - 4 SOCK state=connected type=dgram connected dgram -ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 + 3 SOCK state=connected path=test_mkfds-unix-dgram type=dgram connected dgram 0 test_mkfds-unix-dgram + 4 SOCK state=connected type=dgram connected dgram 0 +ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 + 3 SOCK state=connected path=@test_mkfds-unix-dgram type=dgram connected dgram 0 @test_mkfds-unix-dgram + 4 SOCK state=connected type=dgram connected dgram 0 +ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 diff --git a/tests/expected/lsfd/mkfds-unix-in-netns b/tests/expected/lsfd/mkfds-unix-in-netns index 46b6f200d8..e187753e8f 100644 --- a/tests/expected/lsfd/mkfds-unix-in-netns +++ b/tests/expected/lsfd/mkfds-unix-in-netns @@ -1,18 +1,18 @@ - 5 SOCK state=listen path=test_mkfds-unix-stream-ns listen stream test_mkfds-unix-stream-ns -ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 + 5 SOCK state=listen path=test_mkfds-unix-stream-ns listen stream 1 test_mkfds-unix-stream-ns +ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 the netns for the stream socket is extracted as expectedly - 5 SOCK state=listen path=@test_mkfds-unix-stream-ns listen stream @test_mkfds-unix-stream-ns -ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 + 5 SOCK state=listen path=@test_mkfds-unix-stream-ns listen stream 1 @test_mkfds-unix-stream-ns +ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 the netns for the abstract stream socket is extracted as expectedly - 5 SOCK state=unconnected path=test_mkfds-unix-dgram-ns type=dgram unconnected dgram test_mkfds-unix-dgram-ns -ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 + 5 SOCK state=unconnected path=test_mkfds-unix-dgram-ns type=dgram unconnected dgram 0 test_mkfds-unix-dgram-ns +ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 the netns for the dgram socket is extracted as expectedly - 5 SOCK state=unconnected path=@test_mkfds-unix-dgram-ns type=dgram unconnected dgram @test_mkfds-unix-dgram-ns -ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 + 5 SOCK state=unconnected path=@test_mkfds-unix-dgram-ns type=dgram unconnected dgram 0 @test_mkfds-unix-dgram-ns +ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 the netns for the abstract dgram socket is extracted as expectedly - 5 SOCK state=listen path=test_mkfds-unix-seqpacket-ns type=seqpacket listen seqpacket test_mkfds-unix-seqpacket-ns -ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 + 5 SOCK state=listen path=test_mkfds-unix-seqpacket-ns type=seqpacket listen seqpacket 1 test_mkfds-unix-seqpacket-ns +ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 the netns for the seqpacket socket is extracted as expectedly - 5 SOCK state=listen path=@test_mkfds-unix-seqpacket-ns type=seqpacket listen seqpacket @test_mkfds-unix-seqpacket-ns -ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 + 5 SOCK state=listen path=@test_mkfds-unix-seqpacket-ns type=seqpacket listen seqpacket 1 @test_mkfds-unix-seqpacket-ns +ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 the netns for the abstract seqpacket socket is extracted as expectedly diff --git a/tests/expected/lsfd/mkfds-unix-stream b/tests/expected/lsfd/mkfds-unix-stream index 45eee020e0..01abba478b 100644 --- a/tests/expected/lsfd/mkfds-unix-stream +++ b/tests/expected/lsfd/mkfds-unix-stream @@ -1,24 +1,24 @@ - 3 SOCK state=listen path=test_mkfds-unix-stream listen stream test_mkfds-unix-stream - 4 SOCK state=connected connected stream - 5 SOCK state=connected path=test_mkfds-unix-stream connected stream test_mkfds-unix-stream -ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 - 3 SOCK state=listen path=@test_mkfds-unix-stream-abs listen stream @test_mkfds-unix-stream-abs - 4 SOCK state=connected connected stream - 5 SOCK state=connected path=@test_mkfds-unix-stream-abs connected stream @test_mkfds-unix-stream-abs -(abs) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 - 3 SOCK state=listen path=test_mkfds-unix-stream-shutdown listen stream test_mkfds-unix-stream-shutdown - 4 SOCK state=connected connected stream - 5 SOCK state=connected path=test_mkfds-unix-stream-shutdown connected stream test_mkfds-unix-stream-shutdown -(shutdown) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 - 3 SOCK state=listen path=test_mkfds-unix-seqpacket type=seqpacket listen seqpacket test_mkfds-unix-seqpacket - 4 SOCK state=connected type=seqpacket connected seqpacket - 5 SOCK state=connected path=test_mkfds-unix-seqpacket type=seqpacket connected seqpacket test_mkfds-unix-seqpacket -ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 - 3 SOCK state=listen path=@test_mkfds-unix-seqpacket-abs listen stream @test_mkfds-unix-seqpacket-abs - 4 SOCK state=connected connected stream - 5 SOCK state=connected path=@test_mkfds-unix-seqpacket-abs connected stream @test_mkfds-unix-seqpacket-abs -(abs) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 - 3 SOCK state=listen path=test_mkfds-unix-seqpacket-shutdown type=seqpacket listen seqpacket test_mkfds-unix-seqpacket-shutdown - 4 SOCK state=connected type=seqpacket connected seqpacket - 5 SOCK state=connected path=test_mkfds-unix-seqpacket-shutdown type=seqpacket connected seqpacket test_mkfds-unix-seqpacket-shutdown -(shutdown) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH: 0 + 3 SOCK state=listen path=test_mkfds-unix-stream listen stream 1 test_mkfds-unix-stream + 4 SOCK state=connected connected stream 0 + 5 SOCK state=connected path=test_mkfds-unix-stream connected stream 0 test_mkfds-unix-stream +ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 + 3 SOCK state=listen path=@test_mkfds-unix-stream-abs listen stream 1 @test_mkfds-unix-stream-abs + 4 SOCK state=connected connected stream 0 + 5 SOCK state=connected path=@test_mkfds-unix-stream-abs connected stream 0 @test_mkfds-unix-stream-abs +(abs) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 + 3 SOCK state=listen path=test_mkfds-unix-stream-shutdown listen stream 1 test_mkfds-unix-stream-shutdown + 4 SOCK state=connected connected stream 0 + 5 SOCK state=connected path=test_mkfds-unix-stream-shutdown connected stream 0 test_mkfds-unix-stream-shutdown +(shutdown) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 + 3 SOCK state=listen path=test_mkfds-unix-seqpacket type=seqpacket listen seqpacket 1 test_mkfds-unix-seqpacket + 4 SOCK state=connected type=seqpacket connected seqpacket 0 + 5 SOCK state=connected path=test_mkfds-unix-seqpacket type=seqpacket connected seqpacket 0 test_mkfds-unix-seqpacket +ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 + 3 SOCK state=listen path=@test_mkfds-unix-seqpacket-abs listen stream 1 @test_mkfds-unix-seqpacket-abs + 4 SOCK state=connected connected stream 0 + 5 SOCK state=connected path=@test_mkfds-unix-seqpacket-abs connected stream 0 @test_mkfds-unix-seqpacket-abs +(abs) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 + 3 SOCK state=listen path=test_mkfds-unix-seqpacket-shutdown type=seqpacket listen seqpacket 1 test_mkfds-unix-seqpacket-shutdown + 4 SOCK state=connected type=seqpacket connected seqpacket 0 + 5 SOCK state=connected path=test_mkfds-unix-seqpacket-shutdown type=seqpacket connected seqpacket 0 test_mkfds-unix-seqpacket-shutdown +(shutdown) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH: 0 diff --git a/tests/ts/lsfd/mkfds-unix-dgram b/tests/ts/lsfd/mkfds-unix-dgram index 82710e912c..8707f6d6f5 100755 --- a/tests/ts/lsfd/mkfds-unix-dgram +++ b/tests/ts/lsfd/mkfds-unix-dgram @@ -35,9 +35,9 @@ EXPR='(TYPE == "UNIX") and ((FD == 3) or (FD == 4))' path=test_mkfds-unix-dgram ; } if read -r -u "${MKFDS[0]}" PID; then ${TS_CMD_LSFD} -n \ - -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \ + -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH \ -p "${PID}" -Q "${EXPR}" - echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $? + echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH': $? kill -CONT "${PID}" wait "${MKFDS_PID}" @@ -48,9 +48,9 @@ EXPR='(TYPE == "UNIX") and ((FD == 3) or (FD == 4))' abstract=true ; } if read -r -u "${MKFDS[0]}" PID; then ${TS_CMD_LSFD} -n \ - -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \ + -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH \ -p "${PID}" -Q "${EXPR}" - echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $? + echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH': $? kill -CONT "${PID}" wait "${MKFDS_PID}" diff --git a/tests/ts/lsfd/mkfds-unix-in-netns b/tests/ts/lsfd/mkfds-unix-in-netns index d57edc6f03..87a6fabc33 100755 --- a/tests/ts/lsfd/mkfds-unix-in-netns +++ b/tests/ts/lsfd/mkfds-unix-in-netns @@ -60,9 +60,9 @@ compare_net_namespaces() type=$t ; } if read -r -u "${MKFDS[0]}" PID; then ${TS_CMD_LSFD} -n \ - -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \ + -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH \ -p "${PID}" -Q "${EXPR}" - echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $? + echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH': $? compare_net_namespaces "$t" "${PID}" @@ -76,9 +76,9 @@ compare_net_namespaces() type=$t ; } if read -r -u "${MKFDS[0]}" PID; then ${TS_CMD_LSFD} -n \ - -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \ + -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH \ -p "${PID}" -Q "${EXPR}" - echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $? + echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH': $? compare_net_namespaces "abstract $t" "${PID}" diff --git a/tests/ts/lsfd/mkfds-unix-stream b/tests/ts/lsfd/mkfds-unix-stream index 767dc89349..dc724f410b 100755 --- a/tests/ts/lsfd/mkfds-unix-stream +++ b/tests/ts/lsfd/mkfds-unix-stream @@ -40,9 +40,9 @@ EXPR='(((TYPE == "UNIX-STREAM") or (TYPE == "UNIX")) and (FD >= 3) and (FD <= 5) type=$t ; } if read -r -u "${MKFDS[0]}" PID; then ${TS_CMD_LSFD} -n \ - -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \ + -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH \ -p "${PID}" -Q "${EXPR}" - echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $? + echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH': $? kill -CONT "${PID}" wait "${MKFDS_PID}" @@ -53,9 +53,9 @@ EXPR='(((TYPE == "UNIX-STREAM") or (TYPE == "UNIX")) and (FD >= 3) and (FD <= 5) abstract=true ; } if read -r -u "${MKFDS[0]}" PID; then ${TS_CMD_LSFD} -n \ - -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \ + -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH \ -p "${PID}" -Q "${EXPR}" - echo '(abs) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $? + echo '(abs) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH': $? kill -CONT "${PID}" wait "${MKFDS_PID}" @@ -68,9 +68,9 @@ EXPR='(((TYPE == "UNIX-STREAM") or (TYPE == "UNIX")) and (FD >= 3) and (FD <= 5) type=$t ; } if read -r -u "${MKFDS[0]}" PID; then ${TS_CMD_LSFD} -n \ - -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \ + -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH \ -p "${PID}" -Q "${EXPR}" - echo '(shutdown) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $? + echo '(shutdown) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,SOCKLISTENING,UNIX.PATH': $? # Surprisingly, the socket status doesn't change at all. kill -CONT "${PID}"