1
0
Fork 0
util-linux/tests/ts/lsfd/lsfd-functions.bash
Daniel Baumann c36e531662
Adding upstream version 2.41.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-21 11:26:35 +02:00

172 lines
4.1 KiB
Bash

#!/bin/bash
#
# Copyright (C) 2021 Masatake YAMATO <yamato@redhat.com>
#
# 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.
#
# The exit-status used in a test target.
readonly EPERM=18
readonly ENOPROTOOPT=19
readonly EPROTONOSUPPORT=20
readonly EACCES=21
readonly ENOENT=22
readonly ENOSYS=23
readonly EADDRNOTAVAIL=24
readonly ENODEV=25
function lsfd_wait_for_pausing {
ts_check_prog "sleep"
local PID=$1
until [[ $(ps --no-headers -ostat "${PID}") =~ S.* ]]; do
sleep 1
done
}
function lsfd_compare_dev {
local LSFD=$1
local FILE=$2
local EXPR=$3
ts_check_prog "grep"
ts_check_prog "expr"
ts_check_prog "stat"
local DEV
DEV=$("${LSFD}" --raw -n -o DEV -Q "${EXPR}")
echo 'DEV[RUN]:' $?
local MAJ=${DEV%:*}
local MIN=${DEV#*:}
local DEVNUM=$(ts_makedev "$MAJ" "$MIN")
local STAT_DEVNUM
STAT_DEVNUM=$(stat -c "%d" "$FILE")
echo 'STAT[RUN]:' $?
if [ "${DEVNUM}" == "${STAT_DEVNUM}" ]; then
echo 'DEVNUM[STR]:' 0
else
echo 'DEVNUM[STR]:' 1
# Print more information for debugging
echo 'DEV:' "${DEV}"
echo 'MAJ:MIN' "${MAJ}:${MIN}"
echo 'DEVNUM:' "${DEVNUM}"
echo 'STAT_DEVNUM:' "${STAT_DEVNUM}"
fi
}
function lsfd_strip_type_stream
{
# lsfd changes the output of NAME column for a unix stream socket
# whether the kernel reports it is a "UNIX-STREAM" socket or a
# "UNIX" socket. For "UNIX", lsfd appends "type=stream" to the
# NAME column. Let's delete the appended string before comparing.
sed -e 's/ type=stream//'
}
function lsfd_make_state_connected
{
# Newer kernels report the states of unix dgram sockets created by
# sockerpair(2) are "connected" via /proc/net/unix though Older
# kernels report "unconnected".
#
# Newer kernels report the states of unix dgram sockets already
# connect(2)'ed are "connected", too.
#
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=83301b5367a98c17ec0d76c7bc0ccdc3c7e7ad6d
#
# This rewriting adjusts the output of lsfd running on older kernels
# to that on newer kernels.
sed -e 's/state=unconnected/state=connected/'
}
function lsfd_check_mkfds_factory
{
local FACTORY=$1
ts_check_test_command "$TS_HELPER_MKFDS"
if ! "$TS_HELPER_MKFDS" --is-available "$FACTORY"; then
ts_skip "test_mkfds has no factory for $FACTORY"
fi
}
function lsfd_check_sockdiag
{
local family=$1
local type=${2:-dgram}
ts_check_test_command "$TS_HELPER_MKFDS"
local msg
local err
msg=$("$TS_HELPER_MKFDS" -c sockdiag 9 family=$family type=$type 2>&1)
err=$?
case $err in
0)
return;;
"$EPROTONOSUPPORT")
ts_skip "NETLINK_SOCK_DIAG protocol is not supported in socket(2)";;
"$EACCES")
ts_skip "sending a msg via a sockdiag netlink socket is not permitted";;
"$ENOENT")
ts_skip "sockdiag netlink socket is not available";;
*)
ts_failed "failed to create a sockdiag netlink socket $family ($err): $msg";;
esac
}
function lsfd_check_vsock
{
ts_check_test_command "$TS_HELPER_MKFDS"
local msg
local err
msg=$("$TS_HELPER_MKFDS" -c vsock 3 4 5 socktype=DGRAM 2>&1)
err=$?
case $err in
0)
return;;
"$EADDRNOTAVAIL")
ts_skip "VMADDR_CID_LOCAL doesn't work";;
"$ENODEV")
ts_skip "AF_VSOCK+SOCK_DGRAM doesn't work";;
*)
ts_failed "failed to use a AF_VSOCK socket: $msg [$err]";;
esac
}
function lsfd_check_userns
{
ts_check_test_command "$TS_HELPER_MKFDS"
local msg
local err
msg=$("$TS_HELPER_MKFDS" -c userns 3 2>&1)
err=$?
case $err in
0)
return;;
"$EPERM")
ts_skip "maybe /proc/self/uid_map it not writable";;
*)
ts_failed "failed to use a AF_VSOCK socket: $msg [$err]";;
esac
}