File: lsfd-functions.bash

package info (click to toggle)
util-linux 2.41.3-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 92,844 kB
  • sloc: ansic: 179,146; sh: 22,716; yacc: 1,284; makefile: 525; xml: 422; python: 316; lex: 89; ruby: 75; csh: 37; exp: 19; sed: 16; perl: 15; sql: 9
file content (172 lines) | stat: -rw-r--r-- 4,184 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/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
}