Commit | Line | Data |
---|---|---|
b7150b71 | 1 | #!/bin/bash |
2879dbbc | 2 | # SPDX-License-Identifier: (GPL-2.0 or LGPL-2.1) |
b75d00c4 MD |
3 | |
4 | # example usage: | |
644d6e9c | 5 | # lttng-get-syscall-inout.sh table-syscall-inout.txt select 1 |
b75d00c4 MD |
6 | |
7 | FILENAME=$1 | |
8 | SYSCALL_NAME=$2 | |
9 | ARG_NR=$3 | |
2879dbbc MJ |
10 | TMPFILE=$(mktemp) |
11 | ||
12 | # Delete temp file on exit | |
13 | trap 'rm -f "$TMPFILE"' EXIT | |
14 | ||
b75d00c4 MD |
15 | |
16 | if [ x"${FILENAME}" = x"" ]; then | |
2879dbbc | 17 | echo "Error: Please specify input file name as first argument" >&2 |
b75d00c4 MD |
18 | exit 1 |
19 | fi | |
20 | ||
21 | if [ x"${SYSCALL_NAME}" = x"" ]; then | |
2879dbbc | 22 | echo "Error: Please specify system call name as second argument" >&2 |
b75d00c4 MD |
23 | exit 1 |
24 | fi | |
25 | ||
26 | if [[ x"${ARG_NR}" = x"" || ${ARG_NR} == 0 ]]; then | |
2879dbbc | 27 | echo "Error: Please specify argument number larger than 0 as third argument" >&2 |
b75d00c4 MD |
28 | exit 1 |
29 | fi | |
30 | ||
2879dbbc MJ |
31 | # Abort on error and undefined variable |
32 | set -eu | |
33 | ||
34 | # Get the required syscall | |
35 | grep "syscall ${SYSCALL_NAME} " "${FILENAME}" > "${TMPFILE}" || true | |
b75d00c4 | 36 | |
2879dbbc MJ |
37 | # Error out if we got more than one syscall |
38 | NR_MATCH=$(wc -l < "${TMPFILE}") | |
39 | if [ "${NR_MATCH}" -gt 1 ]; then | |
40 | echo "Error: more than one system call match" >&2 | |
b75d00c4 MD |
41 | exit 1 |
42 | fi | |
43 | ||
2879dbbc MJ |
44 | # Default to sc_inout for unknown syscalls |
45 | if [ "${NR_MATCH}" -eq 0 ]; then | |
46 | echo "Warning: no match for syscall '${SYSCALL_NAME}', set to 'inout'" >&2 | |
b75d00c4 MD |
47 | # no match, default to inout |
48 | echo "sc_inout" | |
49 | exit 0 | |
50 | fi | |
51 | ||
2879dbbc MJ |
52 | # Get the number of argument |
53 | SC_ARGS=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) .*/\2/g' "${TMPFILE}") | |
b75d00c4 | 54 | |
2879dbbc MJ |
55 | if [ "${ARG_NR}" -gt "${SC_ARGS}" ]; then |
56 | echo "Error: argument number (${ARG_NR}) is larger than number of syscall arguments (${SC_ARGS})" >&2 | |
b75d00c4 MD |
57 | exit 1 |
58 | fi | |
59 | ||
2879dbbc MJ |
60 | if [ "${ARG_NR}" == 1 ]; then |
61 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: (\([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
62 | fi |
63 | ||
2879dbbc MJ |
64 | if [ "${ARG_NR}" == 2 ]; then |
65 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: ([^,]*, \([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
66 | fi |
67 | ||
2879dbbc MJ |
68 | if [ "${ARG_NR}" == 3 ]; then |
69 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: ([^,]*, [^,]*, \([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
70 | fi |
71 | ||
2879dbbc MJ |
72 | if [ "${ARG_NR}" == 4 ]; then |
73 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: ([^,]*, [^,]*, [^,]*, \([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
74 | fi |
75 | ||
2879dbbc MJ |
76 | if [ "${ARG_NR}" == 5 ]; then |
77 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: ([^,]*, [^,]*, [^,]*, [^,]*, \([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
78 | fi |
79 | ||
2879dbbc MJ |
80 | if [ "${ARG_NR}" == 6 ]; then |
81 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: ([^,]*, [^,]*, [^,]*, [^,]*, [^,]*, \([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
82 | fi |
83 | ||
b75d00c4 | 84 | |
2879dbbc | 85 | if [ "${SC_ARG_TYPE}" = "r" ]; then |
b75d00c4 MD |
86 | echo "sc_in" |
87 | fi | |
2879dbbc | 88 | if [ "${SC_ARG_TYPE}" = "w" ]; then |
b75d00c4 MD |
89 | echo "sc_out" |
90 | fi | |
2879dbbc | 91 | if [ "${SC_ARG_TYPE}" = "rw" ]; then |
b75d00c4 MD |
92 | echo "sc_inout" |
93 | fi | |
94 | ||
2879dbbc | 95 | # EOF |