]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
tests: (lsfd) extend unix-stream test case to test SEQPACKET socket
authorMasatake YAMATO <yamato@redhat.com>
Sat, 24 Sep 2022 09:21:30 +0000 (18:21 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Sat, 24 Sep 2022 17:29:28 +0000 (02:29 +0900)
Signed-off-by: Masatake YAMATO <yamato@redhat.com>
tests/expected/lsfd/mkfds-unix-stream
tests/helpers/test_mkfds.c
tests/ts/lsfd/mkfds-unix-stream

index 5628e78e111a371fec93c03b3a19fe1258556f53..45eee020e0b0dbf4ed64745792e078ea54936dd6 100644 (file)
@@ -9,4 +9,16 @@ 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
index fdd3cff1e83f9c5118bbffa844f79467264bc07c..86e2d2ba4672aacf2565faab7b6341681694ae59 100644 (file)
@@ -788,8 +788,8 @@ static void close_unix_socket(int fd, void *data)
        }
 }
 
-static void *make_unix_stream(const struct factory *factory, struct fdesc fdescs[],
-                             int argc, char ** argv)
+static void *make_unix_stream_core(const struct factory *factory, struct fdesc fdescs[],
+                                  int argc, char ** argv, int type, const char *typestr)
 {
        struct arg path = decode_arg("path", factory->params, argc, argv);
        const char *spath = ARG_STRING(path);
@@ -830,10 +830,10 @@ static void *make_unix_stream(const struct factory *factory, struct fdesc fdescs
        if (iclient_shutdown < 0 || iclient_shutdown > 3)
                errx(EXIT_FAILURE, "the client shudown specification in unexpected range");
 
-       ssd = socket(AF_UNIX, SOCK_STREAM, 0);
+       ssd = socket(AF_UNIX, type, 0);
        if (ssd < 0)
                err(EXIT_FAILURE,
-                   "failed to make a socket with AF_UNIX + SOCK_STREAM (server side)");
+                   "failed to make a socket with AF_UNIX + SOCK_%s (server side)", typestr);
        if (ssd != fdescs[0].fd) {
                if (dup2(ssd, fdescs[0].fd) < 0) {
                        int e = errno;
@@ -869,10 +869,10 @@ static void *make_unix_stream(const struct factory *factory, struct fdesc fdescs
                err(EXIT_FAILURE, "failed to listen a socket");
        }
 
-       csd = socket(AF_UNIX, SOCK_STREAM, 0);
+       csd = socket(AF_UNIX, type, 0);
        if (csd < 0)
                err(EXIT_FAILURE,
-                   "failed to make a socket with AF_UNIX + SOCK_STREAM (client side)");
+                   "failed to make a socket with AF_UNIX + SOCK_%s (client side)", typestr);
        if (csd != fdescs[1].fd) {
                if (dup2(csd, fdescs[1].fd) < 0) {
                        int e = errno;
@@ -935,6 +935,29 @@ static void *make_unix_stream(const struct factory *factory, struct fdesc fdescs
        return NULL;
 }
 
+static void *make_unix_stream(const struct factory *factory, struct fdesc fdescs[],
+                             int argc, char ** argv)
+{
+       struct arg type = decode_arg("type", factory->params, argc, argv);
+       const char *stype = ARG_STRING(type);
+
+       int typesym;
+       const char *typestr;
+
+       if (strcmp(stype, "stream") == 0) {
+               typesym = SOCK_STREAM;
+               typestr = "STREAM";
+       } else if (strcmp(stype, "seqpacket") == 0) {
+               typesym = SOCK_SEQPACKET;
+               typestr = "SEQPACKET";
+       } else
+               errx(EXIT_FAILURE, _("unknown unix socket type: %s"), stype);
+
+       free_arg(&type);
+
+       return make_unix_stream_core(factory, fdescs, argc, argv, typesym, typestr);
+}
+
 static void *make_unix_dgram(const struct factory *factory, struct fdesc fdescs[],
                             int argc, char ** argv)
 {
@@ -1264,6 +1287,12 @@ static const struct factory factories[] = {
                                .desc = "shutdown the client socket; 1: R, 2: W, 3: RW",
                                .defv.integer = 0,
                        },
+                       {
+                               .name = "type",
+                               .type = PTYPE_STRING,
+                               .desc = "stream or seqpacket",
+                               .defv.string = "stream",
+                       },
                        PARAM_END
                },
        },
index 2f2bfd76a52b798326073578e5cf1db98d1979e7..767dc89349c21274292493714d94d13aa7f17abb 100755 (executable)
@@ -32,47 +32,51 @@ FDA=5
 EXPR='(((TYPE == "UNIX-STREAM") or (TYPE == "UNIX")) and (FD >= 3) and (FD <= 5))'
 
 {
-    # TYPE is not tested here; AF_UNIX+SOCK_STREAM socket type was changed from "UNIX"
-    # to "UNIX-STREAM" at a time in Linux kernel development history.
-    coproc MKFDS { "$TS_HELPER_MKFDS" unix-stream $FDS $FDC $FDA \
-                                     path=test_mkfds-unix-stream ; }
-    if read -r -u "${MKFDS[0]}" PID; then
-       ${TS_CMD_LSFD} -n \
-                      -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \
-                      -p "${PID}" -Q "${EXPR}"
-       echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $?
+    for t in stream seqpacket; do
+       # TYPE is not tested here; AF_UNIX+SOCK_STREAM socket type was changed from "UNIX"
+       # to "UNIX-STREAM" at a time in Linux kernel development history.
+       coproc MKFDS { "$TS_HELPER_MKFDS" unix-stream $FDS $FDC $FDA \
+                                         path=test_mkfds-unix-${t} \
+                                         type=$t ; }
+       if read -r -u "${MKFDS[0]}" PID; then
+           ${TS_CMD_LSFD} -n \
+                          -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \
+                          -p "${PID}" -Q "${EXPR}"
+           echo 'ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $?
 
-       kill -CONT "${PID}"
-       wait "${MKFDS_PID}"
-    fi
+           kill -CONT "${PID}"
+           wait "${MKFDS_PID}"
+       fi
 
-    coproc MKFDS { "$TS_HELPER_MKFDS" unix-stream $FDS $FDC $FDA \
-                                     path=test_mkfds-unix-stream-abs \
-                                     abstract=true ; }
-    if read -r -u "${MKFDS[0]}" PID; then
-       ${TS_CMD_LSFD} -n \
-                      -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \
-                      -p "${PID}" -Q "${EXPR}"
-       echo '(abs) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $?
+       coproc MKFDS { "$TS_HELPER_MKFDS" unix-stream $FDS $FDC $FDA \
+                                         path=test_mkfds-unix-${t}-abs \
+                                         abstract=true ; }
+       if read -r -u "${MKFDS[0]}" PID; then
+           ${TS_CMD_LSFD} -n \
+                          -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \
+                          -p "${PID}" -Q "${EXPR}"
+           echo '(abs) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $?
 
-       kill -CONT "${PID}"
-       wait "${MKFDS_PID}"
-    fi
+           kill -CONT "${PID}"
+           wait "${MKFDS_PID}"
+       fi
 
-    coproc MKFDS { "$TS_HELPER_MKFDS" unix-stream $FDS $FDC $FDA \
-                                     path=test_mkfds-unix-stream-shutdown \
-                                     server-shutdown=3 \
-                                     client-shutdown=3 ; }
-    if read -r -u "${MKFDS[0]}" PID; then
-       ${TS_CMD_LSFD} -n \
-                      -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \
-                      -p "${PID}" -Q "${EXPR}"
-       echo '(shutdown) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $?
-       # Surprisingly, the socket status doesn't change at all.
+       coproc MKFDS { "$TS_HELPER_MKFDS" unix-stream $FDS $FDC $FDA \
+                                         path=test_mkfds-unix-${t}-shutdown \
+                                         server-shutdown=3 \
+                                         client-shutdown=3 \
+                                         type=$t ; }
+       if read -r -u "${MKFDS[0]}" PID; then
+           ${TS_CMD_LSFD} -n \
+                          -o ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH \
+                          -p "${PID}" -Q "${EXPR}"
+           echo '(shutdown) ASSOC,STTYPE,NAME,SOCKSTATE,SOCKTYPE,UNIX.PATH': $?
+           # Surprisingly, the socket status doesn't change at all.
 
-       kill -CONT "${PID}"
-       wait "${MKFDS_PID}"
-    fi
+           kill -CONT "${PID}"
+           wait "${MKFDS_PID}"
+       fi
+    done
 } > "$TS_OUTPUT" 2>&1
 
 ts_finalize