From: Masatake YAMATO Date: Fri, 15 Oct 2021 18:48:43 +0000 (+0900) Subject: lsfd: (test) add a case for displaying socket pairs X-Git-Tag: v2.38-rc1~144^2~21 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d827da235fefbd353e3b981537c657aeb8be19f8;p=thirdparty%2Futil-linux.git lsfd: (test) add a case for displaying socket pairs Signed-off-by: Masatake YAMATO --- diff --git a/tests/expected/lsfd/mkfds-socketpair b/tests/expected/lsfd/mkfds-socketpair new file mode 100644 index 0000000000..b2c95978b0 --- /dev/null +++ b/tests/expected/lsfd/mkfds-socketpair @@ -0,0 +1,3 @@ + 3 rw- SOCK sockfs UNIX + 4 rw- SOCK sockfs UNIX +ASSOC,MODE,TYPE,SOURCE,PROTONAME: 0 diff --git a/tests/helpers/test_mkfds.c b/tests/helpers/test_mkfds.c index 80b4ffed2f..68613cdd25 100644 --- a/tests/helpers/test_mkfds.c +++ b/tests/helpers/test_mkfds.c @@ -25,7 +25,9 @@ #include #include #include +#include #include +#include #include #include "c.h" @@ -386,6 +388,44 @@ static void open_rw_chrdev(const struct factory *factory, struct fdesc fdescs[], }; } +static void make_socketpair(const struct factory *factory, struct fdesc fdescs[], pid_t * child _U_, + int argc, char ** argv) +{ + int sd[2]; + struct arg socktype = decode_arg("socktype", factory->params, argc, argv); + int isocktype; + if (strcmp(ARG_STRING(socktype), "STREAM") == 0) + isocktype = SOCK_STREAM; + else if (strcmp(ARG_STRING(socktype), "DGRAM") == 0) + isocktype = SOCK_DGRAM; + else if (strcmp(ARG_STRING(socktype), "SEQPACKET") == 0) + isocktype = SOCK_SEQPACKET; + else + errx(EXIT_FAILURE, + "unknown socket type for socketpair(AF_UNIX,...): %s", + ARG_STRING(socktype)); + free_arg(&socktype); + + if (socketpair(AF_UNIX, isocktype, 0, sd) < 0) + err(EXIT_FAILURE, "failed to make socket pair"); + + for (int i = 0; i < 2; i++) { + if (dup2(sd[i], fdescs[i].fd) < 0) { + int e = errno; + close(sd[0]); + close(sd[1]); + errno = e; + err(EXIT_FAILURE, "failed to dup %d -> %d", + sd[i], fdescs[i].fd); + } + fdescs[i] = (struct fdesc){ + .fd = fdescs[i].fd, + .close = close_fdesc, + .data = NULL + }; + } +} + #define PARAM_END { .name = NULL, } static const struct factory factories[] = { { @@ -468,6 +508,23 @@ static const struct factory factories[] = { PARAM_END }, }, + { + .name = "socketpair", + .desc = "AF_UNIX socket pair created with socketpair(2)", + .priv = false, + .N = 2, + .fork = false, + .make = make_socketpair, + .params = (struct parameter []) { + { + .name = "socktype", + .type = PTYPE_STRING, + .desc = "STREAM, DGRAM, or SEQPACKET", + .defv.string = "STREAM", + }, + PARAM_END + }, + }, }; static int count_parameters(const struct factory *factory) diff --git a/tests/ts/lsfd/mkfds-socketpair b/tests/ts/lsfd/mkfds-socketpair new file mode 100755 index 0000000000..0b7ee90a24 --- /dev/null +++ b/tests/ts/lsfd/mkfds-socketpair @@ -0,0 +1,46 @@ +#!/bin/bash +# +# Copyright (C) 2021 Masatake YAMATO +# +# 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="AF_UNIX socket pair created with socketpair(2)" + +. $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= +FD0=3 +FD1=4 +EXPR= + +{ + coproc MKFDS { "$TS_HELPER_MKFDS" socketpair $FD0 $FD1 socktype=STREAM; } + 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}" + echo 'ASSOC,MODE,TYPE,SOURCE,PROTONAME': $? + + kill -CONT ${PID} + wait ${MKFDS_PID} + fi +} > $TS_OUTPUT 2>&1 + +ts_finalize