From 21c70c294a8d665d28f2ff552694982a74040004 Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Sat, 16 Oct 2021 05:38:49 +0900 Subject: [PATCH] lsfd: (test) add a case for displaying symlinks Signed-off-by: Masatake YAMATO --- tests/expected/lsfd/mkfds-symlink | 2 ++ tests/helpers/test_mkfds.c | 33 +++++++++++++++++++++++ tests/ts/lsfd/mkfds-symlink | 45 +++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 tests/expected/lsfd/mkfds-symlink create mode 100755 tests/ts/lsfd/mkfds-symlink diff --git a/tests/expected/lsfd/mkfds-symlink b/tests/expected/lsfd/mkfds-symlink new file mode 100644 index 0000000000..5c91bbc6e7 --- /dev/null +++ b/tests/expected/lsfd/mkfds-symlink @@ -0,0 +1,2 @@ + 3 --- LINK /dev/stdin path +ASSOC,MODE,TYPE,NAME,FLAGS: 0 diff --git a/tests/helpers/test_mkfds.c b/tests/helpers/test_mkfds.c index c71b789a63..aa96ac79c6 100644 --- a/tests/helpers/test_mkfds.c +++ b/tests/helpers/test_mkfds.c @@ -428,6 +428,22 @@ static void make_socketpair(const struct factory *factory, struct fdesc fdescs[] } } +static void open_with_opath(const struct factory *factory, struct fdesc fdescs[], pid_t * child _U_, + int argc, char ** argv) +{ + struct arg path = decode_arg("path", factory->params, argc, argv); + int fd = open(ARG_STRING(path), O_PATH|O_NOFOLLOW); + if (fd < 0) + err(EXIT_FAILURE, "failed to open with O_PATH: %s", ARG_STRING(path)); + free_arg(&path); + + fdescs[0] = (struct fdesc){ + .fd = fd, + .close = close_fdesc, + .data = NULL + }; +} + #define PARAM_END { .name = NULL, } static const struct factory factories[] = { { @@ -527,6 +543,23 @@ static const struct factory factories[] = { PARAM_END }, }, + { + .name = "symlink", + .desc = "symbolic link itself opened with O_PATH", + .priv = false, + .N = 1, + .fork = false, + .make = open_with_opath, + .params = (struct parameter []) { + { + .name = "path", + .type = PTYPE_STRING, + .desc = "path to a symbolic link", + .defv.string = "/dev/stdin", + }, + PARAM_END + }, + }, }; static int count_parameters(const struct factory *factory) diff --git a/tests/ts/lsfd/mkfds-symlink b/tests/ts/lsfd/mkfds-symlink new file mode 100755 index 0000000000..e4513d9f5a --- /dev/null +++ b/tests/ts/lsfd/mkfds-symlink @@ -0,0 +1,45 @@ +#!/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="symbolic link itself opened with O_PATH" + +. $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= + +{ + coproc MKFDS { "$TS_HELPER_MKFDS" symlink $FD path=/dev/stdin; } + if read -u ${MKFDS[0]} PID; then + EXPR='(PID == '"${PID}"') and (FD == '"$FD"')' + ${TS_CMD_LSFD} -n -o ASSOC,MODE,TYPE,NAME,FLAGS -Q "${EXPR}" + echo 'ASSOC,MODE,TYPE,NAME,FLAGS': $? + + kill -CONT ${PID} + wait ${MKFDS_PID} + fi +} > $TS_OUTPUT 2>&1 + +ts_finalize -- 2.47.3