3 # Copyright (c) 2015 Elvira Khabirova <lineprinter0@gmail.com>
4 # Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
5 # Copyright (c) 2017 Gleb Fotengauer-Malinovskiy <glebfm@altlinux.org>
6 # Copyright (c) 2015-2017 The strace developers.
9 # SPDX-License-Identifier: LGPL-2.1-or-later
12 dirmap[2^8] = "_IOC_NONE"
13 dirmap[2^9] = "_IOC_READ"
14 dirmap[2^10] = "_IOC_WRITE"
15 dirmap[2^10 + 2^9] = "_IOC_READ|_IOC_WRITE"
17 function array_get(array_idx, array_member, \
20 array_return = array[array_idx][array_member]
21 if ("" == array_return) {
22 printf("%s: index [%s] without %s\n",
23 FILENAME, array_idx, array_member) > "/dev/stderr"
28 function dir2str(dir, \
32 printf("%s: ioctl direction %d is not known\n",
33 FILENAME, dir) > "/dev/stderr"
39 match($0, /([[:alnum:]]+)><([[:alnum:]]+)/, matches)
45 match($0, /:[[:space:]]+([[:alpha:]_][[:alnum:]_[:space:]]*)/,
47 array[idx]["name"] = temparray[1]
50 match($0, /:[[:space:]]+<(0x[[:xdigit:]]*)>$/, temparray)
51 array[idx]["type"] = temparray[1]
53 /^DW_AT_upper_bound/ {
54 match($0, /[[:digit:]]+/, temparray)
55 array[array[idx]["parent"]]["size"] = temparray[0]
58 match($0, /[[:digit:]]+/, temparray)
59 array[array[idx]["parent"]]["size"] = temparray[0] - 1
61 /^Abbrev Number:[^(]+\(DW_TAG_/ {
62 if (match($0, /member|subrange_type|variable/, temparray)) {
63 array[idx]["special"] = temparray[0]
64 if (level > 1 && ("member" == temparray[0] ||
65 "subrange_type" == temparray[0]))
66 array[idx]["parent"] = parent[level-1]
71 if (array[i]["special"] == "variable" &&
72 index(array_get(i, "name"), "ioc_") == 1) {
73 ioc_name = substr(array_get(i, "name"),
75 type = array_get(i, "type")
78 if ("parent" in array[j] &&
79 type == array_get(j, "parent")) {
80 t = array_get(j, "type")
82 field_name = array_get(j, "name")
83 sizemap[field_name] = \
87 if (sizemap["d"] == "" ||
90 printf("%s: failed to parse %s ioctl info\n",
91 FILENAME, ioc_name) > "/dev/stderr"
94 printf("{ \"%s\", \"%s\", %s, 0x%04x, 0x%02x },\n",
95 HEADER_NAME, ioc_name, dir2str(sizemap["d"]),
96 sizemap["n"], sizemap["s"])