]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsfd: add SOCKLISTENING column
authorMasatake YAMATO <yamato@redhat.com>
Sat, 1 Oct 2022 20:16:54 +0000 (05:16 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Sat, 1 Oct 2022 20:16:54 +0000 (05:16 +0900)
Signed-off-by: Masatake YAMATO <yamato@redhat.com>
12 files changed:
misc-utils/lsfd-sock-xinfo.c
misc-utils/lsfd-sock.c
misc-utils/lsfd-sock.h
misc-utils/lsfd.1.adoc
misc-utils/lsfd.c
misc-utils/lsfd.h
tests/expected/lsfd/mkfds-unix-dgram
tests/expected/lsfd/mkfds-unix-in-netns
tests/expected/lsfd/mkfds-unix-stream
tests/ts/lsfd/mkfds-unix-dgram
tests/ts/lsfd/mkfds-unix-in-netns
tests/ts/lsfd/mkfds-unix-stream

index ef994f191cd304076adfa758ed1cbd6fd0cda608..d675c49705af7c356d776a33f6d19ff176c05216 100644 (file)
@@ -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,
 };
index 06201646dd0cd04de88f4532530173860260a8e2..d1ed26d8c5549f184dda18b081a642a9e205950b 100644 (file)
@@ -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) {
index 155bf819ef35a3504ce5881e5599293a25c7c844..00acf3d41aabbad5cc77ab47ca0ad1e4f59ad3bc 100644 (file)
@@ -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 *,
index b6db69583a76f69f6001a84d8ab5e01b60518c3d..af939ac75a9a69abdad2ca5f8513ccac36bc83ec 100644 (file)
@@ -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.
 
index d4035139610219cb8649c140d671a4e92ab95bd9..99193df7607c68ff415ca1903e9ebd78f3a69fbb 100644 (file)
@@ -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,
index 2ab17d27d3fa2b5916e87b734729a0abcc6b3fce..3f7bc4ff36c642fc6c013c956e55169f1f11c4ad 100644 (file)
@@ -67,6 +67,7 @@ enum {
        COL_PROTONAME,
        COL_RDEV,
        COL_SIZE,
+       COL_SOCKLISTENING,
        COL_SOCKNETNS,
        COL_SOCKSTATE,
        COL_SOCKTYPE,
index 915b34396eff7eaf3571fb45e55c9ba6bee83b8f..02eba974c95892ee752948f2cc71a7c9a0d60822 100644 (file)
@@ -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
index 46b6f200d865d2b2a87ac8fdefadf77182ce6883..e187753e8fd1b8795bc95784535a57a294dfc4c2 100644 (file)
@@ -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
index 45eee020e0b0dbf4ed64745792e078ea54936dd6..01abba478bd0c27ba4466d968ba5a2e34c266ff3 100644 (file)
@@ -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
index 82710e912cfae7784c73d1f5f22cf5359d7410ea..8707f6d6f5001fd27b5f1a72b3bc25e80d808fa2 100755 (executable)
@@ -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}"
index d57edc6f0320b6ecf775b0c1de614c811bb56fe4..87a6fabc336dcbb31793ac49f49acce78c83f964 100755 (executable)
@@ -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}"
 
index 767dc89349c21274292493714d94d13aa7f17abb..dc724f410b0e29a61403fe6361fd316f62785708 100755 (executable)
@@ -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}"