Compare commits

..

1385 Commits
v4.10 ... v4.12

Author SHA1 Message Date
ed1f206551 Prepare for 4.12 release
* NEWS: Update for 4.12 release.
* debian/changelog: 4.12-1.
* strace.spec: 4.12-1.
2016-05-31 11:12:13 +00:00
3ce8e9f1b1 Sync strace.spec and debian/changelog with packages
* debian/changelog: Sync with 4.11-1.
* strace.spec: Sync with 4.11.0.163.9720-2.
2016-05-31 10:47:53 +00:00
bb9d6835a6 Mpersify hdio.c
* defs.h (hdio_ioctl): Remove.
* hdio.c: Mpersify struct hd_geometry.
(hdio_ioctl): Mpersify.
2016-05-30 00:29:14 +00:00
4b9fa902d2 loop.c: decode LOOP_SET_DIRECT_IO
* loop.c (loop_ioctl) [LOOP_SET_DIRECT_IO] : Handle LOOP_SET_DIRECT_IO.
2016-05-29 22:58:56 +00:00
b7166a6f28 loop.c: fix printing of arrays
* loop.c (decode_loop_info): Use square brackets to print
struct loop_info.lo_init and struct loop_info.reserved arrays.
(decode_loop_info64): Use square brackets to print
struct loop_info64.lo_init array.
2016-05-29 22:34:30 +00:00
25129acea0 loop.c: fix printing of structure members' names
* loop.c (decode_loop_info, decode_loop_info64): Do not strip "lo_"
prefix from printed names.
2016-05-29 22:28:28 +00:00
bece24d1c6 loop.c: optimize decoding of paired ioctls
* loop.c (loop_ioctl): Optimize decoding of LOOP_[GS]ET_STATUS
and LOOP_[GS]ET_STATUS64 ioctl pairs.
2016-05-29 22:15:53 +00:00
124c17ad3c tests/ioctl_evdev.c: check EVIOCGUNIQ decoding
* tests/ioctl_evdev.c (main): Check EVIOCGUNIQ(0) decoding.
2016-05-28 22:13:27 +00:00
bd090efc40 tests/ioctl_mtd.c: fix build with musl
* tests/ioctl_mtd.c: Include <linux/ioctl.h>.
2016-05-28 19:55:01 +00:00
129b304c95 tests: check decoding of 'M' type ioctls
* tests/ioctl_mtd.c: New file.
* tests/ioctl_mtd.test: New test.
* tests/.gitignore: Add ioctl_mtd.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioctl_mtd.test.
2016-05-28 19:31:50 +00:00
a0866bce35 Mpersify mtd.c
* defs.h (mtd_ioctl): Remove.
* mtd.c: Mpersify struct mtd_oob_buf and ioctl numbers.
(mtd_ioctl): Mpersify.
2016-05-28 19:16:32 +00:00
0a27c814b2 mtd.c: refactor
* mtd.c (mtd_ioctl): Move parsers of structures to separate functions.
2016-05-28 19:16:28 +00:00
5104db4e60 Move parser of UBI_* ioctls to a separate file
* mtd.c (ubi_ioctl): Move to ...
* ubi.c: ... new file.
* Makefile.am (strace_SOURCES): Add it.
2016-05-28 10:29:30 +00:00
fc0a38612f tests: check decoding of EVIOC* ioctls
* tests/ioctl_evdev.c: New file.
* tests/ioctl_evdev-v.c: Likewise.
* tests/ioctl_evdev.test: New test.
* tests/ioctl_evdev-v.test: Likewise.
* tests/.gitignore: Add ioctl_evdev and ioctl_evdev-v.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioctl_evdev.test and ioctl_evdev-v.test.
2016-05-28 00:56:47 +00:00
43c8a5d0e8 Mpersify EVIOC* ioctl parser
* defs.h (evdev_abs): New xlat prototype.
(evdev_ioctl): Remove.
* evdev.c: Do not include "xlat/evdev_abs.h".
Mpersify struct ff_effect and ioctl numbers.
(evdev_ioctl): Mpersify.
* NEWS: Mention this enhancement.
2016-05-28 00:56:47 +00:00
aa21c07f2e evdev.c: fix printing of unrecognized event type passed to EVIOCGBIT
* evdev.c (bit_ioctl): If event type is not unrecognized,
print the argument as an address.
2016-05-28 00:56:47 +00:00
47be9f2597 evdev.c: fix printing of EV_PWR's argument
* evdev.c (bit_ioctl): Fix printing of comma before EV_PWR's argument.
2016-05-28 00:56:47 +00:00
3f23c0c79f evdev.c: fix indentation
* evdev.c: Fix indentation of print formats.
2016-05-28 00:56:47 +00:00
10de2eb030 evdev.c: fix decoding of EVIOCGNAME, EVIOCGPHYS, and EVIOCGUNIQ
* evdev.c (evdev_read_ioctl): Fix printing of the string returned
in response to EVIOCGNAME, EVIOCGPHYS, and EVIOCGUNIQ requests.
2016-05-28 00:56:47 +00:00
b29569aa1d evdev.c: fix EVIOCGVERSION decoding
* evdev.c (evdev_read_ioctl): Print EVIOCGVERSION's argument
using #x format.
2016-05-28 00:56:47 +00:00
563f0cefb1 evdev.c: fix EVIOCGMTSLOTS decoding
* evdev.c (mtslots_ioctl): Use umove_or_printaddr.
2016-05-28 00:56:47 +00:00
14a810e6d8 evdev.c: fix bitset decoding
* evdev.c (decode_bitset): Use umove_or_printaddr.
2016-05-28 00:56:47 +00:00
e54f98a223 evdev.c: fix decoding of struct input_id
* evdev.c (getid_ioctl): Use umove_or_printaddr.
2016-05-28 00:56:47 +00:00
13f8e8fb4e evdev.c: fix decoding of struct input_keymap_entry
* evdev.c (keycode_V2_ioctl): Use umove_or_printaddr.
2016-05-28 00:56:47 +00:00
7954e2a711 evdev.c: fix decoding of EVIOCGKEYCODE/EVIOCSKEYCODE
* evdev.c (keycode_ioctl): Use umove_or_printaddr.
2016-05-28 00:56:47 +00:00
e167006908 evdev.c: fix decoding of struct input_absinfo
* evdev.c (abs_ioctl): Use umove_or_printaddr.
2016-05-28 00:56:46 +00:00
3a45eb3711 evdev.c: fix decoding of struct ff_effect
* evdev.c (ff_effect_ioctl): Use umove_or_printaddr.
Fix printing of struct ff_effect.u member names.
2016-05-28 00:37:06 +00:00
c758ed0f50 evdev.c: fix printing of struct ff_envelope.fade_level
* evdev.c (decode_envelope): Print struct ff_envelope.fade_level
using #x format.
2016-05-28 00:37:06 +00:00
9635df43b6 evdev.c: fix decoding of EVIOCGRAB and EVIOCREVOKE
* evdev.c (evdev_write_ioctl): Print argument of EVIOCGRAB
and EVIOCREVOKE as unsigned long.
2016-05-28 00:37:06 +00:00
0039424cb9 evdev.c: fix EVIOCRMFF decoding
* evdev.c (evdev_write_ioctl): Print EVIOCRMFF's argument as int.
2016-05-28 00:37:06 +00:00
53767d8ec5 evdev.c: move handling of EVIOCGBIT to a separate function
* evdev.c (evdev_read_ioctl): Move EVIOCGBIT handling to ...
(bit_ioctl): ... new function.
2016-05-28 00:37:05 +00:00
8a18f80a37 evdev.c: reorder ioctl command checks
Change the order of ioctl command cheks to match the kernel:
1st, check for fixed-number fixed-length commands,
2nd, check for fixed-number variable-length commands,
3rd, check for multi-number fixed-length commands,
4thm check for multi-number variable-length commands.

* evdev.c (evdev_read_ioctl, evdev_write_ioctl): Reorder
ioctl command checks.
2016-05-28 00:37:05 +00:00
2114e08a87 evdev.c: decode all directions except _IOC_READ on entering syscall
* evdev.c (evdev_write_ioctl): Remove exiting check.
(evdev_read_ioctl): Move entering check ...
(evdev_ioctl): ... here.  Add RVAL_DECODED to return code in _IOC_WRITE
and default cases.
2016-05-28 00:37:05 +00:00
8d85c233d2 evdev.c: fix indentation of preprocessor directives
* evdev.c: Fix indentation of preprocessor directives.
Move inclusion of <linux/ioctl.h> into [HAVE_LINUX_INPUT_H].
2016-05-28 00:37:05 +00:00
eb36e38523 file_ioctl.c: print first two extents for FIDEDUPERANGE in abbrev mode
* file_ioctl.c (file_ioctl, print_file_dedupe_range_info): Print first
two elements of info array in abbrev mode.
* tests/btrfs.c (btrfs_test_extent_same_ioctl): Handle newly
printed elements.
2016-05-28 00:37:02 +00:00
1f1559e6a9 ioctl.c: fix typo in decoding of EVIOCSABS's parameter
* ioctl.c (evdev_decode_number): Fix typo in printxval default value.
2016-05-27 08:55:40 +00:00
826b7978ec tests: check decoding of btrfs RDWR ioctls returned data
* tests/btrfs-vw.test: New file.
* tests/btrfs-w.test: New file.
* tests/Makefile.am (DECODER_TESTS): Add them.
2016-05-27 08:54:32 +00:00
fd70b501f6 tests/btrfs.c: fix live btrfs_test_search_ioctls output
* tests/btrfs.c (btrfs_test_search_ioctls): Use print_tree_search_buf
for BTRFS_IOC_TREE_SEARCH and fix missing whitespace.
2016-05-27 08:54:18 +00:00
d32d95a87f btrfs.c: don't use print_array in btrfs_print_tree_search
* btrfs.c (btrfs_print_tree_search): Don't use print_array.  The buffer
represents a series of variable sized records, not an array.
2016-05-27 08:53:44 +00:00
2060d97382 btrfs.c: fix print_array usage in btrfs_print_logical_ino_container
* btrfs.c: (btrfs_print_logical_ino_container) Fix the element count
to reflect the number of records rather than the number of items.
2016-05-27 08:53:30 +00:00
563a758994 tests/btrfs.c: fix btrfs-v for BTRFS_IOC_TREE_SEARCH
* tests/btrfs.c (btrfs_test_send_ioctl): Assign key_reference
to search_args for BTRFS_IOC_TREE_SEARCH ioctl tests.
2016-05-26 20:54:46 +00:00
e6d2b566aa Fix -yy documentation
* strace.c (usage): Fix description of -yy option.
* strace.1: Likewise.
2016-05-26 15:34:28 +00:00
59b140a096 tests/ioctl_block.c: tweak magic constants to make the test more reliable
* tests/ioctl_block.c (main): Change bad pointer to make
its lower 32-bit part closer to -1U.
2016-05-26 15:16:31 +00:00
b356ad8abf tests/btrfs.c: check basic decoding of read-only ioctls
* tests/btrfs.c (btrfs_test_read_ioctls): New function.
(main): Use it.
2016-05-26 14:46:37 +00:00
799b22a27d tests: check decoding of BLK* ioctls
* configure.ac (AC_CHECK_TYPES): Add struct blk_user_trace_setup.
* tests/ioctl_block.c: New file.
* tests/ioctl_block.test: New test.
* tests/.gitignore: Add ioctl_block.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioctl_block.test.
2016-05-26 14:44:13 +00:00
37d1b3dd8c Mpersify BLK* ioctl parser
* defs.h (block_ioctl): Remove.
* block.c: Mpersify struct blk_user_trace_setup,
struct blkpg_ioctl_arg, struct blkpg_partition, and ioctl numbers.
(block_ioctl): Mpersify.
* NEWS: Mention this enhancement.
2016-05-26 14:44:13 +00:00
0c9087c1b5 block.c: optimize decoding of paired ioctls
* block.c (block_ioctl): Optimize decoding of commands that return
a signed int.
2016-05-26 14:44:13 +00:00
46d25c2b84 block.c: fix printing of uint64_t pairs
* block.c (block_ioctl): Print uint64_t values using PRIu64 format.
2016-05-26 14:44:13 +00:00
0bea528fa8 block.c: fix printing of struct blk_user_trace_setup
* block.c (block_ioctl): Fix printing of comma before
struct blk_user_trace_setup.name on exiting syscall.
2016-05-26 14:44:13 +00:00
4dd9f3f038 Move parser of 'X' type ioctls to a separate file
* fs_x_ioctl.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* block.c: (block_ioctl): Move parser of FITRIM, FIFREEZE, and FITHAW
to fs_x_ioctl.c.
* defs.h (fs_x_ioctl): New prototype.
* ioctl.c (ioctl_decode): Call fs_x_ioctl for ioctl type 'X'.
2016-05-26 14:44:13 +00:00
b3f00403c3 Move parser of HDIO_* ioctls to a separate file
* hdio.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* block.c: Do not include <linux/hdreg.h>.
(block_ioctl): Move parser of HDIO_GETGEO to hdio.c.
* defs.h (hdio_ioctl): New prototype.
* ioctl.c (ioctl_decode): Call hdio_ioctl for ioctl type 0x03.
2016-05-26 14:44:13 +00:00
84a979c9ee Fix explicit casts of signed integer types to unsigned long long
* defs.h (widen_to_ull): New macro.
* dirent.c (print_old_dirent, SYS_FUNC(getdents)): Use it in place
of explicit casts to unsigned long long.
* io.c (print_lld_from_low_high_val): Likewise.
* lseek.c (SYS_FUNC(llseek)): Likewise.
* printsiginfo.c (print_si_info): Likewise.
* printstat.h (DO_PRINTSTAT): Likewise.
* sysinfo.c (SYS_FUNC(sysinfo)): Likewise.
* times.c (SYS_FUNC(times)): Likewise.
* fetch_struct_statfs.c (ASSIGN_NUMBER): Remove.
(fetch_struct_statfs, fetch_struct_statfs64): Replace ASSIGN_NUMBER
with widen_to_ull.
2016-05-26 14:44:13 +00:00
51507201ea scsi.c: print __u64 types using PRI__u64 format
* scsi.c (print_sg_io_v4_req, print_sg_io_v4_res): Remove explicit casts
to unsigned long long, print fields of type __u64 using PRI__u64 format.
2016-05-26 14:44:13 +00:00
ba35137246 tests: check decoding of RTC_* ioctls
* configure.ac (AC_CHECK_FUNCS): Add ioctl_rtc.
* tests/ioctl_rtc.c: New file.
* tests/ioctl_rtc-v.c: Likewise.
* tests/ioctl_rtc.test: New test.
* tests/ioctl_rtc-v.test: Likewise.
* tests/.gitignore: Add ioctl_rtc and ioctl_rtc-v.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioctl_rtc.test and ioctl_rtc-v.test.
2016-05-25 17:58:57 +00:00
5d7812a479 Mpersify RTC_* ioctl parser
* defs.h (rtc_ioctl): Remove.
* rtc.c: Mpersify struct rtc_pll_info and ioctl numbers.
(rtc_ioctl): Mpersify.
* NEWS: Mention this enhancement.
2016-05-25 16:36:37 +00:00
7e3a381c3d rtc.c: fix decoding of struct rtc_wkalrm
* rtc.c (decode_rtc_wkalrm): Print field name of struct rtc_wkalrm.time.
2016-05-25 15:28:23 +00:00
eea86017e1 file_ioctl.c: print file descriptors using printfd
* file_ioctl.c (print_file_dedupe_range_info): Print
struct file_dedupe_range_info.dest_fd using printfd.
(file_ioctl): Print struct file_clone_range.src_fd using printfd.
2016-05-25 08:38:53 +00:00
6085825201 rtc.c: do not print argument of ioctls that have no arguments
* rtc.c (rtc_ioctl): Do not print argument of RTC_{A,U,P,W}IE_{ON,OFF}
and RTC_VL_CLR ioctls.
2016-05-25 08:38:53 +00:00
3adf229434 rtc.c: decode RTC_PLL_GET and RTC_PLL_SET
* rtc.c (rtc_ioctl): Decode RTC_PLL_GET and RTC_PLL_SET
2016-05-25 08:38:52 +00:00
e0b5e91375 rtc.c: optimize decoding of paired ioctls
* rtc.c (rtc_ioctl): Optimize decoding of RTC_ALM_READ/RTC_ALM_SET,
RTC_RD_TIME/RTC_SET_TIME, and RTC_WKALM_RD/RTC_WKALM_SET ioctl pairs.
2016-05-25 07:37:44 +00:00
a41fdb5786 block.c: handle BLKDAXGET
* block.c [!BLKDAXGET] (BLKDAXGET): Define.
(block_ioctl): Handle it.
2016-05-25 07:33:02 +00:00
f8da0f3e78 tests: check decoding of mount syscall
* tests/mount.c: New file.
* tests/mount.test: New test.
* tests/.gitignore: Add mount.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add mount.
2016-05-25 00:11:37 +00:00
1ba55355c6 tests/vhangup.c: diassociate from the controlling terminal first
* tests/vhangup.c (main): Call setsid before vhangup.
2016-05-24 20:12:25 +00:00
a41d9f5621 tests: add vhangup.test
* tests/vhangup.c: New file.
* tests/vhangup.test: New test.
* tests/.gitignore: Add vhangup.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add vhangup.test.
2016-05-24 20:09:16 +00:00
0cf24d9184 NEWS: Prepare for 4.12 release 2016-05-24 18:12:08 +00:00
e79f038dd9 tests/btrfs.c: fix build on x32
* tests/btrfs.c (btrfs_test_ino_path_ioctls): Fix printing of st_ino.
2016-05-24 15:10:41 +00:00
6697d15f0a tests/btrfs.c: fix build with u64 based BTRFS_IOC_DEFAULT_SUBVOL
* tests/btrfs.c: Fix build on systems where BTRFS_IOC_DEFAULT_SUBVOL
is defined using unexported type "u64".
2016-05-24 14:52:27 +00:00
ea516df85e btrfs.c: fix build on systems without BTRFS_IOC_FILE_EXTENT_SAME
* btrfs.c (btrfs_ioctl): Skip BTRFS_IOC_FILE_EXTENT_SAME case
if this constant is not defined.
* tests/btrfs.c (btrfs_test_extent_same_ioctl): Skip this part
of the test if BTRFS_IOC_FILE_EXTENT_SAME is not defined.
2016-05-24 14:52:27 +00:00
3f36611e98 tests/btrfs.c: fix printing struct btrfs_ioctl_clone_range_args
* tests/btrfs.c (btrfs_test_clone_ioctls): Print __u64 members
of struct btrfs_ioctl_clone_range_args using PRI__u64 format.
2016-05-24 14:52:27 +00:00
57888fa5f9 tests/btrfs.c: tweak magic constants to make the test more reliable
* tests/btrfs.c (btrfs_test_sync_ioctls): Change u64val
to 0xdeadbeefbadc0ded.
(btrfs_test_subvol_ioctls): Likewise.  Change bad_pointer
to make their lower 32-bit parts closer to -1U.
2016-05-24 14:52:27 +00:00
6ce6d3be10 btrfs.c: print file descriptors using printfd
* btrfs.c (btrfs_ioctl): Print struct btrfs_ioctl_send_args.send_fd,
struct btrfs_ioctl_vol_args.fd, and struct btrfs_ioctl_vol_args_v2.fd
using printfd.
* tests/btrfs.c (btrfs_print_vol_args_v2, btrfs_test_subvol_ioctls,
btrfs_test_device_ioctls, btrfs_test_clone_ioctls,
btrfs_test_send_ioctl): Update.
2016-05-24 14:52:27 +00:00
9298c66dc0 tests/btrfs.c: do not print errno in case of fs type mismatch
* tests/btrfs.c (main): Use error_msg_and_fail instead of
perror_msg_and_fail when the fs type of the given directory
is not BTRFS_SUPER_MAGIC.
2016-05-24 14:52:27 +00:00
2447de4ca1 tests/btrfs.c: fix indentation
* tests/btrfs.c: Fix indentation of preprocessor directives
and function prototypes.
2016-05-24 14:52:27 +00:00
28a5f66e2e tests/btrfs.c: sort included headers
* tests/btrfs.c: Sort included headers.
2016-05-24 14:52:27 +00:00
45fcc0c853 tests/btrfs.c: do not use alloca
* tests/btrfs.c: Don't include <alloca.h>.
(btrfs_test_subvol_ioctls): Allocate
struct btrfs_ioctl_vol_args_v2.qgroup_inherit using tail_alloc.
2016-05-24 14:52:27 +00:00
2212918aa2 tests/btrfs.c: fix build on systems without <linux/btrfs.h> or <linux/fiemap.h>
* tests/btrfs.c: Include "tests.h" first.
Skip the test if [!HAVE_LINUX_BTRFS_H].  Skip parts of the test
that use struct fiemap if [!HAVE_LINUX_FIEMAP_H].
2016-05-24 14:52:27 +00:00
3586679f7a tests: add testing for btrfs ioctls
* tests/btrfs.c: New file.
* tests/btrfs.test: New test.
* tests/btrfs-v.test: Likewise.
* tests/.gitignore: Add btrfs.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add btrfs.test and btrfs-v.test.
2016-05-24 14:52:27 +00:00
aab00c2023 tests/file_ioctl.c: use tail_alloc
* tests/file_ioctl.c (main): Allocate struct fiemap using tail_alloc.
2016-05-24 14:52:27 +00:00
3b730d4a0f tests/file_ioctl.c: fix build on systems without <linux/fiemap.h>
* tests/file_ioctl.c: Include "tests.h" first.
Skip the test if [!HAVE_LINUX_FIEMAP_H].
2016-05-24 14:52:27 +00:00
c05c24cc51 tests: add testing for FS_IOC_FIEMAP
This is limited to FIEMAP.  FICLONE* and FIDEDUPERANGE originated in
btrfs and will be tested there.

* tests/file_ioctl.c: New file.
* tests/file_ioctl.test: New test.
* tests/.gitignore: Add file_ioctl.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add file_ioctl.test.
2016-05-24 14:52:27 +00:00
fb0c6095f3 Mpersify btrfs.c
* btrfs.c: Mpersify 3 arch-specific structures
and corresponding ioctl numbers.
(btrfs_ioctl): Mpersify.
* defs.h (btrfs_ioctl): Remove.
2016-05-24 14:52:27 +00:00
d57cc26bf0 btrfs.c: use print_array
* btrfs.c (print_btrfs_data_container_logical_ino,
print_btrfs_data_container_ino_path, print_uint64,
print_btrfs_ioctl_search_header, print_objectid_callback,
print_btrfs_ioctl_space_info): New functions.
(btrfs_print_logical_ino_container, btrfs_print_ino_path_container):
Rewrite printers of struct btrfs_data_container.val array
using print_array.
(btrfs_print_qgroup_inherit): Rewrite printer of
struct btrfs_qgroup_inherit.qgroups array using print_array.
(btrfs_print_tree_search): Rewrite printer of
struct btrfs_ioctl_search_header array using print_array.
(btrfs_ioctl): Rewrite printer of
struct btrfs_ioctl_send_args.clone_sources and
struct btrfs_ioctl_space_args.spaces using print_array.
2016-05-24 14:52:27 +00:00
82b9e34e7c btrfs.c: simplify BTRFS_IOC_GET_FSLABEL parser
* btrfs.c (btrfs_ioctl): Share code of parser of BTRFS_IOC_SET_FSLABEL
with parser of BTRFS_IOC_GET_FSLABEL only on BTRFS_IOC_GET_FSLABEL's
entering.
2016-05-24 14:52:27 +00:00
d67b2173a1 btrfs.c: fix BTRFS_IOC_TREE_SEARCH_V2 output
* btrfs.c (btrfs_ioctl): Fix BTRFS_IOC_TREE_SEARCH_V2 output
in case of EOVERFLOW and failed umove.
2016-05-24 14:52:27 +00:00
6638a5d132 btrfs.c: cleanup use of tcp->auxstr
* btrfs.c (btrfs_ioctl): Reset tcp->auxstr only if it is set.
2016-05-24 14:52:27 +00:00
92b90621cc btrfs.c: cleanup struct btrfs_ioctl_get_dev_stats.nr_items check
* btrfs.c (btrfs_ioctl): Cleanup check of iterator of
btrfs_ioctl_get_dev_stats.values array.
2016-05-24 14:52:27 +00:00
0cd7ea0552 btrfs.c: do not use BTRFS_SUBVOL_NAME_MAX
* btrfs.c [BTRFS_SUBVOL_NAME_MAX]: Remove.
(btrfs_ioctl): Use sizeof(struct btrfs_ioctl_vol_args_v2.name)
instead of BTRFS_SUBVOL_NAME_MAX + 1.
2016-05-24 14:52:27 +00:00
b85d09f316 btrfs.c: mark some function arguments as const
* btrfs.c (btrfs_print_balance_args, btrfs_print_features,
btrfs_print_qgroup_limit, btrfs_print_data_container_header,
btrfs_print_logical_ino_container, btrfs_print_ino_path_container,
btrfs_print_qgroup_inherit): Mark some function arguments as const.
2016-05-24 14:52:27 +00:00
90ffbc79b0 btrfs.c: use umove instead of umoven
* btrfs.c: Use umove instead of umoven and umove_or_printaddr
instead of umoven_or_printaddr.
2016-05-24 14:52:27 +00:00
3ce2dfcebb btrfs.c: remove unused variable
* btrfs.c (btrfs_ioctl): Remove "ret" variable.
2016-05-24 14:52:27 +00:00
95577cf9d3 btrfs.c: use printxval/printxval64 instead of printxvals
* btrfs.c (btrfs_ioctl): Do not call printxvals directly,
use printxval/printxval64 wrappers that do the right thing.
2016-05-24 14:52:27 +00:00
2be39ec201 btrfs.c: fix indentation
* btrfs.c: Fix indentation of preprocessor directives and print formats.
2016-05-24 14:52:27 +00:00
aa7787f85b xlat/btrfs_dev_stats_values.in: cleanup
* xlat/btrfs_dev_stats_values.in: Remove HAVE_DECL_* defines,
use #unconditional instead.
2016-05-24 14:52:27 +00:00
d2bd683202 file_ioctl.c: use print_array
* file_ioctl.c (file_ioctl): Rewrite printers of
struct file_dedupe_range_info and struct fiemap_extent arrays
using print_array.
2016-05-24 14:52:27 +00:00
0b13d9c294 file_ioctl.c: fix indentation
* file_ioctl.c: Fix indentation of preprocessor directives
and print formats.
2016-05-24 14:52:27 +00:00
1d2201c95c file_ioctl.c: include <linux/ioctl.h> instead of <sys/ioctl.h>
Being a wrapper around <linux/ioctl.h>, <sys/ioctl.h> brings
no benefits for this parser.

* file_ioctl.c: Include <linux/ioctl.h> instead of <sys/ioctl.h>.
2016-05-24 14:52:27 +00:00
c5253077d8 file_ioctl.c: fix build on systems without <linux/fiemap.h>
* configure.ac (AC_CHECK_HEADERS): Add linux/fiemap.h.
* file_ioctl.c: Do not include <linux/fiemap.h> and xlat/fiemap_*.h
if [!HAVE_LINUX_FIEMAP_H].
(file_ioctl): Do not parse FS_IOC_FIEMAP if [!HAVE_LINUX_FIEMAP_H].
2016-05-24 14:52:27 +00:00
25f3758510 ioctl.c: fix build
* ioctl.c (ioctl_decode): Move definition of "ret" variable
to [ALPHA || POWERPC] case.
[ALPHA || POWERPC]: Fix syntax error.
2016-05-24 14:52:27 +00:00
398fe0493e ioctl: add decoding for FS_IOC_FIEMAP
* file_ioctl.c: Include <linux/fiemap.h>, "xlat/fiemap_flags.h",
and "xlat/fiemap_extent_flags.h".
(file_ioctl): Handle FS_IOC_FIEMAP.
* ioctl.c (ioctl_decode): Use file_ioctl for decoding 'f' code ioctls.
2016-05-24 14:52:27 +00:00
306a2612a5 Add xlat/fiemap_flags.in and xlat/fiemap_extent_flags.in
* xlat/fiemap_flags.in: New file.
* xlat/fiemap_extent_flags.in: Likewise.
2016-05-24 14:52:27 +00:00
8cc6962216 ioctl: add decoding support for btrfs ioctls
* btrfs.c: New file.
* file_ioctl.c: Likewise.
* Makefile.am (strace_SOURCES): Add them.
* configure.ac (AC_CHECK_HEADERS): Add linux/btrfs.h.
(AC_CHECK_MEMBERS): Add struct btrfs_ioctl_feature_flags.compat_flags,
struct btrfs_ioctl_fs_info_args.nodesize,
struct btrfs_ioctl_defrag_range_args.start,
and struct btrfs_ioctl_search_args_v2.buf_size.
(AC_CHECK_DECLS): Add BTRFS_COMPRESS_* enums.
* defs.h (btrfs_ioctl, file_ioctl): New prototypes.
* ioctl.c (ioctl_decode) [HAVE_LINUX_BTRFS_H]: Use btrfs_ioctl.
* xlat/btrfs_balance_args.in: New file.
* xlat/btrfs_balance_ctl_cmds.in: Likewise.
* xlat/btrfs_balance_flags.in: Likewise.
* xlat/btrfs_balance_state.in: Likewise.
* xlat/btrfs_compress_types.in: Likewise.
* xlat/btrfs_defrag_flags.in: Likewise.
* xlat/btrfs_dev_replace_cmds.in: Likewise.
* xlat/btrfs_dev_replace_results.in: Likewise.
* xlat/btrfs_dev_replace_state.in: Likewise.
* xlat/btrfs_dev_stats_flags.in: Likewise.
* xlat/btrfs_dev_stats_values.in: Likewise.
* xlat/btrfs_features_compat.in: Likewise.
* xlat/btrfs_features_compat_ro.in: Likewise.
* xlat/btrfs_features_incompat.in: Likewise.
* xlat/btrfs_key_types.in: Likewise.
* xlat/btrfs_qgroup_ctl_cmds.in: Likewise.
* xlat/btrfs_qgroup_inherit_flags.in: Likewise.
* xlat/btrfs_qgroup_limit_flags.in: Likewise.
* xlat/btrfs_qgroup_status_flags.in: Likewise.
* xlat/btrfs_scrub_flags.in: Likewise.
* xlat/btrfs_send_flags.in: Likewise.
* xlat/btrfs_snap_flags_v2.in: Likewise.
* xlat/btrfs_space_info_flags.in: Likewise.
* xlat/btrfs_tree_objectids.in: Likewise.
2016-05-24 14:52:27 +00:00
c4d4d3c3a6 x32: update ioctl entries from linux 4.6
* linux/x32/ioctls_inc0.h: Update from linux v4.6 using ioctls_gen.sh.
2016-05-24 14:50:43 +00:00
9b49af1871 tests/attach-f-p.c: sleep a bit more to let the tracer catch up
On noticeably lagging systems, the parent process may invoke its chdir
call before the tracer gets notified about completion of its last child
process.  Add extra sleep in the parent process to win the race.

* tests/attach-f-p.c (main): Change timerid into a static array.
Arm a timer in the parent process and wait for it.
2016-05-24 12:14:33 +00:00
475d2b5da6 tests/attach-p-cmd-cmd.c: fix potential errno clobbering
* tests/attach-p-cmd-cmd.c (main): Call getpid before chdir.
2016-05-23 16:39:23 +00:00
4ea65fb549 tests/net-yy-netlink.c: robustify against libc specific issues
* tests/net-yy-netlink.c (main): Use getsockname instead of recvmsg
as the latter has notible implementation differences that make
the test unreliable.
2016-05-23 10:26:46 +00:00
29df0351a9 tests/net-yy-netlink.c: robustify against os specific issues
* tests/net-yy-netlink.c (main): Pass a pointer to a real struct msghdr
as NULL doesn't work well on some systems.
2016-05-23 10:26:46 +00:00
1e9dabee66 tests/net-yy-{inet,netlink}.test: cleanup
* tests/net-yy-inet.test: Do not pass arguments to net-yy-inet
as the latter does not accept them.
* tests/net-yy-netlink.test: Do not pass arguments to net-yy-netlink
as the latter does not accept them.
2016-05-23 10:14:39 +00:00
f21a2f4119 tests: define PRI__[dux]64 macros to print __s64 and __u64 values
Rather than cast every __u64 or __s64 before printing,
define printing helpers for those types directly.

This complements commit 1f3482beda.

* tests/tests.h (PRI__d64, PRI__u64, PRI__x64): New macros.
2016-05-22 22:54:23 +00:00
62a35fa572 tests: remove manual creation of memory mapping holes
We used to call tail_alloc(1) to create memory mapping holes around
regular tail_alloc allocations.  This is no longer needed since regular
tail_alloc allocations create additional memory mapping holes.

* tests/clock_adjtime.c (main): Remove creation of memory mapping holes
using tail_alloc(1).
* tests/futimesat.c (main): Likewise.
* tests/get_mempolicy.c (print_nodes, main): Likewise.
* tests/getgroups.c (main): Likewise.
* tests/getresugid.c (main): Likewise.
* tests/ioctl_uffdio.c (main): Likewise.
* tests/ioctl_v4l2.c (main): Likewise.
* tests/move_pages.c (main): Likewise.
* tests/net-icmp_filter.c (main): Likewise.
* tests/ptrace.c (test_peeksiginfo, main): Likewise.
* tests/pwritev.c (main): Likewise.
* tests/set_mempolicy.c (print_nodes): Likewise.
* tests/setgroups.c (main): Likewise.
* tests/umovestr3.c (main): Likewise.
* tests/utimes.c (main): Likewise.
* tests/xattr.c (main): Likewise.
2016-05-22 22:29:33 +00:00
0f303f99c6 tests: make tail_alloc create additional memory mapping holes
* tests/tail_alloc.c (tail_alloc): Create additional memory mapping
holes before and after the allocated memory.
2016-05-22 22:21:48 +00:00
a8fce09e34 mpers: add support of conditionally compiled printers
We used to declare and define all printers marked with
MPERS_PRINTER_DECL, including ifdef'ed ones.  That approach left us
no way to conditionally compile mpersified printers, which was not
a problem until btrfs ioctls appeared on the horizon.

With this change, those mpersified printers that are not going
to be compiled are also won't be declared and won't be added to
struct_printers.

This is implemented by filtering all source files containing
MPERS_PRINTER_DECL markers through CPP.  As a nice side effect, this
also lifts an ugly requirement of writing all MPERS_PRINTER_DECL
declarations in a single line.

* README-mpers: Update description of MPERS_PRINTER_DECL syntax.
* defs.h [IN_MPERS_BOOTSTRAP] (MPERS_PRINTER_DECL): Turn into
a recursive variadic macro.
[!IN_MPERS_BOOTSTRAP] (MPERS_PRINTER_DECL): Turn into a variadic macro.
All callers changed.
* Makefile.am (mpers_preproc_files, mpers_printer_decl_pattern):
New variables.
(CLEANFILES): Add $(mpers_preproc_files).
(%.c.mpers.i): New rule.
(printers.h, %_printer_decls.h, %_printer_defs.h): Use
mpers_preproc_files instead of srcdir_mpers_source_files,
use mpers_printer_decl_pattern.
* .gitignore: Add /*.mpers.i.
2016-05-21 22:53:06 +00:00
4bf7ab7005 Remove redundant declaration of v4l2_ioctl
There is no need to declare mpers printers in defs.h because
they are already declared in printers.h or native_printer_decls.h.

This complements commit 1e56814f77.

* defs.h (v4l2_ioctl): Remove.
2016-05-20 22:47:39 +00:00
7b6979701b Fix one more code pattern that might break gcc strict aliasing rules
* socketutils.c (receive_responses): Turn static buffer into a union
to avoid breaking of gcc strict aliasing rules.
* tests/netlink_inet_diag.c (check_responses): Likewise.
* tests/netlink_netlink_diag.c (check_responses): Likewise.
* tests/netlink_unix_diag.c (check_responses): Likewise.
2016-05-21 09:33:12 +00:00
28e955d747 tests: add check for netlink protocol decoding with -yy option
* tests/netlink_netlink_diag.c: New file.
* tests/net-yy-netlink.c: New file.
* tests/net-yy-netlink.test: New test.
* tests/.gitignore: Add net-yy-netlink and netlink_netlink_diag
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add net-yy-netlink.test.
2016-05-21 09:32:52 +00:00
814c0d575d Add netlink domain sockets support to socketutils
* linux/netlink_diag.h: New file.
* Makefile.am (EXTRA_DIST): Add it.
* socketutils.c: Include it and "xlat/netlink_protocols.h".
(netlink_send_query, netlink_parse_response, netlink_print): New
functions.
(print_sockaddr_by_inode): Hook up netlink_print.
2016-05-18 22:02:48 +00:00
ff2b853e7f tests/pread64-pwrite64.c: robustify against os specific issues
Do not assume that pwrite64 syscall fails when only part of the
specified memory buffer is accessible.  With some kernels, one
accessible byte at the end of page is enough for pwrite64 syscall
to return 1.

* tests/pread64-pwrite64.c (main): Tweak the test that can lead
to a partial write.
2016-05-18 09:26:01 +00:00
a8e820586e tests/read-write.c: robustify against os specific issues
Do not assume that write syscall fails when only part of the specified
memory buffer is accessible.  With some kernels, one accessible byte
at the end of page is enough for write syscall to return 1.

* tests/read-write.c (main): Tweak the test that can lead to a partial
write.
2016-05-18 09:26:01 +00:00
af09d4f4fa umovestr3.test: extend test coverage
* tests/umovestr3.c: Include <sys/param.h>.
(main): Test with each number between PATH_MAX-1 and 0.
2016-05-18 09:26:01 +00:00
81f1b1689a tests/timer_create.c: robustify against os specific issues
* tests/timer_create.c (main): Do not assume any specific error code
returned by timer_create, print whatever it is.
2016-05-18 09:26:01 +00:00
e0ba92016b Fix some compilation warnings on older systems
* print_statfs.c (print_statfs_flags): Define only
for [HAVE_STRUCT_STATFS_F_FLAGS || HAVE_STRUCT_STATFS64_F_FLAGS].
* tests/inet-cmsg.c (print_origdstaddr): Define only
for [IP_ORIGDSTADDR].
2016-05-18 09:26:01 +00:00
9164722af0 Update generic ioctl entries from linux 4.6
* linux/64/ioctls_inc.h: Update from linux v4.6 using ioctls_gen.sh.
* linux/32/ioctls_inc_align32.h: Likewise.
* linux/32/ioctls_inc_align64.h: Likewise.
* NEWS: Mention this.
2016-05-18 09:26:01 +00:00
d07201aeef maint: update for linux 4.6
* maint/ioctls_sym.sh: Update workarounds for linux/kvm.h.
2016-05-18 09:26:01 +00:00
a9fdbf1d59 Update SOL_* constants
* xlat/socketlayers.in: Add SOL_KCM.
2016-05-18 09:26:01 +00:00
85acd1304e Update MSG_* constants
* xlat/msg_flags.in: Add MSG_BATCH.
2016-05-18 09:26:01 +00:00
72712cbc58 Update AF_* constants
* xlat/addrfams.in: Add AF_KCM.
2016-05-18 09:26:01 +00:00
854a25930c tests: add brk.test
* tests/brk.c: New file.
* tests/brk.test: New test.
* tests/.gitignore: Add brk.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add brk.test.
2016-05-17 10:53:03 +00:00
9b8ca23cc0 Fix printing of invalid arguments of term ioctls
* term.c (term_ioctl): Print arguments of TCXONC and TCFLSH ioctls
using printxval_long.
2016-05-17 08:03:58 +00:00
29c845ca85 mips: fix printing of invalid operations argument of sysmips syscall
* sysmips.c (SYS_FUNC(sysmips)): Print 1st argument of syscall using
printxval_long.
2016-05-17 08:03:58 +00:00
5e2fc6228e bfin: fix printing of invalid flags argument of sram_alloc syscall
* sram_alloc.c (SYS_FUNC(sram_alloc)): Print 2nd argument using
printflags_long.
2016-05-17 08:03:58 +00:00
c5f6863a18 Fix printing of invalid arguments of prctl syscall
* prctl.c (SYS_FUNC(prctl)): Print 2nd syscall argument
of PR_CAPBSET_DROP, PR_CAPBSET_READ, PR_CAP_AMBIENT, PR_MCE_KILL,
and PR_SET_SECCOMP using printxval_long.
Print 2nd syscall argument of PR_SET_SECUREBITS using printflags_long.
Print 3rd syscall argument of PR_CAP_AMBIENT and PR_MCE_KILL using
printxval_long.
* tests/prctl-seccomp-strict.c (main): Update.
2016-05-16 23:50:59 +00:00
a95c3e515f Fix printing of invalid flags argument of perf_event_open syscall
* numa.c (SYS_FUNC(perf_event_open)): Print 5th argument of syscall
using printflags_long.
2016-05-16 23:48:05 +00:00
30dc5418a3 or1k: fix printing of invalid 1st argument of or1k_atomic syscall
* or1k_atomic.c (SYS_FUNC(or1k_atomic)): Print 1st argument using
printxval_long.
2016-05-16 23:48:05 +00:00
0da9b0e3b2 Fix printing of invalid flags argument of get_mempolicy syscall
* numa.c (SYS_FUNC(get_mempolicy)): Print 5th argument of syscall
using printxval_long.
2016-05-16 23:48:05 +00:00
3a0fa5c619 Fix printing of invalid mode argument of mbind syscall
* numa.c (SYS_FUNC(mbind)): Print 3rd argument of syscall
using printxval_long.
* tests/mbind.c (main): Update.
2016-05-16 23:48:05 +00:00
942da9c895 Fix printing of invalid argument of MTDFILEMODE ioctl
* mtd.c (mtd_ioctl): Print 3rd argument of MTDFILEMODE ioctl
using printflags_long.
2016-05-16 23:48:05 +00:00
412ec9480c Fix printing of invalid flags argument of mount syscall
* mount.c (SYS_FUNC(mount)): Print 1st argument using printflags_long.
2016-05-16 23:48:05 +00:00
1168114879 Fix printing of invalid arguments of memory mapping related syscalls
* mem.c (print_mmap): Print 3rd and 4th arguments of syscall
using printflags_long.
(SYS_FUNC(mprotect)): Print 3rd argument of syscall using
printflags_long.
(SYS_FUNC(mremap)): Print 4th argument of syscall using printflags_long.
(SYS_FUNC(remap_file_pages)): Print 3rd and 4th arguments of syscall
using printflags_long.
* tests/remap_file_pages.c (main): Update.
2016-05-16 23:47:34 +00:00
e2c5a3c60e Fix printing of invalid flags argument of kexec_load and kexec_file_load
* kexec.c (SYS_FUNC(kexec_load), SYS_FUNC(kexec_file_load)): Print
flags argument using printflags_long.
2016-05-16 22:54:41 +00:00
c560c80aa0 Fix printing of invalid 3rd argument of fcntl/fcntl64 syscall
* fcntl.c (print_fcntl): Print 3rd argument of F_NOTIFY, F_SETLEASE, and
F_ADD_SEALS operations using printflags_long.
2016-05-16 22:52:04 +00:00
d06fa28b0e Fix printing of invalid flags argument of unshare syscall
* clone.c (SYS_FUNC(unshare)): Print 1st argument using printflags_long.
2016-05-16 22:49:54 +00:00
77ab8dd0bd Introduce printflags_long and printxval_long
* defs.h (printflags_long, printxval_long): New static inline functions.
2016-05-16 22:44:50 +00:00
f77ca9ca71 Fix printing of invalid struct xfs_dqblk.d_flags
* quota.c (decode_cmd_data): Explicitly cast struct xfs_dqblk.d_flags
to uint8_t to avoid potential sign-extension bug when printing
invalid struct xfs_dqblk.d_flags.
2016-05-16 22:41:20 +00:00
2cad72f489 Fix printing of invalid struct ubi_mkvol_req.vol_type
* mtd.c (ubi_ioctl): Explicitly cast struct ubi_mkvol_req.vol_type
to unsigned short to avoid potential sign-extension bug when printing
invalid struct ubi_mkvol_req.vol_type.
2016-05-16 22:41:20 +00:00
b8eec608fa Fix decoding of prctl/arch_prctl operation argument
Consistently treat operation argument of prctl/arch_prctl syscalls
as int to match the kernel behaviour.

* prctl.c (SYS_FUNC(prctl), SYS_FUNC(arch_prctl)): Assign 1st argument
of syscalls to a variable of type unsigned int and use it in all
subsequent checks and lookups.
2016-05-16 22:41:20 +00:00
ba62f34243 Fix printing of struct sched_attr.sched_flags
* sched.c (print_sched_attr): Print sched_flags using printflags64.
2016-05-16 22:41:19 +00:00
e9dd8f9406 Fix printing of struct statfs.f_flags
* print_statfs.c (print_statfs_flags): Print flags using printflags64.
2016-05-16 22:41:19 +00:00
b0695de14f Fix printing of invalid struct ifreq.ifr_flags
* sock.c (print_ifreq): Explicitly cast struct ifreq.ifr_flags
to unsigned short to avoid potential sign-extension bug when printing
invalid struct ifreq.ifr_flags.
2016-05-16 22:41:19 +00:00
952d89ba5a Fix printing of invalid struct pollfd.events
* poll.c (print_pollfd): Explicitly cast struct pollfd.events
to unsigned short to avoid potential sign-extension bug when printing
invalid struct pollfd.events.
2016-05-16 22:41:19 +00:00
977aee82bf Fix printing of invalid struct sembuf.sem_flg
* ipc_sem.c (print_sembuf): Explicitly cast struct sembuf.sem_flg
to unsigned short to avoid potential sign-extension bug when printing
invalid struct sembuf.sem_flg.
2016-05-16 22:41:19 +00:00
a734a97d0e Fix printing of invalid l_type and l_whence in fcntl/fcntl64 syscalls
* fcntl.c (print_struct_flock64): Explicitly cast l_type and l_whence
fields to unsigned short to avoid potential sign-extension bug when
printing invalid l_type or l_whence fields.
2016-05-16 22:41:19 +00:00
6e381c67fd Fix printing of fanotify_mark mask argument
* fanotify.c (SYS_FUNC(fanotify_mark)): Print mask using printflags64.
2016-05-16 22:41:17 +00:00
55044d9670 Fix decoding of epoll_ctl operation argument
Consistently treat operation argument of epoll_ctl syscall as int
to match the kernel behaviour.

* epoll.c (SYS_FUNC(epoll_ctl)): Assign 2nd argument of syscall
to a variable of type unsigned int and use it in all subsequent
checks and lookups.
* tests/epoll_ctl.c (invoke_syscall): New function.
(main): Use it.
2016-05-16 21:47:09 +00:00
7fb984e27e Fix printing of invalid d_type in getdents syscall
* dirent.c (SYS_FUNC(getdents)): Treat d_type as unsigned char to avoid
potential sign-extension bug when printing invalid d_type.
2016-05-16 21:47:09 +00:00
2eb56d1906 bfin: fix decoding of cacheflush syscall
* cacheflush.c (SYS_FUNC(cacheflush)): Print 2nd argument
using %lu format.  Print 3rd argument as flags.
2016-05-16 21:47:09 +00:00
18d921da6d Fix decoding of BPF_MAP_UPDATE_ELEM flags
* bpf.c (bpf_map_update_elem): Print attr.flags using printxval64.
2016-05-16 21:47:09 +00:00
77086594ce Fix decoding of fcntl/fcntl64 operation argument
Consistently treat operation argument of fcntl/fcntl64 syscalls as int
to match the kernel behaviour.

* fcntl.c (print_fcntl, SYS_FUNC(fcntl), SYS_FUNC(fcntl64)): Assign
2nd argument of syscall to a variable of type unsigned int
and use it in all subsequent checks and lookups.
* tests/struct_flock.c (invoke_test_syscall): New function.
(test_flock_einval, test_flock): Use it.
* tests/fcntl.c (test_flock64_einval): Use it.
* tests/fcntl64.c (test_flock64_einval, test_flock64): Use it.
2016-05-16 21:46:48 +00:00
4811023e74 Rename sprintflags64 to sprintflags.
* defs.h (sprintflags): Remove.
(sprintflags64): Rename to sprintflags.
* util.c (sprintflags64): Rename to sprintflags.
2016-05-15 14:26:03 +00:00
6274ecc752 Prepare for transition from sprintflags64 to sprintflags
* fcntl.c (print_fcntl): Cast 3rd argument of sprintflags
to unsigned long.
* membarrier.c (SYS_FUNC(membarrier)): Likewise.
* prctl.c (SYS_FUNC(prctl)): Likewise.
* poll.c (decode_poll_exiting): Cast 3rd argument of sprintflags
to unsigned short.
2016-05-15 14:23:06 +00:00
c0db59b97b Rename xlookup64 to xlookup
* defs.h (xlookup): Remove.
(xlookup64): Rename to xlookup.
* util.c (xlookup64): Rename to xlookup.
2016-05-14 22:05:09 +00:00
9134aab407 Prepare for transition from xlookup64 to xlookup
* fcntl.c (print_fcntl, SYS_FUNC(fcntl), SYS_FUNC(fcntl64)):
Cast 2nd argument of xlookup to unsigned long.
* prctl.c (SYS_FUNC(prctl)): Likewise.
* sched.c (SYS_FUNC(sched_getscheduler)): Likewise.
* time.c (do_adjtimex): Likewise.
* ioprio.c (sprint_ioprio): Change type of the argument
and local variables from int to unsigned int.
* keyctl.c (print_keyring_serial_number): Cast 2nd argument
of xlookup to unsigned int.
* net.c (tprint_sock_type): Change type of the argument to unsigned int.
* printmode.c (sprintmode): Likewise.
* printsiginfo.c (printsigval):  Change type of si_code argument
to unsigned int.
2016-05-14 22:05:06 +00:00
a8443f8695 v4l2: fix build with old kernel headers
Prior to v2.6.25-rc3, <linux/videodev2.h> didn't include all
required headers, resulting to omission of V4L2_* constants.

This issue doesn't arise in v4l2.c and tests/ioctl_v4l2.c files
because they already include all necessary headers themselves.

* configure.ac (AC_CHECK_DECLS): Include <sys/time.h>, <linux/ioctl.h>,
and <linux/types.h> before <linux/videodev2.h>.
2016-05-14 00:36:27 +00:00
3cc989e7fc configure.ac: do not check for sys/ioctl.h and ioctls.h
Since sys/ioctl.h is included unconditionally when needed
and ioctls.h doesn't exist, these checks are redundant.

* configure.ac (AC_CHECK_HEADERS): Remove ioctls.h and sys/ioctl.h.
2016-05-13 22:09:40 +00:00
deff569f41 sock.c: include <linux/ioctl.h> instead of <sys/ioctl.h> or <ioctls.h>
Include <linux/ioctl.h> for <linux/sockios.h> on alpha, sh, and sh64
architectures because their <asm/sockios.h> use _IOR and _IOW macros
but don't include anything that would define these macros.

Being a wrapper around <linux/ioctl.h>, <sys/ioctl.h> brings
no benefits in this case.  <ioctls.h> simply doesn't exist.

* sock.c [ALPHA || SH || SH64]: Include <linux/ioctl.h>
instead of <sys/ioctl.h> or <ioctls.h>.
2016-05-13 22:09:40 +00:00
fe3de9c601 v4l2: include <linux/ioctl.h> instead of <sys/ioctl.h>
Being a wrapper around <linux/ioctl.h>, <sys/ioctl.h> brings
no benefits for parser of VIDIOC_* ioctls.

* v4l2.c: Include <linux/ioctl.h> instead of <sys/ioctl.h>.
2016-05-13 22:09:40 +00:00
f9199ab081 printsiginfo: remove "verbose" argument
Remove erroneous use of verbose(tcp) as a printing limit
for already fetched members of siginfo_t structure.

* printsiginfo.h (printsiginfo): Remove boolean argument.
* printsiginfo.c (printsigval): Remove boolean argument, print
si_int and si_ptr members unconditionally.  All callers changed.
(print_si_info): Remove boolean argument, print si_utime and si_stime
members unconditionally.  All callers changed.
(printsiginfo): Remove boolean argument.  All callers changed.
2016-05-13 22:09:07 +00:00
602998be62 tests/ptrace.c: tweak magic constants to make the test more reliable
* tests/ptrace.c (main): Change bad_request and bad_data to make they
lower 32-bit parts closer to -1U.
2016-05-13 09:37:10 +00:00
98f632a14c tests/ioctl_v4l2.c: fix build on older systems
Fix build on systems without HAVE_DECL_V4L2_CTRL_TYPE_STRING or
V4L2_CTRL_CLASS_CAMERA.

* tests/ioctl_v4l2.c (main) [VIDIOC_S_EXT_CTRLS]: Disable part of the
test if [!HAVE_DECL_V4L2_CTRL_TYPE_STRING].
Replace V4L2_CTRL_CLASS_CAMERA with V4L2_CTRL_CLASS_USER.
2016-05-13 05:18:42 +00:00
f2f162e89c Do not use htole32 function
htole32 function is not portable enough.

* v4l2.c (print_pixelformat): Rewrite initialization of pixel format
union without using of htole32.
* tests/ioctl_v4l2.c (main): Likewise.
2016-05-13 05:18:42 +00:00
09de43b39d tests/ioctl_v4l2.c: fix typo
* tests/ioctl_v4l2.c (main)
[!HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE]: Fix typo in expected
output string.
2016-05-13 05:18:42 +00:00
632efff900 tests: check decoding of ptrace syscall
* tests/ptrace.c: New file.
* tests/ptrace.test: New test.
* tests/.gitignore: Add ptrace.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ptrace.
2016-05-13 05:18:41 +00:00
76b4c33c7f ptrace: decode data argument of PTRACE_PEEKSIGINFO request
The data argument of PTRACE_PEEKSIGINFO request is a pointer
to siginfo_t array.

* printsiginfo.c (print_siginfo_t): New function.
(print_siginfo_array): New mpers printer.
* process.c (SYS_FUNC(ptrace)): Print data argument of
PTRACE_PEEKSIGINFO request using print_siginfo_array.
2016-05-13 02:36:14 +00:00
d9fb4a434d ptrace: decode data argument of PTRACE_SECCOMP_GET_FILTER request
* process.c (SYS_FUNC(ptrace)): Print data argument of
PTRACE_SECCOMP_GET_FILTER request on exiting using print_seccomp_fprog.
2016-05-13 01:39:41 +00:00
846f617805 ptrace: decode argument of PTRACE_GETEVENTMSG request
* process.c (SYS_FUNC(ptrace)): Print data argument of
PTRACE_GETEVENTMSG request on exiting using printnum_ulong.
2016-05-13 01:39:41 +00:00
1634de70b2 ptrace: decode arguments of PTRACE_[GS]ETSIGMASK requests
* process.c (SYS_FUNC(ptrace)): Print arguments of PTRACE_GETSIGMASK
and PTRACE_SETSIGMASK requests using print_sigset_addr_len.
2016-05-13 01:39:41 +00:00
8bd7f3155c ptrace: return RVAL_DECODED for requests decoded on entering
* process.c (SYS_FUNC(ptrace)): Return RVAL_DECODED on entering for all
ptrace requests except those that are partially decoded in exiting,
2016-05-13 01:39:39 +00:00
388aca6472 ptrace: print PTRACE_O_* flags using printflags64
As flags argument has a long integer type, print it using printflags64
because printflags takes unsigned int argument.

* process.c (SYS_FUNC(ptrace)): Print PTRACE_O_* flags
using printflags64.
2016-05-12 16:35:54 +00:00
7c8e3302ea ptrace: print data argument of PTRACE_SEIZE et al requests as flags
* process.c (SYS_FUNC(ptrace)): Print data argument of
PTRACE_SEIZE and PTRACE_OLDSETOPTIONS as PTRACE_O_* flags.
2016-05-12 15:53:28 +00:00
caa2bc3873 ptrace: print data argument of PTRACE_SINGLEBLOCK et al requests as signo
* process.c (SYS_FUNC(ptrace)): Print data argument of
PTRACE_SINGLEBLOCK, PTRACE_SYSEMU, and PTRACE_SYSEMU_SINGLESTEP requests
as a signal number.
2016-05-12 15:50:43 +00:00
809ee3e46c ptrace: decode addr argument of PTRACE_PEEKSIGINFO request
The addr argument of PTRACE_PEEKSIGINFO request is a pointer to
a struct ptrace_peeksiginfo_args.

* process.c: Include "xlat/ptrace_peeksiginfo_flags.h".
(SYS_FUNC(ptrace)): Print addr argument of PTRACE_PEEKSIGINFO request
as a struct ptrace_peeksiginfo_args.
* xlat/ptrace_peeksiginfo_flags.in: New file.
2016-05-12 15:45:24 +00:00
3a5cd34e34 ptrace: fix printing addr argument of PTRACE_GETSIGMASK et al requests
For PTRACE_GETSIGMASK and PTRACE_SETSIGMASK requests, addr argument
contains the size of the buffer pointed to by data argument.
For PTRACE_SECCOMP_GET_FILTER request, addr argument contains
an offset counter.

* process.c (SYS_FUNC(ptrace)): Print addr argument of
PTRACE_GETSIGMASK, PTRACE_SETSIGMASK, and PTRACE_SECCOMP_GET_FILTER
requests using %lu format.
2016-05-12 15:38:35 +00:00
5c720b0b9b ptrace: do not print data argument of some requests on sparc
On sparc, kernel ignores data argument of PTRACE_GETREGS,
PTRACE_SETREGS, PTRACE_GETFPREGS, and PTRACE_SETFPREGS requests.

* process.c (SYS_FUNC(ptrace)) [SPARC || SPARC64]: Return RVAL_DECODED
right after printing addr argument if request is one of PTRACE_GETREGS,
PTRACE_SETREGS, PTRACE_GETFPREGS, or PTRACE_SETFPREGS.
2016-05-12 15:18:05 +00:00
91bd125f53 ptrace: do not print addr and data arguments of PTRACE_ATTACH-like requests
As kernel ignores addr and data arguments of PTRACE_ATTACH,
PTRACE_INTERRUPT, PTRACE_KILL, and PTRACE_LISTEN request,
we do not print them either.

* process.c (SYS_FUNC(ptrace)): After printing pid argument, return
RVAL_DECODED if request is one of PTRACE_ATTACH, PTRACE_INTERRUPT,
PTRACE_KILL, or PTRACE_LISTEN.
2016-05-12 15:10:41 +00:00
89ca4aa140 ptrace: do not print arguments of PTRACE_TRACEME request
As kernel ignores arguments of PTRACE_TRACEME request,
we do not print them either.

* process.c (SYS_FUNC(ptrace)): If request is PTRACE_TRACEME,
return early with RVAL_DECODED.
2016-05-12 15:03:58 +00:00
73a8e97d56 ptrace: print request using printxval64
As first argument of ptrace syscall has a long integer type, print
it using printxval64 because printxval takes unsigned int argument.

* process.c (SYS_FUNC(ptrace)): Change type of "request" variable
from "long" to "unsigned long", print it using printxval64 instead
of printxval.
2016-05-12 14:47:01 +00:00
49955948fb Do not sign-extend siginfo_t.si_syscall
* printsiginfo.c (print_si_info): Explicitly cast si_syscall member
of siginfo_t that has type "int" to "unsigned int", to avoid sign
extension when passed to syscall_name function.
2016-05-12 14:35:02 +00:00
50a26514a5 Export print_seccomp_fprog for further use in parser of ptrace syscall
* defs.h (print_seccomp_fprog): New prototype.
* seccomp.c (print_seccomp_fprog): Remove "static" keyword.
Move printing of struct seccomp_fprog fields ...
(print_seccomp_filter): ... here.
2016-05-12 14:35:02 +00:00
01d16ccb96 tests: add munlockall.test
* tests/munlockall.c: New file.
* tests/munlockall.test: New test.
* tests/.gitignore: Add munlockall.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add munlockall.test.
2016-05-11 12:26:00 +00:00
0684c35c25 tests: add link.test
* tests/link.c: New file.
* tests/link.test: New test.
* tests/.gitignore: Add link.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add link.test.
2016-05-11 12:26:00 +00:00
d81b58f650 tests: check decoding and dumping of preadv2 and pwritev2 syscalls
* tests/preadv2-pwritev2.c: New file.
* tests/preadv2-pwritev2.test: New test.
* tests/.gitignore: Add preadv2-pwritev2.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add preadv2-pwritev2.
2016-05-11 01:54:12 +00:00
a6dd094287 Implement decoding of preadv2 and pwritev2 syscalls
* io.c: Include "xlat/rwf_flags.h".
(do_preadv, do_pwritev, SYS_FUNC(preadv2), SYS_FUNC(pwritev2)):
New functions.
(SYS_FUNC(preadv)): Use do_preadv.
(SYS_FUNC(pwritev)): Use do_pwritev.
* linux/32/syscallent.h (preadv2, pwritev2): New entries.
* linux/64/syscallent.h: Likewise.
* linux/arm/syscallent.h: Likewise.
* linux/hppa/syscallent.h: Likewise.
* linux/i386/syscallent.h: Likewise.
* linux/ia64/syscallent.h: Likewise.
* linux/m68k/syscallent.h: Likewise.
* linux/mips/syscallent-n32.h: Likewise.
* linux/mips/syscallent-n64.h: Likewise.
* linux/mips/syscallent-o32.h: Likewise.
* linux/powerpc/syscallent.h: Likewise.
* linux/powerpc64/syscallent.h: Likewise.
* linux/s390/syscallent.h: Likewise.
* linux/s390x/syscallent.h: Likewise.
* linux/sparc/syscallent.h: Likewise.
* linux/sparc64/syscallent.h: Likewise.
* linux/x32/syscallent.h: Likewise.
* linux/x86_64/syscallent.h: Likewise.
* syscall.c (dumpio): Handle SEN_preadv2 and SEN_pwritev2.
* xlat/rwf_flags.in: New file.
* NEWS: Mention parsers of new syscalls.
2016-05-11 00:58:06 +00:00
ea7b9dbcbd tests: extend test coverage of xattr family syscalls
* tests/xattr.c: Check decoding of all xattr family syscalls.
* tests/xattr.test: Use run_strace_match_diff.
* tests/xattr.expected: Remove.
* tests/Makefile.am (EXTRA_DIST): Remove it.
2016-05-10 22:25:23 +00:00
72cb81151f tests: add print_quoted_memory function to libtests
* tests/print_quoted_string.c (print_quoted_memory): New function.
(print_quoted_string): Use it.
* tests/tests.h (print_quoted_memory): New prototype.
2016-05-10 22:12:01 +00:00
ec9c31705b Fix corner cases of xattr family syscalls decoding
* xattr.c (print_xattr_val): Do not take insize into account, print it
as unsigned long.
Do not decode xattr values of size larger than XATTR_SIZE_MAX.
Use static buffer for fetching xattr values.
(print_xattr_list): Do not decode string when size is zero.
2016-05-10 21:50:37 +00:00
0efd888e22 userfaultfd: Add ioctl tests
* tests/ioctl_uffdio.c: New file.
* tests/ioctl_uffdio.test: New test.
* tests/.gitignore: Add ioctl_uffdio.
* tests/Makefile.am (check_PROGRAMS):  Likewise.
(DECODER_TESTS): Add ioctl_uffdio.test.
2016-05-10 11:00:12 +00:00
5d1216a56b Decode UFFDIO_* ioctls
Decode the ioctls associated with the userfaultfd fd.
Note that they tend to read from and also return result in it's data
structure.

* configure.ac (AC_CHECK_HEADERS): Add linux/userfaultfd.h.
* userfaultfd.c [HAVE_LINUX_USERFAULTFD_H]: Add ioctl decoder.
* defs.h (uffdio_ioctl): New prototype.
* ioctl.c (ioctl_decode) [HAVE_LINUX_USERFAULTFD_H]: Wire in
uffdio_ioctl.
* xlat/uffd_*.in: Create flag xlat for all the IOCTLs.
2016-05-10 10:54:54 +00:00
c415387157 Update AX_CODE_COVERAGE
* m4/ax_code_coverage.m4: Update to serial 16.
* Makefile.am (CODE_COVERAGE_LCOV_OPTIONS): Remove.
(CODE_COVERAGE_GENHTML_OPTIONS): Update, add prefix.
(CODE_COVERAGE_BRANCH_COVERAGE): Set to 1.
2016-05-10 09:51:56 +00:00
26b2cfeb6b strace-ff.test: fix race condition
* tests/strace-ff.test: Wait for completion of PR_SET_PTRACER command.
2016-05-10 09:51:04 +00:00
d12c44bcac tests/epoll_pwait.c: fix for x32
* tests/epoll_pwait.c (main): Explicitly cast last syscall argument
to kernel_ulong_t.
2016-05-10 01:37:46 +00:00
a44c5184f9 strace-S.test: check "-S name"
* tests/strace-S.test: Add a check for "-c -S name" output.
2016-05-10 00:39:17 +00:00
fa925dce70 Fix NULL dereference in "-S name" when syscall table has holes
* count.c (syscall_cmp): Do not pass NULL to strcmp.
2016-05-10 00:38:59 +00:00
804bb8797b strace-S.test: cleanup
* tests/strace-S.test: Rewrite using sed.
2016-05-10 00:38:52 +00:00
6781111857 tests: add strace-S.test
* tests/strace-S.test: New test.
* tests/Makefile.am (MISC_TESTS): Add it.
2016-05-09 23:33:32 +00:00
58ab8b49e0 strace-ff.test: check that -ff does not create unexpected output files
* tests/strace-ff.expected: New file.
* tests/Makefile.am (EXTRA_DIST): Add it.
* tests/strace-ff.test: Use it.  Check that no other output files
have been created.
2016-05-09 23:21:30 +00:00
c259f4fd5d tests: add strace-ff.test
* tests/strace-ff.test: New test.
* tests/Makefile.am (MISC_TESTS): Add it.
2016-05-09 23:21:20 +00:00
a30d02e902 strace-V.test: cleanup
* tests/strace-V.test: Move config.h parser to a function.
Rename $OUT to $EXP, swap arguments passed to match_diff.
2016-05-09 23:19:37 +00:00
c4bb57745a tests: add strace-V.test
* tests/strace-V.test: New test.
* tests/Makefile.am (MISC_TESTS): Add it.
2016-05-09 23:18:40 +00:00
e3086cbc4d tests: check decoding of epoll_pwait syscall
* tests/epoll_pwait.c: New file.
* tests/epoll_pwait.test: New test.
* tests/.gitignore: Add epoll_pwait.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add epoll_pwait.test.
2016-05-09 22:12:57 +00:00
6d44012cb5 Assume that sys/epoll.h exists
This header file was added in glibc-2.3.2,
so it's safe to assume its availability.

* configure.ac (AC_CHECK_HEADERS): Remove sys/epoll.h.
* epoll.c: Include <sys/epoll.h> unconditionally.
Compile [HAVE_SYS_EPOLL_H] code unconditionally.
* tests/epoll_ctl.c: Do not check for HAVE_SYS_EPOLL_H.
* tests/epoll_wait.c: Likewise.
2016-05-09 21:46:17 +00:00
071b9274f4 Factorize send_query functions
* socketutils.c (send_query): New function.
(inet_send_query, unix_send_query): Use it.
2016-05-08 12:37:03 +00:00
b6d4b1167b tests: relax timings
Allow nanosleep(2) to spend 10% more time to make the test suite
more reliable on slow systems.

* tests/count.test: Treat 1.1 seconds as valid output.
* tests/strace-T.expected: Likewise.
* tests/strace-r.expected: Likewise.
2016-05-08 00:00:18 +00:00
88fc4c23d4 tests/attach-f-p.c: increase timeouts
Increase timeouts to make the test more reliable on slow systems.

* tests/attach-f-p.c (its): Increase timeouts to 1, 2, and 3 seconds,
respectively.
2016-05-07 23:51:47 +00:00
dc0dcf90d6 Remove unused functions
* defs.h (umove_ulong_or_printaddr, umove_ulong_array_or_printaddr):
Remove.
* util.c (umove_ulong_or_printaddr, umove_ulong_array_or_printaddr):
Likewise.
2016-05-07 23:37:53 +00:00
17d1a1633d v4l2.c: use print_array function
* v4l2.c (print_v4l2_ext_control, umoven_or_printaddr_ignore_syserror):
New functions.
(print_v4l2_ext_controls): Use them via print_array.
2016-05-07 23:37:53 +00:00
6469f39ee9 uid.c: use print_array function
* uid.c (print_gid): New function.
(print_groups): Use it via print_array.
2016-05-07 23:37:53 +00:00
f82dcd980d seccomp.c: use print_array function
* seccomp.c (decode_filter, decode_seccomp_fprog): Remove.
(print_bpf_filter): New function.
(print_seccomp_fprog): Use it via print_array.
* tests/seccomp-filter-v.c (main): Update.
2016-05-07 23:37:53 +00:00
48b06a63e8 scsi.c: use print_array function
* scsi.c (print_uchar): New function.
(print_sg_io_buffer): Use it via print_array.
2016-05-07 23:37:53 +00:00
fd2d6a7f52 poll.c: use print_array function
* poll.c (print_pollfd): Change for use as print_array callback.
(decode_poll_entering): Use print_array.
* tests/poll.c: Update.
* tests/poll.test: Update.
2016-05-07 23:37:53 +00:00
636b8c161c numa.c: use print_array function
* numa.c (print_node): New function.
(print_nodemask): Use it via print_array.
(print_page_array, print_int_array): Remove.
(print_addr): New function.
(print_status, print_int): Change for use as print_array callback.
(SYS_FUNC(move_pages)): Use print_addr, print_int, and print_status
via print_array.
* tests/move_pages.c: Update.
* tests/set_mempolicy.c: Likewise.
* tests/set_mempolicy.test: Likewise.
2016-05-07 23:37:52 +00:00
0f04b9d6d1 mem.c: use print_array function
* mem.c [POWERPC] (print_protmap_entry): New function.
[POWERPC] (SYS_FUNC(subpage_prot)): Use it via print_array.
2016-05-07 23:32:30 +00:00
ba4a4c60cf kexec.c: use print_array function
* kexec.c (print_seg): Change for use as print_array callback.
(print_kexec_segments): Use print_array.
2016-05-07 23:32:30 +00:00
0bae8001da ipc_sem.c: use print_array function
* ipc_sem.c (tprint_sembuf): Rename to print_sembuf, change signature
for use as print_array callback.
(tprint_sembuf_array): Use print_array.
2016-05-07 23:32:30 +00:00
4ce3054340 io.c: use print_array function
* io.c (print_iovec_config): New structure.
(print_iovec): New function.
(tprint_iov_upto): Use print_array.
* tests/preadv.c (main): Update.
* tests/pwritev.c (print_iovec, main): Likewise.
2016-05-07 23:32:29 +00:00
02387258cb epoll.c: use print_array function
* epoll.c (print_epoll_event): Change signature for use as print_array
callback, all users updated.
(print_epoll_event_array): Remove.
(epoll_wait_common): Change to use print_array instead
of print_epoll_event_array.
2016-05-07 22:49:39 +00:00
2868e2b941 aio.c: use print_array function
* aio.c (print_iocbp): New function.
(SYS_FUNC(io_submit)): Use it via print_array.  Use widen_to_long
to process long int argument.
(print_io_event): Change to print struct io_event fetched elsewhere.
(SYS_FUNC(io_cancel)): Update use of print_io_event.
(SYS_FUNC(io_getevents)): Use print_io_event via print_array.
Use widen_to_long to print long int arguments.
* tests/aio.c (main): Check decoding of io_submit with negative "nr".
2016-05-07 22:40:06 +00:00
72e4f7af56 Introduce print_array function for consistent decoding of arrays
* defs.h (print_array): New prototype.
* util.c (print_array): New function.
2016-05-07 13:08:36 +00:00
eb5c233d99 Fix corner cases of ICMP_FILTER decoding
* net.c (print_icmp_filter): Print icmp_filter for any positive length.
* tests/net-icmp_filter.c: New file.
* tests/net-icmp_filter.test: New test.
* tests/.gitignore: Add net-icmp_filter.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add net-icmp_filter.test.
2016-05-06 00:22:52 +00:00
1d17ac7c32 xlat: do not strip "1<<" prefix from xlat strings
* xlat/gen.sh (cond_xlat, gen_header): Do not strip "1<<" prefix
from xlat strings to fix incorrect output.
* tests/caps.awk: Update.

Reported-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
2016-05-05 22:20:40 +00:00
dcb18a6fd5 tests/xstatfsx.c: fix mips o32 support
mips o32 differs from all other 32-bit architectures by defining
__kernel_fsid_t structure as an array of long ints.

* tests/xstatfsx.c (print_statfs): Explicitly cast elements
of PRINT_F_FSID array to unsigned int.
2016-05-05 21:20:58 +00:00
1e56814f77 Mpersify VIDIOC_* ioctl parser
* v4l2.c: Mpersify arch-specific structures.
(v4l2_ioctl): Mpersify.
* tests/ioctl_v4l2.c: New file.
* tests/ioctl_v4l2.test: New test.
* tests/.gitignore: Add ioctl_v4l2.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioctl_v4l2.test.
2016-05-05 21:20:56 +00:00
1822546133 Mpersify ioctl macros
As values of some ioctl macros differ between personalities, these
personality specific ioctl macros should be properly defined for
mpersified code.  Implement this by redefining personality specific
ioctl macros from ioctlent*.h for each file that includes MPERS_DEFS.

* Makefile.am (ioctl_macros_h): New variable.
(ioctl_macros%.h): New rule.
(BUILT_SOURCES, CLEANFILES): Add $(ioctl_macros_h).
(m%_type_defs.h): #include MPERS_$(mpers_PREFIX)IOCTL_MACROS.
* defs.h [HAVE_M32_MPERS] (MPERS_m32_IOCTL_MACROS): New macro.
[HAVE_MX32_MPERS] (MPERS_mx32_IOCTL_MACROS): Likewise.

Acked-by: Elvira Khabirova <lineprinter0@gmail.com>
2016-05-05 21:20:47 +00:00
0a47ff79ca Fix decoding of VIDIOC_* ioctls
* v4l2.c: Fix numerous bugs in decoding of VIDIOC_* ioctls.
* tests/ioctl.c (main): Update.
2016-05-05 21:20:45 +00:00
6331fd4b32 nsyscalls.test: add mips o32 support
Out-of-range syscalls looks differently on mips o32.

* tests/nsyscalls.c (main): Handle LINUX_MIPSO32.
* tests/nsyscalls.test: Trace syscall called "syscall" on mips.
2016-05-05 18:04:33 +00:00
1e9c966398 Remove initialization of big holes in syscallent.h files
There is no need to explicitly initialize big holes after conversion
of syscallent.h files to use designated initializers.  For architectures
that have some data at the end of syscallent.h this initialization of
big holes is no-op, for others it just inflates the table unnecessarily.

* linux/arc/syscallent.h: Remove initialization of arch specific block
at the end of table.
* linux/metag/syscallent.h: Likewise.
* linux/nios2/syscallent.h: Likewise.
* linux/or1k/syscallent.h: Likewise.
* linux/tile/syscallent.h: Likewise.
* linux/tile/syscallent1.h: Likewise.
* linux/arm/syscallent.h: Remove explicit initialization of a big hole
before socket subcalls.
* linux/i386/syscallent.h: Likewise.
* linux/m68k/syscallent.h: Likewise.
* linux/mips/syscallent-n32.h: Likewise.
* linux/powerpc/syscallent.h: Likewise.
* linux/powerpc64/syscallent.h: Likewise.
* linux/s390/syscallent.h: Likewise.
* linux/s390x/syscallent.h: Likewise.
* linux/sh/syscallent.h: Likewise.
* linux/sh64/syscallent.h: Likewise.
* linux/sparc/syscallent.h: Likewise.
* linux/sparc64/syscallent.h: Likewise.
* linux/mips/syscallent-compat.h: Remove explicit initialization
of big holes between different mips ABIs.
* linux/mips/syscallent-n64.h: Remove explicit initialization
of big holes before socket subcalls and between different mips ABIs.
* linux/mips/syscallent-o32.h: Likewise.
2016-04-29 21:51:00 +00:00
7a1c25ebc4 xlat: make "1<<val" syntax work with 64-bit values
* xlat/gen.sh(cond_xlat, gen_header): Generate 1UUL<<val
for 1<<val syntax.

Reported-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
2016-04-29 20:12:54 +00:00
070fec2248 Fix typo in XLAT_TYPE_PAIR
* xlat.h (XLAT_TYPE_PAIR): Take "type" parameter.

Reported-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
2016-04-29 20:04:38 +00:00
e212a15955 Fix decoding of move_pages syscall
* numa.c (print_page_array, print_status, print_int, print_int_array):
New functions.
(SYS_FUNC(move_pages)): Rewrite using these functions.
* tests/move_pages.c: New file.
* tests/move_pages.test: New test.
* tests/.gitignore: Add move_pages.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add move_pages.test.
2016-04-29 18:21:02 +00:00
900a282d36 tests: check decoding of mbind syscall
* tests/mbind.c: New file.
* tests/mbind.test: New test.
* tests/.gitignore: Add mbind.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add mbind.test.
2016-04-29 18:21:01 +00:00
9019cf4cf5 Change type of struct xlat.val to uint64_t
Some ioctls have flags fields that are 64-bit.  A 32-bit val means
these flags will never be matched or printed.

* xlat.h: Include <stdint.h>.
(struct xlat): Change type of val to uint64_t.
2016-04-29 01:12:14 +00:00
9ae46690bd xlat: extend syntax with #val_type directive
When #val_type directive is encountered, gen.sh starts using
XLAT_TYPE/XLAT_TYPE_PAIR macros instead of XLAT/XLAT_PAIR,
with #val_type's argument as a type.

For example, "#val_type uint64_t" means values of type uint64_t.

* xlat/gen.sh (gen_header, print_xlat, print_xlat_pair):
Add val_type support.
2016-04-29 01:12:14 +00:00
6b040fc505 xlat/gen.sh: prepare for adding #val_type directive support
This is essentially a no-op change that makes the following change
easier to read.

* xlat/gen.sh (print_xlat, print_xlat_pair): New functions.
(cond_xlat, gen_header): Use them.
2016-04-29 01:12:14 +00:00
0f4982691e Introduce XLAT_TYPE and XLAT_TYPE_PAIR macros
* xlat.h (XLAT_TYPE): New macro, similar to XLAT but casts
to the specified type instead of unsigned int.
(XLAT_TYPE_PAIR): New macro, similar to XLAT_PAIR but casts
to the specified type instead of unsigned int.
2016-04-29 00:15:01 +00:00
3f25b65d63 xlat: generate xlat pairs using new XLAT_PAIR macro
Before this change there were two forms of xlat entries: those that use XLAT
or XLAT_END macros, and others verbatim entries.  This change converts
the latter to use new XLAT_PAIR macro.

This is necessary for the upcoming change of xlat.val type.

* xlat.h (XLAT_PAIR): New macro.
* xlat/gen.sh (cond_xlat, gen_header): Use it.
2016-04-29 00:15:01 +00:00
a9f956d279 Explicitly cast argument of XLAT macro to unsigned int
This is necessary for the upcoming change of xlat.val type.

* xlat.h (XLAT): Cast the argument to unsigned int.
2016-04-29 00:15:01 +00:00
dd9a511c17 Change type of {s,t}print_open_modes's argument to unsigned
As "flags" argument of sprint_open_modes and tprint_open_modes is
involved only in bit operations, change its type to unsigned.

* defs.h.c (sprint_open_modes, tprint_open_modes): Change type
to unsigned int.
* open.c (sprint_open_modes, tprint_open_modes): Likewise.
2016-04-29 00:13:20 +00:00
909e664a2e tests/remap_file_pages.c: fix for the upcoming change of xlat.val type
The "flags" argument of remap_file_page syscall has type "unsigned
long", so it is not correct to load most significant bits with garbage
ans assume they are going to be ignored.

* tests/remap_file_pages.c (main): Remove artificial garbage from flags.
2016-04-28 21:14:54 +00:00
00beed61a4 Introduce printflags64 function
This is necessary for the upcoming change of xlat.val type.

* defs.h (printflags): Rename to printflags64, change type of integer
argument to uint64_t.
(printflags): New static inline function.
* util.c (printflags): Rename to printflags64, change type of integer
argument to uint64_t.  Print it using PRIx64 format.
Based on patch by Jeff Mahoney <jeffm@suse.com>.
2016-04-28 19:05:13 +00:00
01c910ccc3 Introduce sprintflags64 function
This is necessary for the upcoming change of xlat.val type.

* defs.h (sprintflags): Rename to sprintflags64, change type of integer
argument to uint64_t.
(sprintflags): New static inline function.
* util.c (sprintflags): Rename to sprintflags64, change type of integer
argument to uint64_t.  Print it using PRIx64 format.
Based on patch by Jeff Mahoney <jeffm@suse.com>.
2016-04-28 19:04:38 +00:00
c1328100d4 printxvals: change type of integer argument to uint64_t
This is necessary for the upcoming change of xlat.val type.
All users of printxvals are already prepared for this change.

* defs.h (printxvals): Change type of integer argument to uint64_t.
* util.c (printxvals): Likewise.  Print it using PRIx64 format.
Patch by Jeff Mahoney <jeffm@suse.com>.
2016-04-28 19:04:02 +00:00
43242e6656 xlat_search: change type of integer argument to uint64_t
This is necessary for the upcoming change of xlat.val type.
All users of addflags are already prepared for this change.

* defs.h (xlat_search): Change type of integer argument to uint64_t.
* util.c (xlat_search): Likewise.  Pass it by pointer.
(xlat_bsearch_compare): Treat first argument as a pointer.
Patch by Jeff Mahoney <jeffm@suse.com>.
2016-04-28 19:04:02 +00:00
ed92d87f1c Introduce xlookup64 function
This is necessary for the upcoming change of xlat.val type.

* defs.h (xlookup): Rename to xlookup64, change type of integer argument
to uint64_t.
(xlookup): New static inline function.
* util.c (xlookup): Rename to xlookup64, change type of integer
argument to uint64_t.
Based on patch by Jeff Mahoney <jeffm@suse.com>.
2016-04-28 19:04:02 +00:00
c9146ebef8 addflags: change type of integer argument to uint64_t
This is necessary for the upcoming change of xlat.val type.
All users of addflags are already prepared for this change.

* defs.h (addflags): Change type of integer argument to uint64_t.
* util.c (addflags): Likewise.  Print it using PRIx64 format.
Based on patch by Jeff Mahoney <jeffm@suse.com>.
2016-04-28 19:04:02 +00:00
482bab05a0 Introduce printxval64 wrapper
This is necessary for the upcoming change of xlat.val type.

* defs.h (printxval64): New static inline function.
2016-04-28 19:04:01 +00:00
7d63aa5ef3 Turn printxval macro into a static inline function
This is necessary for the upcoming change of xlat.val type.

* defs.h (printxval): Change to static inline function.
2016-04-28 19:03:21 +00:00
38ed916d1b tests: check decoding of migrate_pages syscall
* tests/migrate_pages.c: New file.
* tests/migrate_pages.test: New test.
* tests/.gitignore: Add migrate_pages.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add migrate_pages.test.
2016-04-28 01:20:19 +00:00
c8c7a5333e Fix decoding of migrate_pages syscall
* numa.c (SYS_FUNC(migrate_pages)): Print syscall arguments
in the right order.
2016-04-28 01:20:19 +00:00
d10a95548c tests: check decoding of set_mempolicy syscall
* tests/set_mempolicy.c: New file.
* tests/set_mempolicy.test: New test.
* tests/.gitignore: Add set_mempolicy.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add set_mempolicy.test.
2016-04-28 01:17:39 +00:00
aa1ed760c8 tests: check decoding of get_mempolicy syscall
* tests/get_mempolicy.c: New file.
* tests/get_mempolicy.test: New test.
* tests/.gitignore: Add get_mempolicy.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add get_mempolicy.test.
2016-04-28 01:17:39 +00:00
9547c4526e numa: fix decoding of nodemask arrays
* numa.c (get_nodes): Rewrite an rename to print_nodemask.
All callers updated.
(SYS_FUNC(mbind), SYS_FUNC(set_mempolicy), SYS_FUNC(get_mempolicy)):
Print a delimiter before nodemask argument.
2016-04-28 01:17:05 +00:00
fb1ae073e9 Fix decoding of policy argument of get_mempolicy syscall
* numa.c (SYS_FUNC(get_mempolicy)): Print policy argument in square
brackets to indicate indirect access.
2016-04-27 22:36:07 +00:00
45a3e460bc Fix decoding of pid_t argument of migrate_pages syscall
* numa.c (SYS_FUNC(migrate_pages)): Print pid_t syscall
argument using %d format.
2016-04-27 22:09:41 +00:00
a182d8c6c1 tests: add printxval function to libtests
* tests/tests.h (printxval): New prototype.
* tests/printxval.c: New file.
* tests/Makefile.am  (libtests_a_SOURCES): Add it.
2016-04-27 20:31:34 +00:00
d6c76f3a37 tests: check decoding of remap_file_pages syscall
* tests/remap_file_pages.c: New file.
* tests/remap_file_pages.test: New test.
* tests/.gitignore: Add remap_file_pages.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add remap_file_pages.test.
2016-04-27 16:04:01 +00:00
649ee4b370 tests: add pause.test
* tests/pause.c: New file.
* tests/pause.test: New test.
* tests/.gitignore: Add pause.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add pause.test.
2016-04-27 14:22:22 +00:00
7585ccdcab tests: add kill.test
* tests/kill.c: New file.
* tests/kill.test: New test.
* tests/.gitignore: Add kill.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add kill.test.
2016-04-27 14:22:02 +00:00
f1cadc2675 Fix decoding of pid_t arguments of kill and tgkill syscalls
* signal.c (SYS_FUNC(kill), SYS_FUNC(tgkill)): Print pid_t syscall
arguments using %d format.
2016-04-27 14:04:55 +00:00
b45a1e78e3 tests: add mlock.test
* tests/mlock.c: New file.
* tests/mlock.test: New test.
* tests/.gitignore: Add mlock.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add mlock.test.
2016-04-27 11:11:12 +00:00
a4da0c8b79 Move parsers of NUMA related syscalls to numa.c
* mem.c (get_nodes, SYS_FUNC(mbind), SYS_FUNC(set_mempolicy),
SYS_FUNC(get_mempolicy), SYS_FUNC(migrate_pages), SYS_FUNC(move_pages)):
Move ...
* numa.c: ... here.
* Makefile.am (strace_SOURCES): Add numa.c
2016-04-27 05:09:16 +00:00
db34e195bb tests/umovestr3.c: robustify against os specific issues
* tests/umovestr3.c (main): Create extra gap before unreadable page.
2016-04-27 03:18:44 +00:00
12890ffda1 tests: extend test coverage of umovestr short read condition
* tests/umovestr3.c: New file.
* tests/umovestr3.test: New test.
* tests/.gitignore: Add umovestr3.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add umovestr3.test.
2016-04-27 01:32:21 +00:00
1c61f829e4 tests: check decoding of out-of-range syscalls
* tests/nsyscalls.c: New file.
* tests/nsyscalls.test: New test.
* tests/.gitignore: Add nsyscalls.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add nsyscalls.test.
2016-04-27 01:32:20 +00:00
f443fd40cb Fix decoding of 3rd argument of getdents/getdents64 syscalls
* dirent.c (SYS_FUNC(getdents)): Always print 3rd syscall argument
as unsigned int.
* dirent64.c (SYS_FUNC(getdents64)): Likewise.
* tests/getdents.c (main): Check it.
* tests/getdents64.c (main): Likewise.
2016-04-26 22:38:10 +00:00
b83bb1cc7a Fix decoding of LINUX_REBOOT_CMD_RESTART2 argument
* reboot.c (SYS_FUNC(reboot)): Cast numeric arguments to unsigned int.
2016-04-26 17:46:44 +00:00
2607b4e48a .travis.yml: raise sleep delay
Previous sleep delay value seems to be not enough nowadays.

.travis.yml (SLEEP_A_BIT): Raise sleep delay.
2016-04-26 16:46:20 +00:00
9d2b6b9b52 Move definitions of MPOL_* constants to xlat files
* mem.c (MPOL_DEFAULT, MPOL_PREFERRED, MPOL_BIND, MPOL_INTERLEAVE):
Move to xlat/policies.in.
(MPOL_F_NODE, MPOL_F_ADDR): Move to xlat/mempolicyflags.in.
(MPOL_MF_STRICT, MPOL_MF_MOVE, MPOL_MF_MOVE_ALL): Move
to xlat/mbindflags.in.
2016-04-26 16:36:30 +00:00
f41eaebddf tests: check decoding of renameat2 syscall
* tests/renameat2.c: New file.
* tests/renameat2.test: New test.
* tests/.gitignore: Add renameat2.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add renameat2.test.
2016-04-26 16:30:43 +00:00
96cf7d79b3 Add default values for RENAME_* constants
* xlat/rename_flags.in: Add default values.
2016-04-26 16:30:43 +00:00
33fc2e4757 tests: check decoding of utimes syscall
* tests/utimes.c: New file.
* tests/utimes.test: New test.
* tests/.gitignore: Add utimes.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add utimes.test.
2016-04-26 16:13:17 +00:00
4e9269aebc tests: check decoding of futimesat syscall
* tests/futimesat.c: New file.
* tests/futimesat.test: New test.
* tests/.gitignore: Add futimesat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add futimesat.test.
2016-04-26 16:13:15 +00:00
7dad3f3edd tests: extend test coverage of mknod syscall
* mknod.c (main): Check more corner cases of mode_t parser.
* mknod.test: Update.
2016-04-26 11:00:51 +00:00
68b1d24e59 tests: add sched_yield.test
* tests/sched_yield.c: New file.
* tests/sched_yield.test: New test.
* tests/.gitignore: Add sched_yield.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add sched_yield.test.
2016-04-26 10:31:11 +00:00
86ff93e527 tests: add sync.test
* tests/sync.c: New file.
* tests/sync.test: New test.
* tests/.gitignore: Add sync.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add sync.test.
2016-04-26 10:29:58 +00:00
63be9e318c tests: add mknodat.test
* tests/mknodat.c: New file.
* tests/mknodat.test: New test.
* tests/.gitignore: Add mknodat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add mknodat.test.
2016-04-26 10:11:41 +00:00
363b71d281 tests: add unlink.test
* tests/unlink.c: New file.
* tests/unlink.test: New test.
* tests/.gitignore: Add unlink.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add unlink.test.
2016-04-26 10:11:41 +00:00
68d171d133 tests: add reboot.test
* tests/reboot.c: New file.
* tests/reboot.test: New test.
* tests/.gitignore: Add reboot.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add reboot.test.
2016-04-26 10:11:41 +00:00
67c2f67410 Fix decoding of statfs family syscalls
Fix decoders of fstatfs, fstatfs64, statfs, and statfs64 syscalls
by rewriting them using mpers infrastructure.

* fetch_struct_statfs.c: New file.
* fstatfs.c: Likewise.
* fstatfs64.c: Likewise.
* print_statfs.c: Likewise.
* statfs.h: Likewise.
* statfs64.c: Likewise.
* statfs.c: Remove everything except SYS_FUNC(statfs).
* configure.ac: Remove the check for struct statfs64 in <sys/vfs.h>.
Add checks for struct statfs and struct statfs64 in <asm/statfs.h>.
Add checks for f_frsize and f_flags members of these structures.
* defs.h (struct strace_statfs): New forward declaration.
(print_struct_statfs, print_struct_statfs64): New prototypes.
* Makefile.am (libstrace_a_SOURCES): Add fstatfs.c, fstatfs64.c,
statfs.c, and statfs64.c.
(strace_SOURCES): Add fetch_struct_statfs.c, print_statfs.c,
and statfs.h.
* NEWS: Mention this fix.
* tests/fstatfs.c: New file.
* tests/fstatfs64.c: Likewise.
* tests/statfs64.c: Likewise.
* tests/xstatfs.c: Likewise.
* tests/xstatfs64.c: Likewise.
* tests/xstatfsx.c: Likewise.
* tests/fstatfs.test: New test.
* tests/fstatfs64.test: Likewise.
* tests/statfs64.test: Likewise.
* tests/statfs.c: Rewrite using xstatfs.c.
* tests/statfs.test: Update.
* tests/.gitignore: Add fstatfs, fstatfs64, and statfs64.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add  fstatfs.test, fstatfs64.test, and statfs64.test.
(EXTRA_DIST): Add xstatfs.c, xstatfs64.c, and xstatfsx.c.
2016-04-26 01:35:31 +00:00
121e1961d7 tests: add printflags function to libtests
* tests/printflags.c: New file.
* tests/tests.h (printflags): New prototype.
* tests/Makefile.am (libtests_a_SOURCES): Add it.
2016-04-26 00:13:47 +00:00
0e09704e09 Move definition of struct xlat to a separate header file
Define struct xlat in a separate file so that it could be used later by
tests without inclusion of defs.h header file.

* defs.h (struct xlat, XLAT, XLAT_END): Move ...
* xlat.h: ... here.
* Makefile.am (strace_SOURCES): Add xlat.h.
2016-04-26 00:08:16 +00:00
a6acc310d7 alpha: decode osf_statfs64 and osf_fstatfs64 syscalls
* linux/alpha/syscallent.h (osf_statfs64, osf_fstatfs64): Set nargs
and handler.
2016-04-25 23:52:03 +00:00
39e7e1f05d alpha: fix decoding of osf_statfs and osf_fstatfs syscalls
Do not attempt to print struct osf_statfs as if it was the same as
struct statfs.  Since struct osf_statfs has never been decoded properly,
it is probably too late to implement a decoder, so let's just print the
pointer.

* statfs.c [ALPHA] (SYS_FUNC(osf_statfs), SYS_FUNC(osf_fstatfs)): Move ...
* alpha.c: ... here.  Replace printstatfs with printaddr.
2016-04-25 23:52:03 +00:00
f3ac12990d statfs: print f_flags field only when ST_VALID flag is set
* statfs.c (print_statfs_flags): New function.
(printstatfs, printstatfs64, printcompat_statfs64): Use it.
* xlat/statfs_flags.in (ST_VALID): Move to the head of the list.
* tests/statfs.expected: Update.
2016-04-25 10:30:03 +00:00
13c1d0899d tests: add symlink.test
* tests/symlink.c: New file.
* tests/symlink.test: New test.
* tests/.gitignore: Add symlink.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add symlink.test.
2016-04-25 10:24:48 +00:00
506a42f8c3 tests: add rmdir.test
* tests/rmdir.c: New file.
* tests/rmdir.test: New test.
* tests/.gitignore: Add rmdir.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add rmdir.test.
2016-04-25 10:24:12 +00:00
7f05113624 tests: add setdomainname.test
* tests/setdomainname.c: New file.
* tests/setdomainname.test: New test.
* tests/.gitignore: Add setdomainname.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setdomainname.test.
2016-04-25 10:24:12 +00:00
cd61c9f3e4 tests: add sched_rr_get_interval.test
* tests/sched_rr_get_interval.c: New file.
* tests/sched_rr_get_interval.test: New test.
* tests/.gitignore: Add sched_rr_get_interval.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add sched_rr_get_interval.test.
2016-04-25 10:24:12 +00:00
b4a478dbfa statfs: decode f_flags field of struct statfs
* xlat/statfs_flags.in: New file.
* statfs.c: Include "xlat/statfs_flags.h".
(printstatfs) [_STATFS_F_FLAGS]: Print statbuf.f_flags as flags.
(printstatfs64) [_STATFS_F_FLAGS]: Likewise.
(printcompat_statfs64): Likewise.
* tests/statfs.expected: Update.
2016-04-25 01:58:25 +00:00
b587a5a1be statfs: don't quote f_type macro names
* statfs.c (sprintfstype): Don't add double-quotes to fs magic macros.
* tests/statfs.expected: Remove double-quotes.
2016-04-25 01:54:05 +00:00
6c69ed7ac5 tests/shmxt.c: robustify against arch specific issues
Do not treat failed shmat(SHM_RND) as a test failure.
This change partially reverts commit
bea707377d.

* tests/shmxt.c (main): Use SHM_RND in the second shmat call,
do not treat its potential error as a test failure.
2016-04-25 01:54:05 +00:00
e5c88499a3 Rename PRI__s64 to PRI__d64
As PRI__*64 macros mirror PRI*64 macros from inttypes.h, follow the
principle of least astonishment and name these macros the same way.

* defs.h (PRI__s64): Rename to PRI__d64.
2016-04-23 00:07:16 +00:00
3db07f11c8 Fix old_mmap output when mmap arguments are unfetchable
* mem.c (SYS_FUNC(old_mmap)): Use umove_or_printaddr instead of umoven
to fetch mmap arguments, return RVAL_DECODED when umove_or_printaddr
fails.
* tests/old_mmap.c (main): Check it.
2016-04-23 00:07:14 +00:00
cf52778aba aarch64: fix old_mmap output for arm personality
* mem.c (SYS_FUNC(old_mmap)) [AARCH64]: Fetch mmap arguments
as 32-bit integers.
2016-04-22 23:47:46 +00:00
bc724ce0bf Define old_mmap parser only on architectures that use it
* mem.c (SYS_FUNC(old_mmap)): Define only on AARCH64, ARM, I386, X86_64,
X32, M68K, S390, and S390X.
2016-04-22 23:36:26 +00:00
3797d10e82 tests: extend test coverage of mmap syscall
Check decoding of "old mmap" edition of mmap syscall
on those architectures that define it.

* tests/old_mmap.c: New file.
* tests/old_mmap.test: New test.
* tests/.gitignore: Add old_mmap.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add old_mmap.test.
2016-04-22 23:28:23 +00:00
0e6cb1740a tests: extend test coverage of mincore syscall
* tests/mincore.c (print_mincore): New function.
(test_mincore): Use it.  Check mincore with invalid vec address.
Check mincore with length argument not a multiple of the page size.
(main): Check with DEFAULT_STRLEN pages.
2016-04-22 14:14:39 +00:00
a7501f6adb Move parsers of sync_file_range and sync_file_range2 syscalls to libstrace
For each given architecture only one of these two syscalls has a
syscallent entry.  When each parser is placed into a separate file,
moving to libstrace ensures that only one of them that is need
is linked into strace executable.

* sync_file_range.c (SYS_FUNC(sync_file_range2)): Move ...
* sync_file_range2.c: ... here.
* Makefile.am (strace_SOURCES): Move sync_file_range.c ...
(libstrace_a_SOURCES): ... here.  Add sync_file_range2.c.
(strace_SOURCES_c): Add filtered libstrace_a_SOURCES.
2016-04-22 04:34:22 +00:00
a9540e72c7 tests: check decoding of clock_adjtime syscall
* tests/clock_adjtime.c: New file.
* tests/clock_adjtime.test: New test.
* tests/.gitignore: Add clock_adjtime.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add clock_adjtime.test.
2016-04-22 01:13:27 +00:00
fa5e5d9854 tests: do not include <assert.h> unnecessarily
Automatically change tests/*.c files using the following script:

for f in tests/*.c; do
	grep -q '\<assert(' "$f" ||
		sed -i '/# *include *<assert\.h>/d' "$f"
done
2016-04-21 22:05:57 +00:00
96a9ff5746 tests: do not include <errno.h> unnecessarily
Automatically change tests/*.c files using the following script:

for f in tests/*.c; do
	grep -Fv errno.h "$f" |
	grep -Ewq '(si_)?errno|SOCK_FILTER_DENY_SYSCALL' ||
		sed -i '/# *include *<errno\.h>/d' "$f"
done
2016-04-21 22:05:57 +00:00
e5297aeb13 tests/xetpriority.c: print syscall() result using %ld format 2016-04-21 22:05:57 +00:00
8141093cd0 tests/xetpgid.c: print syscall() result using %ld format 2016-04-21 22:05:57 +00:00
556179345b tests/xchownx.c: use errno2name 2016-04-21 22:05:57 +00:00
92288b2ba3 tests/userfaultfd.c: stop using assert 2016-04-21 22:05:56 +00:00
5d8c235110 tests/unlinkat.c: print syscall() result using %ld format 2016-04-21 22:05:56 +00:00
0df647673a tests/umount.c: use errno2name 2016-04-21 22:05:56 +00:00
ae4ba89702 tests/truncate64.c: cleanup
* tests/truncate64.c (main): Use errno2name, stop using assert.
2016-04-21 22:05:56 +00:00
2eec1ce820 tests/truncate.c: cleanup
* tests/truncate.c (main): Use errno2name, stop using assert.
2016-04-21 22:05:56 +00:00
7456b6420b tests/tee.c: stop using assert 2016-04-21 22:05:56 +00:00
86a090120a tests/syslog.c: use errno2name 2016-04-21 22:05:56 +00:00
82dd238b84 tests/sync_file_range2.c: stop using assert 2016-04-21 22:05:56 +00:00
3694b0c5bd tests/sync_file_range.c: stop using assert 2016-04-21 22:05:56 +00:00
5bc585ecc8 tests/symlinkat.c: cleanup 2016-04-21 22:05:56 +00:00
f75e034c84 tests/swap.c: cleanup
* tests/swap.c (error_msg): Remove.
(main): Use errno2name.
2016-04-21 22:05:56 +00:00
f5748b006f tests/splice.c: stop using assert 2016-04-21 22:05:56 +00:00
0b52ac3134 tests/setugid.c: cleanup 2016-04-21 22:05:56 +00:00
60b9187a7c tests/sethostname.c: use errno2name 2016-04-21 22:05:56 +00:00
b255f6e186 tests/setgroups.c: use errno2name
* tests/setgroups.c (errno2str): Remove.
(main): Use errno2name.
2016-04-21 22:05:56 +00:00
4483f628ab tests/seccomp-strict.c: cleanup
* tests/seccomp-strict.c (main): Use errno2name, stop using assert.
2016-04-21 22:05:56 +00:00
14fa74f9aa tests/seccomp-filter.c: cleanup
* tests/seccomp-filter.c (main): Use errno2name, stop using assert.
2016-04-21 22:05:56 +00:00
06c2828ee1 tests/sched_xetscheduler.c: print syscall() result using %ld format 2016-04-21 22:05:56 +00:00
61042d491b tests/sched_xetparam.c: print syscall() result using %ld format 2016-04-21 22:05:56 +00:00
3f470d83de tests/renameat.c: print syscall() result using %ld format 2016-04-21 22:05:56 +00:00
f224909546 tests/rename.c: print syscall() result using %ld format 2016-04-21 22:05:56 +00:00
92e3cca998 tests/readv.c: cleanup 2016-04-21 22:05:56 +00:00
304689e4ec tests/pwritev.c: use errno2name 2016-04-21 22:05:56 +00:00
cf1cfe13be tests/preadv-pwritev.c: cleanup 2016-04-21 22:05:56 +00:00
abde241e68 tests/prctl-seccomp-strict.c: cleanup
* tests/prctl-seccomp-strict.c (main): Use errno2name,
stop using assert.
2016-04-21 22:05:55 +00:00
037ab86e9a tests/openat.c: use errno2name 2016-04-21 22:05:55 +00:00
1e2f5f7733 tests/open.c: use errno2name 2016-04-21 22:05:55 +00:00
84aeea7e29 tests/mlockall.c: cleanup 2016-04-21 22:05:55 +00:00
c0b1d6f37c tests/mlock2.c: stop using assert 2016-04-21 22:05:55 +00:00
d0652a40eb tests/mknod.c: print syscall() result using %ld format 2016-04-21 22:05:55 +00:00
a175bfe445 tests/mkdirat.c: print syscall() result using %ld format 2016-04-21 22:05:55 +00:00
1b511d0fea tests/lseek.c: cleanup
* tests/lseek.c (main): Use errno2name, stop using assert.
2016-04-21 22:05:55 +00:00
cd157776bd tests/llseek.c: cleanup
* tests/llseek.c (main): Use errno2name, stop using assert.
2016-04-21 22:05:55 +00:00
5c62af0753 tests/linkat.c: print syscall() result using %ld format 2016-04-21 22:05:55 +00:00
33e0df7074 tests/iopl.c: use errno2name 2016-04-21 22:05:55 +00:00
c1dbe052f1 tests/ioperm.c: use errno2name 2016-04-21 22:05:55 +00:00
7f68f80f42 tests/getgroups.c: use errno2name
* tests/getgroups.c (errno2str): Remove.
(main): Use errno2name.
2016-04-21 22:05:55 +00:00
337f66e7c7 tests/ftruncate64.c: cleanup
* tests/ftruncate64.c (main): Use errno2name, stop using assert.
2016-04-21 22:05:55 +00:00
a57bc5be7f tests/ftruncate.c: cleanup
* tests/ftruncate.c (main): Use errno2name, stop using assert.
2016-04-21 22:05:55 +00:00
1717c8c06d tests/fsync.c: print syscall() result using %ld format 2016-04-21 22:05:55 +00:00
ca24b94652 tests/flock.c: print syscall() result using %ld format 2016-04-21 22:05:55 +00:00
884471bc9f tests/file_handle.c: use errno2name 2016-04-21 22:05:53 +00:00
02269e5da0 tests/fdatasync.c: print syscall() result using %ld format 2016-04-21 20:52:42 +00:00
3fc6bd96d8 tests/fchownat.c: use errno2name 2016-04-21 20:52:42 +00:00
bf563a9ea3 tests/fchmodat.c: use errno2name 2016-04-21 20:52:42 +00:00
ba93e7b886 tests/fchmod.c: use errno2name 2016-04-21 20:52:42 +00:00
a2633101da tests/faccessat.c: print syscall() result using %ld format 2016-04-21 20:52:42 +00:00
33568cf1be tests/epoll_wait.c: print syscall() result using %ld format 2016-04-21 20:52:42 +00:00
becfc0eb0a tests/epoll_ctl.c: print syscall() result using %ld format 2016-04-21 20:52:42 +00:00
7529683349 tests/epoll_create1.c: cleanup
* tests/epoll_create1.c (main): Use errno2name, stop using assert.
2016-04-21 20:52:42 +00:00
8243175721 tests/epoll_create.c: print syscall() result using %ld format 2016-04-21 20:52:41 +00:00
22f9fa7fd9 tests/dup3.c: print syscall() result using %ld format 2016-04-21 20:52:41 +00:00
65dea4b1e4 tests/dup2.c: print syscall() result using %ld format 2016-04-21 20:52:41 +00:00
89b575d3c5 tests/dup.c: cleanup 2016-04-21 20:52:41 +00:00
b0a647f4d4 tests/creat.c: stop using sys/stat.h 2016-04-21 20:52:41 +00:00
0d8361fc80 tests/copy_file_range.c: stop using assert 2016-04-21 20:52:41 +00:00
adbbc2d288 tests/chroot.c: use errno2name 2016-04-21 20:52:41 +00:00
5327e9c179 tests/aio.c: use errno2name 2016-04-21 20:52:41 +00:00
dd02f09f4b tests: cleanup acct.test
* tests/acct.c (main): Use errno2name, stop using assert,
change sample file name.
* tests/acct.test: Update.
2016-04-21 20:20:42 +00:00
9f6611bb31 tests: use errno2name()
Automatically change tests/*.c files using the following sed regexp:
sed -i 's/errno == E[[:alnum:]]\+ ? "E[[:alnum:]]\+" : "E[[:alnum:]]\+"/errno2name()/g'
2016-04-21 18:16:50 +00:00
57b5f55a2a tests/dup.c: include "tests.h"
This is going to be necessary for the following commit.
2016-04-21 18:16:10 +00:00
ef6b4262bb tests: add getpgrp.test
* tests/getpgrp.c: New file.
* tests/getpgrp.test: New test.
* tests/.gitignore: Add getpgrp.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add getpgrp.test.
2016-04-21 17:37:44 +00:00
f914194fc3 tests: add access.test
* tests/access.c: New file.
* tests/access.test: New test.
* tests/.gitignore: Add access.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add access.test.
2016-04-21 17:37:43 +00:00
e0057a578f tests: add fchdir.test
* tests/fchdir.c: New file.
* tests/fchdir.test: New test.
* tests/.gitignore: Add fchdir.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add fchdir.test.
2016-04-21 17:35:39 +00:00
5c1776fe00 tests: add mkdir.test
* tests/mkdir.c: New file.
* tests/mkdir.test: New test.
* tests/.gitignore: Add mkdir.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add mkdir.test.
2016-04-21 17:34:38 +00:00
8bfe0d5e22 tests: add getsid.test
* tests/getsid.c: New file.
* tests/getsid.test: New test.
* tests/.gitignore: Add getsid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add getsid.test.
2016-04-21 17:31:05 +00:00
2b69fd4c43 tests: add errno2name function to libtests
Add a simple translator of errno to its name, so one could
simply use errno2name() instead of complex expressions like
errno == EINVAL ? "EINVAL" : "EFAULT".

* tests.h (errno2name): New prototype.
* errno2name.c: New file.
* Makefile.am (libtests_a_SOURCES): Add it.
2016-04-21 04:08:55 +03:00
769c98af34 hppa: rename ECANCELLED to ECANCELED
hppa seems to be the only architecture that defines ECANCELLED synonym
for ECANCELED constant, other architectures just define ECANCELED.
Change the way how this constant is printed on hppa to be in line
with other architectures.

* linux/hppa/errnoent.h [253]: Rename ECANCELLED to ECANCELED.
2016-04-20 21:36:46 +00:00
126464566d Remove parser of unimplemented timerfd syscall
timerfd syscall was introduced in v2.6.22-rc1, but in v2.6.25-rc1
it was replaced by timerfd_* syscall family.

* linux/avr32/syscallent.h (timerfd): Fix nargs.
* linux/dummy.h (sys_timerfd): Add stub alias.
* time.c (SYS_FUNC(timerfd)): Remove.
2016-04-20 17:15:05 +00:00
e8a8f6d6e8 tests: workaround kernel bugs in seccomp-strict.test and prctl-seccomp-strict.test
If kernel implementation of strict seccomp mode is buggy, test programs
will be killed by SIGKILL.  This is a known problem at least on
x32 and mips.  Skip affected tests if this is the case.

This change partially revert commit 9c1a72cd3f.

* tests/seccomp-strict.c (main): Remove workaround for x32.
* tests/prctl-seccomp-strict.c: Likewise.
* tests/seccomp-strict.test: Skip the test if the test program
has been killed by SIGKILL.
* tests/prctl-seccomp-strict.test: Likewise.
2016-04-20 14:30:43 +00:00
bea707377d tests/shmxt.c: do not use SHM_RND, it is unreliable
* tests/shmxt.c (main): Do not set SHM_RND flag.
2016-04-20 05:40:58 +00:00
c8cc0f2a87 tests/rt_sigpending.c: fix for systems where _NSIG > 16 * sizeof(long)
* tests/rt_sigsuspend.c (iterate): Do not assume that size will be less
than sizeof(long) on the second iteration.
2016-04-20 04:35:25 +00:00
d424c765f7 prctl-seccomp-strict.test: robustify against unrelated prctl invocations
* tests/prctl-seccomp-strict.test: Filter out PR_GET_* prctl calls.
2016-04-20 01:08:13 +00:00
fdb2a1867e tests: adjust rt_sigpending to older kernels
With linux kernels older than v3.9-rc1, compat rt_sigpending syscall
could fail with EFAULT in cases where on later kernels it succeeds.
Adjust the test to handle both cases properly.

* tests/rt_sigpending.c (iterate): Stop iterations if rt_sigpending
failed with EFAULT.
2016-04-20 01:08:13 +00:00
f73a3a44dd tests: adjust readv/writev and preadv/pwritev tests to older kernels
With linux kernels older than v3.16-rc1, iovec based compat syscalls may
return EINVAL in some cases where on later kernels they return EFAULT.
Adjust tests to handle both cases properly.

* tests/preadv-pwritev.c: Include <errno.h>.
(main): Print either "EINVAL" or "EFAULT" depending on errno.
* tests/pwritev.c: Likewise.
* tests/readv.c: Likewise.
2016-04-20 01:08:13 +00:00
87c0b56a77 tests: remove obsolete non-strict uid tests
Recently added strict tests for uid/gid related syscalls
made old uid tests obsolete.

* tests/uid.awk: Remove.
* tests/uid.c: Remove.
* tests/uid.test: Remove.
* tests/uid16.c: Remove.
* tests/uid16.test: Remove.
* tests/uid32.c: Remove.
* tests/uid32.test: Remove.
* tests/.gitignore: Remove uid, uid16, and uid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Remove uid.test, uid16.test, and uid32.test.
(EXTRA_DIST): Remove uid.awk.
2016-04-20 01:08:13 +00:00
f096422882 tests: extend test coverage of getuid/getgid family syscalls
Add strict tests for getuid, getuid32, getgid, getgid32, geteuid,
geteuid32, getegid, and getegid32 syscalls.

* tests/getegid.c: New file.
* tests/getegid.test: New test.
* tests/getegid32.c: New file.
* tests/getegid32.test: New test.
* tests/geteuid.c: New file.
* tests/geteuid.test: New test.
* tests/geteuid32.c: New file.
* tests/geteuid32.test: New test.
* tests/getgid.c: New file.
* tests/getgid.test: New test.
* tests/getgid32.c: New file.
* tests/getgid32.test: New test.
* tests/getuid.c: New file.
* tests/getuid.test: New test.
* tests/getuid32.c: New file.
* tests/getuid32.test: New test.
* tests/.gitignore: Add getuid, getuid32, getgid, getgid32, geteuid,
* geteuid32, getegid, and getegid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add getegid.test, getegid32.test, geteuid.test,
geteuid32.test, getgid.test, getgid32.test, getuid.test,
and getuid32.test.
2016-04-20 01:08:13 +00:00
7f3da2ff4c tests: extend test coverage of getresgid32 syscall
* tests/getresgid32.c: New file.
* tests/getresgid32.test: New test.
* tests/.gitignore: Add getresgid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add getresgid32.test.
2016-04-20 01:08:13 +00:00
91119e5306 tests: extend test coverage of getresgid syscall
* tests/getresgid.c: New file.
* tests/getresgid.test: New test.
* tests/.gitignore: Add getresgid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add getresgid.test.
2016-04-20 01:08:13 +00:00
dcc6660256 tests: extend test coverage of getresuid32 syscall
* tests/getresuid32.c: New file.
* tests/getresuid32.test: New test.
* tests/.gitignore: Add getresuid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add getresuid32.test.
2016-04-20 01:08:13 +00:00
fbe1a9ec6e tests: extend test coverage of getresuid syscall
* tests/getresugid.c: New file.
* tests/getresuid.c: New file.
* tests/getresuid.test: New test.
* tests/.gitignore: Add getresuid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add getresuid.test.
(EXTRA_DIST): Add getresugid.c.
2016-04-20 01:08:13 +00:00
bff70d4311 tests: add symlinkat.test
* tests/symlinkat.c: New file.
* tests/symlinkat.test: New test.
* tests/.gitignore: Add symlinkat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add symlinkat.test.
2016-04-20 01:08:13 +00:00
1eb0051663 tests: add iopl.test
* tests/iopl.c: New file.
* tests/iopl.test: New test.
* tests/.gitignore: Add iopl.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add iopl.test.
2016-04-20 01:08:13 +00:00
ef2007eccc mips o32, powerpc, powerpc64: fix decoding of iopl syscall
* linux/mips/syscallent-o32.h (iopl): Fix nargs.
* linux/powerpc/syscallent.h (iopl): Fix nargs and sys_func.
* linux/powerpc64/syscallent.h (iopl): Likewise.
2016-04-20 01:08:13 +00:00
2e069fcc0d tests: add ioperm.test
* tests/ioperm.c: New file.
* tests/ioperm.test: New test.
* tests/.gitignore: Add ioperm.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add ioperm.test.
2016-04-20 01:08:13 +00:00
5e9944df2c Fix corner cases of getgroups and setgroups syscall decoders
* uid.c (print_groups): New function.
(SYS_FUNC(setgroups), SYS_FUNC(getgroups)): Use it.
Print first syscall argument using %u format.
* tests/getgroups.c: New file.
* tests/getgroups.test: New test.
* tests/getgroups32.c: New file.
* tests/getgroups32.test: New test.
* tests/setgroups.c: New file.
* tests/setgroups.test: New test.
* tests/setgroups32.c: New file.
* tests/setgroups32.test: New test.
* tests/.gitignore: Add getgroups, getgroups32, setgroups,
and setgroups32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add getgroups.test, getgroups32.test,
setgroups.test, and setgroups32.test.
2016-04-20 01:08:13 +00:00
ba210af060 Cleanup setfsuid syscall decoder
* uid.c (SYS_FUNC(setfsuid)): Remove redundant check.
2016-04-20 01:08:13 +00:00
f184989593 tests: check decoding of setfsgid32 syscall
* tests/setfsgid32.c: New file.
* tests/setfsgid32.test: New test.
* tests/.gitignore: Add setfsgid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setfsgid32.test.
2016-04-20 01:08:13 +00:00
fba762db71 tests: check decoding of setfsgid syscall
* tests/setfsugid.c: New file.
* tests/setfsgid.c: New file.
* tests/setfsgid.test: New test.
* tests/.gitignore: Add setfsgid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setfsgid.test.
(EXTRA_DIST): Add setfsugid.c.
2016-04-20 01:08:13 +00:00
2def3d4a04 tests: check decoding of setfsuid32 syscall
* tests/setfsuid32.c: New file.
* tests/setfsuid32.test: New test.
* tests/.gitignore: Add setfsuid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setfsuid32.test.
2016-04-20 01:08:13 +00:00
281e4578dd tests: check decoding of setfsuid syscall
* tests/setfsugid.c: New file.
* tests/setfsuid.c: New file.
* tests/setfsuid.test: New test.
* tests/.gitignore: Add setfsuid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setfsuid.test.
(EXTRA_DIST): Add setfsugid.c.
2016-04-20 01:08:13 +00:00
fa7c988bd9 tests: extend test coverage of setresgid32 syscall
* tests/setresgid32.c: New file.
* tests/setresgid32.test: New test.
* tests/.gitignore: Add setresgid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setresgid32.test.
2016-04-20 01:08:13 +00:00
4f6d95dd58 tests: extend test coverage of setresgid syscall
* tests/setresgid.c: New file.
* tests/setresgid.test: New test.
* tests/.gitignore: Add setresgid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setresgid.test.
2016-04-20 01:08:12 +00:00
2b42d8e32f tests: extend test coverage of setresuid32 syscall
* tests/setresuid32.c: New file.
* tests/setresuid32.test: New test.
* tests/.gitignore: Add setresuid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setresuid32.test.
2016-04-20 01:08:12 +00:00
0eac88a00a tests: extend test coverage of setresuid syscall
* tests/setresugid.c: New file.
* tests/setresuid.c: New file.
* tests/setresuid.test: New test.
* tests/.gitignore: Add setresuid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setresuid.test.
(EXTRA_DIST): Add setresugid.c.
2016-04-20 01:08:12 +00:00
7d7dfbede8 tests: extend test coverage of setregid32 syscall
* tests/setregid32.c: New file.
* tests/setregid32.test: New test.
* tests/.gitignore: Add setregid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setregid32.test.
2016-04-20 01:08:12 +00:00
28d02ea6f3 tests: extend test coverage of setregid syscall
* tests/setregid.c: New file.
* tests/setregid.test: New test.
* tests/.gitignore: Add setregid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setregid.test.
2016-04-20 01:08:12 +00:00
619a96a295 tests: extend test coverage of setreuid32 syscall
* tests/setreuid32.c: New file.
* tests/setreuid32.test: New test.
* tests/.gitignore: Add setreuid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setreuid32.test.
2016-04-20 01:08:12 +00:00
e6d8473850 tests: extend test coverage of setreuid syscall
* tests/setreugid.c: New file.
* tests/setreuid.c: New file.
* tests/setreuid.test: New test.
* tests/.gitignore: Add setreuid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setreuid.test.
(EXTRA_DIST): Add setreugid.c.
2016-04-20 01:08:12 +00:00
6511b2df01 tests: extend test coverage of setgid32 syscall
* tests/setgid32.c: New file.
* tests/setgid32.test: New test.
* tests/.gitignore: Add setgid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setgid32.test.
2016-04-20 01:08:12 +00:00
cf273016fe tests: extend test coverage of setgid syscall
* tests/setgid.c: New file.
* tests/setgid.test: New test.
* tests/.gitignore: Add setgid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setgid.test.
2016-04-20 01:08:12 +00:00
8f0e41afb7 tests: extend test coverage of setuid32 syscall
* tests/setuid32.c: New file.
* tests/setuid32.test: New test.
* tests/.gitignore: Add setuid32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setuid32.test.
2016-04-20 01:08:12 +00:00
aa399261ac tests: extend test coverage of setuid syscall
* tests/setugid.c: New file.
* tests/setuid.c: New file.
* tests/setuid.test: New test.
* tests/.gitignore: Add setuid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add setuid.test.
(EXTRA_DIST): Add setugid.c.
2016-04-20 01:08:12 +00:00
39a33b171b tests: add shmxt.test
* tests/shmxt.c: New file.
* tests/shmxt.test: New test.
* tests/.gitignore: Add shmxt.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add shmxt.test.
2016-04-20 01:08:12 +00:00
10c6c3f7b5 alpha: fix decoding of shmat syscall
On alpha, shmat syscall is known as osf_shmat.

* linux/alpha/syscallent.h (osf_shmat): Fix sys_flags and sys_func.
2016-04-20 01:08:12 +00:00
f22db4e753 tests: add semop.test
* tests/semop.c: New file.
* tests/semop.test: New test.
* tests/.gitignore: Add semop.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add semop.test.
2016-04-20 00:11:27 +00:00
7d23d33933 prctl-seccomp-filter-v.test: robustify against unrelated prctl invocations
* tests/prctl-seccomp-filter-v.test: Filter out PR_GET_* prctl calls.

Reported-by: Steve McIntyre <steve@einval.com>
2016-04-18 01:10:44 +00:00
bcdd2041fa tests/pselect6.c: fix potential output mismatch
* tests/pselect6.c (main): In the last case of printing pselect6
syscall, print the last argument the same way as in other cases.

Reported-by: Steve McIntyre <steve@einval.com>
2016-04-18 01:10:44 +00:00
96492b2acd tests: check decoding of fchown32 syscall
* tests/fchown32.c: New file.
* tests/fchown32.test: New test.
* tests/.gitignore: Add fchown32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add fchown32.test.
2016-04-18 01:10:44 +00:00
e6828b1102 tests: check decoding of fchown syscall
* tests/fchown.c: New file.
* tests/fchown.test: New test.
* tests/.gitignore: Add fchown.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add fchown.test.
2016-04-18 01:10:44 +00:00
11f98f21b7 tests: check decoding of lchown32 syscall
* tests/lchown32.c: New file.
* tests/lchown32.test: New test.
* tests/.gitignore: Add lchown32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add lchown32.test.
2016-04-18 01:10:44 +00:00
408420f51f tests: check decoding of lchown syscall
* tests/lchown.c: New file.
* tests/lchown.test: New test.
* tests/.gitignore: Add lchown.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add lchown.test.
2016-04-18 01:10:43 +00:00
f559a876f8 tests: check decoding of chown32 syscall
* tests/chown32.c: New file.
* tests/chown32.test: New test.
* tests/.gitignore: Add chown32.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add chown32.test.
2016-04-18 01:10:43 +00:00
4ccdbd698e tests: check decoding of chown syscall
* tests/chown.c: New file.
* tests/chown.test: New test.
* tests/xchownx.c: New file.
* tests/.gitignore: Add chown.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add chown.test.
(EXTRA_DIST): Add xchownx.c.
2016-04-18 01:10:43 +00:00
a99bcbf916 Fix decoding of 16-bit uid_t/git_t
* uid.c (printuid): Always cast value to uid_t.
2016-04-18 01:10:43 +00:00
c1f1cc1b4c tests: move kernel uid overflow check to libtests
This code used in two different places, so move it to the library.

* tests/overflowuid.c: New file.
* tests/Makefile.am (libtests_a_SOURCES): Add it.
* tests/tests.h (check_overflowuid, check_overflowgid): New prototypes.
* tests/uid.c (main): Use check_overflowuid.
* tests/uid16.c (main): Likewise.
2016-04-18 01:10:41 +00:00
9c1a72cd3f tests: skip seccomp-strict.test and prctl-seccomp-strict.test on x32
As x86_64 kernel does not support x32 syscall numbers in
SECCOMP_MODE_STRICT, skip affected tests on x32.

* tests/seccomp-strict.c (main) [__x86_64__ && __ILP32__]: Bail out
using error_msg_and_skip.
* tests/prctl-seccomp-strict.c: Likewise.
2016-04-12 04:39:25 +00:00
c2523e0d9c tests: add seccomp-filter.test
* tests/seccomp-filter.c: New file.
* tests/seccomp-filter.test: New test.
* tests/.gitignore: Add seccomp-filter.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add seccomp-filter.test.
2016-04-12 00:20:03 +00:00
6ba947f36e seccomp: fix decoding of sock_fprog and sock_filter structures
Always print struct sock_fprog.len.
Fix printing of unfetchable elements in sock_filter array.
Fix printing of large sock_filter arrays.

* seccomp.c (decode_fprog): Rewrite into decode_seccomp_fprog and
print_seccomp_fprog.
(print_seccomp_filter): Replace decode_fprog with print_seccomp_fprog.
* tests/prctl-seccomp-filter-v.c (main): Update.
* tests/seccomp-filter-v.c: New file.
* tests/seccomp-filter-v.test: New test.
* tests/.gitignore: Add seccomp-filter-v.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add seccomp-filter-v.test.
2016-04-12 00:05:43 +00:00
3ea6a59802 seccomp: print SECCOMP_* and BPF_* constants in a more compact way
* seccomp.c (decode_bpf_code, decode_bpf_stmt): Replace " | " with "|".
* tests/prctl-seccomp-filter-v.c: Update.
2016-04-11 20:25:01 +00:00
181806136e tests: rename seccomp.test to prctl-seccomp-filter-v.test
* tests/.gitignore: Replace seccomp with prctl-seccomp-filter-v.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Replace seccomp.test with prctl-seccomp-filter-v.test.
* tests/seccomp.c: Rename to tests/prctl-seccomp-filter-v.c.
* tests/seccomp.test: Rename to tests/prctl-seccomp-filter-v.test.
2016-04-11 15:16:30 +00:00
b19945bebc tests: add seccomp-strict.test
* tests/seccomp-strict.c: New file.
* tests/seccomp-strict.test: New test.
* tests/.gitignore: Add seccomp-strict.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add seccomp-strict.test.
2016-04-11 15:09:09 +00:00
c1aa737325 tests: add prctl-seccomp-strict.test
* tests/prctl-seccomp-strict.c: New file.
* tests/prctl-seccomp-strict.test: New test.
* tests/.gitignore: Add prctl-seccomp-strict.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add prctl-seccomp-strict.test.
2016-04-11 15:06:28 +00:00
d9e4ff7fb3 tests: bring lists back to the sorted order 2016-04-11 15:04:08 +00:00
7a06960ff4 tests/epoll_create1.c: extend for the case of ENOSYS
* epoll_create1.c: Make the test work in case of epoll_create1
returning ENOSYS.
2016-04-10 23:05:18 +00:00
2399a6031c tests/epoll_ctl.c: extend epoll_ctl coverage
* tests/epoll_ctl.c (main): Check EPOLL_CTL_DEL decoding.  Check
decoding of long int descriptors and NULL struct epoll_event pointer.
2016-04-10 22:38:00 +00:00
cb6f997114 tests: add mlockall.test
* tests/mlockall.c: New file.
* tests/mlockall.test: New test.
* tests/.gitignore: Add mlockall.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add mlockall.test.
2016-04-09 23:34:18 +00:00
c75e2c2e42 tests: add epoll_wait.test
* tests/epoll_wait.c: New file.
* tests/epoll_wait.test: New test.
* tests/.gitignore: Add epoll_wait.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add epoll_wait.test.
2016-04-08 07:59:16 +00:00
258a22519f tests: add epoll_ctl.test
* tests/epoll_ctl.c: New file.
* tests/epoll_ctl.test: New test.
* tests/.gitignore: Add epoll_ctl.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add epoll_ctl.test.
2016-04-08 07:59:15 +00:00
bbdd23c8ed tests: add epoll_create.test
* tests/epoll_create.c: New file.
* tests/epoll_create.test: New test.
* tests/.gitignore: Add epoll_create.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add epoll_create.test.
2016-04-08 07:59:14 +00:00
17f4b45164 tests/pread64-pwrite64.c: minor cleanup
* tests/pread64-pwrite64.c: Do not include <sys/uio.h>.
2016-04-08 02:16:28 +00:00
fcb94cded0 Fix decoding of swapon flags
* swapon.c (SYS_FUNC(swapon)): Print priority regardless
of SWAP_FLAG_PREFER flag being set.
* tests/swap.c (error_msg): Handle EINVAL.
(main): Check decoding of swapon flags.
2016-04-07 01:15:58 +00:00
f2f91c0933 tests/unlinkat.c: check AT_* decoding
* tests/unlinkat.c (main): Check decoding of AT_* constants.
2016-04-07 00:39:18 +00:00
867c1cdf19 tests/linkat.c: check AT_* decoding
* tests/linkat.c (main): Check decoding of AT_* constants.
2016-04-07 00:31:44 +00:00
612368b59e Improve decoding of Android's PR_SET_VMA prctl
Before:

  prctl(0x53564d41 /* PR_??? */, 0, 0x7f8ab53000, 4096,
        "atexit handlers") = 0

After:

  prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, 0x7fa8cbd000, 4096,
        "atexit handlers") = 0

* prctl.c (SYS_FUNC(prctl)) [__ANDROID__]: Do not define PR_SET_VMA.
* Hard-code PR_SET_VMA_ANON_NAME, the only current sub-option.
* xlat/prctl_options.in: Add PR_SET_VMA.
2016-04-06 21:41:36 +00:00
c4a30f15ef tests: add mkdirat.test
* tests/mkdirat.c: New file.
* tests/mkdirat.test: New test.
* tests/.gitignore: Add mkdirat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add mkdirat.test.
2016-04-06 06:18:51 +00:00
93faa4cc88 tests: add swap.test
* tests/swap.c: New file.
* tests/swap.test: New test.
* tests/.gitignore: Add swap.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add swap.test.
2016-04-06 06:18:50 +00:00
41cd657930 tests: add unlinkat.test
* tests/unlinkat.c: New file.
* tests/unlinkat.test: New test.
* tests/.gitignore: Add unlinkat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add unlinkat.test.
2016-04-06 06:18:49 +00:00
7a158a18f8 tests: add linkat.test
* tests/linkat.c: New file.
* tests/linkat.test: New test.
* tests/.gitignore: Add linkat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add linkat.test.
2016-04-06 06:18:48 +00:00
5b2d257839 tests: add sync_file_range.test and sync_file_range2.test
* configure.ac (AC_CHECK_FUNCS): Add sync_file_range.
* tests/sync_file_range.c: New file.
* tests/sync_file_range2.c: Likewise.
* tests/sync_file_range.test: New test.
* tests/sync_file_range2.test: Likewise.
* tests/.gitignore: Add sync_file_range and sync_file_range2.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add sync_file_range.test and sync_file_range2.test.
2016-04-06 00:02:08 +00:00
27bff90e86 Add default values for SYNC_FILE_RANGE_* constants
* xlat/sync_file_range_flags.in: Add default values.
2016-04-05 23:30:05 +00:00
6f072d5e87 Fix sync_file_range2 output
Before:

  sync_file_range2(3SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE|
    SYNC_FILE_RANGE_WAIT_AFTER|0xfffffff8, 0, 0, )

After:

  sync_file_range2(3, SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE|
    SYNC_FILE_RANGE_WAIT_AFTER|0xfffffff8, 0, 0)

* sync_file_range.c (SYS_FUNC(sync_file_range2)): Output the ", "
in the right place.
2016-04-05 19:10:16 +00:00
71fe62e6b7 Replace PF_* constants with AF_*
AF_* constants appear to be more standardized, and in practice there's
always a one to one relationship between AF_* and PF_*, so let's
use AF_* instead of PF_*.

* xlat/domains.in: Remove.
* net.c: Do not define PF_UNSPEC.  Stop including "xlat/domains.h".
Replace PF_* with AF_*.  Replace domains with addrfams.
* tests/inet-cmsg.c: Replace PF_INET with AF_INET.
* tests/net-yy-inet.c: Likewise.
* tests/netlink_inet_diag.c: Likewise.
* tests/net-accept-connect.c: Replace PF_LOCAL with AF_LOCAL.
* tests/net-y-unix.c: Likewise.
* tests/net-yy-unix.c: Likewise.
* tests/netlink_unix_diag.c: Likewise.
* tests/net.expected: Replace PF_ with AF_.
2016-04-04 01:35:28 +00:00
2aa9b32d81 tests: add read-write.test
* tests/read-write.c: New file.
* tests/read-write.test: New test.
* tests/.gitignore: Add read-write.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add read-write.test.
2016-04-03 16:37:43 +00:00
7b5d8f98fc tests/pread64-pwrite64.test: extend dumpio coverage
* tests/pread64-pwrite64.c (dump_str, print_hex, test_dump):
New functions.
(main): Use them to test dumping of various data.
* tests/pread64-pwrite64.test: Update.
2016-04-02 18:27:44 +00:00
0de582907a tests: add hexdump_memdup function to libtests
* tests/hexdump_strdup.c (hexdump_memdup): New function.
(hexdump_strdup): Use it.
* tests/tests.h (hexdump_memdup): New prototype.
2016-04-02 18:24:36 +00:00
35e97a78c7 tests: add fchownat.test
* tests/fchownat.c: New file.
* tests/fchownat.test: New test.
* tests/.gitignore: Add fchownat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add fchownat.test.
2016-04-02 14:07:02 +00:00
baeff232ce tests: add fchmodat.test
* tests/fchmodat.c: New file.
* tests/fchmodat.test: New test.
* tests/.gitignore: Add fchmodat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add fchmodat.test.
2016-04-02 13:13:16 +00:00
9f3a6af09a Fix printing of negative offsets in pread64 and pwrite64 syscalls
* io.c (SYS_FUNC(pread), SYS_FUNC(pwrite)): Print offset
using %lld format string.
* tests/pread64-pwrite64.c: New file.
* tests/pread64-pwrite64.test: New test.
* tests/.gitignore: Add pread64-pwrite64.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(pread64_pwrite64_CPPFLAGS): New variable.
(DECODER_TESTS): Add pread64-pwrite64.
2016-04-02 01:08:24 +00:00
69f1bf37fd tests/hexdump_strdup.c: add support for longer strings
* tests/hexdump_strdup.c (hexdump_strdup): Output extra space character
before hexdumping of the 9th symbol.
2016-04-02 01:05:25 +00:00
fe0d07a1bc tests/preadv-pwritev.c: fix typo in error diagnostics
* tests/preadv-pwritev.c (main): Fix typo in error message.
2016-04-02 01:04:57 +00:00
d82b0d8ceb tests: add chroot.test
* tests/chroot.c: New file.
* tests/chroot.test: New test.
* tests/.gitignore: Add chroot.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add chroot.test.
2016-04-01 23:34:33 +00:00
4c4ab0fe82 tests: add fdatasync.test
* tests/fdatasync.c: New file.
* tests/fdatasync.test: New test.
* tests/.gitignore: Add fdatasync.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add fdatasync.test.
2016-04-01 23:34:33 +00:00
16c078ea99 tests: add fsync.test
* tests/fsync.c: New file.
* tests/fsync.test: New test.
* tests/.gitignore: Add fsync.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add fsync.test.
2016-04-01 23:34:33 +00:00
a067b8d3b0 tests: add sethostname.test
* tests/sethostname.c: New file.
* tests/sethostname.test: New test.
* tests/.gitignore: Add sethostname.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add sethostname.test.
2016-04-01 23:34:33 +00:00
3ae8690d8e Consistently handle unsigned arguments of mmap* and remap_file_pages
Explicitly declare first 4 arguments of mmap* and all remap_file_pages
arguments as unsigned to avoid potential sign extension issues.

* mem.c (print_mmap, SYS_FUNC(remap_file_pages)): Assign syscall
arguments to local variables of appropriate types.
2016-04-01 15:31:23 +00:00
f40ea796ba Consistently handle 2nd and 3rd arguments of [gs]etsockopt as unsigned
The second (level) and third (optname) arguments of getsockopt and
setsockopt syscalls are enums, so treat them consistently as enums:
use "unsigned int" type to avoid potential sign extension issues.

* net.c (print_sockopt_fd_level_name, print_getsockopt,
print_setsockopt): Change type of "level" and "name" arguments
from "int" to "unsigned int".
2016-04-01 01:03:20 +00:00
b0d23cc2c0 Add sentinel attribute to printxvals
* gcc_compat.h (ATTRIBUTE_SENTINEL): New macro.
* defs.h (printxvals): Add ATTRIBUTE_SENTINEL.
2016-04-01 00:52:01 +00:00
ccdc82a57d Cleanup parser of ptrace syscall
* process.c (print_user_offset_addr): New function for printing offset
address in the tracee's USER area.
(SYS_FUNC(ptrace)): Assign syscall arguments to local variables with
appropriate types.  Print pid argument as int.  Use switch statement
in the code that handles address argument.  Use print_user_offset_addr
to print address in PTRACE_PEEKUSER and PTRACE_POKEUSER requests.
2016-04-01 00:28:33 +00:00
1f3482beda Define PRI__[uxs]64 macros to print __s64 and __u64 values
Rather than cast every __u64 or __s64 before printing,
define printing helpers for those types directly.

* defs.h (PRI__s64, PRI__u64, PRI__x64): New macros.
2016-03-31 04:34:17 +00:00
3f6ebceb50 Implement dumping of preadv and pwritev syscalls
* syscall.c (dumpio): Add SEN_preadv and SEN_pwritev.
* NEWS: Mention this.
* tests/preadv-pwritev.c: New file.
* tests/preadv-pwritev.test: New test.
* tests/.gitignore: Add preadv-pwritev.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(preadv_pwritev_CPPFLAGS): New variable.
(DECODER_TESTS): Add preadv-pwritev.
2016-03-31 00:01:58 +00:00
c98ab8805b Fix decoding of preadv syscall in case of short read
* io.c (SYS_FUNC(preadv)): Call tprint_iov_upto instead
of tprint_iov and specify syscall return value as a data size limit.
* NEWS: Mention it.
* tests/preadv.c (main): Add a test case for preadv short read.
2016-03-30 18:04:00 +00:00
d461151f23 Fix printing of negative offsets in preadv and pwritev syscalls
* io.c (print_llu_from_low_high_val): Rename to
print_lld_from_low_high_val, all callers changed.
Print value as a signed integer.
* tests/preadv.c: New file.
* tests/preadv.test: New test.
* tests/pwritev.c: New file.
* tests/pwritev.test: New test.
* tests/.gitignore: Add preadv and pwritev.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(preadv_CPPFLAGS, pwritev_CPPFLAGS): New variables.
(DECODER_TESTS): Add preadv.test and pwritev.test.
2016-03-30 03:54:21 +00:00
0a9d1947a7 Fix printing of unreadable struct iovec
* io.c (tprint_iov_upto): If the first element of iovec array is
unreadable, print its address without array markup.
* tests/readv.c (main): Check it.
2016-03-30 02:22:58 +00:00
5dde5671bd tests: factor out a part common to many simply organized test scripts
* tests/init.sh (run_strace_match_diff): New function.
* tests/acct.test: Rewrite using run_strace_match_diff.
* tests/aio.test: Likewise.
* tests/alarm.test: Likewise.
* tests/chmod.test: Likewise.
* tests/clock_nanosleep.test: Likewise.
* tests/clock_xettime.test: Likewise.
* tests/copy_file_range.test: Likewise.
* tests/creat.test: Likewise.
* tests/dup.test: Likewise.
* tests/dup2.test: Likewise.
* tests/dup3.test: Likewise.
* tests/epoll_create1.test: Likewise.
* tests/execveat-v.test: Likewise.
* tests/execveat.test: Likewise.
* tests/fchmod.test: Likewise.
* tests/fcntl.test: Likewise.
* tests/file_handle.test: Likewise.
* tests/flock.test: Likewise.
* tests/fork-f.test: Likewise.
* tests/ftruncate.test: Likewise.
* tests/ftruncate64.test: Likewise.
* tests/getcwd.test: Likewise.
* tests/getdents.test: Likewise.
* tests/getdents64.test: Likewise.
* tests/getrandom.test: Likewise.
* tests/getrusage.test: Likewise.
* tests/getxxid.test: Likewise.
* tests/inet-cmsg.test: Likewise.
* tests/init.sh: Likewise.
* tests/membarrier.test: Likewise.
* tests/mincore.test: Likewise.
* tests/mknod.test: Likewise.
* tests/mlock2.test: Likewise.
* tests/mmsg.test: Likewise.
* tests/nanosleep.test: Likewise.
* tests/open.test: Likewise.
* tests/openat.test: Likewise.
* tests/pselect6.test: Likewise.
* tests/readdir.test: Likewise.
* tests/readlink.test: Likewise.
* tests/readv.test: Likewise.
* tests/recvmsg.test: Likewise.
* tests/rename.test: Likewise.
* tests/renameat.test: Likewise.
* tests/rt_sigpending.test: Likewise.
* tests/rt_sigprocmask.test: Likewise.
* tests/rt_sigqueueinfo.test: Likewise.
* tests/rt_sigsuspend.test: Likewise.
* tests/rt_sigtimedwait.test: Likewise.
* tests/rt_tgsigqueueinfo.test: Likewise.
* tests/sched_get_priority_mxx.test: Likewise.
* tests/sched_xetaffinity.test: Likewise.
* tests/sched_xetparam.test: Likewise.
* tests/sched_xetscheduler.test: Likewise.
* tests/seccomp.test: Likewise.
* tests/select.test: Likewise.
* tests/sendfile.test: Likewise.
* tests/sendfile64.test: Likewise.
* tests/splice.test: Likewise.
* tests/statx.sh: Likewise.
* tests/sysinfo.test: Likewise.
* tests/syslog.test: Likewise.
* tests/tee.test: Likewise.
* tests/time.test: Likewise.
* tests/timer_create.test: Likewise.
* tests/timer_xettime.test: Likewise.
* tests/timerfd_xettime.test: Likewise.
* tests/times-fail.test: Likewise.
* tests/times.test: Likewise.
* tests/truncate.test: Likewise.
* tests/truncate64.test: Likewise.
* tests/umask.test: Likewise.
* tests/umount.test: Likewise.
* tests/umount2.test: Likewise.
* tests/userfaultfd.test: Likewise.
* tests/vmsplice.test: Likewise.
* tests/xet_robust_list.test: Likewise.
* tests/xetitimer.test: Likewise.
* tests/xetpgid.test: Likewise.
* tests/xetpriority.test: Likewise.
* tests/xettimeofday.test: Likewise.
2016-03-30 00:16:24 +00:00
579a4aae8a tests: introduce $NAME
* tests/init.sh (NAME): New variable, defined to ${ME_%.test}.
(run_prog, match_awk, match_diff, match_grep): Replace ${ME_%.test}
with $NAME.
* tests/fcntl.test: Likewise.
* tests/fstat.test: Likewise.
* tests/mmap.test: Likewise.
* tests/net-y-unix.test: Likewise.
* tests/net-yy-inet.test: Likewise.
* tests/net-yy-unix.test: Likewise.
* tests/open.test: Likewise.
* tests/openat.test: Likewise.
* tests/poll.test: Likewise.
* tests/ppoll.test: Likewise.
* tests/readlink.test: Likewise.
* tests/select.test: Likewise.
* tests/statx.sh: Likewise.
* tests/uname.test: Likewise.
2016-03-30 00:13:56 +00:00
2e8a7871ab tests: move definitions of $OUT and $ERR to init.sh
As virtually every test defines either one or both of OUT and ERR
variables and these definitions are exactly the same, move definitions
of these variables from individual tests to init.sh.

* tests/init.sh (OUT, ERR): New variables.
* tests/ipc.sh: Remove initialization of OUT variable.
* tests/statx.sh: Likewise.
* tests/*.test: Remove initialization of OUT and ERR variables.
2016-03-30 00:13:37 +00:00
a990e8c671 tests: simplify sendfile.test and sendfile64.test
Use the executable itself for input by default.

* tests/sendfile.c (main): Use av[0] instead of av[1] for input.
* tests/sendfile64.c (main): Likewise.
* tests/sendfile.test: Invoke run_prog without arguments.
* tests/sendfile64.test: Likewise.
2016-03-29 17:01:02 +00:00
1e7dfc38fd open.test, openat.test: lift /proc requirement
While -P option needs /proc to match descriptors, it does not use
/proc to match pathnames.  As these tests do not need descriptor
match, the /proc requirement can be safely lifted.

* tests/open.test: Lift /proc/self/fd/ requirement.
* tests/openat.test: Likewise.
2016-03-29 03:33:00 +00:00
cca2e53c4a quotactl: add decoding of Q_GETNEXTQUOTA and Q_XGETNEXTQUOTA
* quota.c (if_nextdqblk): New structure.
(decode_cmd_data): Handle Q_GETNEXTQUOTA and Q_XGETNEXTQUOTA.
2016-03-29 01:15:24 +00:00
4ce6b5e0e8 Update Q_* constants
* xlat/quotacmds.in: Add Q_GETNEXTQUOTA and Q_XGETNEXTQUOTA introduced
by linux kernel commits v4.6-rc1~65^2~9^2~5 and v4.6-rc1~65^2~9^2~6.
2016-03-29 00:51:28 +00:00
c4d67d4141 Update CLONE_* constants
* xlat/clone_flags.in: Rename CLONE_STOPPED to CLONE_NEWCGROUP.
The former was removed by linux kernel commit v2.6.38-rc1~217.
The latter was introduced by linux kernel commit v4.6-rc1~67^2~8.
2016-03-29 00:51:28 +00:00
54cc3e1d21 Update BPF_MAP_TYPE_* constants
* xlat/bpf_map_types.in: Add BPF_MAP_TYPE_PERCPU_HASH,
BPF_MAP_TYPE_PERCPU_ARRAY, and BPF_MAP_TYPE_STACK_TRACE introduced by
linux kernel commits v4.6-rc1~91^2~326^2~5, v4.6-rc1~91^2~326^2~4, and
v4.6-rc1~91^2~212^2~1, respectively.
2016-03-29 00:28:11 +00:00
ce515ddda4 Update SO_* constants
* xlat/sockoptions.in: Add SO_CNX_ADVICE introduced by linux kernel
commit v4.6-rc1~91^2~176.
2016-03-29 00:20:37 +00:00
ebd1124bce Update SEGV_* constants
* xlat/sigsegv_codes.in: Add SEGV_PKUERR introduced by linux kernel
commit v4.6-rc1~68^2~23.
2016-03-29 00:17:19 +00:00
dbc68b7034 avr32: wire up copy_file_range syscall
* linux/avr32/syscallent.h [325]: Add copy_file_range entry.
2016-03-29 00:01:07 +00:00
d2029cc4a1 tests/uname.test: check abbreviated output, use print_quoted_string
* tests/uname.c (main): Use print_quoted_string to print
utsname members.  Add abbrev check.
* tests/uname.test: Add abbrev check.
2016-03-28 23:25:30 +00:00
90406df134 faccessat.test: robustify against libcs invoking faccessat syscall on their own
* tests/faccessat.c (TMP_FILE): Rename to sample, change its value
to "faccessat.sample".
* tests/faccessat.test: Rewrite using openat.test.
2016-03-28 00:16:17 +00:00
347a5d45ec openat.test: robustify against libcs invoking openat syscall on their own
* tests/openat.c (main): Rename fname to sample, change its value
to "openat.sample".
* tests/openat.test: Use -P option to filter out openat syscalls
made by libc and dynamic linker.
2016-03-28 00:16:02 +00:00
f09a474877 tests: add open.test
* tests/open.c: New file.
* tests/open.test: New test.
* tests/.gitignore: Add open.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add open.test.
2016-03-28 00:15:15 +00:00
e17f28dce0 Update generic ioctl entries from linux 4.5
* linux/64/ioctls_inc.h: Update from linux v4.5 using ioctls_gen.sh.
* linux/32/ioctls_inc_align32.h: Likewise.
* linux/32/ioctls_inc_align64.h: Likewise.
* NEWS: Mention this.
2016-03-27 00:03:27 +00:00
e7794ae36c maint: update for linux 4.5
* maint/ioctls_sym.sh: Update workarounds for drm/*_drm.h files.
Add workarounds for xen/gntdev.h and net/nfc/nci_core.h files.
Update path of saa6588.h and exynos-fimc.h files.
2016-03-26 23:37:18 +00:00
9d91928320 Fix decoding of device numbers in mknod and mknodat syscalls
* mknod.c (decode_mknod): Treat device number argument as unsigned int.
* tests/mknod.c: Include <sys/sysmacros.h> or <sys/mkdev.h>
for definition of makedev macro.
(main): Add a check for a character special file.
2016-03-25 23:48:48 +00:00
b0e507f39d sparc64: fix decoding of mknod and mknodat syscalls for sparc personality
Remove remnants of solaris personality support in mknod parser
that resulted to sparc personality being decoded as old solaris
personality.  This complements commit v4.10-45-gdf4dd8b and fixes
commit v4.10-46-g588a90f.

* mknod.c (decode_mknod) [SPARC || SPARC64]: Remove.
2016-03-25 23:48:48 +00:00
6598026d6a tests: add openat.test
* tests/openat.c: New file.
* tests/openat.test: New test.
* tests/.gitignore: Add openat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add openat.test.
2016-03-25 19:40:12 +00:00
896479de76 tests: add renameat.test
* tests/renameat.c: New file.
* tests/renameat.test: New test.
* tests/.gitignore: Add renameat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add renameat.test.
2016-03-25 09:47:16 +00:00
e2975b61b3 tests: add faccessat.test
* tests/faccessat.c: New file.
* tests/faccessat.test: New test.
* tests/.gitignore: Add faccessat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add faccessat.test.
2016-03-25 09:47:15 +00:00
8346e63e43 tests: add creat.test
* tests/creat.c: New file.
* tests/creat.test: New test.
* tests/.gitignore: Add creat.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add creat.test.
2016-03-25 09:47:14 +00:00
0ebe67b780 tests: add mknod.test
* tests/mknod.c: New file.
* tests/mknod.test: New test.
* tests/.gitignore: Add mknod.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add mknod.test.
2016-03-25 09:47:13 +00:00
9a88371122 tests: add syslog.test
* tests/syslog.c: New file.
* tests/syslog.test: New test.
* tests/.gitignore: Add syslog.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add syslog.test.
2016-03-25 09:46:19 +00:00
c4e36dc14e tests/scm_rights-fd.test: fix pathname regex
Pathname containing >, }, or non-printable characters was resulting
in failing of the test.

* tests/scm_rights-fd.test: Fix pathname regex and simplify things.
2016-03-23 19:13:13 +00:00
e10ab4cdbc tests: add strace-r.test
* tests/strace-r.expected: New file.
* tests/strace-r.test: New test.
* tests/Makefile.am (MISC_TESTS): Add it.
(EXTRA_DIST): Add strace-r.expected.
2016-03-24 01:27:03 +00:00
534a39292a tests: add strace-ttt.test
* tests/strace-ttt.test: New test.
* tests/Makefile.am (MISC_TESTS): Add it.
2016-03-24 01:10:02 +00:00
e4d110df88 tests: add strace-tt.test
* tests/strace-tt.test: New test.
* tests/Makefile.am (MISC_TESTS): Add it.
2016-03-24 01:03:31 +00:00
ac2c43e8e9 tests: add strace-t.test
* tests/strace-t.test: New test.
* tests/Makefile.am (MISC_TESTS): Add it.
2016-03-24 00:59:32 +00:00
a08d03f08d tests: add strace-T.test
* tests/strace-T.expected: New file.
* tests/strace-T.test: New test.
* tests/Makefile.am (MISC_TESTS): Add it.
(EXTRA_DIST): Add strace-T.expected.
2016-03-24 00:31:23 +00:00
f7f7e601c3 tests: split out tests of specific decoders
Split TESTS into three groups: tests of specific decoders, libunwind
tests, and all other tests.

* tests/Makefile.am (TESTS): Move attach-f-p.test, attach-p-cmd.test,
bexecve.test, count-f.test, count.test, detach-running.test,
detach-sleeping.test, detach-stopped.test, dumpio.test,
filter-unavailable.test, fork-f.test, ksysent.test, opipe.test,
pc.test, qual_syscall.test, redirect.test, restart_syscall.test,
strace-f.test, and vfork-f.test to MISC_TESTS.
Move remaining tests except $(LIBUNWIND_TESTS) to DECODER_TESTS.
Add $(DECODER_TESTS) and $(MISC_TESTS).
2016-03-23 23:07:02 +00:00
39ab120626 tests: add getcwd.test
* tests/getcwd.c: New file.
* tests/getcwd.test: New test.
* tests/.gitignore: Add getcwd.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add getcwd.test.
2016-03-23 13:38:35 +00:00
17654da621 tests: add print_quoted_string function to libtests
* tests/tests.h (print_quoted_string): New prototype.
* tests/print_quoted_string.c: New file.
* tests/Makefile.am (libtests_a_SOURCES): Add it.
2016-03-23 13:34:15 +00:00
032a9a4358 tests: add xetpriority.test
* resource.c (SYS_FUNC(getpriority), SYS_FUNC(setpriority)): Print
the second syscall argument using %d format.
* tests/xetpriority.c: New file.
* tests/xetpriority.test: New test.
* tests/.gitignore: Add xetpriority.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add xetpriority.test.
2016-03-17 09:30:45 +00:00
b824f9872b tests: add flock.test
* tests/flock.c: New file.
* tests/flock.test: New test.
* tests/.gitignore: Add flock.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add flock.test.
2016-03-15 08:38:34 +00:00
c3fb92c0ae tests: add sched_xetscheduler.test
* tests/sched_xetscheduler.c: New file.
* tests/sched_xetscheduler.test: New test.
* tests/.gitignore: Add sched_xetscheduler.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add sched_xetscheduler.test.
2016-03-15 08:38:17 +00:00
ab26390287 alpha: fix SOCK_DIAG_BY_FAMILY tests
This complements commit v4.9-368-g301c65c.

* tests/netlink_inet_diag.c (check_responses): Align "buf"
on sizeof(long) boundary.
* tests/netlink_unix_diag.c (check_responses): Likewise.
2016-03-15 02:54:38 +00:00
aa7b60de3e Update EPOLL* constants
* xlat/epollevents.in: Add EPOLLWAKEUP and EPOLLEXCLUSIVE.
2016-03-14 21:53:19 +00:00
b389028e08 tests: add count-f.test
* tests/count-f.c: New file.
* tests/count-f.expected: Likewise.
* tests/count-f.test: New test.
* tests/.gitignore: Add count-f.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(count_f_LDADD): New variable.
(EXTRA_DIST): Add count-f.expected.
(TESTS): Add count-f.test.
2016-03-12 23:52:52 +00:00
5d6292c167 hppa: wire up copy_file_range syscall
* linux/hppa/syscallent.h [346]: Add copy_file_range entry.
2016-02-21 01:53:31 +00:00
fb2230665c tests: filter strace output in uname test
* tests/uname.test: Use uniq to filter strace output.
2016-03-11 02:43:02 +00:00
ea5c7b5515 tests: add sched_xetparam.test
* tests/sched_xetparam.c: New file.
* tests/sched_xetparam.test: New test.
* tests/.gitignore: Add sched_xetparam.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add sched_xetparam.test.
2016-03-10 09:12:24 +00:00
1eed594f30 tests: add sched_get_priority_mxx.test
* tests/sched_get_priority_mxx.c: New file.
* tests/sched_get_priority_mxx.test: New test.
* tests/.gitignore: Add sched_get_priority_mxx.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add sched_get_priority_mxx.test.
2016-03-10 09:12:23 +00:00
ab917ae5af tests: add dup.test, dup2.test, and dup3.test
* tests/dup.c: New file.
* tests/dup.test: New test.
* tests/dup2.c: New file.
* tests/dup2.test: New test.
* tests/dup3.c: New file.
* tests/dup3.test: New test.
* tests/.gitignore: Add dup, dup2, and dup3.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add dup.test, dup2.test, and dup3.test.
2016-03-10 02:41:31 +00:00
61ac8ee9b2 tests: add fchmod.test
* tests/fchmod.c: New file.
* tests/fchmod.test: New test.
* tests/.gitignore: Add fchmod.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add fchmod.test.
2016-03-10 10:29:32 +00:00
275d135ec2 tests: add acct.test
* tests/acct.c: New file.
* tests/acct.test: New test.
* tests/.gitignore: Add acct.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add acct.test.
2016-03-09 06:07:06 +00:00
1b5d1cbf63 tests: add chmod.test
* tests/chmod.c: New file.
* tests/chmod.test: New test.
* tests/.gitignore: Add chmod.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add chmod.test.
2016-03-07 23:13:28 +00:00
c811fa6115 Reduce memory usage while managing tcbs allocation.
* strace.c (init):  Remove initial memory allocation for tcbtab.
(expand_tcbtab): Do initial memory allocation when tcbtabsize == 0.

Signed-off-by: Nahim El Atmani <nahim+dev@naam.me>
Reviewed-By: Gabriel Laskar <gabriel@lse.epita.fr>
Reported-by: haris iqbal <haris.phnx@gmail.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2016-03-05 17:02:05 +00:00
eee3476844 tests: add umask.test
* tests/umask.c: New file.
* tests/umask.test: New test.
* tests/.gitignore: Add umask.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add umask.test.
2016-03-01 08:55:37 +00:00
a4128a75f5 tests: add rename.test
* tests/rename.c: New file.
* tests/rename.test: New test.
* tests/.gitignore: Add rename.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add rename.test.
2016-03-01 08:55:36 +00:00
68a58a301f tests: add uname.test
* tests/uname.c: New file.
* tests/uname.test: New test.
* tests/.gitignore: Add uname.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add uname.test.
2016-03-01 08:55:35 +00:00
0cb245a76c mips: wire up copy_file_range syscall
* linux/mips/syscallent-n32.h [6324]: Add copy_file_range entry.
* linux/mips/syscallent-n64.h [5320]: Likewise.
* linux/mips/syscallent-o32.h [4360]: Likewise.
2016-02-20 00:37:01 +00:00
9649ac1c8b tests: add rt_sigsuspend.test
* tests/rt_sigsuspend.c: New file.
* tests/rt_sigsuspend.test: New test.
* tests/.gitignore: Add rt_sigsuspend.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add rt_sigsuspend.test.
2016-02-19 16:10:25 +00:00
11d623f10a Print pid_t arguments of rt_sigqueueinfo and rt_tgsigqueueinfo as int
* signal.c (SYS_FUNC(rt_sigqueueinfo)): Print first syscall argument
using %d format.
(SYS_FUNC(rt_tgsigqueueinfo)): Print first and second syscall arguments
using %d format.
* tests/rt_tgsigqueueinfo.c: New file.
* tests/rt_tgsigqueueinfo.test: New test.
* tests/.gitignore: Add rt_tgsigqueueinfo.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add rt_tgsigqueueinfo.test.
2016-02-19 05:48:48 +00:00
2743efccce getrusage.test: fix build on x32
* tests/getrusage.c: Include <stdint.h>
(main): Print members of struct timeval using %ju format.
2016-02-19 03:39:59 +00:00
274fd468e1 getrusage.test: check that getrusage parser does not access extra memory
Place struct rusage at the end of an allocated memory page followed by
an inaccessible page.

* tests/getrusage.c (main): Use tail_alloc.
2016-02-19 03:39:59 +00:00
5204dbdbb1 tests: add getrusage.test
* tests/getrusage.c: New file.
* tests/getrusage.test: New test.
* tests/.gitignore: Add getrusage.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add getrusage.test.
2016-02-19 03:39:59 +00:00
49faae958a Print rt_sigtimedwait return value as a signal name
* signal.c (SYS_FUNC(rt_sigtimedwait)): Decode return value.
* tests/rt_sigtimedwait.c: New file.
* tests/rt_sigtimedwait.test: New test.
* tests/.gitignore: Add rt_sigtimedwait.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add rt_sigtimedwait.test.
2016-02-19 03:39:59 +00:00
f09b7c4984 tests: add rt_sigprocmask.test
* tests/rt_sigprocmask.c: New file.
* tests/rt_sigprocmask.test: New test.
* tests/.gitignore: Add rt_sigprocmask.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add rt_sigprocmask.test.
2016-02-19 01:44:33 +00:00
11656206ff Fix corner cases of rt_sigpending syscall decoder
* signal (print_sigset_addr_len_limit): New function, cloned from
print_sigset_addr_len with added minimal length argument.
Treat length less than minimal length or greater than NSIG/8 as invalid.
Do not align length to 4-byte boundary.  Align destination buffer
to 4-byte boundary and initialize it with zeroes so that subsequent
call to sprintsigmask_n will not access uninitialized data.
(print_sigset_addr_len): Turn into a wrapper around
print_sigset_addr_len_limit with current_wordsize
as a minimal length argument.
(SYS_FUNC(rt_sigpending)): Call print_sigset_addr_len_limit
instead of print_sigset_addr_len with 1 as a minimal length argument.
* tests/rt_sigpending.c: New file.
* tests/rt_sigpending.test: New test.
* tests/.gitignore: Add rt_sigpending.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add rt_sigpending.test.
2016-02-19 01:44:33 +00:00
10c61e3b22 Change unix_diag requests back to use full dump instead of exact match
Unfortunately, 64-bit linux kernel has a bug in matching inode numbers
greater than INT_MAX, so unix_diag exact match is not reliable.

This partially reverts commit 69bfc89770.

* socketutils.c (unix_send_query): Add NLM_F_DUMP to nlmsg_flags,
remove initialization of udiag_cookie.
* tests/netlink_unix_diag.c (send_query): Remove "inode" argument,
add NLM_F_DUMP to nlmsg_flags, remove initialization of udiag_ino
and udiag_cookie.
(check_responses): Remove "inode" argument and its use.
(main): Remove invocation of inode_of_sockfd and passing of listening
socket inode to send_query and check_responses.
2016-02-19 01:44:33 +00:00
f20304b6ae tests: avoid using cpp -dD
-dD is less portable across some peculiar preprocessors.

tests/Makefile.am (ksysent.h): Use cpp -dM instead of cpp -dD.
2016-02-19 01:44:33 +00:00
446e5b1780 tests: add poll.test
* tests/poll.c: New file.
* tests/poll.test: New test.
* tests/.gitignore: Add poll.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add poll.test.
2016-02-16 01:35:36 +00:00
9f612ffc49 Fix abbreviated output of poll and ppoll decoders
* poll.c (decode_poll_entering, decode_poll_exiting): Fix corner cases
of abbreviated output.
* tests/ppoll-v.expected: Update.
* tests/ppoll.expected: Update.
* tests/ppoll.test: Update.
2016-02-16 01:35:36 +00:00
8ef9809b63 Print unfetchable address in poll and ppoll decoders
* poll.c (decode_poll_entering): Replace umove call with
umove_or_printaddr.
(decode_poll_exiting): Print unfetchable address when umove call fails.
2016-02-16 01:35:36 +00:00
ddbede5d9c Print offsets in lseek and _llseek syscalls as signed integers
* lseek.c (SYS_FUNC(lseek)): Print offset using %lld format.
(SYS_FUNC(llseek)): Likewise.  Treat high and low components of offset
as unsigned long integers.
* tests/llseek.c (main): Check that negative offset is printed properly.
* tests/lseek.c (main): Likewise.
2016-02-16 01:35:36 +00:00
669f8cfb42 tests: add xetpgid.test
* tests/xetpgid.c: New file.
* tests/xetpgid.test: New test.
* tests/.gitignore: Add xetpgid.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add xetpgid.test.
2016-02-14 22:30:27 +00:00
7c05954cd8 tests: add alarm.test
* tests/alarm.c: New file.
* tests/alarm.test: New test.
* tests/.gitignore: Add alarm.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add alarm.test.
2016-02-14 22:30:27 +00:00
1ab6e25585 Replace printargs_lu and printargs_ld with printargs_u and printargs_d
* defs.h (printargs_lu): Rename to printargs_u.
(printargs_ld): Rename to printargs_d.
* syscall.c (printargs_lu): Rename to printargs_u.  Replace %lu with %u.
(printargs_ld): Rename to printargs_d.  Replace %ld with %d.
* linux/dummy.h (sys_getpgrp): Change to printargs.
(sys_alarm): Change to printargs_u.
(sys_getpgid, sys_getsid, sys_nice, sys_setpgid, sys_setpgrp,
sys_timer_delete, sys_timer_getoverrun): Change to printargs_d.
2016-02-14 22:30:27 +00:00
835127d469 Change printargs_lu and printargs_ld to return RVAL_DECODED
* syscall.c (printargs_lu, printargs_ld): Return RVAL_DECODED.
2016-02-14 22:30:27 +00:00
cff071a5ca redirect.test: fix the way how strace output is discarded
* tests/redirect.test: Disable tracing of syscalls, signals,
and exit status instead of redirecting strace output to /dev/null.
2016-02-14 00:59:42 +00:00
4774f8239b tests: extend coverage of struct iovec arrays
* tests/readv.c (main): Check decoding of empty, inaccessible,
and partially inaccessible iovec arrays.
* tests/readv.test: Update.
2016-02-14 00:36:38 +00:00
13870c5482 Implement dumping of vmsplice syscall
* syscall.c (dumpio): Add SEN_vmsplice.
* NEWS: Mention this.
* tests/vmsplice.c: New file.
* tests/vmsplice.test: New test.
* tests/.gitignore: Add vmsplice.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add vmsplice.test.
2016-02-14 00:36:38 +00:00
6c93254614 tests: add tee.test
* tests/tee.c: New file.
* tests/tee.test: New test.
* tests/.gitignore: Add tee.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add tee.test.
2016-02-14 00:36:38 +00:00
16a52b4b87 Fix printing of negative offsets in splice syscall
* io.c (SYS_FUNC(splice)): Use PRId64 instead of PRIu64 for printing
offsets.
* tests/splice.c: New file.
* tests/splice.test: New test.
* tests/.gitignore: Add splice.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add splice.test.
2016-02-14 00:36:38 +00:00
c1f99f569a Implement copy_file_range syscall decoding
* copy_file_range.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* linux/32/syscallent.h (copy_file_range): New entry.
* linux/64/syscallent.h: Likewise.
* linux/arm/syscallent.h: Likewise.
* linux/i386/syscallent.h: Likewise.
* linux/ia64/syscallent.h: Likewise.
* linux/m68k/syscallent.h: Likewise.
* linux/powerpc/syscallent.h: Likewise.
* linux/powerpc64/syscallent.h: Likewise.
* linux/s390/syscallent.h: Likewise.
* linux/s390x/syscallent.h: Likewise.
* linux/sparc/syscallent.h: Likewise.
* linux/sparc64/syscallent.h: Likewise.
* linux/x32/syscallent.h: Likewise.
* linux/x86_64/syscallent.h: Likewise.
* pathtrace.c (pathtrace_match): Add SEN_copy_file_range.
* NEWS: Mention new syscall parser.
* tests/copy_file_range.c: New file.
* tests/copy_file_range.test: New test.
* tests/.gitignore: Add copy_file_range.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add copy_file_range.test.
2016-02-14 00:36:38 +00:00
38437688ec Update fs *_MAGIC constants
* xlat/fsmagic.in: Add CGROUP2_SUPER_MAGIC and OVERLAYFS_SUPER_MAGIC.
2016-02-14 00:36:38 +00:00
b9c8e66f46 Update IPV6_* constants
* xlat/sockipv6options.in: Add IPV6_HDRINCL.
2016-02-14 00:36:38 +00:00
c257fbe24d Update SO_* constants
* xlat/sockoptions.in: Add SO_ATTACH_REUSEPORT_CBPF
and SO_ATTACH_REUSEPORT_EBPF.
2016-02-14 00:36:38 +00:00
12d5e7c8c3 Update MADV_* constants
* xlat/madvise_cmds.in: Add MAD_FREE.
2016-02-14 00:36:38 +00:00
84be84db7b tests: robustify execve and execveat tests
* tests/execve.c (main): Use one page gap between two mapped regions
for an address that is more likely to be not yet mapped.
* tests/execveat.c (main): Likewise.
2016-02-13 01:32:48 +00:00
b5faea4c73 tests: simplify execve test
* tests/execve.c (main): Simplify the test assuming that execve syscall
never returns ENOSYS.
2016-02-13 01:32:48 +00:00
4ab20405bc Fix numbers of syscall arguments in syscall tables
This semi-automatic change brings syscall tables in sync with kernel's
include/linux/syscalls.h file.

* linux/aarch64/syscallent.h (recv): Fix nargs.
* linux/alpha/syscallent.h (sigaltstack, init_module,
sched_getscheduler, settimeofday): Likewise.
* linux/arm/syscallent.h (signal, pciconfig_iobase, msgrcv, msgctl,
shmat, shmdt, shmctl, semtimedop, get_mempolicy, set_mempolicy,
timerfd_create): Likewise.
* linux/bfin/syscallent.h (signal, delete_module): Likewise.
* linux/hppa/syscallent.h (init_module, munlockall, sched_getscheduler,
io_cancel, set_tid_address, listxattr, llistxattr, flistxattr,
removexattr, lremovexattr, fremovexattr): Likewise.
* linux/i386/syscallent.h (signal, mmap): Likewise.
* linux/ia64/syscallent.h (init_module, readv, writev,
sched_getscheduler): Likewise.
* linux/m68k/syscallent.h (signal, request_key): Likewise.
* linux/microblaze/syscallent.h (signal, clone, fstatfs64, vmsplice):
Likewise.
* linux/mips/syscallent-n32.h (getpgid, statfs, fstatfs, init_module,
delete_module): Likewise.
* linux/mips/syscallent-n64.h (getpgid, statfs, fstatfs, init_module,
delete_module): Likewise.
* linux/mips/syscallent-o32.h (signal, statfs, fstatfs, ioperm,
fstatfs64): Likewise.
* linux/powerpc/syscallent.h (signal, spu_run, spu_create): Likewise.
* linux/powerpc64/syscallent.h (signal, pread64, pwrite64, readahead,
fadvise64, lookup_dcookie, spu_run, spu_create, sync_file_range2,
fallocate, preadv, pwritev, fanotify_mark): Likewise.
* linux/s390/syscallent.h (signal, mmap, lookup_dcookie, ipc): Likewise.
* linux/s390x/syscallent.h (signal, ipc): Likewise.
* linux/sh/syscallent.h (signal, ipc, munlockall, fstatfs64, vmsplice):
Likewise.
* linux/sh64/syscallent.h (signal, ipc, msgrcv, msgctl, shmat, shmdt,
shmctl, fstatfs64, vmsplice): Likewise.
* linux/sparc/syscallent.h (ptrace, dup, signal, ipc): Likewise.
* linux/sparc64/syscallent.h (ptrace, dup, signal, pread64, pwrite64,
readahead, lookup_dcookie, fadvise64, fadvise64_64, ipc,
sync_file_range, fallocate, preadv, pwritev, fanotify_mark): Likewise.
* linux/x32/syscallent.h (64:recvmsg): Likewise.
* linux/xtensa/syscallent.h (mremap, futex, reboot, init_module,
delete_module, request_key, getcpu, ioprio_set, ioprio_get, utimensat,
futimesat, fchmodat, faccessat): Likewise.
* NEWS: Mention this fix.
2016-02-13 00:57:00 +00:00
f3948fe494 s390: decode fadvise64 and fadvise64_64
* linux/s390/syscallent.h (fadvise64): Set sys_func.
(fadvise64_64): Set nargs and sys_func.
2016-02-13 00:57:00 +00:00
61066ea8e7 mips n64: use the most optimal parser for fadvise64 syscall
* linux/mips/syscallent-n64.h (fadvise64): Replace SEN(fadvise64_64)
with SEN(fadvise64).
2016-02-13 00:57:00 +00:00
1a1661813d ia64: decode fstatfs64 and statfs64
* linux/ia64/syscallent.h (fstatfs64, statfs64): Set nargs and sys_func.
2016-02-13 00:57:00 +00:00
a1e822870e alpha, ia64, mips, sh, sh64: fix the number of pipe syscall arguments
On alpha, ia64, mips, sh, sh64, sparc, and sparc64 architectures
pipe syscall does not take arguments.

* linux/alpha/syscallent.h (pipe): Change nargs to 0.
* linux/ia64/syscallent.h (pipe): Likewise.
* linux/mips/syscallent-n32.h (pipe): Likewise.
* linux/mips/syscallent-n64.h (pipe): Likewise.
* linux/mips/syscallent-o32.h (pipe): Likewise.
* linux/sh/syscallent.h (pipe): Likewise.
* linux/sh64/syscallent.h (pipe): Likewise.
2016-02-13 00:57:00 +00:00
9b38885803 alpha, ia64, mips, sh*, sparc*: fix error path decoding of pipe syscall
* net.c (do_pipe) [HAVE_GETRVAL2]: Remove.
Always call decode_pair_fd on exiting.
(SYS_FUNC(pipe)) [HAVE_GETRVAL2]: Call printpair_fd instead of do_pipe.
2016-02-13 00:57:00 +00:00
f9f04f74fc Fix pathtrace match for pipe2 syscall
* pathtrace.c (pathtrace_match): As pipe2 syscall has no descriptors
or paths to test, move SEN_pipe2 to the appropriate category.
2016-02-13 00:57:00 +00:00
3a630751eb avr32: wire up missing syscalls
* linux/avr32/syscallent.h [322..324]: Add userfaultfd, membarrier,
and mlock2 entries.
2016-02-13 00:57:00 +00:00
0aae167293 tests: check decoding of madvise, mlockall, mremap, and msync syscalls
* tests/mmap.c (main): Change output format from regexp to verbatim.
Add tests for madvise, mlockall, mremap, and msync syscalls.
* tests/mmap.test: Convert from match_grep to match_diff.
Add madvise, mlockall, mremap, and msync syscalls to syscall filter.
2016-02-12 02:35:54 +00:00
af618fa943 Simplify decoding of waitpid and wait4 syscalls
* wait.c (printwaitn): Replace "n" and "bitness" integer arguments
with a single print_rusage function pointer.  All callers updated.
2016-02-11 03:06:17 +00:00
591906cccb waitid: print pid argument as int
* wait.c (SYS_FUNC(waitid)): As the type of second syscall argument
in the kernel is pid_t, print it as int.
2016-02-11 03:06:17 +00:00
d3f17c642d waitid: always print 5th argument
* wait.c (SYS_FUNC(waitid)): Do not check for tcp->s_ent->nargs
as waitid syscall has 5 arguments.
2016-02-11 03:06:17 +00:00
ea21823d27 socketutils: add const qualifier to variables
* socketutils.c (cache_and_print_inode_details): Make "details"
parameter const.
(print_sockaddr_by_inode_cached): Make "e" variable const.
(inet_send_query): Make struct nlmsghdr and struct inet_diag_req_v2
members const.  Make "msg" variable const.
(inet_parse_response): Make "data" parameter and diag_msg variable const.
(receive_responses): Make "h" and "rc" variables const.
(unix_send_query): Make struct nlmsghdr and struct unix_diag_req
members const.  Make "msg" variable const.
(unix_print): Make all parameters const.
(print_sockaddr_by_inode): Make proto_name parameter const.
2016-02-11 03:06:17 +00:00
bcf5975a3e print_sockaddr_by_inode: cleanup protocol lookup
* socketutils.c (tcp_v4_print, udp_v4_print, tcp_v6_print,
udp_v6_print): New functions.
(print_sockaddr_by_inode): Make "protocols" array static, replace
"family" and "protocol" members with "print" in its underlying
structure.  Iterate through protocols array when the protocol name
is specified.
2016-02-11 03:06:17 +00:00
6204654329 tests: check that -f -p attaches to threads properly
Check that -f -p attaches and follows all threads of the given pid.

* tests/attach-f-p.c: New file.
* tests/attach-f-p.test: New test.
* tests/.gitignore: Add attach-f-p.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(attach_f_p_LDADD): New variable.
(TESTS): Add attach-f-p.test.
2016-02-09 05:08:00 +00:00
6ca4c92c1b Introduce libstrace.a for potentially conditional compilation units
Some files are used conditionally depending on architecture and
configuration.  Create a library for the purpose of keeping such
compilation units.

* Makefile.am (strace_LDADD, noinst_LIBRARIES): Add libstrace.a.
(libstrace_a_CPPFLAGS): New variable, set to $(strace_CPPFLAGS).
(libstrace_a_CFLAGS): New variable, set to $(strace_CFLAGS).
(libstrace_a_SOURCES): New variable, set to upeek.c.
* util.c (upeek): Move ...
* upeek.c: ... here.
2016-02-09 05:08:00 +00:00
0acd8d0ec3 travis-ci: pass more gcov arguments to codecov 2016-02-08 18:35:16 +00:00
b1b692eb23 tests: extend coverage of struct itimerspec
* tests/timer_xettime.c (main): Check decoding of NULL struct itimerspec
pointer.
2016-02-08 18:28:36 +00:00
9ee77b9e65 tests: extend coverage of utimensat syscall
* tests/utimensat.c (main): Check decoding of NULL struct timespec
pointer.
2016-02-08 18:27:59 +00:00
c736b456ad tests: extend coverage of time syscall
* tests/time.c (main): Check decoding of NULL time_t pointer.
2016-02-08 18:27:17 +00:00
595fc10f11 tests: extend coverage of struct sigevent
* tests/timer_create.c (main): Check decoding of NULL struct sigevent
pointer.  Check decoding of invalid sigev_notify value.
2016-02-08 18:26:46 +00:00
23168c1e54 tests: extend coverage of execve and execveat syscalls
Check decoding of inaccessible or partially inaccessible arrays.

* tests/execve-v.c: New file.
* tests/execveat-v.c: Likewise.
* tests/execve-v.test: New test.
* tests/execveat-v.test: Likewise.
* tests/execve.c: Rewrite.
* tests/execveat.c: Likewise.
* tests/execve.test: Likewise.
* tests/execveat.test: Likewise.
* tests/execve.expected: Remove.
* tests/execve-v.expected: Likewise.
* tests/execveat.expected: Likewise.
* tests/execveat-v.expected: Likewise.
* tests/.gitignore: Add execve-v and execveat-v.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add execve-v.test and execveat-v.test.
(EXTRA_DIST): Remove execve.expected, execve-v.expected,
execveat.expected, and execveat-v.expected.
2016-02-08 18:25:33 +00:00
3c00e63b03 Fix decoding of execve and execveat syscalls with invalid input
* execve.c (printargv): Fix decoding of inaccessible or partially
inaccessible array.
(printargc): Diagnose inaccessible or partially inaccessible array.
(decode_execve, SYS_FUNC(execv)): Update printargv and printargc callers.
2016-02-08 18:21:31 +00:00
a59fcec4c9 tests: extend coverage of capget syscall
* tests/caps.c (main): Check decoding of inaccessible cap_user_header_t
and/or cap_user_data_t.
* tests/caps.awk: Update match patterns.
* tests/caps.test: Update.
2016-02-08 18:21:10 +00:00
48d97b6a83 tests: extend coverage of sched_getaffinity syscall
* tests/sched_xetaffinity.c (main): Check decoding of pointer
to inaccessible cpu_set_t.
2016-02-08 18:18:51 +00:00
f2e6f3d3c4 tests: extend coverage of utime syscall
* tests/utime.c (main): Check decoding of NULL struct utimbuf pointer.
Check decoding of struct utimbuf located at the end of page boundary.
* tests/utime.test: Update.
2016-02-08 18:18:05 +00:00
b5a7011d71 tests: extend coverage of sysinfo syscall
* tests/sysinfo.c (main): Check decoding of NULL struct sysinfo pointer.
Check decoding of struct sysinfo located at the end of page boundary.
* tests/sysinfo.test: Update.
2016-02-08 18:17:28 +00:00
7fce7c0332 tests: extend coverage of adjtimex syscall
* tests/adjtimex.c (main): Check decoding of NULL struct timex pointer.
Check decoding of struct timex located at the end of page boundary.
* tests/adjtimex.test: Update.
2016-02-08 18:16:27 +00:00
a88c72ef66 tests: check that strace does not retain stdin and stdout descriptors
* tests/redirect.test: New test.
* tests/Makefile.am (TESTS): Add it.
2016-02-08 17:51:18 +00:00
6aedd42206 Create a dummy pipe descriptor instead of opening /dev/null
* strace.c (open_dev_null): Rename to open_dummy_desc.  All callers
changed.  Create a pipe and return its first descriptor instead of
opening /dev/null.
2016-02-08 17:51:18 +00:00
0736d4e1a3 If stdin/stdout aren't open on startup, open them to /dev/null
Otherwise, -oLOGFILE may end up using one of them. This conflicts
with the previous change, which closes stdin/out in strace.

* strace.c (init): If fcntl(F_GETFD) fails on stdin or stdout,
sanitize them: open /dev/null and dup it until fds 0,1,2
are all used up.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2016-02-08 18:17:38 +01:00
c9f85b3876 Close stdin/out after child is forked
Testcase:

{ sleep 1; yes | head -n99999; } | strace -o/dev/null sh -c 'exec <&-; sleep 9'

The writer (head) will be able to perform writes to write end of the pipe.
With strace call removed, head will immediately get SIGPIPE.

This change fixes this: now writer immediately gets SIGPIPE with strace too.

* strace.c (startup_child): Close stdin/out and reopen them to /dev/null.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2016-02-08 18:17:38 +01:00
7469e252fa tests: add opipe.test
Check that -o |pipe_command works.  In particular, check that
strace waits for completion of piped command.

* tests/opipe.test: New test.
* tests/Makefile.am (TESTS): Add it.
2016-02-05 14:58:41 +00:00
320fb41682 strace-graph: print the pid in the graph
* strace-graph: Prefix each command with its pid.
2016-02-05 00:41:23 +00:00
7e0ba4bdcc strace-graph: cope with clone immediately followed by exit
* strace-graph: A clone() followed by exit() with no intervening fork
or execve resulted in the new pid having no seq key.  That breaks when
trying to use seq as an array reference.  Ensure that clone populates
the new pid with an empty seq entry.
2016-02-05 00:41:23 +00:00
ef445b5daf strace-graph: handle recent strace output
* strace-graph: Fix regex for --SIG.  Ignore '+++ exited with <n> +++'
lines.  Handle exit_group syscall as well as _exit.
2016-02-05 00:41:23 +00:00
dbc1ffb2a4 strace-graph: handle strace -T
* strace-graph: Ignore extra ' <time.spent>' field added by strace -T.
2016-02-05 00:41:23 +00:00
a0bc25f085 strace-graph: use "strict" and "warnings" pragmas
* strace-graph: Set "use strict" and "use warnings" options.  Fix errors
detected by strict/warnings.  $result is really a string, it can be "-1"
followed by an error text.
2016-02-05 00:41:23 +00:00
26ed70b252 Add README.md file with links to build status and test coverage 2016-02-04 18:20:14 +00:00
5be488c3a5 travis-ci: prepare and submit test coverage report 2016-02-04 17:04:13 +00:00
d8a81dfa40 tests: extend readlink and readlinkat coverage
* tests/readlink.c (PREFIX, TARGET, LINKPATH): New macros.
(main): Allocate memory for string and buffer passed to the syscall
being tested using tail_alloc mechanism.  Create and cleanup test
symlink.  Test syscall error path output.  Print hexquoted strings
using hexquote_strndup.
* tests/readlinkat.c: Likewise.
* tests/readlink.test: Remove creation and cleanup of test symlinks.
2016-02-04 03:36:25 +00:00
7637b1d9e8 tests: add hexquote_strndup function to libtests
* tests/tests.h (hexquote_strndup): New prototype.
* tests/hexquote_strndup.c: New file.
* tests/Makefile.am (libtests_a_SOURCES): Add it.
2016-02-04 03:36:25 +00:00
f2eb27c73e readlinkat.test: use readlink.test
* tests/readlink.test (syscall): Initialize from $0.
* tests/readlinkat.test: Source readlink.test.
2016-02-04 03:36:25 +00:00
cba67108a0 Add configure --enable-code-coverage option
* m4/ax_code_coverage.m4: New file.
* configure.ac: Use AX_CODE_COVERAGE.
* Makefile.am: Add @CODE_COVERAGE_RULES@.
(CODE_COVERAGE_LCOV_OPTIONS, CODE_COVERAGE_GENHTML_OPTIONS,
CODE_COVERAGE_IGNORE_PATTERN): New variables.
(strace_CPPFLAGS): Add $(CODE_COVERAGE_CPPFLAGS).
(strace_CFLAGS): Add $(CODE_COVERAGE_CFLAGS).
(strace_LDADD): Add $(CODE_COVERAGE_LDFLAGS).
* .gitignore: Add *.gcda and *.gcno.

Signed-off-by: Gabriel Laskar <gabriel@lse.epita.fr>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2016-02-04 03:36:11 +00:00
71d3aa0cea Makefile.am: introduce strace_CFLAGS and derivatives
* Makefile.am (strace_CFLAGS): New variable, set to $(AM_CFLAGS).
(libmpers_CFLAGS): New variable, set to $(strace_CFLAGS).
(libmpers_m32_a_CFLAGS, libmpers_mx32_a_CFLAGS): New variables,
set to $(libmpers_CFLAGS).
2016-02-03 19:24:23 +00:00
fafa7dc2f3 Makefile.am: use strace_CPPFLAGS consistently
* Makefile.am (libmpers_CPPFLAGS): Replace $(AM_CPPFLAGS)
with $(strace_CPPFLAGS).
2016-02-03 19:18:28 +00:00
751fcb8f8a tests: replace net-fd.test with net-y-unix.test
Unlike the former test that was based on match_grep,
the new one uses match_diff and does more rigorous testing.

* tests/net-y-unix.c: New file.
* tests/net-y-unix.test: New test.
* tests/net-fd.test: Remove.
* tests/net-fd.expected: Remove.
* tests/.gitignore: Add net-y-unix.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Replace net-fd.test with net-y-unix.test.
(net-fd.log): Remove.
(EXTRA_DIST): Remove net-fd.expected.
2016-02-03 16:09:34 +00:00
3c17d1b5e1 Implement caching of print_sockaddr_by_inode
As -yy parser, compared to -y, needs to do at least 5 extra syscalls
(getxattr, socket, sendmsg, recvmsg, close) to print socket details,
caching results of netlink conversations between strace and kernel
noticeably reduces amount of system time spent by strace.

The caching is safe since sockets do not change their addresses after
successful bind or connect syscall.

* defs.h (string_quote, print_sockaddr_by_inode_cached): New prototypes.
* socketutils.c (cache_entry): New type.
(CACHE_SIZE, CACHE_MASK): New macros.
(cache): New static array.
(cache_and_print_inode_details): New static function.
(print_sockaddr_by_inode_cached): New function.
(inet_parse_response, unix_parse_response): Use
cache_and_print_inode_details.
* util.c (printfd): Use string_quote and print_sockaddr_by_inode_cached.
(string_quote): Remove static qualifier.
* NEWS: Mention this improvement.
* tests/unix-yy.c (main): Update.
2016-02-03 12:43:22 +00:00
69bfc89770 Change unix_diag requests to use exact match instead of full dump
* socketutils.c (unix_send_query): Remove NLM_F_DUMP from nlmsg_flags,
initialize udiag_cookie.
* tests/netlink_unix_diag.c (send_query): Remove "family" and "proto"
arguments, add "inode" argument, remove NLM_F_DUMP from nlmsg_flags,
initialize udiag_ino and udiag_cookie.
(check_responses): Add "inode" argument, check inode match.
(main): Pass listening socket inode to send_query and check_responses.
2016-02-03 12:43:22 +00:00
3c86e0ea5d Robustify netlink response parsers
* socketutils.c (inet_parse_response, unix_parse_response): Change
return type from bool to int, return -1 on all parse errors except
inode mismatch.
(receive_responses): Stop on the first nlmsg_type that is not
SOCK_DIAG_BY_FAMILY, also stop when the parser returns -1.
* tests/netlink_inet_diag.c (check_responses): Stop on short messages,
on first nlmsg_type that is not SOCK_DIAG_BY_FAMILY, print more verbose
diagnostics for NLMSG_ERROR.
* tests/netlink_unix_diag.c (check_responses): Likewise.
2016-02-03 12:43:17 +00:00
cc09ba1a84 inet_parse_response: add a safety check
* socketutils.c (inet_parse_response): Check that netlink message
is large enough to contain a inet_diag_msg structure.
2016-02-03 12:42:20 +00:00
2215c3e352 receive_responses: avoid potential hangup
* socketutils.c (receive_responses): Pass MSG_DONTWAIT to recvmsg after
the first recvmsg call to avoid potential hangup.
2016-02-03 12:42:20 +00:00
9d15ec7b57 tests: replace net-yy.test with net-yy-inet.test
Unlike the former test that was based on match_awk,
the new one uses match_diff and does more rigorous testing.

* tests/net-yy-inet.c: New file.
* tests/net-yy-inet.test: New test.
* tests/net-yy.test: Remove.
* tests/net-yy-accept.awk: Remove.
* tests/net-yy-connect.awk: Remove.
* tests/inet-accept-connect-send-recv.c: Remove.
* tests/.gitignore: Replace inet-accept-connect-send-recv
with net-yy-inet.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Replace net-yy.test with net-yy-inet.test.
(EXTRA_DIST): Remove net-yy-accept.awk and net-yy-connect.awk.
2016-02-03 12:42:01 +00:00
6124cd9932 tests: replace unix-yy.test with net-yy-unix.test
Unlike the former test that was based on match_awk,
the new one uses match_diff and does more rigorous testing.

* tests/net-yy-unix.c: New file.
* tests/net-yy-unix.test: New test.
* tests/unix-yy.test: Remove.
* tests/unix-yy-accept.awk: Remove.
* tests/unix-yy-connect.awk: Remove.
* tests/.gitignore: Add net-yy-unix.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Replace unix-yy.test with net-yy-unix.test.
(EXTRA_DIST): Remove unix-yy-accept.awk and unix-yy-connect.awk.
2016-02-03 12:39:06 +00:00
e364920b67 tests: add inode_of_sockfd function to libtests
* tests/tests.h (inode_of_sockfd): New prototype.
* tests/inode_of_sockfd.c: New file.
* tests/Makefile.am (libtests_a_SOURCES): Add it.
2016-02-02 00:24:48 +00:00
3d0f55e419 unix_parse_response: add a safety check
* socketutils.c (unix_parse_response): Check that netlink message
is large enough to contain a unix_diag_msg structure.
2016-02-02 00:24:46 +00:00
dfea1da0e6 Fixed decoding of mincore syscall's last argument
* mem.c (SYS_FUNC(mincore)): Print only those bytes of the vector
that were written by the kernel.
* NEWS: Mention this fix.
* tests/mincore.c: New file.
* tests/mincore.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add mincore.
(TESTS): Add mincore.test.
* tests/.gitignore: Add mincore.
2016-01-29 02:39:40 +00:00
ea8b8e3152 Move fallback -yy socket print from printfd to print_sockaddr_by_inode
* util.c (printfd): In -yy mode, move fallback print of proto:[inode] ...
* socketutils.c (to print_sockaddr_by_inode): ... here.
2016-01-23 16:35:02 +00:00
fa8c286d50 Implement simultaneous use of -p option and tracing of a command
* strace.c (init): Allow -p option along with a command.
(startup_child): In -D mode, record the parent of the tracer process
as strace_child.
(startup_attach): Save trace_tracer_pid before -D mode fork.
When tracing a command in -f mode, do not check for the command's
threads as it has no threads at this moment.
Never attach to the tracer process.
In -D mode, never attach to the parent of the tracer process,
terminate that process only once at the end of startup_attach,
and reset strace_child.
* strace.1: Document that -p option can be used along with tracing
of a command.
* NEWS: Mention it.
* tests/attach-p-cmd-cmd.c: New file.
* tests/attach-p-cmd-p.c: Likewise.
* tests/attach-p-cmd.test: New test.
* tests/.gitignore: Add attach-p-cmd-cmd and attach-p-cmd-p.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(TESTS): Add attach-p-cmd.test.

This fixes Debian bug #549942.
2016-01-22 19:37:11 +00:00
38721432de strace.1: fix format of -P description
* strace.1 (-P): Write trailing using regular font.
2016-01-22 14:55:56 +00:00
a8eb52f952 tests: use local nanosleep based sleep utility replacement
* tests/sleep.c: New file.
* tests/.gitignore: Add sleep.
* tests/Makefile.am (check_PROGRAMS): Likewise.
* tests/count.test: Use it instead of system sleep utility.
2016-01-21 23:52:39 +00:00
3d54c92691 tests: add error_msg_and_fail function to libtests
* tests/tests.h (error_msg_and_fail): New prototype.
* tests/error_msg.c (error_msg_and_fail): New function.
2016-01-21 23:46:43 +00:00
d44707d889 Fix dumping of recvmmsg syscall in case of short read
* net.c (dumpiov_in_mmsghdr): Call dumpiov_upto instead of dumpiov,
pass data size limit to dumpiov_upto.
* NEWS: Mention this fix.
* tests/mmsg.c (main): Update.
2016-01-20 17:36:41 +00:00
93c9d1cdbd Fix dumping of recvmsg syscall in case of short read
* defs.h (dumpiov_in_msghdr): Add unsigned long argument.
* net.c (dumpiov_in_msghdr): Add data_size argument.  Call dumpiov_upto
instead of dumpiov, pass data_size to dumpiov_upto.
* syscall.c (dumpio): Pass data size limit to dumpiov_in_msghdr.
* NEWS: Mention this fix.
* tests/recvmsg.c: New file.
* tests/recvmsg.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add recvmsg.
(TESTS): Add recvmsg.test.
* tests/.gitignore: Add recvmsg.
2016-01-20 17:35:27 +00:00
05a0af6d60 Fix decoding and dumping of readv syscall in case of short read
* defs.h (dumpiov_upto): New prototype.
(dumpiov): Change to a wrapper around dumpiov_upto.
* util.c (dumpiov): Rename to dumpiov_upto, add and check data_size
argument.
* io.c (SYS_FUNC(readv)): Call tprint_iov_upto instead
of tprint_iov and specify syscall return value as a data size limit.
* syscall.c (dumpio): In case of SEN_readv, call dumpiov_upto instead
of dumpiov and specify syscall return value as a data size limit.
* NEWS: Mention this fix.
* tests/readv.c: New file.
* tests/readv.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add readv.
(TESTS): Add readv.test.
* tests/.gitignore: Add readv.
2016-01-20 15:31:26 +00:00
a5417308e4 tests/tests.h: add ARRAY_SIZE and LENGTH_OF macros
* tests/tests.h (ARRAY_SIZE, LENGTH_OF): New macros.
* tests/aio.c (ARRAY_SIZE): Remove.
* tests/mmsg.c (LENGTH_OF): Remove.
2016-01-20 15:24:45 +00:00
590b240444 tests: add hexdump_strdup function to libtests
* tests/tests.h (hexdump_strdup): New prototype.
* tests/hexdump_strdup.c: New file.
* tests/Makefile.am (libtests_a_SOURCES): Add it.
2016-01-20 15:24:41 +00:00
536a0353dd tests: add tprintf function to libtests
* tests/tests.h (tprintf): New prototype.
* tests/tprintf.c: New file.
* tests/Makefile.am (libtests_a_SOURCES): Add it.
* tests/mmsg.c: Use tprintf.
2016-01-20 15:17:28 +00:00
ed227111a4 quotactl: add Q_XGETQSTATV command decoding
* quota.c (fs_qfilestatv, fs_quota_statv): New structures.
(decode_cmd_data): Handle Q_XGETQSTATV case.
2016-01-19 23:48:36 +00:00
60d4892866 quotactl: add decoding of if_dqinfo.dqi_flags constants
* xlat/if_dqinfo_flags.in: New file.
* quota.c: Include "xlat/if_dqinfo_flags.h".
(decode_cmd_data): Print struct if_dqinfo.dqi_flags using printflags.
2016-01-19 02:10:23 +00:00
c02fd6109a quotactl: consistenly decode all write and unknown commands on entering
* quota.c (decode_cmd_data): Change return type to int.
Return 0 on entering Q_GETQUOTA, Q_V1_GETQUOTA, Q_V2_GETQUOTA,
Q_XGETQUOTA, Q_GETFMT, Q_GETINFO, Q_V2_GETINFO, Q_V1_GETSTATS,
Q_V2_GETSTATS, and Q_XGETQSTAT commands, return RVAL_DECODED
for any other command.
(SYS_FUNC(quotactl)): On entering, print third argument of any command.
For any command except Q_QUOTAON and Q_V1_QUOTAON, call decode_cmd_data
and forward its return value.
2016-01-19 02:00:20 +00:00
b176920bb7 quotactl: fix Q_QUOTAON command decoding
* quota.c (SYS_FUNC(quotactl)): Print Q_QUOTAON 4th argument as a path.
2016-01-19 01:43:24 +00:00
7258d27e9c quotactl: print third argument as unsigned int
* quota.c (SYS_FUNC(quotactl)): Consistently print the third
argument using "%u" format.
2016-01-19 01:43:24 +00:00
7ea48d6ff8 quotactl: fix Q_XQUOTAOFF command decoding
* quota.c (decode_cmd_data): Print xfs quota flags argument.
2016-01-19 01:43:17 +00:00
6a9ac9636a quotactl: fix Q_GETFMT and Q_XQUOTAON commands decoding
* quota.c (decode_cmd_data): As quota format value and xfs quota flags
are in-memory constants, print it like an array of one element instead
of a structure.
2016-01-19 01:42:08 +00:00
2d544968fe Update quotactl constants
* xlat/quota_formats.in: Add QFMT_OCFS2 and QFMT_VFS_V1.
* xlat/quotacmds.in: Add Q_XGETQSTATV.
* xlat/quotatypes.in: Add PRJQUOTA.
* xlat/xfs_quota_flags.in: Add FS_QUOTA_PDQ_ACCT and FS_QUOTA_PDQ_ENFD.
2016-01-17 22:30:54 +00:00
0894194648 Replace u_int{8,16,32,64} with uint{8,16,32,64}
* util.c: Replace u_int{32,64} with uint{32,64}.
* quota.c: Replace u_int{8,16,32,64} with uint{8,16,32,64}.
2016-01-19 00:28:38 +00:00
2105a9737c Move definitions of quotactl constants to xlat files
* quota.c (Q_*): Move to xlat/quotacmds.in.
(USRQUOTA, GRPQUOTA): Move to xlat/quotatypes.in.
(QFMT_VFS_OLD, QFMT_VFS_V0): Move to xlat/quota_formats.in.
(XFS_QUOTA_*): Move to xlat/xfs_quota_flags.in.
(XFS_*_QUOTA): Move to xlat/xfs_dqblk_flags.in.
(QIF_*): Move to xlat/if_dqblk_valid.in.
(IIF_*): Move to xlat/if_dqinfo_valid.in.
2016-01-19 00:06:09 +00:00
972018f2ea llseek.test: robustify against libcs invoking _llseek syscall on their own
* tests/llseek.test: Filter out _llseek calls made with non-negative
descriptor arguments.
2016-01-15 00:10:00 +00:00
8e37cffaa8 lseek.test: robustify against libcs invoking lseek syscall on their own
* tests/lseek.test: Filter out lseek calls made with non-negative
descriptor arguments.
2016-01-15 00:09:48 +00:00
19d10f8965 mmsg.test: fix regression introduced by commit v4.11-138-g6e815ce
This fixes the test on platforms where both __NR_sendmmsg and
HAVE_SENDMMSG are defined but the former is not implemented by the
kernel and the second is implemented as an indirect syscall.

* tests/mmsg.c (LENGTH_OF): New macro.
(send_mmsg, recv_mmsg): Print expected output in case of ENOSYS.
(main): Redirect stdout to a new descriptor.  Use LENGTH_OF.
Print expected output.
* tests/mmsg.test: Update.
* tests/mmsg.expected: Remove.
* tests/Makefile.am (EXTRA_DIST): Remove mmsg.expected.
2016-01-14 00:06:20 +00:00
68f7a66dc9 aio.test: check memory access by aio decoders
* tests/aio.c (main): Place all objects passed to io_* syscalls
at the end of memory pages followed by inaccessible pages.
2016-01-13 22:06:18 +00:00
1763fa5f62 s390, s390x: fix printing of syscalls unknown to the kernel
On s390/s390x, syscalls with NR up to 255 can be implemented
directly using "svc NR", for NR >= 256 "svc 0" with %r1=NR is used.
The latter method is allowed for NR < 256, too.

When the syscall number specified directly or indirectly is recognized
by the kernel, i.e. it is less than its NR_syscalls value, it is stored
in %r2 and is available to arch_get_scno via s390_regset.gprs[2].
For syscall numbers >= NR_syscalls this register is set to 0,
but %r1 remains unchanged and could be used by arch_get_scno
via s390_regset.gprs[1] to decide what the syscall number is.

* linux/s390/get_scno.c (arch_get_scno): If s390_regset.gprs[2] is zero,
take syscall number from s390_regset.gprs[1].
* NEWS: Mention this fix.

This fixes Debian bug #485979 and Fedora bug #1298294.
2016-01-13 21:27:48 +00:00
e2136d4b89 s390, s390x: print all syscall arguments for syscall number 0
* linux/s390/syscallent.h [0]: Set nargs to MA.
* linux/s390x/syscallent.h: Likewise.
2016-01-13 21:26:26 +00:00
606fcd0878 mips o32: alias sys_syscall to printargs
* linux/dummy.h (sys_syscall): Alias to printargs.
* syscall.c [LINUX_MIPSO32] (SYS_FUNC(syscall)): Remove.
2016-01-13 21:26:26 +00:00
b227293f1c travis-ci: update build matrix
Add clang-3.6/x86_64, clang-3.6/x86, and musl-gcc/x86_64 to the matrix.

* .travis.yml (compiler): Add gcc, clang-3.6, and musl-gcc.
(env): Add matrix, remove global ENABLE_GCC_WERROR.
(matrix): Add exclude, remove include.
* travis-ci.sh: Add support for clang and musl-gcc.
Use --enable-gcc-Werror for gcc build unconditionally.
2016-01-13 12:12:33 +00:00
cc902e3272 mpers.awk: add support for DWARF files generated by clang
* mpers.awk: Define default_pointer_size.  Initialize byte_size
for DW_TAG_pointer_type to default_pointer_size.  Set parent
for DW_TAG_member only.  Handle DW_AT_count as an alternative
to DW_AT_upper_bound.
2016-01-13 02:38:59 +00:00
1ef7aa65ab configure.ac: reorder some statements for better readability
* configure.ac: Sort and group together AC_PROG_*, AC_C_*, AC_TYPE_*,
AC_HEADER_*, AC_CHECK_FUNCS, AC_CHECK_TYPES, AC_CHECK_MEMBERS,
and AC_CHECK_HEADERS.
2016-01-12 21:48:04 +00:00
3fdcdd47c6 scm_rights-fd.test: rewrite without fork
* tests/scm_rights.c (main): Rewrite without fork.
Place all objects passed to sendmsg and recvmsg at the end
of memory pages followed by inaccessible pages.
* tests/scm_rights-fd.test: Update.
2016-01-12 16:06:58 +00:00
55f3c8901d tests: fix clang "duplicate 'const' declaration specifier" warnings
* tests/ksysent.c (pstr_t): Remove second const specifier.
* tests/mmsg.c (main): Remove second const specifier from one[], two[],
and three[].
2016-01-12 05:06:10 +00:00
b6edea5ce7 tests/times.c: fix clang compilation warning
* tests/times.c (main): Initialize dummy variable.
2016-01-12 05:06:10 +00:00
eb4649a0dc tests/mmsg.c: fix build on rhel6/ppc
There are weird platforms that define __NR_sendmmsg but at the same time
do not define __NR_recvmmsg.  Add a workaround for them.

* configure.ac (AC_CHECK_FUNCS): Add recvmmsg.
* tests/mmsg.c: Check for __NR_recvmmsg || HAVE_RECVMMSG.
2016-01-12 05:06:10 +00:00
8493dcf6f7 s390: fix sigreturn decoding on recent kernels
Linux kernel commit v4.3-rc1-50-g8d4bd0e corrected uc_sigmask
of the compat signal frame, so remove the old workaround.

* linux/s390/arch_sigreturn.c (arch_sigreturn) [S390]: Remove.
2016-01-12 03:07:39 +00:00
65f8d39278 Update PTRACE_* constants
* ptrace.h (PTRACE_SECCOMP_GET_FILTER): Define.
* xlat/ptrace_cmds.in: Add PTRACE_SECCOMP_GET_FILTER.
2016-01-12 03:07:39 +00:00
e714b87064 Fix struct sigevent decoding for musl
Do not rely on "struct sigevent.__pad" being located at the same address
as "struct sigevent.sigev_notify_thread_id", it's not the case with musl
libc.  Do not rely on struct sigevent definition at all to access
sigev_notify_thread_id.

* configure.ac (AC_CHECK_MEMBERS): Remove struct sigevent._sigev_un._pad
and struct sigevent.__pad.
* sigevent.h: New file.
* Makefile.am (strace_SOURCES): Add it.
* print_sigevent.c: Include it.
* print_sigevent.c (struct_sigevent): Remove.
(print_sigevent): Update all struct_sigevent users.
* tests/timer_create.c: Include "sigevent.h".
(main): Use struct_sigevent instead of struct sigevent,
all struct sigevent clients changed.
2016-01-12 03:07:39 +00:00
2a6ac9473c syscall.c: include <signal.h>
All users of NSIG macro must include <signal.h>.
This complements commit v4.10-184-g0e946ab.

* syscall.c: Include <signal.h>.
2016-01-12 03:07:39 +00:00
07572c68dd signal.c: fix musl libc compilation warning
musl libc defines SIGRTMAX to a function that returns signed int,
which obviously makes gcc -Wsign-compare unhappy.

* signal.c (signame): Cast ASM_SIGRTMAX to unsigned int.
2016-01-12 03:07:39 +00:00
7bbf8b54cd tests: fix TEST_SYSCALL_{NR,STR} and STRUCT_STAT_STR macros for musl
The contents of TEST_SYSCALL_NAME and STRUCT_STAT macros was subject
to macro expansion when used in definitions of TEST_SYSCALL_NR,
TEST_SYSCALL_STR, and STRUCT_STAT_STR macros.

As some libcs, e.g. musl libc, define lfs64 names as macros
(stat64 as stat, lstat64 as lstat, etc.), this might result to incorrect
expansion of TEST_SYSCALL_NR, TEST_SYSCALL_STR, and STRUCT_STAT_STR
macros.  To avoid this problem, define these macros directly and remove
TEST_SYSCALL_NAME macro.

* tests/_newselect.c (TEST_SYSCALL_NAME): Remove.
(TEST_SYSCALL_NR, TEST_SYSCALL_STR): New macros.
* tests/fcntl.c: Likewise.
* tests/fcntl64.c: Likewise.
* tests/fstat.c: Likewise.
* tests/fstatat64.c: Likewise.
* tests/lstat.c: Likewise.
* tests/newfstatat.c: Likewise.
* tests/select.c: Likewise.
* tests/stat.c: Likewise.
* tests/fstat64.c (TEST_SYSCALL_NAME): Remove.
(TEST_SYSCALL_NR, TEST_SYSCALL_STR, STRUCT_STAT_STR): New macros.
* tests/lstat64.c: Likewise.
* tests/stat64.c: Likewise.
* tests/fstatx.c (TEST_SYSCALL_NR, nrify, nrify_): Remove.
* tests/lstatx.c: Likewise.
* tests/struct_flock.c (TEST_SYSCALL_NR, TEST_SYSCALL_STR, nrify,
nrify_, stringify, stringify_): Remove.
* tests/xselect.c: Likewise.
* tests/xstatx.c: Check TEST_SYSCALL_STR instead of TEST_SYSCALL_NAME.
(STRUCT_STAT_STR, TEST_SYSCALL_STR, stringify, stringify_): Remove.
[!STRUCT_STAT] (STRUCT_STAT_STR): New macro.
2016-01-12 03:07:39 +00:00
2165a359fd tests/struct_flock.c: fix musl libc compilation warnings
The size of off_t is not something one can rely upon.  For example,
musl libc unconditionally defines it as an int64_t type on x86.
A cast to the target type helps to avoid these libc differences.

* configure.ac: Call AC_C_TYPEOF.
* tests/struct_flock.c (TYPEOF_FLOCK_OFF_T): New macro.
(test_flock_einval): Use it instead of off_t.
2016-01-12 03:07:38 +00:00
4776e3366f tests/inet-cmsg.c: fix musl libc compilation warnings
The types that are used to define msg_namelen member of struct msghdr
and cmsg_len member of struct cmsghdr differ between libcs.
For example, glibc defines them as size_t, while musl libc - as type
socklen_t.  Print these fields using %lu format to avoid issues caused
by libc differences.

* tests/inet-cmsg.c (main): Cast mh.msg_controllen and c->cmsg_len
to unsigned long and print them using %lu format.
2016-01-12 00:00:47 +00:00
c36270a28e aio.test: include <fcntl.h> instead of <sys/fcntl.h>
* tests/aio.c: Include <fcntl.h> instead of <sys/fcntl.h>.
2016-01-11 02:20:04 +00:00
35eb03fdf7 mmsg.test: check memory access by sendmmsg and recvmmsg decoders
* tests/tests.h (tail_memdup): New prototype.
* tests/tail_alloc.c (tail_memdup): New function.
* tests/mmsg.c (main): Place all objects passed to sendmmsg and recvmmsg
at the end of memory pages followed by inaccessible pages.
2016-01-11 01:05:34 +00:00
3a184fe9cc mmsg.test: check decoding of flags passed to sendmmsg and recvmmsg
* tests/mmsg.c (main): Pass MSG_DONTROUTE|MSG_NOSIGNAL to sendmmsg.
Pass MSG_DONTWAIT to recvmmsg.
* tests/mmsg.expected: Update.
2016-01-11 01:05:34 +00:00
6e815ce640 mmsg.test: prefer direct sendmmsg/recvmmsg syscalls to libc wrappers
* tests/mmsg.c: Include <sys/syscall.h>.
Check for __NR_sendmmsg as an alternative to HAVE_SENDMMSG.
[!HAVE_STRUCT_MMSGHDR] (struct mmsghdr): Define.
(send_mmsg, recv_mmsg): New functions.
(main): Use them instead of sendmmsg and recvmmsg.

Reported-by: Szabolcs Nagy <nsz@port70.net>
2016-01-11 01:03:19 +00:00
8df07e1039 sigreturn.test: use RT_5 signal number instead of RT_2
Make the test compatible with musl libc that uses RT_2 internally.

* tests/sigreturn.c (main): Replace RT_2 with RT_5.
* tests/sigreturn.test: Likewise.

Reported-by: Szabolcs Nagy <nsz@port70.net>
2016-01-10 22:48:51 +00:00
5b87572952 avr32: wire up accept4 syscall
* linux/avr32/syscallent.h [321]: Add accept4 entry.
2016-01-10 21:38:03 +00:00
7de53317ab sparc64: fix names of {s,g}etres{u,g}id syscalls
* linux/sparc64/syscallent.h [108 ... 111]: Use sparc64 syscall names.
2016-01-09 22:54:53 +00:00
b663fd990b sparc64: remove sparc32 syscall entries
* linux/sparc64/syscallent.h [31, 32, 35, 44, 53, 56, 69, 70, 72, 77,
82, 84, 87, 89, 91, 94, 112, 115, 155, 231]: Unassign.
2016-01-09 22:53:33 +00:00
f77c4e6d25 sparc: remove sparc64 syscall entries
* linux/sparc/syscallent.h [52, 163]: Unassign.
2016-01-09 22:47:25 +00:00
f5fb0a7249 sparc64: clone syscallent.h from sparc
* linux/sparc64/syscallent.h: Clone from linux/sparc/syscallent.h.
2016-01-09 22:44:00 +00:00
b1110543d9 sparc: fix mlock2 sysentry, wire up bind, listen, and setsockopt syscalls
* linux/sparc/syscallent.h [353]: Move mlock2 entry to 356.
[353, 354, 355]: Add bind, listen, and setsockopt entries.
* NEWS: Mention this.
2016-01-09 21:58:44 +00:00
8249eeb5d4 tests: do not use settimeofday wrapper provided by libc
Workaround limitations of settimeofday wrapper provided by musl libc.

* tests/xettimeofday.c (main): Call settimeofday using syscall().

Reported-by: Szabolcs Nagy <nsz@port70.net>
2016-01-09 13:06:31 +00:00
19ff2b2ee7 ioctl.test: robustify against libcs invoking ioctl syscall on their own
* tests/ioctl.test: Filter out from the log ioctl calls with standard
descriptor arguments.

Reported-by: Szabolcs Nagy <nsz@port70.net>
2016-01-09 01:44:19 +00:00
2720a61832 alpha: enhance decoding of getxpid, getxuid, and getxgid syscalls
Print the second return value of getxpid, getxuid, and getxgid syscalls
that return a pair of values using the same mechanism as pipe syscall.

* alpha.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* linux/alpha/syscallent.h [20]: Change SEN(getpid) to SEN(getxpid).
[24]: Change SEN(getuid) to SEN(getxuid).
[47]: Change SEN(getgid) to SEN(getxgid).
* NEWS: Mention this enhancement.
* tests/uid.awk: Update for getxgid output change.
* tests/uid.test: Cleanup.
* tests/getxxid.c: New file.
* tests/getxxid.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add getxxid.
(TESTS): Add getxxid.test.
* tests/.gitignore: Add getxxid.
2016-01-09 00:09:04 +00:00
b61b2d820f Cleanup parser of getpagesize syscall
* mem.c (SYS_FUNC(getpagesize)): Decode on entering syscall.
2016-01-08 19:20:05 +00:00
fbec510297 alpha: alias getdtablesize to printargs
* linux/dummy.h [ALPHA] (sys_getdtablesize): Alias to printargs.
* desc.c [ALPHA] (SYS_FUNC(getdtablesize)): Remove.
2016-01-08 18:53:27 +00:00
6833d61090 tests: change text marker in fork-f and vfork-f tests
Use chdir syscalls instead of pwrite64 syscalls as a method of inserting
text markers into strace output because the former are more portable.

* tests/fork-f.c (logit): Rename to logit_. Use chdir instead of pwrite.
(logit): New macro wrapper around logit_.
(main): Update expected output.
* tests/vfork-f.c: Likewise.
* tests/fork-f.test: Update.
2016-01-08 02:45:05 +00:00
be1cb92c72 Fix printing of 32-bit times syscall return value on 64-bit architectures
This change complements commit v4.9-359-gd93d9f8 by fixing
RVAL_UDECIMAL case.
The only syscall that appears to be affected is the times syscall.

* syscall.c (trace_syscall_exiting): In case of RVAL_UDECIMAL,
when current personality is 32-bit, print 32-bit return code.
* NEWS: Mention this fix.

Reported-by: Steve McIntyre <steve@einval.com>
2016-01-07 19:47:23 +00:00
1eabdb3c99 tests/vfork-f.c: support platforms without vfork
On some platforms, e.g. hppa glibc, vfork() is implemented using fork
syscall, so the test cannot rely on the parent process remaining blocked
until the child process either terminates or calls execve.

* tests/vfork-f.c (main): Explicitly block the parent until the child
either terminates or calls execve.
2016-01-07 02:11:58 +00:00
6bf08e3e4a Fix and enhance decoding of sched_[gs]etaffinity syscalls
Print cpu_set_t as a set of integers, similar to the way
fd_set is printed as a set of descriptors.

* affinity.c: Include <sched.h>.
(get_cpuset_size): New function.
(print_affinitylist): Rewrite using get_cpuset_size and next_set_bit.
(sched_getaffinity, sched_setaffinity): Print first two args as ints.
* NEWS: Mention this enhancement.
* tests/sched_xetaffinity.c: New file.
* tests/sched_xetaffinity.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add sched_xetaffinity.
(TESTS): Add sched_xetaffinity.test.
* tests/.gitignore: Add sched_xetaffinity.

Reported-by: Joe Korty <joe.korty@ccur.com>
2016-01-07 02:11:55 +00:00
6267e4b0e3 tests: convert epoll_create1.test from match_grep to match_diff
* tests/epoll_create1.c (main): Print expected output.
* tests/epoll_create1.test: Use match_diff instead of match_grep.
* tests/epoll_create1.expected: Remove.
* tests/Makefile.am (EXTRA_DIST): Remove epoll_create1.expected.
2016-01-06 16:08:07 +00:00
6e65922a32 tests/struct_flock.c: use libtests
* tests/struct_flock.c (create_sample): Return void,
all callers changed.  Use perror_msg_and_fail.
* tests/fcntl.c: Use SKIP_MAIN_UNDEFINED.
* tests/fcntl64.c: Likewise.
2016-01-06 16:06:35 +00:00
c83746acf7 tests/file_handle.c: use libtests
* tests/file_handle.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert and perror_msg_and_skip.
2016-01-06 16:01:46 +00:00
6feccf199e tests/uid32.c: use libtests
* tests/uid32.c: Use SKIP_MAIN_UNDEFINED.
2016-01-06 15:58:14 +00:00
67c998b7d4 tests/uid16.c: use libtests
* tests/uid16.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 15:57:45 +00:00
eb81ecf033 tests/uid.c: use libtests
* tests/uid.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 15:57:17 +00:00
ea56b5ba3f tests/netlink_unix_diag.c: use libtests
* tests/netlink_unix_diag.c (send_query, check_responses, main):
Use perror_msg_and_skip.
2016-01-06 15:55:12 +00:00
285c3f453a tests/netlink_inet_diag.c: use libtests
* tests/netlink_inet_diag.c (send_query, check_responses, main):
Use perror_msg_and_skip.
2016-01-06 15:53:45 +00:00
82d1fd14f1 tests/readdir.c: use libtests
* tests/readdir.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 12:03:57 +00:00
2e00fe9155 tests/getdents64.c: use libtests
* tests/getdents64.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 12:03:37 +00:00
74769e99cd tests/getdents.c: use libtests
* tests/getdents.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 12:02:55 +00:00
29e5bde776 tests/ipc_shm.c: use libtests
* tests/ipc_shm.c (cleanup): New function.
(main): Use it and perror_msg_and_skip.
2016-01-06 11:59:58 +00:00
efb134041e tests/ipc_sem.c: use libtests
* tests/ipc_sem.c (cleanup): New function.
(main): Use it and perror_msg_and_skip.
2016-01-06 11:59:29 +00:00
3ba7feca53 tests/ipc_msg.c: use libtests
* tests/ipc_msg.c (cleanup): New function.
(main): Use it and perror_msg_and_skip.
2016-01-06 11:59:06 +00:00
4e4958e0f9 tests/ipc_msgbuf.c: use libtests
* tests/ipc_msgbuf.c (cleanup): New function.
(main): Use it and perror_msg_and_skip.
2016-01-06 11:55:13 +00:00
bbbb97fb30 tests/mq.c: use libtests
* tests/mq.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 11:52:43 +00:00
00777042c4 tests/utimensat.c: use libtests
* tests/utimensat.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert and perror_msg_and_skip.
2016-01-06 11:49:27 +00:00
647e7953ce tests/ppoll.c: use libtests
* tests/ppoll.c (main): Use assert, perror_msg_and_skip,
and perror_msg_and_fail.
2016-01-06 11:44:32 +00:00
4e66672923 tests/mmsg.c: use libtests
* tests/mmsg.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 11:43:08 +00:00
2c59f1e482 tests/ip_mreq.c: use libtests
* tests/ip_mreq.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 11:42:10 +00:00
cf40111be1 tests/ioctl.c: use libtests
* tests/ioctl.c: Use SKIP_MAIN_UNDEFINED.
(main): Use %m printf format specifier.
2016-01-06 11:40:00 +00:00
b736a05c56 tests/pipe.c: use libtests
* tests/pipe.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_fail and perror_msg_and_skip.
2016-01-06 11:38:05 +00:00
a380ba0f9b tests/getrandom.c: use libtests
* tests/getrandom.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 11:36:54 +00:00
0b75320910 tests/signalfd.c: use libtests
* tests/signalfd.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 11:35:23 +00:00
7fce908de0 tests/pc.c: use libtests
* tests/pc.c (main): Use assert, get_page_size, perror_msg_and_fail,
and perror_msg_and_skip.
2016-01-06 11:33:13 +00:00
73aa88a619 tests/uio.c: use libtests
* tests/uio.c: Use SKIP_MAIN_UNDEFINED.
2016-01-06 11:31:48 +00:00
b2ae749ab1 tests/bpf.c: use libtests
* tests/bpf.c: Use SKIP_MAIN_UNDEFINED.
(main) Use perror_msg_and_skip.
2016-01-06 11:29:16 +00:00
9ad4409a64 tests/aio.c: use libtests
* tests/aio.c: Use SKIP_MAIN_UNDEFINED.
(main) Use perror_msg_and_skip.
2016-01-06 11:27:15 +00:00
05a27ea2f6 tests/sched_xetattr.c: use libtests
* tests/sched_xetattr.c: Use SKIP_MAIN_UNDEFINED.
(main) Use perror_msg_and_skip.
2016-01-06 11:25:47 +00:00
2d161f5bad tests/wait.c: use libtests
* tests/wait.c (main): Use perror_msg_and_fail.
2016-01-06 11:25:00 +00:00
f90f69fa32 tests/vfork-f.c: use libtests
* tests/vfork-f.c (main): Use assert and perror_msg_and_fail.
2016-01-06 11:24:44 +00:00
237fbcd966 tests/fork-f.c: use libtests
* tests/fork-f.c (main): Use assert and perror_msg_and_fail.
2016-01-06 11:24:29 +00:00
a68d7aca2a tests/userfaultfd.c: use libtests
* tests/userfaultfd.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert.
2016-01-06 10:01:20 +00:00
f03712ef1a tests/mlock2.c: use libtests
* tests/mlock2.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert.
2016-01-06 10:00:44 +00:00
d3bd308162 tests/membarrier.c: use libtests
* tests/membarrier.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert.
2016-01-06 09:59:46 +00:00
02b71669df tests/nanosleep.c: use libtests
* tests/nanosleep.c (main): Use assert, perror_msg_and_fail,
and perror_msg_and_skip.
2016-01-06 09:56:09 +00:00
3a7c659e76 tests/timerfd_xettime.c: use libtests
* tests/timerfd_xettime.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 09:51:37 +00:00
0566d548f9 tests/timer_xettime.c: use libtests
* tests/timer_xettime.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 09:50:44 +00:00
21bbc14575 tests/timer_create.c: use libtests
* tests/timer_create.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 09:49:32 +00:00
9d499b5128 tests/clock_xettime.c: use libtests
* tests/clock_xettime.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-06 09:48:05 +00:00
4bd7cad240 tests/clock_nanosleep.c: use libtests
* tests/clock_nanosleep.c (main): Use assert and perror_msg_and_skip.
2016-01-06 09:46:29 +00:00
5bf0eb0859 tests/truncate64.c: use libtests
* tests/truncate64.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert and perror_msg_and_skip.
2016-01-06 09:39:07 +00:00
89eb888ebf tests/truncate.c: use libtests
* tests/truncate.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert and perror_msg_and_skip.
2016-01-06 09:37:55 +00:00
8efd324255 tests/ftruncate64.c: use libtests
* tests/ftruncate64.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert and perror_msg_and_skip.
2016-01-06 09:37:42 +00:00
e4c6592c15 tests/ftruncate.c: use libtests
* tests/ftruncate.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert and perror_msg_and_skip.
2016-01-06 09:37:10 +00:00
a79617a637 tests/llseek.c: use libtests
* tests/llseek.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert and perror_msg_and_skip.
2016-01-05 23:28:15 +00:00
b699cb7230 tests/lseek.c: use libtests
* tests/lseek.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert and perror_msg_and_skip.
2016-01-05 23:27:42 +00:00
3f6a552e1e tests/readlinkat.c: use libtests
* tests/readlinkat.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-05 23:27:05 +00:00
4b86fdbd5f tests/readlink.c: use libtests
* tests/readlink.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-05 23:26:13 +00:00
c2c840d40e tests/xattr.c: use libtests
* tests/xattr.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-05 23:18:25 +00:00
c497c96179 tests/seccomp.c: use libtests
* tests/seccomp.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_fail and perror_msg_and_skip.
2016-01-05 23:17:29 +00:00
fa63468f55 tests/restart_syscall.c: use libtests
* tests/restart_syscall.c (main): Use assert, perror_msg_and_fail,
and perror_msg_and_skip.
2016-01-05 23:14:25 +00:00
91a6ef6648 tests/inet-cmsg.c: use libtests
* tests/inet-cmsg.c (main): Use perror_msg_and_skip.
2016-01-05 23:13:41 +00:00
8cad05c5ef tests/eventfd.c: use libtests
* tests/eventfd.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip.
2016-01-05 23:12:51 +00:00
69fe020a23 tests/epoll_create1.c: use libtests
* tests/epoll_create1.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert and perror_msg_and_skip.
2016-01-05 23:11:48 +00:00
bde121b849 tests/mmap.c: use libtests
* tests/mmap.c (main): Use get_page_size and perror_msg_and_fail.
2016-01-05 23:07:59 +00:00
18eeb96799 tests/fanotify_mark.c: use libtests
* tests/fanotify_mark.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 23:06:14 +00:00
af364e1ec4 tests/inet-accept-connect-send-recv.c: use libtests
* tests/inet-accept-connect-send-recv.c (main): Use perror_msg_and_skip
and perror_msg_and_fail.
2016-01-05 23:04:30 +00:00
2f5786c0fc tests/net-accept-connect.c: use libtests
* tests/net-accept-connect.c (main): Use perror_msg_and_skip
and perror_msg_and_fail.
2016-01-05 23:03:26 +00:00
9b3c77c965 tests/unix-pair-send-recv.c: use libtests
* tests/unix-pair-send-recv.c (main): Use perror_msg_and_skip
and perror_msg_and_fail.
2016-01-05 23:02:21 +00:00
423dd59330 tests/xselect.c: use libtests
* tests/xselect.c (main): Use assert, perror_msg_and_fail,
and perror_msg_and_skip.
2016-01-06 00:57:14 +00:00
8d2674ea81 tests/pselect6.c: use libtests
* tests/pselect6.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert, perror_msg_and_fail, and perror_msg_and_skip.
2016-01-06 00:57:08 +00:00
fc3e11bcdc tests/oldselect.c: use libtests
* tests/oldselect.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_fail and perror_msg_and_skip.
2016-01-05 22:53:28 +00:00
1bda9d71b2 tests/select.c: use libtests
* tests/select.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:52:39 +00:00
0827838905 tests/_newselect.c: use libtests
* tests/_newselect.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:51:44 +00:00
8655cb55ec tests/fstatat.c: use libtests
* tests/fstatat.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:41:28 +00:00
cebe881059 tests/newfstatat.c: use libtests
* tests/newfstatat.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:40:51 +00:00
2acad73184 tests/fstatat64.c: use libtests
* tests/fstatat64.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:40:17 +00:00
6c52f2b0fa tests/xstatx.c: use libtests
* tests/xstatx.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:37:42 +00:00
18757252c5 tests/stat64.c: use libtests
* tests/stat64.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:35:52 +00:00
9e51ce1751 tests/stat.c: use libtests
* tests/stat.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:35:11 +00:00
929bc6fba1 tests/lstat64.c: use libtests
* tests/lstat64.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:34:30 +00:00
096a436b91 tests/lstat.c: use libtests
* tests/lstat.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:33:26 +00:00
fc2c61498c tests/fstat64.c: use libtests
* tests/fstat64.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:32:37 +00:00
2902146c1c tests/fstat.c: use libtests
* tests/fstat.c: Use SKIP_MAIN_UNDEFINED.
2016-01-05 22:31:46 +00:00
ec6b85e59c tests/statfs.c: use libtests
* tests/statfs.c (main): Use perror_msg_and_fail.
2016-01-05 22:28:51 +00:00
d88c2d8cc3 tests/xettimeofday.c: use libtests
* tests/xettimeofday.c (main): Use assert and perror_msg_and_skip.
2016-01-06 00:14:36 +00:00
7994f14ae5 tests/utime.c: use libtests
* tests/utime.c (main): Use assert and perror_msg_and_skip.
2016-01-06 00:14:36 +00:00
55095d06e9 tests/filter-unavailable.c: use libtests
* tests/filter-unavailable.c (main): Use perror_msg_and_fail.
2016-01-06 00:14:36 +00:00
339a15b619 tests/scm_rights.c: use libtests
* tests/scm_rights.c (main): Use perror_msg_and_fail and perror_msg_and_skip.
2016-01-06 00:14:36 +00:00
e301e98342 tests/caps.c: use libtests
* tests/caps.c (main): Use perror_msg_and_skip.
2016-01-06 00:14:36 +00:00
3174812d8d tests/rt_sigqueueinfo.c: use libtests
* tests/rt_sigqueueinfo.c (main): Use assert and perror_msg_and_skip.
2016-01-06 00:14:36 +00:00
55deec66a9 tests/umount.c: use libtests
* tests/umount.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_fail.
2016-01-06 00:14:36 +00:00
fa8d4491e3 tests/umount2.c: use libtests
* tests/umount2.c (main): Use perror_msg_and_fail.
2016-01-06 00:05:41 +00:00
6a641fce5d tests/times.c: use libtests
* tests/times.c (main): Use perror_msg_and_fail and perror_msg_and_skip.
2016-01-05 23:44:59 +00:00
f2e29da95f tests/times-fail.c: use assert
* tests/times-fail.c (main): Use assert.
2016-01-04 23:43:09 +00:00
82924318f0 tests/memfd_create.c: use libtests
* tests/memfd_create.c: Use SKIP_MAIN_UNDEFINED.
2016-01-04 23:41:27 +00:00
71ac6ff9e8 tests/execveat.c: use libtests
* tests/execveat.c: Use SKIP_MAIN_UNDEFINED.
2016-01-04 23:40:24 +00:00
c47adebc67 tests/xetitimer.c: use libtests
* tests/xetitimer.c (main): Use perror_msg_and_skip.
2016-01-04 23:38:19 +00:00
10a69f8108 tests/sysinfo.c: use libtests
* tests/sysinfo.c (main): Use perror_msg_and_skip.
2016-01-05 23:37:14 +00:00
9c8654e3e0 tests/sigaltstack.c: use libtests
* tests/sigaltstack.c (main): Use perror_msg_and_skip.
2016-01-05 23:37:01 +00:00
463bb88de1 tests/adjtimex.c: use libtests
* tests/adjtimex.c (main): Use perror_msg_and_skip.
2016-01-05 23:36:59 +00:00
cadf3543f7 tests/xet_robust_list.c: use libtests
* tests/xet_robust_list.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip and tail_alloc.
2016-01-05 23:25:00 +00:00
4cd38c0d77 tests/umovestr2.c: use libtests
* tests/umovestr2.c (main): Use get_page_size and tail_alloc.
2016-01-05 23:24:50 +00:00
4eb5d79c45 tests/umovestr.c: use libtests
* tests/umovestr.c (main): Use perror_msg_and_skip and tail_alloc.
2016-01-05 23:24:36 +00:00
6a733fd461 tests/time.c: use libtests
* tests/time.c: Use SKIP_MAIN_UNDEFINED.
(main): Use perror_msg_and_skip and tail_alloc.
2016-01-05 23:17:11 +00:00
164e577824 tests/sendfile64.c: use libtests
* tests/sendfile64.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert, perror_msg_and_fail, perror_msg_and_skip,
and tail_alloc.
2016-01-05 23:17:11 +00:00
54ba3b5c32 tests/sendfile.c: use libtests
* tests/sendfile.c: Use SKIP_MAIN_UNDEFINED.
(main): Use assert, perror_msg_and_fail, perror_msg_and_skip,
and tail_alloc.
2016-01-05 23:17:11 +00:00
0c8853c3c3 tests: include tests.h instead of config.h
Automatically edit tests/*.c files using the following perl one-liner:

perl -0777 -pi -e \
's/#ifdef HAVE_CONFIG_H\n# include "config\.h"\n#endif\n*/#include "tests.h"\n/' \
tests/*.c
2016-01-05 23:17:11 +00:00
87e6b230ff tests: introduce libtests
Introduce tests/libtests.a with common functions for use in tests.

* tests/tests.h: New file.
* tests/error_msg.c: Likewise.
* tests/tail_alloc.c: Likewise.
* tests/get_page_size.c: Likewise.
* tests/Makefile.am (libtests_a_SOURCES, libtests_a_CPPFLAGS,
check_LIBRARIES, LDADD): New variables.
(clock_xettime_LDADD, filter_unavailable_LDADD, mq_LDADD,
pc_LDADD, times_LDADD): Add $(LDADD).
* tests/.gitignore: Add libtests.a.
2016-01-05 23:17:07 +00:00
10eab9db85 tests: enable strace-k.test only for --with-libunwind configurations
Also, since -k option does not support multiple personalities,
add strace-k.test to XFAIL_TESTS when running mpers tests.

* tests/Makefile.am (MPERS_NAME, LIBUNWIND_TESTS, XFAIL_TESTS_,
XFAIL_TESTS_m32, XFAIL_TESTS_mx32, XFAIL_TESTS): New variables.
[USE_LIBUNWIND] (LIBUNWIND_TESTS): Add strace-k.test.
(TESTS): Replace strace-k.test with $(LIBUNWIND_TESTS).
* bootstrap: Substitute MPERS_NAME variable in tests-*/Makefile.am.
* tests/strace-k.test: Do not check for -k option availability.
2016-01-01 23:09:02 +00:00
f32126ba79 Move gcc compat macros to gcc_compat.h
* defs.h: Include "gcc_compat.h".
(GNUC_PREREQ, ATTRIBUTE_NORETURN, ATTRIBUTE_FORMAT,
ATTRIBUTE_ALIGNED, ATTRIBUTE_PACKED, ATTRIBUTE_MALLOC,
ATTRIBUTE_NOINLINE, ATTRIBUTE_ALLOC_SIZE): Move ...
* gcc_compat.h: ... here.
* Makefile.am (strace_SOURCES): Add gcc_compat.h.
2016-01-02 14:29:33 +00:00
72dc1b48b8 Move defs.h from noinst_HEADERS to strace_SOURCES
* Makefile.am (noinst_HEADERS): Move defs.h ...
(strace_SOURCES): ... here.
2015-12-31 14:15:59 +00:00
0171752084 test: remove fork.c and vfork.c
These manual tests are obsoleted by fork-f.test and vfork-f.test.

* test/fork.c: Remove.
* test/vfork.c: Remove.
* test/Makefile (PROGS): Remove fork and vfork.
* test/.gitignore: Remove fork and vfork.
2015-12-30 23:28:35 +00:00
78db0f2dcf tests: add fork-f.test and vfork-f.test
Check how strace -f follows fork and vfork syscalls.

* tests/fork-f.c: New file.
* tests/fork-f.test: New test.
* tests/vfork-f.c: New file.
* tests/vfork-f.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add fork-f and vfork-f.
(TESTS): Add fork-f.test and vfork-f.test.
* tests/.gitignore: Add fork-f and vfork-f.
2015-12-30 23:08:32 +00:00
aef5e14ba2 Set SYSCALL_NEVER_FAILS flag for getpid, getppid and gettid syscall
* linux/*/syscallent*.h (getpid, getppid, gettid): Set NF flag.
2015-12-29 01:15:20 +00:00
dd039b74ef Set SYSCALL_NEVER_FAILS flag for umask syscall
Linux kernel always ANDs umask argument with 0700 and therefore
this syscall never fails.

* linux/*/syscallent*.h (umask): Set NF flag.
2015-12-29 01:15:06 +00:00
552f2f62fd alpha, ia64, mips, nios2, powerpc, sparc: always check for syscall error
On architectures that use dedicated registers to report syscall errors,
check for syscall error condition regardless of SYSCALL_NEVER_FAILS flag
in the syscall entry.  On architectures that use negated errno
semantics, there is no way to distinguish a syscall error from a valid
return code that looks like a syscall error, and the check for
SYSCALL_NEVER_FAILS flag remains the only way to tell one case
from another.

* linux/alpha/get_error.c (get_error): Ignore check_errno.
* linux/ia64/get_error.c: Likewise.
* linux/mips/get_error.c: Likewise.
* linux/nios2/get_error.c: Likewise.
* linux/powerpc/get_error.c: Likewise.
* linux/sparc/get_error.c: Likewise.
* linux/sparc64/get_error.c: Likewise.
2015-12-27 01:02:53 +00:00
0297e0c067 Handle unlikely errors from personality syscall
Despite being marked as SYSCALL_NEVER_FAILS, personality syscall still
might report a failure on some architectures due to obscure kernel
bugs.  Check for this unlikely case and let users know that their
kernel has gone bananas.

* personality.c (SYS_FUNC(personality)): Do not parse syscall return
value in case of syserror.
2015-12-27 00:18:35 +00:00
abfa939f57 Do not truncate return value of get{,e}[ug]id and setfs[ug]id syscalls
This should not be a user visible change unless the kernel does
something completely unexpected.  In the latter case, let user see
what is going on.

* uid.c (SYS_FUNC(getuid), SYS_FUNC(setfsuid)): Do not truncate
tcp->u_rval to uid_t on exiting syscall, return RVAL_DECODED.
2015-12-27 00:18:03 +00:00
727508b077 Enhance personality syscall decoding
* xlat/personality_options.in: Split into ...
* xlat/personality_types.in: ... personality types and ...
* xlat/personality_flags.in: ... personality flags.
* personality.c: Include "xlat/personality_types.h"
and "xlat/personality_flags.h" instead of "xlat/personality_options.h".
(SYS_FUNC(personality)): Print PER_MASK part of personality as
a symbolic value, and the rest of personality as a set of flags.
* tests/personality.c (main): Add more test cases.
* tests/personality.test: Update.
2015-12-26 02:10:46 +00:00
a147bf8500 sh, sh64: fix syscall flags in several syscall entries
* linux/sh/syscallent.h (geteuid32, getegid32, setfsuid32, setfsgid32):
Set SYSCALL_NEVER_FAILS flag.
(fchown32): Set TRACE_DESC flag.
* linux/sh64/syscallent.h: Likewise.
2015-12-25 21:15:59 +00:00
1e155f76e7 Print personality value 0xffffffff properly
Value 0xffffffff of personality syscall first argument has a special
meaning, it is not a set of personality flags.

* personality.c (SYS_FUNC(personality)): If personality equals
to 0xffffffff, print it verbatim.
* tests/personality.c (main): Test it.
2015-12-25 21:14:57 +00:00
f7423af0df tests: add personality.test
* tests/personality.c: New file.
* tests/personality.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add personality.
(TESTS): Add personality.test.
* tests/.gitignore: Add personality.
2015-12-25 02:27:06 +00:00
97cbf69756 Enhance personality syscall decoding
* personality.c (SYS_FUNC(personality)): On entering syscall,
print first argument not as a hex value but as a set of flags.
On exiting syscall, print return code as a set of flags.
* NEWS: Mention this enhancement.
2015-12-25 00:46:07 +00:00
ffb6c55d7d Set SYSCALL_NEVER_FAILS flag for personality syscall
Starting with commit
v2.6.29-6609-g11d06b2a1e5658f448a308aa3beb97bacd64a940, personality
syscall never fails to set the personality, but before commit
v2.6.35-rc1-372-g485d527 it still could return an error.
Starting with that commit, personality syscall never returns an error.

* linux/*/syscallent.h: Set SYSCALL_NEVER_FAILS flag in personality
syscall entries.
2015-12-25 00:45:43 +00:00
3eba72b9ab Add personality emulation flags
* xlat/personality_options.in: Add UNAME26, ADDR_NO_RANDOMIZE,
FDPIC_FUNCPTRS, MMAP_PAGE_ZERO, ADDR_COMPAT_LAYOUT, READ_IMPLIES_EXEC,
ADDR_LIMIT_32BIT, SHORT_INODE, WHOLE_SECONDS, STICKY_TIMEOUTS,
and ADDR_LIMIT_3GB.
2015-12-24 17:37:35 +00:00
dd1a80c8d2 arc, metag, nios2, or1k, tile: fix build
Fix build regression introduced by commit
34683e3926.

* linux/32/syscallent.h: Add sys_ prefix to ARCH_mmap and mmap.
* linux/arc/syscallent.h: Add sys_ prefix to ARCH_mmap and mmap_pgoff.
* linux/nios2/syscallent.h: Likewise.
* linux/or1k/syscallent.h: Likewise.
* linux/tile/syscallent1.h: Add sys_ prefix to ARCH_mmap and sys_mmap_4koff.
* pathtrace.c (pathtrace_match): Handle SEN_ARCH_mmap.
* NEWS: Mention this build fix.

Reported-by: Alexey Brodkin <Alexey.Brodkin@synopsys.com>
2015-12-24 17:36:58 +00:00
24fb8efa27 packages: remove acl development library from build dependencies
Starting with commit v4.9-46-g681452b that removed all references
to acl.h, we no longer use acl development library.

* .travis.yml (addons.apt.packages): Remove libacl1-dev.
* strace.spec (BuildRequires): Remove libacl-devel.
2015-12-24 00:02:36 +00:00
796fbe085f packages/x86_64: enable experimental -k option
* debian/control (Build-Depends) [amd64]: Add libunwind-dev.
* strace.spec (BuildRequires) [x86_64]: Add libunwind-devel.
2015-12-23 04:36:10 +00:00
cbde4e2671 maint: post-release administrivia
* NEWS: Add header line for the next release.
2015-12-23 04:35:59 +00:00
2acb065f42 Prepare for 4.11 release
* NEWS: Update for 4.11 release.
* debian/changelog: 4.11-1.
* strace.spec: 4.11-1.
2015-12-21 20:21:22 +00:00
4fa8073d87 Sync strace.spec and debian/ with packages
* debian/changelog: Sync with 4.10-3.
* debian/control: Likewise.
* debian/rules: Likewise.
* strace.spec: Sync with 4.10-3.
2015-12-20 00:58:36 +00:00
9c067ea8c8 .mailmap: add addresses of Kirill A. Shutemov
* .mailmap: Add both addresses of Kirill A. Shutemov here
to avoid duplications in CREDITS file.
2015-12-20 00:25:10 +00:00
7405b1225a NEWS: Prepare for 4.11 release 2015-12-19 20:57:30 +00:00
23828a5bbf ia64: wire up mlock2 syscall
* linux/ia64/syscallent.h [1346]: Add mlock2 entry.
2015-12-18 20:55:40 +00:00
38a34c9349 Add copyright headers to some files which lack them
Before this change, all files that exist since 20th century had
copyright headers, while most files that appeared later didn't.  This
change fixes the inconsistency by adding missing copyright headers.

It doesn't mean that copyright headers became maintained.  In my view,
git history provides much better information on this subject and is much
more accurate than copyright headers.
2015-12-17 17:56:48 +00:00
d1c663a2d0 tests/aio.c: include <time.h>
* tests/aio.c: Include <time.h> for struct timespec.

Reported-by: Szabolcs Nagy <nsz@port70.net>
2015-12-16 02:00:01 +00:00
4b08afdf05 mpers.sh: switch to DWARF version 2 format for better portability
* mpers.sh (CFLAGS): Replace -gdwarf-4 with -gdwarf-2.
2015-12-16 01:26:27 +00:00
d2bcb1639e mpers.awk: add support for DWARF version 2 format
* mpers.awk: Handle DW_AT_data_member_location in DWARF v2 format.
2015-12-16 01:25:10 +00:00
e67c8e44db Replace %Ld/%Lu printf format specifiers with %lld/%llu
As %Ld and %Lu printf format specifiers are not quite portable,
replace them with %lld and %llu, respectively.

* desc.c (SYS_FUNC(pselect6)): Replace %Lu with %llu.
* dirent.c (print_old_dirent, SYS_FUNC(getdents)): Likewise.
* times.c (SYS_FUNC(times)): Likewise.
* fcntl.c (print_struct_flock64): Replace %Ld with %lld.
* tests/ftruncate.c (main): Replace %Lu with %llu.
* tests/ftruncate64.c (main): Likewise.
* tests/getdents.c (print_dirent): Likewise.
* tests/llseek.c (main): Likewise.
* tests/lseek.c (main): Likewise.
* tests/truncate.c (main): Likewise.
* tests/truncate64.c (main): Likewise.
* tests/xstatx.c (main): Likewise.
* tests/pselect6.c (main): Replace %Ld with %lld.
* tests/xselect.c(main): Likewise.

Reported-by: Szabolcs Nagy <nsz@port70.net>
2015-12-16 00:07:16 +00:00
34683e3926 Fix SYS_FUNC and SEN macros for musl
The syscall_name argument was subject to macro expansion because
it was passed down to other macros before it was prefixed.

musl libc defines lfs64 names as macros (e.g. fstat64 as fstat)
so SYS_FUNC(fstat64) was expanded to sys_fstat.

This change adds the prefix before the name is passed to other macros,
i.e. the argument of SYS_FUNC_NAME is already prefixed with sys_.

* defs.h (SYS_FUNC): Add sys_ prefix to SYS_FUNC_NAME's argument.
(SYS_FUNC_NAME): Do not add sys_ prefix to MPERS_FUNC_NAME's argument.
* linux/ia64/syscallent.h (SYS_FUNC_NAME): Do not add sys_ prefix
to MPERS_FUNC_NAME's argument.
* syscall.c (SEN_NAME): Remove.
(SEN): Replace SEN_NAME call with its definition.  Add sys_ prefix
to SYS_FUNC_NAME's argument.
2015-12-16 00:06:59 +00:00
b6b38fa73b tests/times.test: workaround libc bug on x32
As glibc times wrapper on x32 is known to wrongly truncate and then sign
extend the syscall return value, invoke the syscall directly on x32.

* tests/times.c (main) [__NR_times && __x86_64__ && __ILP32__]:
Invoke times syscall using inline asm.
2015-12-15 23:34:03 +00:00
c4afd6dc7a mpers.awk: make fillers added to the output structure more predictable
* mpers.awk (array_seq): New function.
(what_is): Use it for printing filler names.  Tweak return types.
* mpers_test.sh: Use a more complicated sample type to test mpers
machinery.
2015-12-15 23:33:34 +00:00
54d18a279a Robustify mpers.awk against input containing index loops
Make mpers.awk check for potential index loops.  Such loops should not
normally happen, but mpers.awk will not go into infinite recursion if
they do.

* mpers.awk (enter, leave): New functions.
(what_is): Use them.
2015-12-15 03:35:26 +00:00
59992183a6 Robustify mpers.awk against invalid input
Make mpers.awk check that accessed elements of the main array that
are expected to have non-empty values really meet this requirement.

* mpers.awk (array_get): New function.
(what_is, END): Use it.
* mpers_test.sh: Use a more complicated type to test mpers machinery.

Reported-by: Mike Frysinger <vapier@gentoo.org>
2015-12-15 02:04:38 +00:00
da126fbd77 Replace HAVE_LITTLE_ENDIAN_LONG_LONG with WORDS_BIGENDIAN
* defs.h: Use WORDS_BIGENDIAN instead of HAVE_LITTLE_ENDIAN_LONG_LONG.
* configure.ac (AC_LITTLE_ENDIAN_LONG_LONG): Remove.
* m4/long_long.m4: Remove.
2015-12-14 11:57:59 +00:00
ba70eb12b2 Remove unused parser of xmknod syscall
The last reference to this parser was removed by commit
v4.10-45-gdf4dd8b.

* mknod.c [SPARC || SPARC64] (SYS_FUNC(xmknod)): Remove.
2015-12-14 00:08:24 +00:00
703a7166ae tests/restart_syscall: add a workaround for old arm kernels
As arm kernels used to overwrite ARM_r0 with -EINTR after
ERESTART_RESTARTBLOCK, update regexp to workaround this.

* tests/restart_syscall.c (main) [__arm__]: Add 0xfffffffc as a valid
alternative value for the first argument of restarted nanosleep syscall.
2015-12-13 01:12:55 +00:00
2c2f663584 tests/.gitignore: add ksysent.h
tests/ksysent.h is a generated file listed in CLEANFILES.
This change complements commit v4.10-566-gbab4ef4.

* tests/.gitignore: Add ksysent.h.
2015-12-12 00:02:16 +00:00
90c7de66b9 aarch64: make arm registers unsigned
Follow the x86_64 example and define registers in arm_pt_regs
as unsigned, to avoid potential sign extension bugs.

This also fixes --enable-gcc-Werror build.

* linux/aarch64/arch_regs.c (arm_pt_regs): Change uregs's type
from int to uint32_t.

Reported-by: Sergey Bolshakov <sbolshakov@altlinux.org>
2015-12-11 10:52:42 +00:00
bab4ef4272 tests: add ksysent.test
Check that syscall names and numbers defined in syscallent files
match kernel __NR_* constants defined by <asm/unistd.h>.

Tested on various platforms, including the following combinations
of architectures and kernel headers:

x86_64: 4.4-rc, 4.3, 4.2, 4.1, 3.19, 3.17, 3.16, 3.12, 3.11,
3.10-rhel, 2.6.32-rhel, 2.6.27-sle, 2.6.18-rhel
i386: 4.4-rc, 4.3, 4.2, 4.1, 3.19, 3.17, 3.16, 3.11,
3.10-rhel, 2.6.32-rhel, 2.6.27-sle, 2.6.18-rhel
aarch64: 4.4-rc
alpha: 4.3
arm eabi: 4.4-rc, 4.2, 4.1
hppa: 3.18
ia64: 3.18
mips o32: 4.1
ppc: 3.18
ppc64: 3.10-rhel, 2.6.32-rhel
s390: 3.18
s390x: 3.18
sparc: 4.1
sparc: 3.18
x32: 3.19

The only platform which is known at this moment to fail the test
is CentOS-5 provided by OBS.  On x86_64 instance it fails with
error: "prlimit64" syscall #300 is "fanotify_init" in syscallent.h
and on i586 it similarly fails with
error: "prlimit64" syscall #338 is "fanotify_init" in syscallent.h
So this is a real platform bug that is not likely to be worked around
on the strace side.

* tests/ksysent.c: New file.
* tests/ksysent.sed: Likewise.
* tests/ksysent.test: New test.
* tests/Makefile.am (AM_CPPFLAGS): Add -I$(builddir).
(check_PROGRAMS): Add ksysent.
(TESTS): Add ksysent.test.
(EXTRA_DIST): Add ksysent.sed.
(ksysent.h): New rule.
(BUILT_SOURCES, CLEANFILES): Add ksysent.h.
* tests/.gitignore: Add ksysent.
2015-12-10 02:06:25 +00:00
a5c16b8656 Document that syscall names match kernel __NR_* constants
* strace.1: Note syscall naming difference between architectures
and the rule of choosing the right syscall name in each case.
2015-12-09 15:59:15 +00:00
cdd2f84d8f ia64: print all ia32 syscalls using printargs
Printing of ia32 syscalls on ia64 must have been broken for a long time.
Do not pretend that it works, print ia32 syscalls using printargs
instead.

* linux/ia64/syscallent.h: Remove all redefinitions of sys_* macros.
Stop including"../dummy.h".  Include "../i386/syscallent.h" with
SYS_FUNC_NAME macro temporarily redirected to printargs.
2015-12-09 11:48:52 +00:00
232cf04c83 Fix build on architectures for which arch_sigreturn is not implemented
This complements commit 527b42ff8d.

* linux/arch_sigreturn.c (arch_sigreturn): Define.
2015-12-09 11:46:43 +00:00
c37173f76d aarch64: swap 64-bit and 32-bit personalities
Let native 64-bit personality be personality 0, and 32-bit personality
be personality 1, to follow the traditional layout used for other
architectures.

* defs.h [AARCH64]: Swap PERSONALITY0_WORDSIZE and
PERSONALITY1_WORDSIZE, remove DEFAULT_PERSONALITY.
[AARCH64 && HAVE_M32_MPERS]: Rename PERSONALITY1_* to PERSONALITY0_*.
* file.c [AARCH64 || defined X86_64 || defined X32]: Define
STAT32_PERSONALITY for AARCH64 as well.
* syscall.c (update_personality) [AARCH64]: Adjust PERSONALITY_NAMES.
* linux/aarch64/errnoent1.h: Adjust comment.
* linux/aarch64/get_error.c (get_error): Adjust tcp->currpers check.
* linux/aarch64/get_syscall_args.c (get_syscall_args): Likewise.
* linux/arm/arch_sigreturn.c (arch_sigreturn) [AARCH64]: Likewise.
* linux/aarch64/get_scno.c (arch_get_scno): Adjust update_personality
invocations.
* linux/aarch64/ioctls_arch0.h: Swap with ...
* linux/aarch64/ioctls_arch1.h: ... this file.
* linux/aarch64/ioctls_inc0.h: Swap with ...
* linux/aarch64/ioctls_inc1.h: ... this file.
* linux/aarch64/syscallent.h: Swap with ...
* linux/aarch64/syscallent1.h: ... this file.
2015-12-09 01:09:11 +00:00
e3a2fe007b mips: fix fadvise64 syscall entries
* linux/mips/syscallent-n32.h [6216]: Change syscall handler
from fadvise64 to fadvise64_64.
* linux/mips/syscallent-n64.h [5215]: Rename from "fadvise64_64"
to "fadvise64"
* linux/mips/syscallent-o32.h [4254]: Likewise.
2015-12-08 22:35:26 +00:00
ebb38bc5bb xtensa: wire up syncfs syscall
* linux/xtensa/syscallent.h [179]: Add syncfs entry.
2015-12-08 21:19:53 +00:00
2b722e20c8 sh, sh64: fix syscall entries
* linux/sh/syscallent.h [322]: Fix timerfd_create entry.
* linux/sh64/syscallent.h [350]: Likewise.
[0]: Fix restart_syscall entry.
2015-12-08 21:19:53 +00:00
57dfe5f814 powerpc, powerpc64: wire up mlock2 syscall
* linux/powerpc/syscallent.h [378]: Add mlock2 entry.
* linux/powerpc64/syscallent.h: Likewise.
2015-12-08 21:19:53 +00:00
b506f78d02 hppa: fix syscall entries
* linux/hppa/syscallent.h: Swap [343] and [344] entries.
2015-12-08 21:19:53 +00:00
19a6d71915 avr32: update syscall entries
* linux/avr32/syscallent.h [0]: Rename from setup to restart_syscall.
[284 ... 320]: New entries.
2015-12-08 21:19:53 +00:00
8e7c92b6b7 m68k: fix syscall names
* linux/m68k/syscallent.h [335]: Rename "atomic_comxchg_32"
to "atomic_cmpxchg_32".
2015-12-08 21:19:53 +00:00
59a1586bcb sparc: update syscall names
* linux/sparc/syscallent.h [160]: Rename "sched_setaffinity"
to "sched_set_affinity".
[161]: Rename "sched_getaffinity" to "sched_get_affinity".
2015-12-08 21:19:53 +00:00
d4bb0ba7e8 powerpc, powerpc64: update syscall names
* linux/powerpc/syscallent.h [201]: Rename "MOL" to "multiplexer".
[225]: Rename "tux" to "tuxcall".
[256]: Rename "debug_setcontext" to "sys_debug_setcontext".
* linux/powerpc64/syscallent.h: Likewise.
2015-12-08 21:19:53 +00:00
a8b0ceffc2 alpha: update syscall entries
* linux/alpha/syscallent.h [224 ... 228]: Add stub entries.
[100]: Rename "osf_getpriority" to "getpriority".
[255]: Rename "osf_subsysinfo" to "osf_subsys_info".
[303]: Rename "adjtimex32" to "old_adjtimex".
[319]: Rename "sysctl" to "_sysctl".
[320]: Remove.
2015-12-08 21:19:53 +00:00
476ec393c3 Fix mmap syscall entries
Change syscall names to match kernel __NR_* constants.

* linux/avr32/syscallent.h [90]: Rename "mmap" to "mmap2".
* linux/bfin/syscallent.h [90]: Rename "old_mmap" to "mmap".
* linux/i386/syscallent.h: Likewise.
* linux/m68k/syscallent.h: Likewise.
* linux/microblaze/syscallent.h: Likewise.
* linux/sh/syscallent.h: Likewise.
* linux/sh64/syscallent.h: Likewise.
* tests/mmap.c (main): Remove old_mmap from expected output.
* tests/mmap.test: Remove old_mmap from the list of mmap syscalls.
2015-12-08 21:19:43 +00:00
69b7307225 Fix select and _newselect syscall entries
Change syscall names to match kernel __NR_* constants.
This reverts commit ddcf54969d.

* linux/arm/syscallent.h [82]: Rename "oldselect" to "select".
[142]: Rename "select" to "_newselect".
* linux/bfin/syscallent.h: Likewise.
* linux/i386/syscallent.h: Likewise.
* linux/m68k/syscallent.h: Likewise.
* linux/microblaze/syscallent.h: Likewise.
* linux/powerpc/syscallent.h [82]: Likewise.
* linux/powerpc64/syscallent.h: Likewise.
* linux/sh/syscallent.h: Likewise.
* linux/sh64/syscallent.h: Likewise.
* linux/hppa/syscallent.h [142]: Rename "select" to "_newselect".
* linux/mips/syscallent-n32.h [6022]: Rename "select" to "_newselect".
* linux/mips/syscallent-n64.h [5022]: Likewise.
* linux/mips/syscallent-o32.h [4142]: Likewise.
* linux/s390/syscallent.h [142]: Rename "select" to "_newselect".
* linux/sparc/syscallent.h [230]: Rename "select" to "_newselect".
* tests/oldselect.test: Rename oldselect to select.  Convert
from match_grep to match_diff.
* tests/oldselect.expected: Likewise.
* xselect.c: New file, based on select.c.
* tests/_newselect.c: New file.
* tests/select.c: Replace with a wrapper around xselect.c.
* tests/select.test: Parametrize.
* tests/_newselect.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add _newselect.
(TESTS): Add _newselect.test.
(EXTRA_DIST): Add xselect.c.
* tests/.gitignore: Add _newselect.
2015-12-08 21:19:40 +00:00
dd360922d1 Fix exit syscall entries
Change syscall names to match kernel __NR_* constants.

* linux/avr32/syscallent.h [1]: Rename "_exit" to "exit".
* linux/bfin/syscallent.h: Likewise.
* linux/i386/syscallent.h: Likewise.
* linux/m68k/syscallent.h: Likewise.
* linux/microblaze/syscallent.h: Likewise.
* linux/sh/syscallent.h: Likewise.
* linux/sh64/syscallent.h: Likewise.
* linux/x32/syscallent.h [60]: Rename "_exit" to "exit".
* linux/x86_64/syscallent.h: Likewise.
2015-12-08 21:19:35 +00:00
5090dde123 Fix pread64 and pwrite64 syscall entries
Change syscall names to match kernel __NR_* constants.

* linux/alpha/syscallent.h [349]: Rename "pread" to "pread64".
[350]: Rename "pwrite" to "pwrite64".
* linux/ia64/syscallent.h [1148]: Rename "pread" to "pread64".
[1149]: Rename "pwrite" to "pwrite64".
* linux/sh/syscallent.h [180]: Rename "pread" to "pread64".
[181]: Rename "pwrite" to "pwrite64".
* linux/sh64/syscallent.h: Likewise.
* linux/x32/syscallent.h [17]: Rename "pread" to "pread64".
[18]: Rename "pwrite" to "pwrite64".
* linux/x86_64/syscallent.h: Likewise.
2015-12-08 21:19:16 +00:00
718990f210 tests: sort the list of tests
* tests/Makefile.am (TESTS): Sort the list of regular tests.
* tests/.gitignore: Sort.
2015-12-08 19:07:24 +00:00
f04eeddbc5 ia64: fix remap_file_pages syscall entry
* linux/ia64/syscallent.h (1125): Set to remap_file_pages.
2015-12-08 04:16:15 +00:00
59281fc8a1 bfin, i386: remove sysentry for nonexistent security syscall
* linux/bfin/syscallent.h (223): Remove.
* linux/i386/syscallent.h: Likewise.
2015-12-08 02:51:02 +00:00
77c0cde116 build: add -D_FILE_OFFSET_BITS=64 to _CPPFLAGS instead of _CFLAGS
* tests/Makefile.am (fstat64_CFLAGS): Rename to fstat64_CPPFLAGS,
replace $(AM_CFLAGS) with $(AM_CPPFLAGS).
(fstatat64_CFLAGS): Rename to fstatat64_CPPFLAGS,
replace $(AM_CFLAGS) with $(AM_CPPFLAGS).
(ftruncate64_CFLAGS): Rename to ftruncate64_CPPFLAGS,
replace $(AM_CFLAGS) with $(AM_CPPFLAGS).
(lstat64_CFLAGS): Rename to lstat64_CPPFLAGS,
replace $(AM_CFLAGS) with $(AM_CPPFLAGS).
(mmap64_CFLAGS): Rename to mmap64_CPPFLAGS,
replace $(AM_CFLAGS) with $(AM_CPPFLAGS).
(newfstatat_CFLAGS): Rename to newfstatat_CPPFLAGS,
replace $(AM_CFLAGS) with $(AM_CPPFLAGS).
(stat64_CFLAGS): Rename to stat64_CPPFLAGS,
replace $(AM_CFLAGS) with $(AM_CPPFLAGS).
(statfs_CFLAGS): Rename to statfs_CPPFLAGS,
replace $(AM_CFLAGS) with $(AM_CPPFLAGS).
(truncate64_CFLAGS): Rename to truncate64_CPPFLAGS,
replace $(AM_CFLAGS) with $(AM_CPPFLAGS).
(uio_CFLAGS): Rename to uio_CPPFLAGS,
replace $(AM_CFLAGS) with $(AM_CPPFLAGS).
2015-12-08 00:29:42 +00:00
323cc92d60 Move x32 <asm/stat.h> replacement to x32 specific directory
As tests-m*32/Makefile.am files now refer to proper arch specific
directories, it's possible to relocate x32 <asm/stat.h> replacement
to its arch specific directory.

* linux/x86_64/asm_stat.h: Move ...
* linux/x32/asm_stat.h: ... here, remove x32 guard.
* Makefile.am (strace_SOURCES): Remove linux/x86_64/asm_stat.h.
2015-12-08 00:14:26 +00:00
860b3a692b build: set arch specific -m switches in tests-m*32/Makefile.am files properly
* tests/Makefile.am (ARCH_MFLAGS, AM_LDFLAGS): New variables.
(AM_CPPFLAGS): Use ARCH_MFLAGS.
* bootstrap: In tests-m32/Makefile.am and tests-mx32/Makefile.am,
add -m32 and -mx32, respectively, to ARCH_MFLAGS instead of AM_CFLAGS.
2015-12-08 00:14:10 +00:00
1e04e57a7a build: initialize ARCH variable in tests-m*32/Makefile.am files properly
* configure.ac (arch_m32): Set to sparc on sparc64, powerpc on
powerpc64, arm on aarch64, i386 on x86_64 and x32, $arch in other cases.
(arch_mx32): Set to x32 on x86_64, $arch in other cases.
(AC_SUBST): Add arch_m32 and arch_mx32.
* bootstrap: Substitute @arch@ with @arch_m32@ in tests-m32/Makefile.am.
Substitute @arch@ with @arch_mx32@ in tests-mx32/Makefile.am.
2015-12-08 00:13:38 +00:00
08a178366a tests: add umount.test and umount2.test
* tests/umount.c: New file.
* tests/umount2.c: Likewise.
* tests/umount.test: New test.
* tests/umount2.test: Likewise.
* tests/Makefile.am (check_PROGRAMS): Add umount and umount2.
(TESTS): Add umount.test and umount2.test.
* tests/.gitignore: Add umount and umount2.
2015-12-07 01:23:39 +00:00
6a8095eaed avr32: fix umount2 syscall entry
* linux/avr32/syscallent.h: Rename umount to umount2.
2015-12-07 00:38:43 +00:00
97af1be4c6 Update umount2 flags
* umount.c (MNT_FORCE, MNT_DETACH, MNT_EXPIRE): Move definitions ...
* xlat/umount_flags.in: ... here.  Add UMOUNT_NOFOLLOW.
2015-12-07 00:38:38 +00:00
431d7fd21a Print the first argument of umount2 syscall as a path
* umount.c (SYS_FUNC(umount2)): Use printpath instead of printstr.

This fixes Debian bug #785050.
2015-12-07 00:10:58 +00:00
eb76c4be15 prctl: add PR_CAP_AMBIENT parser
* xlat/pr_cap_ambient.in: New file.
* prctl.c: Include "xlat/pr_cap_ambient.h".
(SYS_FUNC(prctl)): Handle PR_CAP_AMBIENT.
2015-12-06 15:33:53 +00:00
1b283307d1 prctl: finish decoding of several commands on entering syscall
* prctl.c (SYS_FUNC(prctl)): Return RVAL_DECODED after decoding of
PR_GET_DUMPABLE, PR_GET_KEEPCAPS, PR_GET_SECCOMP, PR_GET_TIMERSLACK,
PR_GET_TIMING, and PR_CAPBSET_READ commands.
2015-12-06 15:29:04 +00:00
b165910f98 Fix build on systems that lack EM_FRV definition
* xlat/audit_arch.in: Guard AUDIT_ARCH_FRV with EM_FRV check.
2015-12-06 15:13:01 +00:00
4bbed305da times.test: workaround buggy libc
* tests/times.c: Include <sys/syscall.h>.
(main): On systems where user's and kernel's long types are the same,
prefer direct times syscall over libc's times function because
the latter is more prone to return value truncation.
2015-12-06 07:59:20 +00:00
fc0a22d40b times.test: reduce cpu time consumption, increase struct tms diversity
* tests/times.c (main): Reduce cpu time consumption fourfold,
make the parent process consume less cpu time than the child process
so that members of the structure returned by times syscall would be
more likely to contain different values.
2015-12-06 07:24:16 +00:00
bb509aafb6 mips n32, x32: fix printing of times syscall return value
As times syscall returns kernel's long value, it has to be printed as
RVAL_LUDECIMAL on systems where long type is less than kernel's long.

* times.c (SYS_FUNC(times)) [RVAL_LUDECIMAL && !IN_MPERS]:
Return RVAL_LUDECIMAL instead of RVAL_UDECIMAL.
2015-12-06 07:24:16 +00:00
4f109266ec unix-yy.test: fix portability issue
* tests/unix-yy-connect.awk (r_close_listen): Quote square brackets
that are not part of a bracket expression.
2015-12-06 07:24:16 +00:00
02d92d095c inet-cmsg.test: skip the test when the network is not functional
* tests/inet-cmsg.c (main): Return 77 if inet datagram socket
cannot be bound to INADDR_LOOPBACK.
2015-12-06 01:02:17 +00:00
2154702865 fcntl: skip F_GETLK64, F_SETLK64, and F_SETLKW64 in fcntl syscall parser
As the kernel recognizes F_GETLK64, F_SETLK64, and F_SETLKW64 commands
in fcntl64 syscall only, do not parse their structures in fcntl parser.

* xlat/fcntlcmds.in: Move F_GETLK64, F_SETLK64, and F_SETLKW64 ...
* xlat/fcntl64cmds.in: ... here.
* fcntl.c: Include "xlat/fcntl64cmds.h".
(print_fcntl): Move printing of first two syscall arguments
and handling of F_GETLK64, F_SETLK64, and F_SETLKW64 commands ...
(SYS_FUNC(fcntl), SYS_FUNC(fcntl64)): ... here.
* tests/fcntl.c: New file, based on struct_flock.c.
* tests/fcntl64.c: Likewise.
* tests/struct_flock.c (test_flock_einval, create_sample): New functions.
(test_flock): Use test_flock_einval.
(test_flock64, main): Remove.
* tests/fcntl.test: New test.
* tests/fcntl64.test: Likewise.
* tests/struct_flock.test: Remove.
* tests/Makefile.am (check_PROGRAMS): Add fcntl and fcntl64,
remove struct_flock.
(TESTS): Add fcntl.test and fcntl64.test, remove struct_flock.test.
(EXTRA_DIST) Add struct_flock.c.
* tests/.gitignore: Add fcntl and fcntl64, remove struct_flock.
2015-12-05 19:35:51 +00:00
03202dac48 print_fcntl: finish with unrecognized commands on entering syscall
* fcntl.c (print_fcntl): Merge two switch statements.
2015-12-05 17:54:26 +00:00
211d6ef4b6 fcntl: create a separate parser for fcntl64 syscall
* fcntl.c(print_fcntl): New function, made from SYS_FUNC(fcntl).
(SYS_FUNC(fcntl), SYS_FUNC(fcntl64)): Use it.
* linux/32/syscallent.h: Change parser of fcntl64 to SEN(fcntl64).
* linux/arm/syscallent.h: Likewise.
* linux/avr32/syscallent.h: Likewise.
* linux/bfin/syscallent.h: Likewise.
* linux/hppa/syscallent.h: Likewise.
* linux/i386/syscallent.h: Likewise.
* linux/m68k/syscallent.h: Likewise.
* linux/microblaze/syscallent.h: Likewise.
* linux/mips/syscallent-n32.h: Likewise.
* linux/mips/syscallent-o32.h: Likewise.
* linux/powerpc/syscallent.h: Likewise.
* linux/s390/syscallent.h: Likewise.
* linux/sh/syscallent.h: Likewise.
* linux/sh64/syscallent.h: Likewise.
* linux/sparc/syscallent.h: Likewise.
* linux/xtensa/syscallent.h: Likewise.
2015-12-04 23:12:14 +00:00
c9d2501a36 travis-ci: add build matrix 2015-12-05 00:04:12 +00:00
144a9db236 tests: replace old stat tests with stat.test and stat64.test
* tests/stat.c: Replace with a wrapper around lstatx.c
* tests/stat.test: Replace with a wrapper around statx.sh.
* tests/stat32-v.test: Remove.
* tests/stat32.c: Remove.
* tests/stat64-v.test: Remove.
* tests/stat64.c: New file.
* tests/stat64.test: New test.
* tests/Makefile.am (check_PROGRAMS): Replace stat32 with stat64.
(stat_CFLAGS): Rename to stat64_CFLAGS.
(TESTS): Replace stat32-v.test and stat64-v.test with stat64.test.
* tests/.gitignore: Replace stat32 with stat64.
2015-12-05 00:03:49 +00:00
38e37686f2 tests: add lstat.test and lstat64.test
* tests/lstat.c: New file.
* tests/lstat64.c: Likewise.
* tests/lstatx.c: Likewise.
* tests/lstat.test: New test.
* tests/lstat64.test: Likewise.
* tests/Makefile.am (check_PROGRAMS): Add lstat and lstat64.
(lstat64_CFLAGS): Define.
(TESTS): Add lstat.test and lstat64.test.
(EXTRA_DIST): Add lstatx.c.
* tests/.gitignore: Add lstat and lstat64.
2015-12-05 00:03:02 +00:00
c863827ddb tests: add fstat.test and fstat64.test
* tests/fstat.c: New file.
* tests/fstat64.c: Likewise.
* tests/fstatx.c: Likewise.
* tests/fstat.test: New test.
* tests/fstat64.test: Likewise.
* tests/Makefile.am (check_PROGRAMS): Add fstat and fstat64.
(fstat64_CFLAGS): Define.
(TESTS): Add fstat.test and fstat64.test.
(EXTRA_DIST): Add fstatx.c.
* tests/.gitignore: Add fstat and fstat64.
2015-12-05 00:02:44 +00:00
cc2baf339f tests: prepare for detailed testing of stat family syscalls
Parametrize code from fstatat.c to support <asm/stat.h>
as an alternative to <sys/stat.h> and move it to a separate file.

* tests/statx.sh: New file, based on fstatat64.test.
* tests/fstatat64.test: Use it.
* tests/newfstatat.test: Likewise.
* tests/xstatx.c: New file, based on fstatat.c.
* tests/fstatat.c: Use it.
* tests/Makefile.am (EXTRA_DIST): Add statx.sh and xstatx.c.
* tests/fstatat64.c (FSTATAT_NAME): Change to TEST_SYSCALL_NAME.
* tests/newfstatat.c: Likewise.
2015-12-05 00:01:56 +00:00
8b6046a052 ioctl: allow to stop decoding number
For some ioctls, like from drm, the identification of the correct ioctl
is done by custom code.  Specifying IOCTL_NUMBER_STOP_LOOKUP on
return of ioctl_decode_command_number() disables further calls to
ioctl_lookup().

* defs.h (IOCTL_NUMBER_UNKNOWN, IOCTL_NUMBER_HANDLED,
IOCTL_NUMBER_STOP_LOOKUP): Add macros representing ioctl number state
decoding.
* ioctl.c (SYS_FUNC(ioctl)): Skip ioctl_lookup() when
ioctl_decode_command_number() returns a value with
IOCTL_NUMBER_STOP_LOOKUP flag is set.

Suggested-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Signed-off-by: Gabriel Laskar <gabriel@lse.epita.fr>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-12-04 18:05:38 +00:00
5421855219 tests: skip restart_syscall.test on x32
The syscall number of restart_syscall returned by the kernel in case
of ERESTART_RESTARTBLOCK is broken on x32 from the beginning, see
https://lkml.org/lkml/2015/11/30/790

Until that improves, skip the test on x32.

* tests/restart_syscall.c (main) [__x86_64__ && __ILP32__]: Return 77.
2015-12-04 16:57:23 +00:00
a5aa080ae6 x32: fix decoding of i386 personality lseek syscall
On x32, tcp->ext_arg is not initialized for i386 personality,
so tcp->u_arg has to be used instead.

* lseek.c (SYS_FUNC(lseek)) [X32]: Handle "current_personality == 1" case.
2015-12-04 16:42:30 +00:00
cfde1e3f0f x86_64, x32: add a replacement for <asm/stat.h>
Some old kernel headers, Ubuntu 14.04 in particular, provide
<asm/stat.h> editions that are completely wrong for x32.
Workaround this issue by providing a replacement.

* linux/x86_64/asm_stat.h: New file.
* linux/x32/asm_stat.h: Likewise.
* Makefile.am (strace_SOURCES): Add them.
2015-12-04 15:22:58 +00:00
c31481fc68 Add a wrapper around <asm/stat.h>
* linux/asm_stat.h: New file.
* Makefile.am (strace_SOURCES): Add it.
* file.c: Use it.
2015-12-04 15:03:12 +00:00
5627cf9080 kernel_types.h: protect from double inclusion
* kernel_types.h: Add #include guard.
2015-12-04 14:32:52 +00:00
530d462783 fstatat64.test: lift /proc requirement
While -P option needs /proc to match descriptors, it does not use
/proc to match pathnames.  As this test does not need descriptor
match, the /proc requirement can be safely lifted.

* tests/fstatat64.test: Lift /proc/self/fd/ requirement.
2015-12-03 15:48:43 +00:00
b0e61152ca tests: add fstatat64.test and newfstatat.test
* configure.ac (AC_CHECK_FUNCS): Add fstatat, ftruncate, and futimens.
* tests/fstatat.c: New file.
* tests/fstatat64.c: Likewise.
* tests/newfstatat.c: Likewise.
* tests/fstatat64.test: New test.
* tests/newfstatat.test: Likewise.
* tests/Makefile.am (check_PROGRAMS): Add fstatat64 and newfstatat.
(fstatat64_CFLAGS, newstatat_CFLAGS): Define.
(TESTS): Add fstatat64.test and newfstatat.test.
(EXTRA_DIST): Add fstatat.c.
* tests/.gitignore: Add fstatat64 and newfstatat.
2015-12-02 01:02:39 +00:00
84940d4892 alpha, ppc, sh, sh64: fix fstatat64 syscall entries
* linux/alpha/syscallent.h (newfstatat): Change sys_name to fstatat64.
* linux/powerpc/syscallent.h: Likewise.
* linux/sh/syscallent.h: Likewise.
* linux/sh64/syscallent.h: Likewise.
2015-12-01 11:35:21 +00:00
fdb3544ef2 ppc64: clone syscallent.h from ppc
* linux/powerpc64/syscallent.h: Clone from linux/powerpc/syscallent.h
with entries for numbers 192..197, 204, 226, and 254 unassigned.
2015-12-01 11:28:43 +00:00
9db0797b22 tests: add lseek.test and llseek.test
* tests/llseek.c: New file.
* tests/lseek.c: Likewise.
* tests/llseek.test: New test.
* tests/lseek.test: Likewise.
* tests/Makefile.am (check_PROGRAMS): Add llseek and lseek.
(TESTS): Add llseek.test and lseek.test.
* tests/.gitignore: Add llseek and lseek.
2015-12-01 08:29:12 +00:00
431d63c13f tests: add ftruncate64.test and truncate64.test
* tests/ftruncate64.c: New file.
* tests/truncate64.c: Likewise.
* tests/ftruncate64.test: New test.
* tests/truncate64.test: Likewise.
* tests/Makefile.am (check_PROGRAMS): Add ftruncate64 and truncate64.
(ftruncate64_CFLAGS, truncate64_CFLAGS): Define.
(TESTS): Add ftruncate64.test and truncate64.test.
* tests/.gitignore: Add ftruncate64 and truncate64.
2015-12-01 08:28:45 +00:00
c1bb87a99d tests: add ftruncate.test and truncate.test
* tests/ftruncate.c: New file.
* tests/truncate.c: Likewise.
* tests/ftruncate.test: New test.
* tests/truncate.test: Likewise.
* tests/Makefile.am (check_PROGRAMS): Add ftruncate and truncate.
(TESTS): Add ftruncate.test and truncate.test.
* tests/.gitignore: Add ftruncate and truncate.
2015-12-01 08:28:42 +00:00
170a4cfe1c build: robustify linux/fcntl.h check
* configure.ac (AC_CHECK_TYPES): Support older linux kernel headers
by including <sys/types.h> before <linux/fcntl.h>.
2015-11-30 16:20:19 +00:00
7386ca7a07 syscall.c: move inclusion of arch specific files to the end of file
Move inclusion of arch specific files that define static functions to
the end of syscall.c.

* syscall.c (get_syscall_result_regs, get_error, getregs_old):
New forward declarations.
(arch_get_scno): Move forward.
Move inclusion of "get_scno.c", "get_syscall_args.c",
"get_syscall_result.c", "get_error.c", and "getregs_old.c"
to the end of file.
2015-11-30 15:31:30 +00:00
f3e9e61d78 x86_64: change getregs_old to forward ptrace return code
* linux/x86_64/getregs_old.c (getregs_old): Change to return ptrace
return code.
* syscall.c (get_regs) [ARCH_REGS_FOR_GETREGSET && X86_64]: Use
getregs_old return code.
2015-11-30 15:30:05 +00:00
5105d4ac96 Cleanup print_pc
Apparently, there are only two types of instruction pointer printers
depending on the architecture: those that print a register that was
fetched earlier, and those that fetch a register themselves using upeek.
With this change, architectures of the first type have ARCH_PC_REG
defined in their arch_regs.c file, architectures of the first type
have ARCH_PC_PEEK_ADDR defined there, and the common code in syscall.c
uses these macros to print the instruction pointer.

* Makefile.am (EXTRA_DIST): Remove linux/*/print_pc.c.
* linux/*/print_pc.c: Remove.
* linux/aarch64/arch_regs.c(ARCH_PC_REG): Define macro.
* linux/arc/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/arm/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/avr32/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/i386/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/ia64/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/metag/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/mips/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/nios2/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/or1k/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/powerpc64/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/powerpc/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/s390/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/s390x/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/sparc64/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/sparc/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/tile/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/x32/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/x86_64/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/alpha/arch_regs.c(ARCH_PC_PEEK_ADDR): Define macro.
* linux/bfin/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/crisv10/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/crisv32/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/hppa/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/m68k/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/microblaze/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/sh64/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/sh/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/xtensa/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* syscall.c (print_pc): Stop including "print_pc.c".
Use ARCH_PC_REG or ARCH_PC_PEEK_ADDR.
2015-11-30 03:30:51 +00:00
16510517f1 cleanup: make get_scno.c files more readable
Make get_scno.c files more self-contained.  While they are still
being included by syscall.c, the latter no longer provides
a function framework for them.

* linux/aarch64/get_scno.c (arch_get_scno): Define.
* linux/alpha/get_scno.c: Likewise.
* linux/arc/get_scno.c: Likewise.
* linux/arm/get_scno.c: Likewise.
* linux/avr32/get_scno.c: Likewise.
* linux/bfin/get_scno.c: Likewise.
* linux/crisv10/get_scno.c: Likewise.
* linux/hppa/get_scno.c: Likewise.
* linux/i386/get_scno.c: Likewise.
* linux/ia64/get_scno.c: Likewise.
* linux/m68k/get_scno.c: Likewise.
* linux/metag/get_scno.c: Likewise.
* linux/microblaze/get_scno.c: Likewise.
* linux/mips/get_scno.c: Likewise.
* linux/nios2/get_scno.c: Likewise.
* linux/or1k/get_scno.c: Likewise.
* linux/powerpc/get_scno.c: Likewise.
* linux/powerpc64/get_scno.c: Likewise.
* linux/s390/get_scno.c: Likewise.
* linux/sh/get_scno.c: Likewise.
* linux/sh64/get_scno.c: Likewise.
* linux/sparc/get_scno.c: Likewise.
* linux/sparc64/get_scno.c: Likewise.
* linux/tile/get_scno.c: Likewise.
* linux/x86_64/get_scno.c: Likewise.
* linux/xtensa/get_scno.c: Likewise.
* syscall.c (arch_get_scno): New declaration.
Include "get_scno.c" in file scope.
(get_scno): Use arch_get_scno.

Requested-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-11-30 01:46:52 +00:00
64672a6526 cleanup: make get_syscall_args.c files more readable
Make get_syscall_args.c files more self-contained.  While they are
still being included by syscall.c, the latter no longer defines
get_syscall_args function.

* linux/aarch64/get_syscall_args.c: Include "arm/get_syscall_args.c"
with get_syscall_args temporarily defined to arm_get_syscall_args.
(get_syscall_args): Define.
* linux/alpha/get_syscall_args.c (get_syscall_args): Define.
* linux/arc/get_syscall_args.c: Likewise.
* linux/arm/get_syscall_args.c: Likewise.
* linux/avr32/get_syscall_args.c: Likewise.
* linux/bfin/get_syscall_args.c: Likewise.
* linux/crisv10/get_syscall_args.c: Likewise.
* linux/hppa/get_syscall_args.c: Likewise.
* linux/i386/get_syscall_args.c: Likewise.
* linux/ia64/get_syscall_args.c: Likewise.
* linux/m68k/get_syscall_args.c: Likewise.
* linux/metag/get_syscall_args.c: Likewise.
* linux/microblaze/get_syscall_args.c: Likewise.
* linux/mips/get_syscall_args.c: Likewise.
* linux/nios2/get_syscall_args.c: Likewise.
* linux/or1k/get_syscall_args.c: Likewise.
* linux/powerpc/get_syscall_args.c: Likewise.
* linux/s390/get_syscall_args.c: Likewise.
* linux/sh/get_syscall_args.c: Likewise.
* linux/sh64/get_syscall_args.c: Likewise.
* linux/sparc/get_syscall_args.c: Likewise.
* linux/tile/get_syscall_args.c: Likewise.
* linux/x86_64/get_syscall_args.c: Likewise.
* linux/xtensa/get_syscall_args.c: Likewise.
* syscall.c (get_syscall_args): Remove.
Include "get_syscall_args.c" in file scope.

Requested-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-11-30 00:57:14 +00:00
f51aec6abf cleanup: make get_syscall_result.c files more readable
Make get_syscall_result.c files more self-contained.  While they are
still being included by syscall.c, the latter no longer provides
a function framework for them.

* linux/alpha/get_syscall_result.c (get_syscall_result_regs): Define.
* linux/bfin/get_syscall_result.c: Likewise.
* linux/crisv10/get_syscall_result.c: Likewise.
* linux/hppa/get_syscall_result.c: Likewise.
* linux/m68k/get_syscall_result.c: Likewise.
* linux/microblaze/get_syscall_result.c: Likewise.
* linux/sh/get_syscall_result.c: Likewise.
* linux/sh64/get_syscall_result.c: Likewise.
* linux/xtensa/get_syscall_result.c: Likewise.
* syscall.c [!ARCH_REGS_FOR_GETREGSET && !ARCH_REGS_FOR_GETREGS]:
Define USE_GET_SYSCALL_RESULT_REGS macro.
[USE_GET_SYSCALL_RESULT_REGS]: Include "get_syscall_result.c".
(get_syscall_result) [USE_GET_SYSCALL_RESULT_REGS]: Stop including
"get_syscall_result.c".  Call get_syscall_result_regs.

Requested-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-11-30 00:01:01 +00:00
0c8c5c9f4e cleanup: make get_error.c files more readable
Make get_error.c files more self-sustained.  While they are still being
included by syscall.c, the latter no longer defines get_error function.

* linux/aarch64/get_error.c: Include "arm/get_error.c" with get_error
temporarily defined to arm_get_error.
(get_error): Define.
* linux/alpha/get_error.c (get_error): Define.
* linux/arc/get_error.c: Likewise.
* linux/arm/get_error.c: Likewise.
* linux/avr32/get_error.c: Likewise.
* linux/bfin/get_error.c: Likewise.
* linux/crisv10/get_error.c: Likewise.
* linux/hppa/get_error.c: Likewise.
* linux/i386/get_error.c: Likewise.
* linux/ia64/get_error.c: Likewise.
* linux/m68k/get_error.c: Likewise.
* linux/metag/get_error.c: Likewise.
* linux/microblaze/get_error.c: Likewise.
* linux/mips/get_error.c: Likewise.
* linux/nios2/get_error.c: Likewise.
* linux/or1k/get_error.c: Likewise.
* linux/powerpc/get_error.c: Likewise.
* linux/s390/get_error.c: Likewise.
* linux/sh/get_error.c: Likewise.
* linux/sh64/get_error.c: Likewise.
* linux/sparc/get_error.c: Likewise.
* linux/sparc64/get_error.c: Likewise.
* linux/tile/get_error.c: Likewise.
* linux/x86_64/get_error.c: Likewise.
* linux/xtensa/get_error.c: Likewise.
* syscall.c: Include "get_error.c" in file scope.
(get_error): Remove.  Move arch independent code ...
(get_syscall_result): ... here.  Update get_error invocation.

Requested-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-11-29 00:06:45 +00:00
527b42ff8d cleanup: make arch_sigreturn.c files more readable
Make arch_sigreturn.c files more self-sustained.  While they are
still being included by sigreturn.c, the latter no longer defines
arch_sigreturn function.

* linux/alpha/arch_sigreturn.c (arch_sigreturn): Define.
* linux/arm/arch_sigreturn.c: Likewise.
* linux/crisv10/arch_sigreturn.c: Likewise.
* linux/i386/arch_sigreturn.c: Likewise.
* linux/ia64/arch_sigreturn.c: Likewise.
* linux/m68k/arch_sigreturn.c: Likewise.
* linux/microblaze/arch_sigreturn.c: Likewise.
* linux/mips/arch_sigreturn.c: Likewise.
* linux/powerpc/arch_sigreturn.c: Likewise.
* linux/s390/arch_sigreturn.c: Likewise.
* linux/sparc/arch_sigreturn.c: Likewise.
* linux/tile/arch_sigreturn.c: Likewise.
* linux/x32/arch_sigreturn.c: Remove code.
Include "x86_64/arch_sigreturn.c".
* linux/x86_64/arch_sigreturn.c: Stop including "x32/arch_sigreturn.c".
Include "i386/arch_sigreturn.c" with arch_sigreturn temporarily defined
to i386_arch_sigreturn.
(arch_sigreturn): Define.  Add x32 personality support there.
* sigreturn.c: Remove arch_sigreturn header and footer.

Requested-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-11-28 02:58:29 +00:00
690235ab0f Add initial Travis CI support
* .travis.yml: New file.
* travis-ci.sh: Likewise.
2015-11-26 17:07:33 +00:00
e8199b25e0 tests: remove temporary files left after two tests
* tests/net-yy.test: Remove "$LOG"-connect and "$LOG"-accept.
* tests/unix-yy.test: Likewise.
2015-11-27 17:24:46 +00:00
2400e9ea54 tests: skip stat32-v.test on x32
Explicitly skip 32-bit stat test on x32 even if libc pretends
to support it.

* tests/stat.c (main) [__x86_64__ && __ILP32__]: Skip.
2015-11-27 17:06:38 +00:00
0ca438d13b tests: fix ipc_msgbuf.test on x32
* tests/ipc_msgbuf.c: Include "config.h" and "kernel_types.h".
(main): Replace "long" with "kernel_long_t" in struct msgbuf.
2015-11-27 14:15:30 +00:00
4408e8595c x32: fix pselect6 decoding
* desc.c: Include "kernel_types.h".
(umove_kulong_array_or_printaddr): New function.
(SYS_FUNC(pselect6)): Use it.
2015-11-27 04:37:46 +00:00
26207512e2 x32: fix sigreturn decoding
* linux/x32/arch_sigreturn.c: Implement x32_rt_sigreturn decoding.
* linux/x86_64/arch_sigreturn.c: Handle (current_personality == 0)
case only.
Include "x32/arch_sigreturn.c" instead of "i386/arch_sigreturn.c".
2015-11-27 03:34:23 +00:00
bdb07e38dd x32: fix struct dirent decoding
* kernel_types.h: New file.
* Makefile.am (strace_SOURCES): Add it.
* configure.ac (AC_CHECK_TYPES): Check for __kernel_long_t
and __kernel_ulong_t in <asm/posix_types.h>.
* dirent.c: Stop including <dirent.h>.
(kernel_dirent): Remove.
Include "kernel_types.h".
(print_old_dirent, SYS_FUNC(getdents)): Print variables
of kernel_ulong_t type using %Lu format.
* syscall.c (kernel_long_t, kernel_ulong_t): Remove.
Include "kernel_types.h".
* tests/getdents.c (kernel_dirent): Remove.
Include "kernel_types.h".
(print_dirent): Print variables of kernel_ulong_t type using %Lu format.
2015-11-27 01:51:22 +00:00
a2fdfe96d5 Refer to -h on incorrect usage
* defs.h (error_msg_and_help): New prototype.
* strace.c (error_msg_and_help): New function.
(error_opt_arg, init): Use it.
(usage): Remove unnecessary arguments.
* count.c: Use the new function.
2015-11-27 02:38:59 +03:00
3272d2902c Rearrange flags descriptions in the usage text
* strace.c (usage): Rearrange descriptions.
* tests/strace-k.test: Change the option detecting regexp accordingly.
2015-11-27 02:38:57 +03:00
4f7db9ac82 tests: run in "set -x" mode if VERBOSE variable is non-null
* tests/init.sh: Enter "set -x" mode if $VERBOSE is non-null.
2015-11-26 21:25:31 +00:00
9c40599755 tests: fix match_diff usage
Fix argument order in match_diff invocations:
the first argument has to be actual output,
the second argument has to be expected output.

* tests/aio.test: Swap match_diff arguments.
* tests/clock_nanosleep.test: Likewise.
* tests/clock_xettime.test: Likewise.
* tests/file_handle.test: Likewise.
* tests/getdents.test: Likewise.
* tests/getdents64.test: Likewise.
* tests/getrandom.test: Likewise.
* tests/inet-cmsg.test: Likewise.
* tests/ioctl.test: Likewise.
* tests/membarrier.test: Likewise.
* tests/mlock2.test: Likewise.
* tests/nanosleep.test: Likewise.
* tests/pselect6.test: Likewise.
* tests/readdir.test: Likewise.
* tests/readlink.test: Likewise.
* tests/readlinkat.test: Likewise.
* tests/rt_sigqueueinfo.test: Likewise.
* tests/seccomp.test: Likewise.
* tests/select.test: Likewise.
* tests/sendfile.test: Likewise.
* tests/sendfile64.test: Likewise.
* tests/struct_flock.test: Likewise.
* tests/sysinfo.test: Likewise.
* tests/time.test: Likewise.
* tests/timer_create.test: Likewise.
* tests/timer_xettime.test: Likewise.
* tests/timerfd_xettime.test: Likewise.
* tests/times-fail.test: Likewise.
* tests/times.test: Likewise.
* tests/umovestr2.test: Likewise.
* tests/userfaultfd.test: Likewise.
* tests/utime.test: Likewise.
* tests/utimensat.test: Likewise.
* tests/xet_robust_list.test: Likewise.
* tests/xetitimer.test: Likewise.
* tests/xettimeofday.test: Likewise.
2015-11-26 20:36:35 +00:00
c6e5e2c134 x86_64: fix x32 personality support in print_llu_from_low_high_val
x86 is the only personality supported on x86_64
that has 32-bit syscall arguments.

* io.c (print_llu_from_low_high_val) [X86_64]: Fix
current_personality == 2 case.
2015-11-26 20:29:25 +00:00
6974c91c02 x86_64: fix x32 personality support in getllval
x86 is the only personality supported on x86_64
that has 32-bit syscall arguments.

* util.c (getllval) [X86_64]: Fix current_personality == 2 case.
2015-11-26 18:25:34 +00:00
4c65ff00ee tests/file_handle: fix expected output
* tests/file_handle.c (main): Parametrize handle_type
in open_by_handle_at parser output.
2015-11-26 16:49:39 +00:00
bb746ff803 startup_attach: fix compilation warning
* strace.c (startup_attach): Split single error_msg statement with
variable number of arguments to silence a compilation warning.
2015-11-26 01:56:44 +00:00
db9af94715 .gitignore: add mpers_xlat.h
Ignore mpers_xlat.h generated since commit v4.10-454-g5cb45b2.

* .gitignore: Add /mpers_xlat.h.

Reported-by: Elvira Khabirova <lineprinter0@gmail.com>
2015-11-26 01:49:36 +00:00
cc1e149be9 tests: add struct_flock.test
* tests/struct_flock.c: New file.
* tests/struct_flock.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add struct_flock.
(TESTS): Add struct_flock.test.
* tests/.gitignore: Add struct_flock.
2015-11-26 01:37:35 +00:00
1a713d9c8e Convert parsers of flock structures to new mpers infrastructure
* fetch_struct_flock.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* fcntl.c (print_struct_flock64): New function.
(printflock64): Use fetch_struct_flock64 and print_struct_flock64.
(printflock): Use fetch_struct_flock and print_struct_flock64.
2015-11-26 01:37:34 +00:00
c7c5270966 fcntl.c: implement decoding for all known operations
* xlat/f_owner_types.in: New file.
* xlat/f_seals.in: Likewise.
* fcntl.c: Include "xlat/f_owner_types.h" and "xlat/f_seals.h".
(print_f_owner_ex): New function.
(SYS_FUNC(fcntl)): Use it.
Handle F_SETPIPE_SZ, F_GETPIPE_SZ, F_OFD_SETLKW,
F_OFD_SETLK, F_SETOWN_EX, F_ADD_SEALS, F_SETSIG,
F_OFD_GETLK, F_GETOWN_EX, F_GET_SEALS, F_GETSIG.
2015-11-26 01:37:34 +00:00
46129c998a fcntl.c: mark F_DUPFD and F_DUPFD_CLOEXEC return code with RVAL_FD flag
* fcntl.c (SYS_FUNC(fcntl)): Set RVAL_FD flag in the return code
for F_DUPFD and F_DUPFD_CLOEXEC operations.
2015-11-26 01:37:34 +00:00
5cad846407 fcntl.c: remove redundant ifdefs
* fcntl.c (USE_PRINTFLOCK64): Remove macro.
(printflock64): Define unconditionally.
(SYS_FUNC(fcntl)): Do not check for USE_PRINTFLOCK64,
F_DUPFD_CLOEXEC, F_NOTIFY, F_SETLEASE, and F_GETLEASE macros.
2015-11-26 01:37:34 +00:00
bcc73975fd Update F_* constants
* xlat/fcntlcmds.in: Add F_SETOWN_EX, F_GETOWN_EX, F_GETOWNER_UIDS,
F_OFD_GETLK, F_OFD_SETLK, F_OFD_SETLKW, and F_CANCELLK.
Remove F_ALLOCSP, F_BLKSIZE, F_BLOCKS, F_CHKFL, F_CNVT, F_DUP2FD,
F_ISSTREAM, F_NPRIV, F_PRIV, F_QUOTACL, F_REVOKE, F_RGETLK, F_RSETLK,
F_RSETLKW, F_SHARE, and F_UNSHARE.
Add default values.
2015-11-26 01:37:34 +00:00
db62a712f9 Update LOCK_* constants
* xlat/flockcmds.in: Add LOCK_MAND, LOCK_READ, LOCK_WRITE, and LOCK_RW.
Add default values.
2015-11-26 01:37:34 +00:00
6250e6c5ed fcntl.c: use <linux/fcntl.h> instead of <fcntl.h>
Include <linux/fcntl.h> for proper definitions of F_* constants
and flock structures.

* configure.ac (AC_CHECK_TYPES): Check for struct flock, struct flock64,
struct __kernel_flock, and struct __kernel_flock64 in <linux/fcntl.h>.
* flock.h: New file.
* Makefile.am (strace_SOURCES): Add it.
* fcntl.c: Include it instead of <fcntl.h>.
(struct flock64): Remove.
(printflock): Use struct_kernel_flock instead of struct flock.
(printflock64): Use struct_kernel_flock64 instead of struct flock64.
2015-11-26 01:37:34 +00:00
a5ffa18f13 mpers: fix compound types with arbitrary member alignments
* mpers.sh: Compound types are now represented as packed
with character arrays as explicit fillers inbetween members
and at the end.
2015-11-26 01:37:34 +00:00
ba10a421b8 Support C libraries without System V shared memory/ipc
Some systems (like Bionic) omit support for SysV related code.  That
means no C library headers for strace to include.  Add configure tests
to probe the headers from the kernel and use them when they are
available.

It might make more sense to never rely on the C library's headers as
there is no guarantee or requirement that the structure layout between
apps and the C library match that what is passed to the kernel.

* configure.ac (AC_CHECK_HEADERS): Check for linux/ipc.h,
linux/mqueue.h, linux/msg.h, linux/sem.h, linux/shm.h,
sys/ipc.h, sys/msg.h, sys/sem.h, and sys/shm.h.
* ipc_defs.h: Include <sys/ipc.h> or <linux/ipc.h> depending
on what is available.
* ipc_msg.c: Replace <sys/ipc.h> with "ipc_defs.h".
Fallback to <linux/msg.h> when available.
* ipc_msgctl.c: Include <sys/msg.h>, <asm/msgbuf.h>, or <linux/msg.h>
based on what is available.  Note missing support for old ipc structs.
* ipc_sem.c: Include <sys/sem.h> or <linux/sem.h> depending
on what is available.  Only decode sembuf when available.
* ipc_shm.c: Fallback to <linux/shm.h> when available.
* ipc_shmctl.c: Include <sys/shm.h>, <asm/shmbuf.h>, or <linux/shm.h>
based on what is available.  Note missing support for old ipc structs.
* print_mq_attr.c: Fallback to <linux/mqueue.h> when available.
2015-11-26 01:36:58 +00:00
3422849673 CREDITS.in: add Jian Zhen
Thanks to Jian Zhen for donation of https://github.com/strace/ and
strace.io.

* CREDITS.in: Add Jian Zhen.
2015-11-25 19:10:56 +00:00
329288b6f9 Fix syscall entries of unimplemented getpmsg and putpmsg syscalls
* linux/ia64/syscallent.h (getpmsg): Change SEN(printargs)
to SEN(getpmsg).
(putpmsg): Change SEN(printargs) to SEN(putpmsg).
* linux/mips/syscallent-n32.h: Likewise.
* linux/mips/syscallent-n64.h: Likewise.
* linux/mips/syscallent-o32.h: Likewise.
* linux/arm/syscallent.h (getpmsg, putpmsg): Set sys_flags to TN.
* linux/bfin/syscallent.h (getpmsg, putpmsg): Likewise.
* linux/hppa/syscallent.h (getpmsg, putpmsg): Likewise.
* linux/i386/syscallent.h (getpmsg, putpmsg): Likewise.
* linux/m68k/syscallent.h (getpmsg, putpmsg): Likewise.
* linux/microblaze/syscallent.h (getpmsg, putpmsg): Likewise.
* linux/powerpc/syscallent.h (getpmsg, putpmsg): Likewise.
* linux/s390/syscallent.h (getpmsg, putpmsg): Likewise.
* linux/s390x/syscallent.h (getpmsg, putpmsg): Likewise.
* linux/x32/syscallent.h (getpmsg, putpmsg): Likewise.
* linux/x86_64/syscallent.h (getpmsg, putpmsg): Likewise.
2015-11-24 02:50:40 +00:00
a56a81c1ec Remove parsers of getpmsg and putpmsg syscalls
These system calls are not implemented in the Linux kernel.

* linux/dummy.h(getpmsg, putpmsg): Move to the list of deprecated
syscalls.
* Makefile.am (strace_SOURCES): Remove stream.c.
* stream.c: Remove.
* xlat/pmsgflags.in: Remove.
2015-11-24 02:42:38 +00:00
aae525f94e Remove parser of query_module syscall
Since query_module syscall is present only in kernels before Linux 2.6
and strace does not support those kernels, there is no use to keep this
parser any longer.

* bjm.c: Do not include <sys/*>, "xlat/qm_which.h",
and "xlat/modflags.h".
(MOD_*, QM_*, module_symbol, module_info, SYS_FUNC(query_module)):
Remove.
* linux/dummy.h (sys_query_module): Add stub alias.
* xlat/modflags.in: Remove.
* xlat/qm_which.in: Remove.
2015-11-24 02:30:45 +00:00
25cb5cb04f Fix syscall entries of deprecated sysfs syscall
* linux/alpha/syscallent.h (sysfs): Change nargs from 5 to 3.
* linux/hppa/syscallent.h (sysfs): Likewise.
* linux/mips/syscallent-n32.h (sysfs): Likewise.
* linux/mips/syscallent-n64.h (sysfs): Likewise.
2015-11-24 02:23:18 +00:00
10bd3157b8 Move sysfs syscall to deprecated category
* linux/dummy.h (sys_sysfs): Move to the list of deprecated syscalls.
2015-11-24 02:21:35 +00:00
a318cc0532 Fix syscall entries of deprecated bdflush syscall
* linux/alpha/syscallent.h (bdflush): Change nargs from 0 to 2.
* linux/arm/syscallent.h (bdflush): Likewise.
* linux/avr32/syscallent.h (bdflush): Likewise.
* linux/bfin/syscallent.h (bdflush): Likewise.
* linux/hppa/syscallent.h (bdflush): Likewise.
* linux/i386/syscallent.h (bdflush): Likewise.
* linux/ia64/syscallent.h (bdflush): Likewise.
* linux/m68k/syscallent.h (bdflush): Likewise.
* linux/microblaze/syscallent.h (bdflush): Likewise.
* linux/powerpc/syscallent.h (bdflush): Likewise.
* linux/s390/syscallent.h (bdflush): Likewise.
* linux/s390x/syscallent.h (bdflush): Likewise.
* linux/sh/syscallent.h (bdflush): Likewise.
* linux/sh64/syscallent.h (bdflush): Likewise.
* linux/sparc/syscallent.h (bdflush): Likewise.
2015-11-24 02:17:48 +00:00
4b3a1703bd Implement name_to_handle_at and open_by_handle_at syscalls decoding
* file_handle.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* linux/dummy.h (sys_name_to_handle_at, sys_open_by_handle_at):
Remove stub aliases.
* pathtrace.c (pathtrace_match): Add SEN_name_to_handle_at.
* tests/file_handle.c: New file.
* tests/file_handle.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add file_handle.
(TESTS): Add file_handle.test.
* tests/.gitignore: Add file_handle.
2015-11-22 23:21:35 +00:00
60d7524090 Implement lookup_dcookie syscall decoding
* lookup_dcookie.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* linux/dummy.h (sys_lookup_dcookie): Remove stub alias.
2015-11-22 23:10:12 +00:00
ea1970500e Implement kexec_file_load syscall decoding
* xlat/kexec_file_load_flags.in: New file.
* kexec.c: Include "xlat/kexec_file_load_flags.h".
(SYS_FUNC(kexec_file_load)): New function.
* linux/dummy.h (sys_kexec_file_load): Remove stub alias.
* pathtrace.c (pathtrace_match): Add SEN_kexec_file_load.
2015-11-22 23:10:12 +00:00
7aa9c0d299 Implement kcmp syscall decoding
* kcmp.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* linux/dummy.h (sys_kcmp): Remove stub alias.
* xlat/kcmp_types.in: New file.
2015-11-22 23:10:12 +00:00
dcd00c3943 Implement iopl syscall decoding
* iopl.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* linux/dummy.h (sys_iopl): Remove stub alias.
2015-11-22 23:10:12 +00:00
2aa180e36a Implement ioperm syscall decoding
* ioperm.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* linux/dummy.h (sys_ioperm): Remove stub alias.
2015-11-22 23:10:12 +00:00
a17f593e50 net: fix printing of IP_RECVOPTS/IP_RETOPTS cmsg options
* net.c (print_cmsg_ip_opts): Print each byte as unsigned char.
2015-11-22 23:09:59 +00:00
87d64ed61f userfaultfd: fix pathtrace support
* pathtrace.c (pathtrace_match): Add SEN_userfaultfd.
2015-11-22 19:59:58 +00:00
1f111cff5a Implement IPPROTO_IP control messages decoding
* net.c: Include "xlat/ip_cmsg_types.h".
(print_cmsg_ip_pktinfo, print_cmsg_ip_ttl, print_cmsg_ip_tos,
print_cmsg_ip_opts, print_cmsg_ip_recverr, print_cmsg_ip_checksum,
print_cmsg_ip_origdstaddr): New functions.
(print_cmsg_type_data): Add generic SOL_IP level decoding.
Use these functions for decoding of IP_PKTINFO, IP_TTL, IP_TOS,
IP_RECVOPTS, IP_RETOPTS, IP_RECVERR, IP_ORIGDSTADDR, IP_CHECKSUM,
and SCM_SECURITY type messages.
* xlat/ip_cmsg_types.in: New file.
* xlat/sockipoptions.in: Move IP_RETOPTS before IP_RECVRETOPTS.
* tests/inet-cmsg.c: New file.
* tests/inet-cmsg.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add inet-cmsg.
(TESTS): Add inet-cmsg.test.
* tests/.gitignore: Add inet-cmsg.

Suggested-by: Orion Poplawski <orion@cora.nwra.com>
2015-11-22 02:56:45 +00:00
1103b4ee86 Simplify control messages printers
Do not pass sizeof(struct cmsghdr) to every cmsg printer.

* net.c (printcmsghdr): Pass pointer to cmsg_data and length
of cmsg_data to print_cmsg_type_data.
(print_cmsg_type_data): Update prototype.  Pass pointer to cmsg_data
and length of cmsg_data to cmsg printers.
(print_scm_rights, print_scm_creds, print_scm_security): Update.
2015-11-22 02:42:45 +00:00
1019f002c1 net: factor out address printing code to a separate function
* net.c (sockaddr_buf_t): New type.
(print_sockaddr): New function.
(printsock, print_group_req): Use it.
2015-11-21 02:52:23 +00:00
5cb45b25a3 mpers: skip xlat struct definitions in mpers mode
Avoid duplicate definitions of xlat structures in files
compiled in mpers mode.

Each xlat file defines the corresponding xlat struct with
either global or local visibility using the following rules:

- if xlat struct declaration is available in defs.h,
  a global definition is provided in regular mode,
  and nothing is provided in mpers mode;
- otherwise, if xlat file is included by a mpers source file,
  a global definition is provided in regular mode
  (unless no mpers mode is supported on this architecture,
  in that case, a local definition is provided instead),
  and a declaration is provided in mpers mode;
- otherwise, a local definition is provided in regular mode,
  and an error message is printed in mpers mode.

Fallback definitions of constants provided by xlat files
remain available in all modes.

* bootstrap: Invoke generate_mpers_am.sh before xlat/gen.sh.
* defs.h (adjtimex_modes, adjtimex_status, sigev_value): Remove.
* generate_mpers_am.sh: Generate mpers_xlat.h.
* Makefile.am (EXTRA_DIST): Add mpers_xlat.h.
* print_sigevent.c: Include "xlat/sigev_value.h" unconditionally.
* print_timex.c: Include "xlat/adjtimex_modes.h" and
"xlat/adjtimex_status.h" unconditionally.
* xlat/gen.sh (cond_xlat): Move printing of fallback definitions ...
(cond_def): ... here.
(gen_header): Check also mpers_xlat.h for global declarations
of xlat structures.
Process input file twice, first time print directives
only, second time print everything.
Wrap struct xlat into #ifdef IN_MPERS ... #else ... #endif.
* xlat/getrandom_flags.in: Cleanup.
2015-11-20 05:44:49 +00:00
7528a0b2e1 tests: rewrite getdents test in C for better coverage
* tests/getdents.awk: Remove.
* tests/getdents.out: Remove.
* tests/getdents.c: New file.
* tests/getdents.test: Rewrite.
* tests/getdents64.c: New file.
* tests/getdents64.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add getdents and getdents64.
(TESTS): Add getdents64.test.
(EXTRA_DIST): Remove getdents.awk and getdents.out.
* tests/.gitignore: Add getdents and getdents64.
2015-11-20 00:08:48 +00:00
4f461581b7 tests: add readdir.test
* tests/readdir.c: New file.
* tests/readdir.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add readdir.
(TESTS): Add readdir.test.
* tests/.gitignore: Add readdir.
2015-11-19 22:57:42 +00:00
a367db8e5b Mpersify parsers of readdir and getdents syscalls
* defs.h (dirent_types): New xlat prototype.
* dirent.c: Stop including "xlat/direnttypes.h".
(kernel_dirent): New typedef.  Mpersify it.
(print_old_dirent): Use it instead of old_dirent_t.
(SYS_FUNC(getdents)): Use it instead of struct kernel_dirent.
Rename direnttypes to dirent_types.
(SYS_FUNC(getdents64)): Move ...
* dirent64.c: ... here.  Rename direnttypes to dirent_types.
Include "xlat/dirent_types.h".
* Makefile.am (strace_SOURCES): Add dirent64.c.
* xlat/direnttypes.in: Rename to xlat/dirent_types.in.
2015-11-19 22:49:58 +00:00
a2df1c12de getdents: fix typos in array output
Array should be enclosed by square brakets, and elements should be
separated by commas.

* dirent.c (SYS_FUNC(getdents), SYS_FUNC(getdents64)): Fix typos
in array output.
* tests/getdents.awk: Update regexps to match fixed output.
* tests/getdents.out: Update output.

Signed-off-by: Gabriel Laskar <gabriel@lse.epita.fr>
2015-11-19 17:52:35 +00:00
f54cb96f7f printcmsghdr: move type and data decoders to a separate function
* net.c (print_scm_rights, print_scm_creds, print_scm_security): Change
to return void.  Move printing of struct cmsghdr closing '}' ...
(printcmsghdr): ... here.  Move type and data decoders to ...
(print_cmsg_type_data): ... new function.
2015-11-19 00:31:32 +00:00
b36d132907 Assume that libc provides sendmsg
Starting with commit v4.6-281-g7af9f35, we implicitly assume that
HAVE_SENDMSG is always defined.  Therefore, the check for sendmsg
availability is redundant and could be safely removed.

* configure.ac (AC_CHECK_FUNCS): Remove sendmsg.
* linux/dummy.h [!HAVE_SENDMSG] (sys_recvmsg, sys_sendmsg): Remove
stub aliases.
* net.c [HAVE_SENDMSG]: Define unconditionally.
* syscall.c (dumpio) [HAVE_SENDMSG]: Likewise.
2015-11-18 23:18:17 +00:00
3a1e95d14e net.c: move fallback definition of SCM_SECURITY to xlat/
* net.c: Move fallback definition of SCM_SECURITY ...
* xlat/scmvals.in: ... here.
2015-11-18 23:11:34 +00:00
0d0a50aa25 Implement mlock2 syscall decoding
* mem.c: Include "xlat/mlock_flags.h".
(SYS_FUNC(mlock2)): New function.
* xlat/mlock_flags.in: New file.
* xlat/mlockall_flags.in: Add MCL_ONFAULT, add default values.
* linux/dummy.h (mlock2): Remove.
* tests/mlock2.c: New file.
* tests/mlock2.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add mlock2.
(TESTS): Add mlock2.test.
* tests/.gitignore Add mlock2.
2015-11-17 00:40:22 +00:00
2aec1e67df Implement membarrier syscall decoding
* membarrier.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* xlat/membarrier_cmds.in: New file.
* linux/dummy.h (membarrier): Remove.
* tests/membarrier.c: New file.
* tests/membarrier.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add membarrier.
(TESTS): Add membarrier.test.
* tests/.gitignore: Add membarrier.
2015-11-17 00:40:22 +00:00
a6ebdb149e Implement userfaultfd syscall decoding
* userfaultfd.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* xlat/uffd_flags.in: New file.
* linux/dummy.h (userfaultfd): Remove.
* tests/userfaultfd.c: New file.
* tests/userfaultfd.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add userfaultfd.
(TESTS): Add userfaultfd.test.
* tests/.gitignore: Add userfaultfd.
2015-11-17 00:40:22 +00:00
1fc01fdee6 ia64: wire up kcmp syscall
ia64 has kcmp syscall starting with linux kernel commit
v4.3-rc7-1-gd305c47.

* linux/ia64/syscallent.h (kcmp): New entry.
2015-11-17 00:40:22 +00:00
7171821dde powerpc: wire up direct sysv ipc syscalls
Starting with linux commit v4.3-rc3-33-ga342361, powerpc has
direct sysv ipc syscalls in addition to traditional ipc syscall.

* linux/powerpc/syscallent.h (semop, semget, semctl, semtimedop, msgsnd,
msgrcv, msgget, msgctl, shmat, shmdt, shmget, shmctl): New entries.
2015-11-17 00:40:21 +00:00
401d4bd601 Wire up userfaultfd, membarrier, and mlock2 syscalls
* linux/dummy.h (membarrier, mlock2, userfaultfd): New stub aliases.
* linux/32/syscallent.h (userfaultfd, membarrier, mlock2): New entries.
* linux/64/syscallent.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/arm/syscallent.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/hppa/syscallent.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/i386/syscallent.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/ia64/syscallent.h (userfaultfd, membarrier): Likewise.
* linux/m68k/syscallent.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/microblaze/syscallent.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/mips/syscallent-n32.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/mips/syscallent-n64.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/mips/syscallent-o32.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/powerpc/syscallent.h (userfaultfd, membarrier): Likewise.
* linux/s390/syscallent.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/s390x/syscallent.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/sparc/syscallent.h (membarrier, userfaultfd, mlock2): Likewise.
* linux/x32/syscallent.h (userfaultfd, membarrier, mlock2): Likewise.
* linux/x86_64/syscallent.h (userfaultfd, membarrier, mlock2): Likewise.
2015-11-17 00:39:49 +00:00
71af1158ec sprintflags: skip zero flags
Tweak sprintflags behaviour to match printflags.

* util.c (sprintflags): Skip zero flags unless the value passed
to sprintflags is also zero.
2015-11-16 03:08:41 +00:00
79bddff923 printflags: handle empty xlats
If the set of headers are unable to produce a valid list, printflags
will try to pass NULL to tprints which crashes.  Add a sanity check
for this edge case.

* util.c (printflags): Check xlat->str is not NULL.
2015-11-16 03:08:41 +00:00
35bd0b8b84 mpers: forward mpers_DEFS to mpers.sh
mpers_DEFS has to be forwarded to mpers.sh so that config.h would be
properly included by defs.h at preprocessor stage.

* Makefile.am (mpers-m%.stamp): Add the whole $(mpers_sh_opts) set of
options to mpers.sh's CPPFLAGS.
2015-11-16 03:08:41 +00:00
0f8af61154 tests/ioctl: workaround glibc ioctl wrapper on powerpc
* tests/ioctl.c (main) [POWERPC] Disable TCGETS test.
2015-11-16 03:08:41 +00:00
b3ab30f218 powerpc: wire up switch_endian syscall
powerpc has switch_endian syscall starting with linux commit
v4.0-rc4-67-g529d235.

* linux/powerpc/syscallent.h (switch_endian): New entry.
2015-11-15 16:51:55 +00:00
a1982b404b sparc: reserve more space for new syscalls
Move socket subcalls further down the table to make room
for new syscalls.

* linux/sparc/syscallent.h (SYS_socket_subcall): Raise from 353 to 400.
2015-11-15 16:48:50 +00:00
b070229f56 m68k: wire up direct socket syscalls
Starting with linux commit v4.3-rc3-1-g5b3f33e, m68k has direct
socket syscalls in addition to traditional socketcall syscall.

* linux/m68k/syscallent.h (socket, socketpair, bind, connect, listen,
accept4, getsockopt, setsockopt, getsockname, getpeername, sendto,
sendmsg, recvfrom, recvmsg, shutdown, recvmmsg, sendmmsg): New entries.
2015-11-15 03:05:34 +00:00
5f394f5e14 i386: wire up direct socket syscalls
Starting with linux commit v4.2-rc1-64-g9dea5dc, x86 has direct
socket syscalls in addition to traditional socketcall syscall.

* linux/i386/syscallent.h (socket, socketpair, bind, connect, listen,
accept4, getsockopt, setsockopt, getsockname, getpeername, sendto,
sendmsg, recvfrom, recvmsg, shutdown): New entries.
2015-11-15 03:05:34 +00:00
4b499f4190 s390, s390x: update syscall tables
* linux/s390/syscallent.h: Add new syscalls available with kernel 4.3.0.
* linux/s390x/syscallent.h: Likewise.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
2015-11-11 22:32:37 +00:00
370eb16ed2 Fix *_printer_defs.h rules ambiguousness
There is an ambiguousness in *_printer_defs.h rules definition:

$ grep '^[^ ]*_defs\.h: ' Makefile.am
m%_defs.h: $(srcdir_mpers_source_files)
%_printer_defs.h: $(srcdir_mpers_source_files)

While it appears to work with GNU make, it has to be fixed nevertheless.

* Makefile.am (m%_defs.h): Rename to m%_type_defs.h.
(mpers_m32_targets): Rename m32_defs.h to m32_type_defs.h.
(mpers_mx32_targets): Rename mx32_defs.h to mx32_type_defs.h.
* mpers_type.h: Rename m32_defs.h to m32_type_defs.h,
mx32_defs.h to mx32_type_defs.h.
* .gitignore: Likewise.

Reported-by: Elliott Hughes <enh@google.com>
2015-11-07 23:33:47 +00:00
c3410ba543 fcntl.c: make use of RVAL_DECODED
* fcntl.c (SYS_FUNC(fcntl)): Return RVAL_DECODED for write-only operations.
2015-10-09 02:18:27 +00:00
2512003cea desc.c: move parser of fcntl syscall to a separate file
* fcntl.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* desc.c (printflock64, printflock, SYS_FUNC(fcntl)): Move to fcntl.c.
2015-10-08 22:41:54 +00:00
5d68f468f4 desc.c: move parser of flock syscall to a separate file
* flock.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* desc.c (SYS_FUNC(flock)): Move to flock.c.
2015-10-08 22:41:54 +00:00
f4d6a0d4e1 tests: fix false uio.test failures
* tests/uio.c (main): Use descriptor number 0 in pread/pwrite
and preadv/pwritev syscalls.
* tests/uio.expected: Update regexps.

Reported-by: Lennart Sorensen <lsorense@csclub.uwaterloo.ca>
2015-10-08 22:41:40 +00:00
ad25c74f4b Fix make -j builds
In files generated by mpers scripts, includes directives are taken from
original files where the type definition was done.  This causes to
include defs.h in multiple files.  defs.h includes printers.h header,
which is a generated header.

This patch add an explicit dependency to printers.h for the mpers
scripts.

* Makefile.am (mpers-m%.stamp): Add printers.h to order-only
prerequisites.

Signed-off-by: Gabriel Laskar <gabriel@lse.epita.fr>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-10-01 22:20:10 +00:00
0656ce9822 mpers: fix shell code to conform better to POSIX
The `echo -n` behavior is non-portable, so use printf instead.

* generate_mpers_am.sh: Change `echo -n` to `printf`.
2015-09-29 19:38:26 +00:00
9c4fc3404c ioctl: fix ioctl command number decoding in case of conflicts
When a command number was decoded through ioctl_decode_command_number(),
there was no check for conflicts with other potential ioctls numbers.

For example:
	ioctl(fd, MCE_GET_RECORD_LEN, &i);
output:
	ioctl(3, MIXER_READ(1), 0x7ffddce74a58) = 0
instead of:
	ioctl(3, MIXER_READ(1) or MCE_GET_RECORD_LEN, 0x7ffee435ce08) = 0

* ioctl.c (SYS_FUNC(ioctl)): Fix ioctl command number decoding
in case of conflicts.
* tests/ioctl.c (main): Add a case for command number conflicts.

Signed-off-by: Gabriel Laskar <gabriel@lse.epita.fr>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-09-23 23:29:30 +00:00
fb2a54300e tests: convert ioctl.test from match_grep to match_diff
* tests/ioctl.c (main): Print expected output.
* tests/ioctl.test: Use match_diff instead of match_grep.
* tests/ioctl.expected: Remove.
* tests/Makefile.am (EXTRA_DIST): Remove ioctl.expected.
2015-09-23 23:29:27 +00:00
7a12974e95 Convert parser of seccomp filter program to new mpers infrastructure
* seccomp_fprog.h: New file.
* fetch_seccomp_fprog.c: New file.
* Makefile.am (strace_SOURCES): Add them.
* seccomp.c: Include "seccomp_fprog.h".
(print_seccomp_filter): Use fetch_seccomp_fprog.
2015-09-20 00:02:26 +00:00
3b731941f3 tests/init.sh: enhance match_grep error diagnostics
* tests/init.sh (match_grep): Check patterns one by one,
output only those patterns that didn't match.
2015-09-19 04:04:49 +03:00
a69854a90b tests/init.sh: fix comment
* tests/init.sh (match_awk): Fix usage description.
2015-09-19 04:04:49 +03:00
39e3be6d74 tests: add one more case to select.test
* tests/select.c (main): Check how timeout is printed
on exiting syscall.
2015-09-19 04:04:49 +03:00
10a40757bf tests: uncouple pselect6 from select.test
* tests/select.c Do not include <string.h>.
Include <sys/syscall.h>.
[!__NR_select]: Skip the test.
(main): Remove pselect6 support, test just select syscall.
* tests/select.test: Remove all pselect6 checks, test just
select syscall.
2015-09-19 04:04:49 +03:00
100bf7c896 tests: robustify select test
* tests/select.c: Do not include <assert.h>.
(main): Skip the test instead of assertions.
Add some padding to the timeval structure.
2015-09-19 04:04:49 +03:00
81ea4bf063 tests: add one more case to pselect6.test
* tests/pselect6.c (main): Check how timeout is printed
on exiting syscall.
2015-09-19 04:04:49 +03:00
5d98310e00 tests: robustify pselect6 test
* tests/pselect6.c: Do not include <assert.h> and <string.h>.
Include <sys/syscall.h>.
[!__NR_pselect6]: Skip the test.
(main): Skip the test instead of assertions.
Add some padding to the timespec structure.
2015-09-19 04:04:49 +03:00
4cb5ccca24 Convert another parser of struct timeval to new mpers infrastructure
* print_time.c (sprint_timeval): New mpers printer.
[ALPHA] (sprint_timeval32): New function.
* defs.h [ALPHA] (sprint_timeval32): New prototype.
(bitness_t, TIMEVAL_TEXT_BUFSIZE, printtv_bitness, sprinttv): Remove.
* desc.c (decode_select): Replace bitness parameter with two printers.
Use them instead of printtv_bitness and sprinttv.
(sys_oldselect, sys_select): Pass print_timeval and sprint_timeval
to decode_select.
[ALPHA] (sys_osf_select): Pass print_timeval32 and sprint_timeval32
to decode_select.
(pselect6): Pass print_timespec and sprint_timespec to decode_select.
* time.c (UTIME_NOW, UTIME_OMIT, current_time_t_is_compat,
struct timeval32, printtv_bitness, do_sprinttv, sprinttv): Remove.
2015-09-19 04:04:49 +03:00
2950de3631 Convert another parser of struct timespec to new mpers infrastructure
* print_time.c (sprint_timespec): New mpers printer.
* defs.h (TIMESPEC_TEXT_BUFSIZE): Update.
(sprint_timespec): Remove.
* time.c (sprint_timespec): Remove.
* net.c (sys_recvmmsg): Update callers.
* poll.c (decode_poll_exiting): Likewise.
2015-09-19 04:04:49 +03:00
6c528f5502 tests: add another case to pselect6 test
* tests/pselect6.c: Include <sys/time.h>.
(handler): New function.
(main): Install an interval timer.
Use it to check how ERESTARTNOHAND is printed.
2015-09-19 04:04:49 +03:00
f57edf4d37 Fix decoding of gettimeofday and settimeofday
* time.c (print_timezone): new function.
(sys_gettimeofday, sys_settimeofday): Use it instead of print_timeval
to print struct timezone.
[ALPHA] (sys_osf_gettimeofday, sys_osf_settimeofday): Use it
instead of print_timeval32 to print struct timezone.
* tests/xettimeofday.c: New file.
* tests/xettimeofday.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add xettimeofday.
(TESTS): Add xettimeofday.
* tests/.gitignore: Add xettimeofday.
2015-09-19 04:04:49 +03:00
f1e3a32045 Convert parser of struct timeval to new mpers infrastructure
* defs.h (printtv, printtv_special): Remove.
[ALPHA] (print_timeval32, print_timeval32_pair): New prototypes.
* print_time.c (print_timeval): New mpers printer.
[ALPHA] (print_timeval32, print_timeval32_pair): New functions.
* time.c (sys_gettimeofday, sys_settimeofday): Use print_timeval
instead of printtv.
[ALPHA] (sys_osf_gettimeofday, sys_osf_settimeofday):
Use print_timeval32 instead of printtv_bitness.
* utimes.c [ALPHA] (sys_osf_utimes): Use print_timeval32_pair
instead of printtv_bitness.
2015-09-19 04:04:49 +03:00
5938526c81 Convert parser of struct timespec to new mpers infrastructure
* defs.h (print_timespec): Remove.
* print_time.c (print_timespec): New mpers printer.
* futex.c (sys_futex): Use print_timespec instead of printtv.
* ipc_sem.c (sys_semtimedop): Likewise.
* mq.c (sys_mq_timedsend, sys_mq_timedreceive): Likewise.
* time.c (clock_settime, clock_gettime, clock_nanosleep): Likewise.
(print_timespec): Remove.
2015-09-19 04:04:49 +03:00
f94d8d6e55 Remove unused parser of adjtime syscall
* time.c (sys_adjtime): Remove.
2015-09-19 04:04:49 +03:00
c648b4a832 Fix decoding of clock_nanosleep
* time.c (sys_clock_nanosleep): Use is_erestart,
temporarily_clear_syserror, and restore_cleared_syserror.
* tests/clock_nanosleep.c: New file.
* tests/clock_nanosleep.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add clock_nanosleep.
(TESTS): Add clock_nanosleep.test.
* tests/.gitignore: Add clock_nanosleep.
2015-09-19 04:04:49 +03:00
9af94a2f48 Add is_erestart helper function
* defs.h (is_erestart): New prototype.
* syscall.c (is_erestart): New function.
* time.c (sys_nanosleep): Use is_erestart,
temporarily_clear_syserror, and restore_cleared_syserror.
2015-09-19 04:04:49 +03:00
3858b93ad9 Add helper functions to clear/restore syserror
* defs.h (temporarily_clear_syserror, restore_cleared_syserror):
New prototypes.
* syscall.c (saved_u_error): New variable.
(temporarily_clear_syserror, restore_cleared_syserror): New functions.
* aio.c (sys_io_getevents): Use temporarily_clear_syserror
and restore_cleared_syserror.
* mq.c (sys_mq_timedreceive): Likewise.
* signal.c (sys_rt_sigtimedwait): Likewise.
2015-09-19 04:04:49 +03:00
593602ce5a tests: add nanosleep.test
* tests/nanosleep.c: New file.
* tests/nanosleep.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add nanosleep.
(TESTS): Add nanosleep.test.
* tests/.gitignore: Add nanosleep.
2015-09-19 04:04:48 +03:00
640623c41e tests: rewrite restart_syscall in C
* tests/restart_syscall.c: New file.
* tests/restart_syscall.expected: Remove.
* tests/restart_syscall_unknown.expected: Remove.
* tests/restart_syscall.test: Update to use restart_syscall.
* tests/Makefile.am (check_PROGRAMS): Add restart_syscall.
(EXTRA_DIST): Remove restart_syscall.expected
and restart_syscall_unknown.expected.
* tests/.gitignore: Add restart_syscall.
2015-09-19 04:04:48 +03:00
135f5cf634 Properly initialize siginfo_t object passed to print_stopped function
* strace.c (trace): Clear the whole siginfo_t variable before passing it
to ptrace(PTRACE_GETSIGINFO) because the latter may initialize only a
part of the structure.
2015-09-19 04:04:48 +03:00
9d4c892ceb tests: add clock_xettime.test
* tests/clock_xettime.c: New file.
* tests/clock_xettime.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add clock_xettime.
(TESTS): Add clock_xettime.test.
* tests/.gitignore: Add clock_xettime.
2015-09-19 04:04:48 +03:00
322be80342 Convert parser of struct itimerval to new mpers infrastructure
* defs.h [ALPHA] (print_itimerval32): New prototype.
* print_time.c (print_itimerval): New mpers printer.
[ALPHA] (timeval32_t): New typedef.
[ALPHA] (print_timeval32_t, print_itimerval32): New functions.
* time.c (sys_getitimer, sys_setitimer): Use print_itimerval instead
of printitv.
[ALPHA] (sys_osf_getitimer, sys_osf_setitimer): Use print_itimerval32
instead of printitv_bitness.
(tprint_timeval32, tprint_timeval, printitv_bitness, printitv): Remove.
2015-09-19 04:04:27 +03:00
12431f76be tests: add xetitimer.test
* tests/xetitimer.c: New file.
* tests/xetitimer.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add xetitimer.
(TESTS): Add xetitimer.test.
* tests/.gitignore: Add xetitimer.
2015-09-19 04:04:27 +03:00
2206085929 Convert parser of struct itimerspec to new mpers infrastructure
* print_time.c (print_itimerspec): New mpers printer.
* time.c (sys_timer_settime, sys_timer_gettime, sys_timerfd,
sys_timerfd_settime, sys_timerfd_gettime): Use it instead of printitv.
2015-09-19 04:03:47 +03:00
207ba11125 print_time.c: introduce print_timespec_t helper
* print_time.c (time_fmt): New constant string.
(print_timeval_t): Use it.
(print_timespec_t): New function.
(print_timespec_t_utime): Use it.
2015-09-17 23:23:45 +00:00
79cafcd337 tests: add timerfd_xettime.test
* tests/timerfd_xettime.c: New file.
* tests/timerfd_xettime.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add timerfd_xettime.
(TESTS): Add timerfd_xettime.test.
* tests/.gitignore: Add timerfd_xettime.
2015-09-17 23:23:41 +00:00
1314098cde tests: add timer_xettime.test
* tests/timer_xettime.c: New file.
* tests/timer_xettime.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add timer_xettime.
(TESTS): Add timer_xettime.test.
* tests/.gitignore: Add timer_xettime.
2015-09-17 23:22:43 +00:00
ba40d85234 time.c: move parser of time syscall to print_time.c
* time.c (current_time_t_is_int32): Remove.
(sys_time): Move ...
* print_time.c: ... here.  Mpersify time_t.
2015-09-17 16:10:53 +00:00
5eb2362cff print_time.c: remove unused function parameters
* print_time.c (print_timespec_t_utime, print_timeval_t): Remove
"struct tcb *" parameter.
(print_timespec_utime_pair, print_timeval_pair): Update callers.
2015-09-17 15:12:42 +00:00
0dbb7acc35 Add struct timex.tai support
* configure.ac (AC_CHECK_MEMBERS): Add struct timex.tai.
* print_timex.c (print_timex) [HAVE_STRUCT_TIMEX_TAI]: Print tai field.
* tests/adjtimex.c (main) [HAVE_STRUCT_TIMEX_TAI]: Likewise.
2015-09-17 13:26:22 +00:00
dad1eef568 Convert parser of struct timex to new mpers infrastructure
* defs.h (adjtimex_modes, adjtimex_status): New xlat prototypes.
* print_timex.c (struct_timex): New typedef.  Mpersify it.
[IN_MPERS]: Do not include "xlat/adjtimex_modes.h"
and "xlat/adjtimex_status.h".
[SUPPORTED_PERSONALITIES > 1]: Remove.
(tprint_timeval): Remove.
(tprint_timex): Rename to print_timex.  Mpersify it.
* time.c (do_adjtimex): Rename tprint_timex to print_timex.
* tests/adjtimex.c: New file.
* tests/adjtimex.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add adjtimex.
(TESTS): Add adjtimex.test.
* tests/.gitignore: Add adjtimex.
2015-09-17 13:25:53 +00:00
dd6bf4b6b4 Move parser of struct timex to a separate file
* print_timex.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* time.c (tprint_timex32, tprint_timex): Move to print_timex.c.
2015-09-17 13:23:12 +00:00
b8f0c9286a Enhance parser of struct sigevent
* print_sigevent.c (print_sigevent): Always print names
of struct_sigevent fields along with their values.
Print signal name of sigev_signo for those sigev_notify values
that require valid signal numbers.
* tests/timer_create.c: New file.
* tests/timer_create.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add timer_create.
(TESTS): Add timer_create.test.
* tests/.gitignore: Add timer_create.
2015-09-17 13:22:57 +00:00
6f950cc499 Convert parser of struct sigevent to new mpers infrastructure
* defs.h (sigev_value): New prototype.
(printsigevent): Remove.
* print_sigevent.c (struct_sigevent): New typedef.  Mpersify it.
[IN_MPERS]: Do not include "xlat/sigev_value.h".
(printsigevent32): Remove.
(printsigevent): Rename to print_sigevent.  Mpersify it.
* mq.c (sys_mq_notify): Rename printsigevent to print_sigevent.
* time.c (sys_timer_create): Likewise.
2015-09-16 21:16:28 +00:00
d6b0558ad6 Move parser of struct sigevent to a separate file
* print_sigevent.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* time.c (printsigevent32, printsigevent): Move to print_sigevent.c.
2015-09-16 18:05:43 +00:00
644a8093a2 time.c: move fallback definitions of SIGEV_* values to xlat/
* time.c: Move fallback definitions of SIGEV_* values ...
* xlat/sigev_value.in: ... here.
2015-09-16 12:09:52 +00:00
e2fb0bb2cf Simplify use of mpers printers
* native_defs.h: New file.
* syscall.c: Include it.
* mpers_type.h [!IN_MPERS] (MPERS_DEFS): Change to "native_defs.h".
* defs.h (MPERS_PRINTER_NAME): Remove.
[SUPPORTED_PERSONALITIES > 1] (MPERS_PRINTER_NAME, printers): Move ...
* Makefile.am (printers.h): ... here.
Add macro definitions for mpers printers.
(m%_defs.h): Add redefinition of MPERS_PRINTER_NAME and inclusion
of "$(mpers_PREFIX)printer_decls.h".
(strace_SOURCES): Add native_defs.h.
* README-mpers: Update instructions for using mpers printers.
* ipc_msg.c (tprint_msgsnd, tprint_msgrcv): Call tprint_msgbuf directly.
* mq.c (sys_mq_open, mq_getsetattr): Call printmqattr directly.
* process.c (sys_ptrace): Call printsiginfo_at directly.
* signal.c (print_sigqueueinfo, sys_rt_sigtimedwait): Likewise.
* resource.c (sys_getrusage): Call printrusage directly.
* utimes.c (sys_utimensat): Call print_timespec_utime_pair directly.
(sys_utimes, sys_futimesat): Call print_timeval_pair directly.
* wait.c (printwaitn): Call printrusage directly.
(sys_waitid): Call printrusage and printsiginfo_at directly.
2015-09-16 00:14:55 +00:00
b172a94d02 Add a new helper function umove_ulong_array_or_printaddr
* defs.h (umove_ulong_array_or_printaddr): New prototype.
* util.c (umove_ulong_array_or_printaddr): New function.
* desc.c (sys_pselect6): Use it instead of open-coding
a proxy struct parser for different personalities.
* io.c (tprint_iov_upto): Use it instead of open-coding
a struct iovec parser for different personalities.
* kexec.c (print_kexec_segments): Use it instead of open-coding
a struct kexec_segment parser for different personalities.
(print_seg): Pass arguments using an array.
2015-09-15 11:23:27 +00:00
77a1b6bc41 tests: add pselect6.test
* tests/pselect6.c: New file.
* tests/pselect6.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add pselect6.
(TESTS): Add pselect6.test.
* tests/.gitignore: Add pselect6.
2015-09-15 02:14:38 +00:00
09a1a5a2ca Rename umove_long_or_printaddr to umove_ulong_or_printaddr
Rename the recently added function to reflect what kind of data type
it actually deals with: unsigned long int, without sign extension.

* defs.h (umove_long_or_printaddr): Rename to umove_ulong_or_printaddr,
chage 3rd argument to unsigned long *.
* util.c (umove_long_or_printaddr): Likewise.
* aio.c (sys_io_submit): Update callers.
2015-09-14 23:02:29 +00:00
a1fa83d8e1 aarch64, ppc64, sparc64, tile: hook up mpers printers
* defs.h [AARCH64 && HAVE_M32_MPERS]: Define PERSONALITY0_INCLUDE_FUNCS,
PERSONALITY0_INCLUDE_PRINTERS_DECLS,
and PERSONALITY0_INCLUDE_PRINTERS_DEFS.
[POWERPC64 && HAVE_M32_MPERS]: Define PERSONALITY1_INCLUDE_FUNCS,
PERSONALITY1_INCLUDE_PRINTERS_DECLS,
and PERSONALITY1_INCLUDE_PRINTERS_DEFS.
[SPARC64 && HAVE_M32_MPERS]: Likewise.
[TILE && HAVE_M32_MPERS]: Likewise.
2015-09-14 22:33:23 +00:00
6375f151a7 Add PowerPC specific ptrace constants
* xlat/ptrace_cmds.in: Add PowerPC specific ptrace constants.
2015-09-14 17:31:36 +00:00
cb7699c2d0 Update SCTP_* constants
* xlat/socksctpoptions.in: Add SCTP_GET_ASSOC_ID_LIST, SCTP_AUTO_ASCONF,
SCTP_PEER_ADDR_THLDS, SCTP_RECVRCVINFO, SCTP_RECVNXTINFO,
SCTP_DEFAULT_SNDINFO, SCTP_SOCKOPT_CONNECTX, SCTP_SOCKOPT_CONNECTX3,
and SCTP_GET_ASSOC_STATS.
2015-09-14 17:27:07 +00:00
456f41ab30 Update F_* constants
* xlat/fcntlcmds.in: Add F_SETPIPE_SZ, F_GETPIPE_SZ, F_ADD_SEALS,
and F_GET_SEALS.
2015-09-14 17:21:10 +00:00
e96869bd96 Update RENAME_* constants
* xlat/rename_flags.in: Add RENAME_WHITEOUT.
2015-09-14 17:16:32 +00:00
a9cda6940a Update SO_* constants
* xlat/sockoptions.in: Add SO_ATTACH_BPF, SO_BPF_EXTENSIONS,
SO_BUSY_POLL, SO_DETACH_BPF, SO_GET_FILTER, SO_INCOMING_CPU,
SO_LOCK_FILTER, SO_MAX_PACING_RATE, SO_PEEK_OFF, SO_RXQ_OVFL,
SO_SELECT_ERR_QUEUE, and SO_WIFI_STATUS.
2015-09-14 17:04:22 +00:00
718dc4361c Update INPUT_PROP_* constants
* xlat/evdev_prop.in: Add INPUT_PROP_ACCELEROMETER.
2015-09-14 16:20:25 +00:00
d6414fbdcc Update KEY_* constants
* xlat/evdev_keycode.in: Add KEY_ROTATE_DISPLAY, KEY_NUMERIC_A,
KEY_NUMERIC_B, KEY_NUMERIC_C, and KEY_NUMERIC_D.
2015-09-14 16:19:25 +00:00
137bf1b910 Update FALLOC_FL_* constants
* xlat/falloc_flags.in: Add FALLOC_FL_INSERT_RANGE.
2015-09-14 16:04:17 +00:00
d44ffe041b Update AF_* and PF_* constants
* xlat/addrfams.in: Add AF_IB and AF_MPLS.
* xlat/domains.in: Add PF_IB and PF_MPLS.
2015-09-14 16:00:39 +00:00
209f695f93 Update TCP_* constants
* xlat/socktcpoptions.in: Add TCP_NOTSENT_LOWAT, TCP_CC_INFO,
TCP_SAVE_SYN, and TCP_SAVED_SYN.
2015-09-14 15:50:44 +00:00
7f0063ca6c Update PACKET_* constants
* xlat/sockpacketoptions.in: Add PACKET_VNET_HDR, PACKET_TX_TIMESTAMP,
PACKET_TIMESTAMP, PACKET_FANOUT, PACKET_TX_HAS_OFF, PACKET_QDISC_BYPASS,
PACKET_ROLLOVER_STATS, and PACKET_FANOUT_DATA.
2015-09-14 15:46:47 +00:00
57c29189aa Update BPF_MAP_TYPE_* constants
* xlat/bpf_map_types.in: Add BPF_MAP_TYPE_PERF_EVENT_ARRAY.
2015-09-14 15:40:17 +00:00
6fda3314fc Update IPPROTO_* constants
* xlat/inet_protocols.in: Add IPPROTO_MPLS.
2015-09-14 15:29:41 +00:00
3fe9d3669e Update IP_* constants
* xlat/sockipoptions.in: Add IP_CHECKSUM and IP_BIND_ADDRESS_NO_PORT.
2015-09-14 15:01:02 +00:00
8e0442d43c Update PTRACE_O_* constants
* ptrace.h: Define PTRACE_O_SUSPEND_SECCOMP.
* xlat/ptrace_setoptions_flags.in: Add it.
2015-09-14 14:42:28 +00:00
b02bcfadcb Update PR_* constants
* xlat/prctl_options.in: Add PR_SET_FP_MODE, PR_GET_FP_MODE,
and PR_CAP_AMBIENT.
2015-09-14 13:25:24 +00:00
b0d1955e17 Update SECBIT_* constants
* xlat/secbits.in: Add SECBIT_NO_CAP_AMBIENT_RAISE
and SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED.
2015-09-14 13:21:01 +00:00
e2a3370f67 mpers.m4: workaround missing gnu/stubs-*.h files
On some systems missing gnu/stubs-*.h files make -m32/-mx32 compilation
checks fail.  As we want to support multiple personalities despite of
this limitation, workaround the check by creating empty gnu stub files
if necessary.

* m4/mpers.m4 (st_MPERS): Check for the gnu stub file.  Create an empty
gnu stub file if the system one is missing.
* Makefile.am (DISTCLEANFILES): Add gnu/stubs-32.h and gnu/stubs-x32.h.
2015-08-28 08:46:24 +00:00
9d77b562d3 tests: add times-fail.test
* tests/times-fail.c: New file.
* tests/times-fail.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add times-fail.
(TESTS): Add times-fail.test.
* tests/.gitignore: Add times-fail.
2015-08-28 08:46:24 +00:00
7a036055af tests: add times.test
* tests/times.c: New file.
* tests/times.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add times.
(TESTS): Add times.test.
(times_LDADD): Define.
* tests/.gitignore: Add times.
2015-08-28 08:46:24 +00:00
6773d6d8a1 Mpersify parser of times syscall
Fix multiple personalities support in parser of times syscall by
mpersifying struct tms.

* times.c (tms_t): New typedef.  Mpersify it.
(sys_times): Use it instead of struct tms.
2015-08-28 08:46:23 +00:00
22d997e538 tests: add sysinfo.test
* tests/sysinfo.c: New file.
* tests/sysinfo.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add sysinfo.
(TESTS): Add sysinfo.test.
* tests/.gitignore: Add sysinfo.
2015-08-28 08:46:23 +00:00
0ec7e21155 Mpersify parser of sysinfo syscall
Fix multiple personalities support in parser of sysinfo syscall by
mpersifying struct sysinfo.

* sysinfo.c (sysinfo_t): New typedef.  Mpersify it.
(sys_sysinfo): Use it instead of struct sysinfo.
2015-08-28 08:46:23 +00:00
d0a61871c8 Enhance msgctl syscall decoding
Make parser of msgctl syscall print struct msqid_ds.

* ipc_msgctl.c (msqid_ds_t): New typedef.  Mpersify it.
(print_msqid_ds): New function.  Use msqid_ds_t.
(sys_msgctl): Use print_msqid_ds.
* tests/ipc_msg.c: Update for struct msqid_ds support.
2015-08-28 08:46:23 +00:00
0a6af9b0a4 Enhance shmctl syscall decoding
Make parser of shmctl syscall print struct shmid_ds.

* ipc_shmctl.c (shmid_ds_t): New typedef.  Mpersify it.
(print_shmid_ds): New function.  Use shmid_ds_t.
(sys_shmctl): Use print_shmid_ds.
* tests/ipc_shm.c: Update for struct shmid_ds support.
2015-08-28 08:46:23 +00:00
b7699b55dd tests: add ipc_msgbuf.test
* tests/ipc_msgbuf.c: New file.
* tests/ipc_msgbuf.expected: Likewise.
* tests/ipc_msgbuf.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add ipc_msgbuf.
(TESTS): Add ipc_msgbuf.test.
(EXTRA_DIST): Add ipc_msgbuf.expected.
* tests/.gitignore: Add ipc_msgbuf.
2015-08-28 08:46:23 +00:00
c2445b4aa7 Mpersify tprint_msgsnd and tprint_msgrcv
Fix multiple personalities support in tprint_msgsnd and tprint_msgrcv
by converting tprint_msgbuf into a mpersified printer.

* print_msgbuf.c (msgbuf_t): New typedef.  Mpersify it.
(tprint_msgbuf): Use it instead of long.
Wrap function name into MPERS_PRINTER_DECL.
* ipc_msg.c (tprint_msgsnd, tprint_msgrcv): Use mpersified
tprint_msgbuf.
2015-08-28 08:46:23 +00:00
422f793364 tests: add mq.test
* tests/mq.c: New file.
* tests/mq.expected: Likewise.
* tests/mq.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add mq.
(TESTS): Add mq.test.
(EXTRA_DIST): Add mq.expected.
(mq_LDADD): Add -lrt.
* tests/.gitignore: Add mq.
2015-08-28 08:46:23 +00:00
1f53730965 Mpersify parsers of mq_open and mq_getsetattr syscalls
Fix multiple personalities support in parsers of mq_open and
mq_getsetattr by converting printmqattr into a mpersified printer.

* print_mq_attr.c (mq_attr_t): New typedef.  Mpersify it.
(printmqattr): Use it instead of struct mq_attr.  Wrap function name
into MPERS_PRINTER_DECL.
* mq.c (mq_open, mq_getsetattr): Use mpersified printmqattr.
2015-08-28 08:46:23 +00:00
cde9ef7183 tests: add wait.test
* tests/wait.c: New file.
* tests/wait.expected: Likewise.
* tests/wait.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add wait.
(TESTS): Add wait.test.
(EXTRA_DIST): Add wait.expected.
* tests/.gitignore: Add wait.
2015-08-28 08:46:23 +00:00
6fb8c6feb9 Mpersify parsers of getrusage, waitpid, wait4, and waitid syscalls
Fix multiple personalities support in parsers of getrusage, waitpid,
wait4, and waitid syscalls by converting printrusage into a mpersified
printer.

* defs.h (printrusage): Remove.
* printrusage.c (rusage_t): New typedef.  Mpersify it.
(printrusage): Use it instead of struct rusage.
Wrap function name into MPERS_PRINTER_DECL.
* resource.c (sys_getrusage): Use mpersified printrusage.
* wait.c (printwaitn, sys_waitid): Likewise.
2015-08-28 08:46:23 +00:00
3b7674c6df tests: add rt_sigqueueinfo.test
* tests/rt_sigqueueinfo.c: New file.
* tests/rt_sigqueueinfo.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add rt_sigqueueinfo.
(TESTS): Add rt_sigqueueinfo.test.
* tests/.gitignore: Add rt_sigqueueinfo.
2015-08-28 08:46:23 +00:00
a0b62498fd Mpersify printsiginfo_at printer
Fix multiple personalities support in parsers of ptrace,
rt_sigqueueinfo, rt_tgsigqueueinfo, rt_sigtimedwait and waitid syscalls
by converting printsiginfo_at into a mpersified printer.

* printsiginfo.c (siginfo_t): Mpersify.
(printsiginfo_at): Wrap function name into MPERS_PRINTER_DECL.
* defs.h (printsiginfo_at): Remove.
* signal.c (print_sigqueueinfo, sys_rt_sigtimedwait): Use mpersified
printsiginfo_at.
* process.c (sys_ptrace): Likewise.
* wait.c (sys_waitid): Likewise.
2015-08-28 08:46:23 +00:00
cbbc23a2a4 Mpersify parser of sigaltstack syscall
Fix multiple personalities support in parser of sigaltstack syscall by
mpersifying stack_t typedef.

* sigaltstack.c (stack_t): Mpersify.
(print_stack_t): Use it.
2015-08-28 08:46:23 +00:00
6b6a55c2b4 Mpersify parser of utime syscall
Fix multiple personalities support in parser of utime syscall by using
mpersified utimbuf_t typedef.

* utime.c (utimbuf_t): New typedef.  Mpersify it.
(sys_utime): Use it instead of a locally defined union.
2015-08-28 08:46:23 +00:00
78e48eb430 tests: add utimensat.test
* tests/utimensat.c: New file.
* tests/utimensat.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add utimensat.
(TESTS): Add utimensat.test.
* configure.ac (AC_CHECK_FUNCS): Add utimensat.
* tests/.gitignore: Add utimensat.
2015-08-28 08:46:23 +00:00
b5a23ed381 Mpersify parsers of utimes, futimesat, and utimensat syscalls
Fix multiple personalities support in parsers of utimes, futimesat,
and utimensat syscalls by introducing two mpersified printers:
print_timeval_pair and print_timespec_utime_pair.

* print_time.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* utimes.c (decode_utimes): Remove.
(sys_utimes, sys_futimesat): Use print_timeval_pair instead
of decode_utimes.
(sys_utimensat): Use print_timespec_utime_pair instead of decode_utimes.
2015-08-28 08:46:23 +00:00
092942206c Add mpers support
Add a subsystem for semi-automatical definition of how parsers should
work with personality-dependent (mpers) types of tracee's data.  Create
auxiliary libraries containing mpers syscall parsers and printer
functions, one library for each possible nonnative target personality.

Currently some parsers do not handle differences in definitions of data
types between personalities, namely LP64 and ILP32.  When
this is the case, long integers, pointers, and all compound
types containing long and pointer members may be printed incorrectly,
because of differences in sizes, offsets and alignments.

Since in most cases these are the only differences in desired behaviour
of parsers and printers for different personalities, a correct way
would be to compile one source code into multiple parsers, differing
only in definitions of mpers types.

To get a definition of a given type for nonnative personality
a very basic .c file containing a declaration of a variable of this type
is being compiled for this personality (using -m32 or -mx32 compiler
flag).  Information about the type is then being extracted from
this binary's DWARF debug info with an awk script and put
into a corresponding header file.  Resulting headers are being used to
compile mpers variations of syscall parsers and printer functions.

In addition to syscall parsers, there can occur a need to create mpers
printing functions, which then can be called from many places
in the code (for example, printsiginfo_at).  Such functions (printers)
are marked in a special manner.

For each possible nonnative target personality a library is being
created, containing mpers variations of syscall parsers and printers.
Only syscall parsers from files marked in a special manner and specially
marked functions from such files are being recompiled and included
in these libraries.

generate_mpers_am.sh is called by bootstrap to find the files
from strace_SOURCES which include MPERS_DEFS.  During compilation,
these files are being inspected for inclusions of DEF_MPERS_TYPE,
and nonnative variations of each included type are being generated
by an awk script.

Mpers parser names are being modified during inclusions of syscallent
headers for nonnative personalities.  Pointers to printers are
being stored in structs struct_printers, and a master
pointer printers is being updated on every set_personality.

* README-mpers: New README explaining how to use mpers support.
* empty.h: New empty file.
* generate_mpers_am.sh: New file.
* mpers.awk: Likewise.
* mpers.sh: Likewise.
* mpers_test.sh: Likewise.
* mpers_type.h: Likewise.
* Makefile.am (strace_SOURCES): Add empty.h and mpers_type.h.
(strace_CPPFLAGS, strace_LDFLAGS, strace_LDADD): Move to the beginning
of the file.
(strace_LDADD, noinst_LIBRARIES): Add libmpers-%.a.
(EXTRA_DIST): Add mpers.awk, mpers.sh, mpers_test.sh.
(BUILT_SOURCES, CLEANFILES): Add new generated files:
native_printer_decls.h, native_printer_defs.h, printers.h,
[HAVE_M32_MPERS] $(mpers_m32_targets), and [HAVE_MX32_MPERS]
$(mpers_mx32_targets).
(mpers_NAME, mpers_PREFIX, mpers_DEFS, mpers_INCLUDES, mpers_CPPFLAGS,
mpers_sh_opts, libmpers_CPPFLAGS, libmpers_m[x]32_a_SOURCES,
libmpers_m[x]32_a_CPPFLAGS, mpers_m[x]32_targets): New variables.
(mpers-m[x]32.stamp, m[x]32_defs.h, m[x]32_funcs.h, printers.h,
%_printer_decls.h, %_printer_defs.h, clean-local,
native_printer_decls.h, native_printer_defs.h, $mpers_m[x]32_targets):
New targets.
* bootstrap: Add generate_mpers_am.sh.
* configure.ac: Add AC_PROG_RANLIB.
* m4/mpers.m4: Add HAVE_MPERS variable.  Add $st_cv_mpers checks.
* defs.h: Include mpers_type.h.
Include printers.h, native_printer_decls.h, define MPERS_PRINTER_NAME.
Redefine SYS_FUNC_NAME.  Define MPERS_PRINTER_DECL.
[HAVE_M32_MPERS]: define PERSONALITY1_INCLUDE_FUNCS,
PERSONALITY1_INCLUDE_PRINTERS_DECLS, PERSONALITY1_INCLUDE_PRINTERS_DEFS
for X86_64, X32.
[HAVE_MX32_MPERS]: define PERSONALITY2_INCLUDE_FUNCS,
PERSONALITY2_INCLUDE_PRINTERS_DECLS, PERSONALITY2_INCLUDE_PRINTERS_DEFS
for X86_64.
Add fallback definitions of
PERSONALITY1_INCLUDE_FUNCS, PERSONALITY2_INCLUDE_FUNCS,
PERSONALITY0_INCLUDE_PRINTERS_DECLS, PERSONALITY0_INCLUDE_PRINTERS_DEFS,
PERSONALITY1_INCLUDE_PRINTERS_DECLS, PERSONALITY1_INCLUDE_PRINTERS_DEFS,
PERSONALITY2_INCLUDE_PRINTERS_DECLS, PERSONALITY2_INCLUDE_PRINTERS_DEFS.
* syscall.c: Include PERSONALITY1_INCLUDE_FUNCS,
PERSONALITY2_INCLUDE_FUNCS,
PERSONALITY0_INCLUDE_PRINTERS_DECLS, PERSONALITY0_INCLUDE_PRINTERS_DEFS,
PERSONALITY1_INCLUDE_PRINTERS_DECLS, PERSONALITY1_INCLUDE_PRINTERS_DEFS,
PERSONALITY2_INCLUDE_PRINTERS_DECLS, PERSONALITY2_INCLUDE_PRINTERS_DEFS.
(printers): New struct.  Update it when needed.
* .gitignore: Add libmpers-m32.a, libmpers-mx32.a, m32_defs.h,
m32_funcs.h, m32_printer_decls.h, m32_printer_defs.h, mpers-m32,
mpers-m32.stamp, mpers-mx32, mpers-mx32.stamp, mpers.am, mx32_defs.h,
mx32_funcs.h, mx32_printer_decls.h, mx32_printer_defs.h,
native_printer_decls.h, native_printer_defs.h, and printers.h.
2015-08-28 08:46:23 +00:00
c633188e82 tests: convert readlink.test and readlinkat.test from match_awk to match_diff
* tests/readlink.c (main): Print expected output.
* tests/readlinkat.c (main): Likewise.
* tests/readlink.test: Use match_diff instead of match_awk.
* tests/readlinkat.test: Likewise.
* tests/readlink.awk: Remove.
* tests/readlinkat.awk: Likewise.
* tests/Makefile.am (EXTRA_DIST): Remove readlink.awk and readlinkat.awk.
2015-08-28 08:43:57 +00:00
f008b01b69 tests: convert getrandom.test from match_awk to match_diff
* tests/getrandom.c (main): Print expected output.
* tests/getrandom.test: Use match_diff instead of match_awk.
* tests/getrandom.awk: Remove.
* tests/Makefile.am (EXTRA_DIST): Remove getrandom.awk.
2015-08-28 08:16:43 +00:00
4960b2f008 tests: convert select.test from match_awk to match_diff
* tests/select.c (main): Print expected output.
* tests/select.test: Use match_diff instead of match_awk.
* tests/select.awk: Remove.
* tests/Makefile.am (EXTRA_DIST): Remove select.awk.
2015-08-27 08:24:39 +00:00
f14a8e1665 tests: convert several tests from match_grep to match_diff
* tests/sendfile.test: Use match_diff instead of match_grep.
* tests/sendfile64.test: Likewise.
* tests/time.test: Likewise.
* tests/utime.test: Likewise.
* tests/xet_robust_list.test: Likewise.
* tests/sendfile.c (main): Update match patterns for match_diff.
* tests/sendfile64.c (main): Likewise.
* tests/time.c (main): Likewise.
* tests/utime.c (main): Likewise.
* tests/xet_robust_list.c (main): Likewise.
2015-08-27 00:09:46 +00:00
f6a36f0c9e tests: fix match_diff usage
The first argument of match_diff should be the file with expected
output, the second argument - the file with actual output.

* tests/aio.test: Swap match_diff arguments.
* tests/restart_syscall.test: Likewise.
* tests/seccomp.test: Likewise.
* tests/umovestr2.test: Likewise.
2015-08-27 00:09:46 +00:00
cf3ecbdd5f build: fix -I options
* configure.ac (AM_INIT_AUTOMAKE): Add nostdinc.
* Makefile.am (AM_CPPFLAGS): Append -I$(builddir) and -I$(srcdir).
* tests/Makefile.am (AM_CPPFLAGS): Likewise.
2015-08-27 00:09:45 +00:00
f56046e459 aio: rewrite from libaio.h to linux/aio_abi.h
* configure.ac (AC_CHECK_HEADERS): Remove libaio.h.
* aio.c: Assume that <linux/aio_abi.h> is available,
include it instead of <libaio.h>.
[!IOCB_RESFD]: Remove.
(enum iocb_sub): Remove SUB_POLL.
(tprint_lio_opcode): Update.
(print_common_flags): Use IOCB_FLAG_RESFD instead of IOCB_RESFD,
rename fields of struct iocb.
(iocb_is_valid, print_iocb_header, print_iocb): New functions.
(sys_io_submit): Use print_iocb.
(print_io_event): Fix struct io_event decoding.
(sys_io_cancel): Use print_iocb_header.
* strace.spec (BuildRequires): Remove libaio-devel.
* tests/aio.c (main): Test IOCB_CMD_PREADV, io_cancel,
and struct io_event decoding.
* tests/aio.test (syscalls): Add io_cancel.
2015-08-26 21:05:17 +00:00
13c2173393 Fix multiple personalities support in parser of io_submit syscall
Introduce a new helper function to fetch tracee's long integers
and use it to fix multiple personalities support in io_submit parser.

* defs.h (umove_long_or_printaddr): New prototype.
* util.c (umove_long_or_printaddr): New function.
* aio.c (sys_io_submit): Use it to fetch tracee's pointers.
* tests/aio.c: New file.
* tests/aio.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add aio.
(TESTS): Add aio.test.
* tests/.gitignore: Add aio.
2015-08-26 21:05:17 +00:00
857adac3a5 tests: fix build on systems that lack O_CLOEXEC definition
* tests/epoll_create1.c (main): Check that O_CLOEXEC is defined.
* tests/eventfd.c (main): Likewise.
* tests/signalfd.c (main): Likewise.
2015-08-26 21:05:17 +00:00
ff6b6f3f72 tests: fix build on systems that lack AT_FDCWD definition
* tests/readlinkat.c: Stop including <fcntl.h>.
(main): Replace AT_FDCWD with -100.
2015-08-26 20:23:31 +00:00
56872838e4 Fix printing of io_getevents first argument
* aio.c (sys_io_getevents): Print first argument using "%lu" format.
2015-08-26 16:16:47 +00:00
54646b8e05 decode extend getsockopt/setsockopt options
Currently the code assumes the set of valid options between getsockopt
and setsockopt are exactly the same and thus maintains one list.  The
kernel unfortunately does not do this -- it allows for different opts
between the get and set functions.  See the {g,s}et_opt{min,max} fields
in the various netfilter subcores.

To support this, extend the printxval function to take multiple sets of
xlats as varargs.  Then we add the new get/set lists, and pass them down
in the net code when decoding things.

A simple example is iptables; before:
	getsockopt(4, SOL_IP, 0x40 /* IP_??? */, ...) = 0
	getsockopt(4, SOL_IP, 0x41 /* IP_??? */, ...) = 0
after:
	getsockopt(4, SOL_IP, IPT_SO_GET_INFO, ...) = 0
	getsockopt(4, SOL_IP, IPT_SO_GET_ENTRIES, ...) = 0

If these were setsockopt calls, then 0x40 & 0x41 would be
IPT_SO_SET_REPLACE & IPT_SO_SET_ADD_COUNTERS.

* configure.ac: Check for netfilter headers.
* defs.h (printxvals): New prototype.
(printxval): Change to a define.
* net.c: Include netfilter headers and new sockopts headers.
(print_sockopt_fd_level_name): Add a is_getsockopt argument.  Change SOL_IP
and SOL_IPV6 decoding to use printxvals, and use is_getsockopt to pass more
xlats down.
(getsockopt): Call print_sockopt_fd_level_name with is_getsockopt as true.
(setsockopt): Call print_sockopt_fd_level_name with is_getsockopt as false.
* util.c (printxval): Rename to ...
(printxvals): ... this.  Rewrite to be varargs based.
* xlat/getsockipoptions.in: New xlat list.
* xlat/getsockipv6options.in, xlat/setsockipoptions.in,
xlat/setsockipv6options.in: Likewise.
2015-08-26 12:09:25 +00:00
fffe50d321 Fix build on systems that lack VIDIOC_CREATE_BUFS definition
* v4l2.c (v4l2_ioctl): Check that v4l2_ioctl is defined.
2015-08-26 11:55:05 +00:00
69c1570d55 Fix build on systems that lack EM_ARM/EM_OPENRISC definitions
* xlat/audit_arch.in: Guard AUDIT_ARCH_ARM and AUDIT_ARCH_ARMEB
with EM_ARM check.  Guard AUDIT_ARCH_OPENRISC with EM_OPENRISC check.
2015-08-26 11:52:43 +00:00
642ee798b2 Fix build on systems that lack UBI_IOCVOLCRBLK/UBI_IOCVOLRMBLK definitions
* mtd.c (ubi_ioctl): Check that UBI_IOCVOLCRBLK and UBI_IOCVOLRMBLK
are defined.
2015-08-25 21:48:36 +00:00
12cca59aed Fix build on systems that lack O_CLOEXEC definition
* xlat/efd_flags.in: Check that O_CLOEXEC is defined.
* xlat/epollflags.in: Likewise.
* xlat/sfd_flags.in: Likewise.
* xlat/timerfdflags.in: Fix O_CLOEXEC check.
2015-08-25 10:05:08 +00:00
3595f4ae15 printsiginfo.c: fix integer conversions
* printsiginfo.c (printsigsource): Print si_pid and si_uid as unsigned
integers.
(printsigval): Print si_int as signed int.
2015-08-21 21:08:30 +03:00
d8ef5e70db Fix decoding of times syscall return value
Always print return value of successful times syscall
as unsigned long integer.

* times.c (sys_times): Return RVAL_UDECIMAL unless syserror.
2015-08-20 21:37:41 +00:00
3585b06f79 mq.c: remove repeated code
* mq.c (sys_mq_open): Use printmqattr instead of implementing it again.
[HAVE_MQUEUE_H]: Remove.
2015-08-20 22:29:15 +03:00
d079fb19f2 ipc_msg.c: fix multiple personalities support in msgrcv ipc subcall
When msgrcv syscall is an ipc subcall, msgp (pointer to struct msgbuf)
and msgtyp (message type) syscall arguments are passed via proxy
structure which definition significantly depends on tracee's
wordsize.

* ipc_msg.c (fetch_msgrcv_args): New function.
(sys_msgrcv): Use it.
2015-08-20 22:21:04 +03:00
c01ad06002 ipc.c: split into separate files
In preparation for upcoming mpers-related changes,
split ipc.c into independent groups of parsers.

* ipc_defs.h: New file.
* ipc_msg.c: Likewise.
* ipc_msgctl.c: Likewise.
* ipc_sem.c: Likewise.
* ipc_shm.c: Likewise.
* ipc_shmctl.c: Likewise.
* mq.c: Likewise.
* print_mq_attr.c: Likewise.
* print_msgbuf.c: Likewise.
* ipc.c: Remove.
(sys_mq_open, sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify,
sys_mq_getsetattr): Move to mq.c.
(sys_msgget, tprint_msgsnd, sys_msgsnd, tprint_msgrcv, sys_msgrcv): Move
to ipc_msg.c.
(sys_msgctl): Move to ipc_msgctl.c.
(tprint_sembuf, tprint_sembuf_array, sys_semop, sys_semtimedop,
sys_semget, syssemctl): Move to ipc_sem.c.
(sys_shmget, sys_shmat, sys_shmdt): Move to ipc_shm.c.
(sys_shmctl): Move to ipc_shmctl.c.
(printmqattr): Move to print_mq_attr.c.
(tprint_msgbuf): Move to print_msgbuf.c.
(IPC_64, PRINTCTL): Move to ipc_defs.h.
* defs.h (struct xlat resource_flags): New prototype.
* Makefile.am (strace_SOURCES): Remove ipc.c.  Add ipc_defs.h, mq.c,
ipc_msg.c, ipc_msgctl.c, ipc_sem.c, ipc_shm.c, ipc_shmctl.c,
print_mq_attr.c, and print_msgbuf.c.
2015-08-20 22:21:04 +03:00
af86bd5bb3 .gitignore: add sen.h and sys_func.h 2015-08-20 22:21:04 +03:00
49182851eb tests: add sendfile.test and sendfile64.test
* tests/sendfile.c: New file.
* tests/sendfile64.c: New file.
* tests/sendfile.test: New test.
* tests/sendfile64.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add sendfile and sendfile64.
(TESTS): Add sendfile.test and sendfile64.test.
* tests/.gitignore: Add sendfile and sendfile64.
2015-08-19 14:15:07 +00:00
22f8b2753c sendfile: decode file offset both on entering and exiting syscall
When sendfile is called with a valid pointer to a file offset variable,
kernel updates this variable on successfull exit from syscall.

* sendfile.c (sys_sendfile, sys_sendfile64): Print tcp->u_arg[2]
on exiting syscall as well as on entering.
2015-08-19 13:36:44 +00:00
ac2e728a6e io.c: move sendfile parsers to a separate file
* sendfile.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* io.c (sys_sendfile, sys_sendfile64): Move to sendfile.c
2015-08-19 13:36:44 +00:00
d77f6693e4 Make printnum_* functions return boolean status
With this change, printnum_* functions return true iff they
successfully fetched necessary data from tracee's memory.

* defs.h (printnum_short, printnum_int, printnum_int64,
printnum_long_int, printpair_int, printpair_int64): Return bool.
* util.c (DEF_PRINTNUM, DEF_PRINTPAIR, printnum_long_int): Likewise.
2015-08-19 13:36:44 +00:00
6684b6857c mips: print _MIPS_SIM in configure.ac for debug purposes
* configure.ac [MIPS]: Print _MIPS_SIM.
2015-08-19 13:36:44 +00:00
daae8f9204 xtensa: fix several syscall entries
* linux/xtensa/syscallent.h: Fix nargs in splice, tee, vmsplice,
pselect6, ppoll, epoll_pwait, and set_robust_list syscall entries.
2015-08-19 13:36:44 +00:00
9f1eb12d11 ia64: fix syscall numbers for set_robust_list, get_robust_list, and splice syscalls
* linux/ia64/syscallent.h: Place syscall entries for set_robust_list,
get_robust_list, and splice in correct order.
2015-08-19 13:36:44 +00:00
41b9facc2a tests: add a test for get_robust_list and set_robust_list decoding
* tests/xet_robust_list.c: New file.
* tests/xet_robust_list.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add xet_robust_list.
(TESTS): Add xet_robust_list.test.
* tests/.gitignore: Add xet_robust_list.
2015-08-18 20:28:54 +00:00
fe50316d2c Simplify printing of get_robust_list first argument
* get_robust_list.c (sys_get_robust_list): Print first argument
using "%d" format.
2015-08-18 19:16:36 +00:00
afac9f0207 Fix io_setup first argument printing
* aio.c (sys_io_setup): Print first argument using "%u" format.
2015-08-18 16:42:37 +00:00
2479ef0bce Fix printing tracee's long integers
Replace ambiguous printnum_long that used to fetch native long integers
from tracee's memory with printnum_ptr, printnum_slong, and printnum_ulong
that fetch tracee's pointer, signed long, and unsigned long integers.

* defs.h (printnum_long, printpair_long): Remove prototypes.
(printnum_int64, printpair_int64): Remove macros, declare functions
unconditionally.
[SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4] (printnum_long_int):
New prototype.
(printnum_ptr, printnum_slong, printnum_ulong): New macros.
* aio.c (sys_io_setup): Use printnum_ulong.
* block.c (block_ioctl): Use printnum_slong and printnum_ulong.
* get_robust_list.c (sys_get_robust_list): Use printnum_ptr
and printnum_ulong.
* io.c (print_off_t): Remove.
(sys_sendfile): Use printnum_ulong.
* ipc.c (sys_semctl): Use printnum_ptr.
* prctl.c (sys_prctl): Likewise.
* process.c (sys_ptrace): Likewise.
* rtc.c (rtc_ioctl): Use printnum_ulong.
* util.c (printnum_long, printpair_long): Remove.
(printnum_int64, printpair_int64): Define unconditionally.
[SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4] (printnum_long_int):
New function.

Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
Signed-off-by: Elvira Khabirova <lineprinter0@gmail.com>
2015-08-18 16:15:33 +00:00
f9b455cfd2 Fix time syscall decoding for some personalities
* time.c (current_time_t_is_int32): Define.
(sys_time): Use it, printnum_int, and printnum_int64 instead
of printnum_long.
* tests/time.c: New file.
* tests/time.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add time.
(TESTS): Add time.test.
* tests/.gitignore: Add time.
2015-08-18 15:10:55 +00:00
d2eaf67486 signal: SIGSYS: decode si_syscall & si_arch fields
When receiving SIGSYS, the si_syscall & si_arch fields are set to known
values, so make sure we decode their values into the symbol settings.
This makes stracing seccomp failures much easier.

* defs.h (syscall_name): New prototype.
* printsiginfo.c: Include linux/audit.h and xlat/audit_arch.h.
(print_si_info): Decode si_syscall & si_arch for SIGSYS.
* syscall.c (undefined_scno_name): Delete.
(syscall_name): New function.
(trace_syscall_entering): Change undefined_scno_name to syscall_name.
(trace_syscall_exiting): Likewise.
* xlat/audit_arch.in: New file.
2015-08-18 07:51:54 +00:00
4d2c8a2cf7 ipc.c: remove unnecesarry #ifdef IPC_64
* ipc.c (PRINTCTL): Remove #ifdef IPC_64 check as IPC_64 is always
defined at this point.
2015-08-18 07:48:37 +00:00
254ff1e623 resource.c: move times parser to a separate file
* times.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* resource.c (sys_times): Move to times.c.
2015-08-16 10:05:19 +00:00
f1bb6391ea sysctl.c: remove KERN_JAVA_* defines handling
This has been obsoleted by binfmt_misc since Linux 2.1.43.

* sysctl.c (sys_sysctl): Remove KERN_JAVA_INTERPRETER
and KERN_JAVA_APPLETVIEWER.
2015-08-16 09:41:28 +00:00
3a58e46d45 sysinfo.c: remove obsolete code
struct sysinfo members totalhigh, freehigh and mem_unit are present
since Linux 2.3.48.

* configure.ac (AC_CHECK_MEMBERS): Remove struct sysinfo checks.
* sysinfo.c (sys_sysinfo): Remove HAVE_STRUCT_SYSINFO_* checks.
2015-08-16 09:37:28 +00:00
3af6aabe52 tests: add readlink.test and readlinkat.test
* tests/readlink.c: New file.
* tests/readlink.awk: Likewise.
* tests/readlinkat.c: Likewise.
* tests/readlinkat.awk: Likewise.
* tests/readlink.test: New test.
* tests/readlinkat.test: Likewise.
* tests/Makefile.am (check_PROGRAMS): Add readlink and readlinkat.
(TESTS): Add readlink.test and readlinkat.test.
(EXTRA_DIST): Add readlink.awk and readlinkat.awk.
* tests/.gitignore: Add readlink and readlinkat.
2015-08-15 02:21:22 +02:00
525eed33fa Print nanoseconds along with seconds in stat family syscalls
* configure.ac (AC_CHECK_MEMBERS): Add stat.st_atim.tv_nsec,
stat.st_ctim.tv_nsec, stat.st_mtim.tv_nsec, stat.st_atime_nsec,
stat.st_atime_csec, and stat.st_mtime_nsec.
* file.c: Explicitly define HAVE_STRUCT_STAT_ST_ATIME_NSEC,
HAVE_STRUCT_STAT_ST_CTIME_NSEC and HAVE_STRUCT_STAT_ST_MTIME_NSEC
for locally defined types.
* printstat.h (DO_PRINTSTAT): Print st_atime_nsec, st_ctime_nsec,
and st_mtime_nsec members.
* tests/stat.c [_FILE_OFFSET_BITS == 64]: Use st_atime_nsec,
st_ctime_nsec, and st_mtime_nsec via st_atim.tv_nsec, st_ctim.tv_nsec,
and st_mtim.tv_nsec.
(main): Print st_atime_nsec, st_ctime_nsec, and st_mtime_nsec members.

This fixes Fedora bug #1251176.
2015-08-09 09:19:55 +00:00
30ac0627f2 signalfd4: fix flags decoding
* configure.ac (AC_CHECK_FUNCS): Add eventfd.
(AC_CHECK_HEADERS): Add sys/signalfd.h.
* signalfd.c: Include <fcntl.h>.
[HAVE_SYS_SIGNALFD_H] Include <sys/signalfd.h>.
Include "xlat/sfd_flags.h".
(do_signalfd): Use sfd_flags for flags decoding.
* xlat/sfd_flags.in: New file.
* tests/signalfd.c: Likewise.
* tests/signalfd.expected: Likewise.
* tests/signalfd.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add signalfd.
(TESTS): Add signalfd.test.
(EXTRA_DIST): Add signalfd.expected.
* tests/.gitignore: Add signalfd.
2015-08-03 09:57:14 +00:00
9e8a84fa3d signalfd, signalfd4: mark return code with RVAL_FD flag
* signalfd.c (do_signalfd): Set RVAL_FD flag in the return code.
2015-08-03 09:14:28 +00:00
2307d5c968 signal.c: move signalfd parsers to a separate file
* signalfd.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* signal.c (do_signalfd, sys_signalfd, sys_signalfd4): Move to signalfd.c
2015-08-03 09:12:26 +00:00
57823c6836 perf_event_open: mark return code with RVAL_FD flag
* perf.c (sys_perf_event_open): Set RVAL_FD flag in the return code.
2015-08-03 09:09:27 +00:00
2a4f0521fc pipe, pipe2, socketpair: print returned descriptors using printfd
* net.c (printpair_fd, decode_pair_fd): New functions.
(do_pipe, sys_socketpair): Use them.
2015-08-03 09:09:26 +00:00
3d463be47e socket: mark return code with RVAL_FD flag
* net.c (sys_socket): Set RVAL_FD flag in the return code.
* tests/net-yy-accept.awk: Update socket and bind regexps.
* tests/unix-yy-accept.awk: Likewise.
* tests/net-yy-connect.awk: Update socket and connect regexps.
* tests/unix-yy-connect.awk: Likewise.
2015-08-03 09:09:26 +00:00
07c878a9b5 timerfd, timerfd_create: mark return code with RVAL_FD flag
* time.c (sys_timerfd, sys_timerfd_create): Set RVAL_FD flag
in the return code.
2015-08-03 09:09:00 +00:00
323d912e0c inotify_init1: mark return code with RVAL_FD flag
* inotify.c (sys_inotify_init1): Set RVAL_FD flag in the return code.
2015-08-02 01:34:57 +00:00
5d22f0742a fanotify_init: mark return code with RVAL_FD flag
* fanotify.c (sys_fanotify_init): Set RVAL_FD flag in the return code.
2015-08-02 01:31:40 +00:00
baaa41c97a Fix epoll_create syscall decoding
* epoll.c (sys_epoll_create): New function.
* linux/dummy.h (sys_epoll_create): Remove.
2015-08-02 00:10:52 +00:00
7b378e6b04 epoll_create1: mark return code with RVAL_FD flag
* epoll.c (sys_epoll_create1): Set RVAL_FD flag in the return code.
2015-08-02 00:10:52 +00:00
2716346602 epoll_create1: fix pathtrace support
* pathtrace.c (pathtrace_match): Add SEN_epoll_create1.
2015-08-02 00:10:52 +00:00
bf62c1b52d epoll_create1: fix flags decoding
* xlat/epollflags.in: Remove EPOLL_NONBLOCK, provide fallback definition
for EPOLL_CLOEXEC.
* tests/epoll_create1.c: New file.
* tests/epoll_create1.expected: Likewise.
* tests/epoll_create1.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add epoll_create1.
(TESTS): Add epoll_create1.test.
(EXTRA_DIST): Add epoll_create1.expected.
* tests/.gitignore: Add epoll_create1.
2015-08-02 00:10:48 +00:00
aba868c6c4 desc.c: move epoll parsers to a separate file
* epoll.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* desc.c (sys_epoll_create1, print_epoll_event, sys_epoll_ctl,
print_epoll_event_array, epoll_wait_common, epoll_wait, epoll_pwait):
Move to epoll.c.
2015-08-01 23:30:03 +00:00
c8cba990a2 eventfd2: fix flags decoding
* configure.ac (AC_CHECK_HEADERS): Add sys/eventfd.h.
* eventfd.c: Include <fcntl.h>.
[HAVE_SYS_EVENTFD_H] Include <sys/eventfd.h>.
Include "xlat/efd_flags.h".
(do_eventfd): Use efd_flags for flags decoding.
* xlat/efd_flags.in: New file.
* tests/eventfd.c: New file.
* tests/eventfd.expected: Likewise.
* tests/eventfd.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add eventfd.
(TESTS): Add eventfd.test.
(EXTRA_DIST): Add eventfd.expected.
* tests/.gitignore: Add eventfd.
2015-08-01 22:23:58 +00:00
00cc35079e eventfd: print first argument as unsigned int
* eventfd.c (do_eventfd): Explicitly cast initial value to unsigned int.
2015-08-01 20:46:43 +00:00
ede0c48554 Mark eventfd return code with RVAL_FD flag
* eventfd.c (do_eventfd): Set RVAL_FD flag in the return code.
2015-08-01 20:46:43 +00:00
28471d17f9 desc.c: move eventfd parsers to a separate file
* eventfd.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* desc.c (do_eventfd, sys_eventfd, sys_eventfd2): Move to eventfd.c.
2015-08-01 20:46:43 +00:00
73a4fa43f5 Update PERF_FLAG_* constants
* xlat/perf_event_open_flags.in: Add PERF_FLAG_FD_CLOEXEC,
provide fallback definitions.
2015-08-01 20:46:43 +00:00
0d60cf753e desc.c: move perf_event_open parser to a separate file
* perf.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* desc.c (sys_perf_event_open): Move to perf.c.
2015-08-01 20:46:37 +00:00
2c217fd8e2 time.c: remove obsolete code from adjtimex parser
Linux versions 1.3.28 and below are not supported.

* time.c (tprint_timex) [LINUX_VERSION_CODE < 66332]: Remove.
2015-08-01 16:52:43 +00:00
f9ce39d1e4 ipc.c: move fallback definitions of msg, sem, and shm constants to xlat/
* ipc.c: Move MSG_STAT and MSG_INFO definitions to xlat/msgctl_flags.in.
Move SHM_STAT and SHM_INFO definitions to xlat/shmctl_flags.in.
Move SEM_STAT and SEM_INFO definitions to xlat/semctl_flags.in.
2015-08-01 16:52:43 +00:00
0c0453a1cb tests/ppoll: replace SIGABRT with SIGHUP
Use SIGHUP instead of SIGABRT, the number of the former
is more portable across architectures.

* tests/ppoll.c (test2): Replace SIGABRT with SIGHUP.
* tests/ppoll.expected: Update regexp.
* tests/ppoll-v.expected: Likewise.
2015-08-01 16:52:13 +00:00
3b9d315e8c decode_poll_exiting: reserve more space in output buffer
* poll.c (decode_poll_exiting): Reserve more space in output buffer.
2015-08-01 08:37:46 +00:00
d9fb450748 Cleanup poll/ppoll decoders
* poll.c (decode_poll): Split into print_pollfd, decode_poll_entering,
and decode_poll_exiting.
(sys_poll, sys_ppoll): Update callers.
* tests/ppoll.c: New file.
* tests/ppoll.expected: Likewise.
* tests/ppoll-v.expected: Likewise.
* tests/ppoll.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add ppoll.
(TESTS): Add ppoll.test.
(EXTRA_DIST): Add ppoll.expected and ppoll-v.expected.
* tests/.gitignore: Add ppoll.
2015-07-30 22:03:07 +00:00
c18b002fe9 poll: print timeout argument as int
* poll.c (sys_poll): Explicitly cast timeout argument to int.
2015-07-30 22:03:07 +00:00
811bda6225 stream.c: move poll and ppoll parsers to a separate file
* poll.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* stream.c (decode_poll, sys_poll, sys_ppoll): Move to poll.c.
2015-07-30 22:03:07 +00:00
80d5e012a1 Assume that <poll.h> is available
* configure.ac (AC_CHECK_HEADERS): Remove poll.h and sys/poll.h.
* pathtrace.c: Include <poll.h> unconditionally.
* stream.c: Likewise.
[HAVE_SYS_POLL_H]: Compile unconditionally.
[!HAVE_SYS_POLL_H]: Remove.
2015-07-30 22:03:07 +00:00
ea7ef9365f tests: add oldselect.test
* tests/oldselect.c: New file.
* tests/oldselect.expected: Likewise.
* tests/oldselect.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add oldselect.
(TESTS): Add oldselect.test.
(EXTRA_DIST): Add oldselect.expected.
* tests/.gitignore: Add oldselect.
2015-07-30 22:03:07 +00:00
c44df3e3ca Fix oldselect decoding on 64-bit architectures
As struct sel_arg_struct is an array of 32-bit values,
fetch it using an intermediate array on 64-bit architectures.

* desc.c (sys_oldselect): Rename args to long_args.
[SIZEOF_LONG == 4] Alias oldselect_args to long_args.
[SIZEOF_LONG != 4] Introduce oldselect_args to fetch oldselect args.
* linux/sh64/syscallent.h (oldselect): Remove.
2015-07-30 22:02:56 +00:00
52dc1506ab net.c: use printaddr
* net.c (printsock, sys_recvfrom): Use printaddr.
2015-07-30 13:53:42 +00:00
383386de73 net.c: recvfrom fixes
This change fixes these three problems (before/after is shown):

On interrupted syscall, flags are not decoded:

    -recvfrom(3, 0x7fff0a41e306, 10, 2, 0, 0) = ? ERESTARTSYS
    +recvfrom(3, 0x7fff0a41e306, 10, MSG_PEEK, 0, 0) = ? ERESTARTSYS

If peer address is unavalable (example: anon sockets from socketpair()),
kernel returns socklen of 0, but we ignore that and show bogus sockaddr data:

    -recvfrom(3, "123456789\0", 10, MSG_PEEK, {sa_family=0x7777 /* AF_??? */, sa_data="wwwwwwwwwwwwww"}, [0]) = 10
    +recvfrom(3, "123456789\0", 10, MSG_PEEK, 0x7ffde6edf760, [0]) = 10

SYS_FUNC(recvfrom) passes address of fromlen, not fromlen, to printsock():

    -               printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
    +               printsock(tcp, tcp->u_arg[4], fromlen);

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-07-30 13:38:32 +02:00
1d246ce3d4 prctl: decode Android-specific PR_SET_VMA
Android kernels have a prctl to name VMAs.

* prctl.c (sys_prctl) [__ANDROID__]: Decode PR_SET_VMA.
2015-07-29 22:54:11 +00:00
0e4b1f2eb3 mips: fix stub files
This complements commit 140ecf8766.

* linux/mips/genstub.sh: Output SEN(printargs) instead of printargs.

Reported-by: Elliott Hughes <enh@google.com>
2015-07-29 22:54:11 +00:00
4e3ded36ef tests/bpf: fix build with incompatibly old linux/bpf.h and/or gcc
* configure.ac: Check how union bpf_attr.log_buf initialization works.
* tests/bpf.c: Check for HAVE_UNION_BPF_ATTR_LOG_BUF.
2015-07-29 22:53:07 +00:00
3456bcca67 Implement sched_getattr and sched_setattr syscalls decoding
* xlat/sched_flags.in: New file.
* sched.c: Include "xlat/sched_flags.h".
(print_sched_attr, sys_sched_setattr, sys_sched_getattr): New functions.
* linux/dummy.h (sys_sched_getattr, sys_sched_setattr): Remove.
* tests/sched_xetattr.c: New file.
* tests/sched_xetattr.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add sched_xetattr.
(TESTS): Add sched_xetattr.test.
* tests/.gitignore: Add sched_xetattr.
2015-07-29 09:18:26 +00:00
95b84ea641 Implement memfd_create syscall decoding
* memfd_create.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* linux/dummy.h (sys_memfd_create): Remove.
* pathtrace.c (pathtrace_match): Add SEN_memfd_create.
* xlat/memfd_create_flags.in: New file.
* tests/memfd_create.c: New file.
* tests/memfd_create.expected: Likewise.
* tests/memfd_create.test: New test.
* tests/Makefile.am: (check_PROGRAMS): Add memfd_create.
(TESTS): Add memfd_create.test.
(EXTRA_DIST): Add memfd_create.expected.
* tests/.gitignore: Add memfd_create.
2015-07-29 09:18:26 +00:00
e46534351d Fix builds where HAVE_MQUEUE_H isn't defined
Android doesn't have <mqueue.h>.

* ipc.c (sys_mq_open) [!HAVE_MQUEUE_H]: Fix printaddr invocation.
2015-07-28 22:40:01 +00:00
afa10d877c tests/restart_syscall: skip if nanosleep looks uninterrupted
* tests/restart_syscall.test: Skip if restart_syscall is not detected
and nanosleep syscall looks uninterrupted.
2015-07-27 15:27:43 +00:00
7c2210190a Implement execveat syscall decoding
* execve.c (decode_execve): New function.
(sys_execve): Use it.
(sys_execveat): New function.
* linux/dummy.h (sys_execveat): Remove.
* tests/execveat.c: New file.
* tests/execveat.expected: Likewise.
* tests/execveat-v.expected: Likewise.
* tests/execveat.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add execveat.
(TESTS): Add execveat.test.
(EXTRA_DIST): Add execveat.expected and execveat-v.expected.
* tests/.gitignore: Add execveat.
2015-07-27 15:27:43 +00:00
4ff687bb31 execve: fix support of personalities with different word size
* execve.c (printargc): Do not assume that host and target pointers have
the same size.
* tests/execve.c: New file.
* tests/execve.expected: Likewise.
* tests/execve-v.expected: Likewise.
* tests/execve.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add execve.
(TESTS): Add execve.test.
(EXTRA_DIST): Add execve.expected and execve-v.expected.
* tests/.gitignore: Add execve.
2015-07-27 15:27:43 +00:00
ddb53dd142 Implement bpf syscall decoding
* bpf.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* configure.ac (AC_CHECK_HEADERS): Add linux/bpf.h.
* linux/dummy.h (sys_bpf): Remove.
* pathtrace.c (pathtrace_match): Add SEN_bpf.
* xlat/bpf_commands.in: New file.
* xlat/bpf_map_types.in: New file.
* xlat/bpf_map_update_elem_flags.in: New file.
* xlat/bpf_prog_types.in: New file.
* tests/bpf.c: New file.
* tests/bpf.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add bpf.
(TESTS): Add bpf.test.
* tests/.gitignore: Add bpf.
2015-07-27 15:27:43 +00:00
3691562e7d prctl: fix decoding of unrecognized commands
The use of printargs introduced by commit v4.10-179-g210a6b6 is wrong:
when the first argument is already printed, printargs cannot be called.

* prctl.c (print_prctl_args): New function.
(sys_prctl): Use it.
2015-07-25 09:55:02 +00:00
f8b49133b7 Macroize -m32/-mx32 configure checks
Prepare for additional configure checks that would be needed
for new multiple personalities support.

* m4/mpers.m4: New file.
* configure.ac: Use it.
2015-07-23 11:39:32 +00:00
04fcb99972 tests/uid: import uid overflow check from tests/uid16
* tests/uid.c (main): Skip if the uid returned by getuid matches
/proc/sys/kernel/overflowuid.
2015-07-22 19:47:39 +00:00
ae61067ce6 sh64: fix inotify_{add,rm}_watch syscall entries
* linux/sh64/syscallent.h (inotify_add_watch, inotify_rm_watch):
Set sys_func.
2015-07-21 19:09:35 +00:00
1e0efbb18d microblaze: fix several syscall entries
* linux/microblaze/syscallent.h (signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1, recvmmsg): Set sys_func.
2015-07-21 19:09:35 +00:00
be547c19da hppa: fix several syscall entries
* linux/hppa/syscallent.h (remap_file_pages, mq_open, mq_unlink,
mq_timedsend, mq_timedreceive, mq_notify, mq_getsetattr,
clock_nanosleep, signalfd, timerfd): Set sys_func.
2015-07-21 19:09:35 +00:00
d00eb1f58d ia64: fix getpagesize syscall entry
* linux/ia64/syscallent.h (getpagesize): Fux nargs.
2015-07-21 19:09:35 +00:00
76c9f0ecb7 avr32: fix fstatat64 syscall entry
* linux/avr32/syscallent.h (fstatat64): Set sys_func.
2015-07-21 19:09:35 +00:00
ecabdcf959 alpha: fix 2 dummy osf syscall entries
* linux/alpha/syscallent.h (osf_set_program_attributes): Fix nargs.
(osf_sigstack): Fix nargs and sys_name.
2015-07-21 19:09:35 +00:00
82841f7e7e alpha, arm, ia64, mips, sh64: fix semop syscall entries
* linux/alpha/syscallent.h (semop): Fix nargs, set sys_func.
* linux/ia64/syscallent.h (semop): Set sys_func.
* linux/mips/syscallent-n32.h (semop): Likewise.
* linux/mips/syscallent-n64.h (semop): Likewise.
* linux/arm/syscallent.h (semop): Fix nargs.
* linux/sh64/syscallent.h (semop): Likewise.
2015-07-21 19:09:35 +00:00
ece9ce6fea m68k: fix getpagesize decoding
* linux/m68k/syscallent.h (getpagesize): Set sys_func.
* mem.c [M68K] (sys_getpagesize): Define.
2015-07-21 19:09:35 +00:00
f1548d93f1 tests/ip_mreq: skip if basic setsockopt operations fail
* tests/ip_mreq.c (main): Return 77 if basic
IP_ADD_MEMBERSHIP/IP_DROP_MEMBERSHIP options cannot be set.
2015-07-21 19:09:35 +00:00
95eaf19644 tests: use -lpthread instead of -pthread
On some obscure systems, -lpthread is more likely to work than -pthread.

* tests/Makefile.am (filter_unavailable_LDFLAGS): Rename to
filter_unavailable_LDADD and change to -lpthread.
2015-07-21 19:09:35 +00:00
ce93bbdef1 mips o32: fix utimensat syscall entry
* linux/mips/syscallent-o32.h (utimensat): set sys_flags and sys_func.
2015-07-21 19:09:35 +00:00
ba8b9556bb linux/mips/syscallent-compat.h: use designated initializers
Change linux/mips/syscallent-compat.h to use designated initializers
like normal syscallent.h files.

* linux/mips/syscallent-compat.h: Use designated initializers.
2015-07-21 19:09:35 +00:00
a3eb3b410d linux/mips/syscallent-compat.h: fix initalization of empty entries
This complements commit 140ecf8766.

* linux/mips/syscallent-compat.h: Fix initalization of empty entries.
2015-07-21 19:09:35 +00:00
716fb20263 Remove unused parsers of getmsg and putmsg
* stream.c [SPARC || SPARC64] (sys_putmsg, sys_getmsg): Remove.
Stop including "xlat/msgflags.h".
* xlat/msgflags.in: Remove.
2015-07-20 22:41:56 +00:00
fa6c0879c7 sigreturn: make use of RVAL_DECODED
* sigreturn.c (arch_sigreturn): New function.
(sys_sigreturn): Use it.  Return RVAL_DECODED.
* linux/alpha/arch_sigreturn.c: Update.
* linux/crisv10/arch_sigreturn.c: Likewise.
* linux/m68k/arch_sigreturn.c: Likewise.
* linux/microblaze/arch_sigreturn.c: Likewise.
* linux/x86_64/arch_sigreturn.c: Likewise.
2015-07-20 22:03:07 +00:00
eebb5616bf or1k_atomic.c: make use of RVAL_DECODED
* or1k_atomic.c (sys_or1k_atomic): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
57ae04e402 Update openat parser for the RVAL_DECODED change
* open.c (sys_openat): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
d9e87921de bjm.c: make use of RVAL_DECODED
* bjm.c (sys_create_module, sys_delete_module, sys_init_module,
sys_finit_module): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
0b2eabeed4 access.c: make use of RVAL_DECODED
* access.c (decode_access, sys_faccessat): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
8aa2a81233 affinity.c: make use of RVAL_DECODED
* affinity.c (sys_sched_setaffinity): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
a52375f748 affinity.c: use printaddr and umove_or_printaddr
* affinity.c (print_affinitylist): Use printaddr and umove_or_printaddr.
(sys_sched_getaffinity): Remove redundant u_rval check.
2015-07-20 22:03:07 +00:00
07eaf50848 aio.c: enhance io_* syscalls decoding
* aio.c (sys_io_setup): Use printnum_int64 and printnum_long.
(sys_io_destroy, sys_io_submit): Update for RVAL_DECODED.
(sys_io_submit): Use umove_or_printaddr and printaddr.
Enclose iocb array in square brackets.
Change to traditional structure output format.
(print_io_event): New function.
(sys_io_cancel, sys_io_getevents): Use it.
(sys_io_cancel): Use umove_or_printaddr and printaddr.
(sys_io_getevents): Use printaddr.
2015-07-20 22:03:07 +00:00
4b6fc98816 cacheflush.c: make use of RVAL_DECODED
* cacheflush.c (sys_cacheflush): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
bb16ee1f65 cacheflush.c: use printaddr
* cacheflush.c (sys_cacheflush): Use printaddr.
2015-07-20 22:03:07 +00:00
ff33aac4e9 capability.c: make use of RVAL_DECODED
* capability.c (sys_capset): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
c70da7c15e capability.c: use printaddr and umove_or_printaddr
* capability.c (get_cap_header): Use printaddr.
(print_cap_data): Use printaddr and umove_or_printaddr.
2015-07-20 22:03:07 +00:00
474083a189 chdir.c: make use of RVAL_DECODED
* chdir.c (sys_chdir): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
a4d45720d0 chmod.c: make use of RVAL_DECODED
* chmod.c (decode_chmod): Change to return void.
(sys_chmod, sys_fchmodat): Update callers.  Update for RVAL_DECODED.
(sys_fchmod): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
10e407dfb3 clone.c: make use of RVAL_DECODED
* clone.c (sys_setns, sys_unshare, sys_fork): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
cbabaf9141 Alias sys_epoll_create to printargs_ld
* desc.c (sys_epoll_create): Remove.
* linux/dummy.h (sys_epoll_create): Alias to printargs_ld.
2015-07-20 22:03:07 +00:00
df0c18c4a3 desc.c: make use of RVAL_DECODED
* desc.c (sys_flock, sys_close, sys_dup, do_dup2, sys_epoll_create1,
sys_epoll_ctl, do_eventfd, sys_perf_event_open): Update
for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
e6019fd424 desc.c: do not use xmalloc, use umove_or_printaddr and printaddr
* desc.c (printflock64, printflock): Use umove_or_printaddr.
(decode_select): Do not use xmalloc.  Use umoven_or_printaddr
and printaddr.
(sys_oldselect): Use printaddr.
(sys_epoll_ctl): Use umoven_or_printaddr and printaddr.
(print_epoll_event_array): New function.
(sys_epoll_wait_common): Use it.
(sys_pselect6): Use umove_or_printaddr.
(sys_eventfd2): Use printaddr.
2015-07-20 22:03:07 +00:00
d4b3f6a8e2 xlat/epollctls.in: add default values
* xlat/epollctls.in (EPOLL_CTL_ADD, EPOLL_CTL_DEL, EPOLL_CTL_MOD): Add
default values.
2015-07-20 22:03:07 +00:00
3ef50217c1 dirent.c: do not use xmalloc
* dirent.c (print_old_dirent): Use umove_or_printaddr.
(sys_readdir): Use printaddr.
(sys_getdents, sys_getdents64): Do not use xmalloc for dirents,
treat malloc failure the same way as umoven failure.  Use printaddr.
2015-07-20 22:03:07 +00:00
7e56b4e5ae execve.c: make use of RVAL_DECODED
* execve.c (sys_execve, sys_execv): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
ad18132608 execve.c: use printaddr and umove_or_printaddr
* execve.c (printargv): Use umoven_or_printaddr.
(sys_execve, sys_execv): Use printaddr.
2015-07-20 22:03:07 +00:00
429c6775d4 fadvise.c: make use of RVAL_DECODED
* fadvise.c (sys_fadvise64, sys_fadvise64_64): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
5dcf3b1642 fallocate.c: make use of RVAL_DECODED
* fallocate.c (sys_fallocate): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
a3a7ffee58 fanotify.c: make use of RVAL_DECODED
* fanotify.c (sys_fanotify_init, sys_fanotify_mark): Update
for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
f891bb4373 fchownat.c: make use of RVAL_DECODED
* fchownat.c (sys_fchownat): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
b6d80ffe02 file.c: use umove_or_printaddr
* file.c (printstat32, printstatsol): Remove.
(printstat, printstat64, printoldstat): Use umove_or_printaddr.
2015-07-20 22:03:07 +00:00
b5821091ee futex.c: enhance futex syscall decoding
* futex.c (sys_futex): Use switch statement.  Use printaddr.
Print uint32_t syscall arguments using %u format.
Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
a9183c3958 get_robust_list.c: use printnum_long
* get_robust_list.c (sys_get_robust_list): Use printnum_long.
2015-07-20 22:03:07 +00:00
bc863e9cae getcpu.c: use printnum_int and printaddr
* getcpu.c (sys_getcpu): Use printnum_int and printaddr.
2015-07-20 22:03:07 +00:00
071193f620 getcwd.c: use printaddr
* getcwd.c (sys_getcwd): Use printaddr.
2015-07-20 22:03:07 +00:00
aa9f687ff3 getrandom.c: use printaddr
* getrandom.c (sys_getrandom): Use printaddr.
2015-07-20 22:03:07 +00:00
3aced79818 hostname.c: make use of RVAL_DECODED
* hostname.c (sys_sethostname): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
3f08e2d4d5 hostname.c: use printaddr
* hostname.c (sys_gethostname): Use printaddr.
2015-07-20 22:03:07 +00:00
fe3cdfc68d inotify.c: make use of RVAL_DECODED
* inotify.c (sys_inotify_add_watch, sys_inotify_rm_watch,
sys_inotify_init1): Update for RVAL_DECODED.
2015-07-20 22:03:07 +00:00
1f255fd968 io.c: make use of RVAL_DECODED
* io.c (sys_write, sys_writev, sys_pwrite, sys_pwritev, sys_sendfile,
sys_sendfile64, sys_tee, sys_splice, sys_vmsplice): Update
for RVAL_DECODED.
2015-07-20 22:03:06 +00:00
dd5f0cef93 Use printnum_int64 instead of print_loff_t
* defs.h (print_loff_t): Remove.
* io.c (print_loff_t): Remove.
(sys_sendfile64, sys_splice): Use printnum_int64 instead of print_loff_t.
* mtd.c (mtd_ioctl): Likewise.
2015-07-20 22:03:06 +00:00
43b5a1f985 io.c: use printaddr and umove_or_printaddr
* io.c (sys_read, sys_pread): Use printaddr.
(tprint_iov_upto): Do not fetch data in case of syserror.
Use printaddr.
(sys_readv, sys_preadv): Remove redundant check for syserror.
(print_off_t): Use printnum_int and printnum_long.
(print_loff_t): Use umove_or_printaddr.
2015-07-20 22:03:06 +00:00
a58ad74f79 ioprio.c: make use of RVAL_DECODED
* ioprio.c (sys_ioprio_set): Update for RVAL_DECODED.
2015-07-20 22:03:06 +00:00
2370d53281 ipc.c: use printaddr and umove_or_printaddr
* ipc.c (sys_msgctl): Use printaddr.
(tprint_msgbuf): New function.
(tprint_msgsnd, tprint_msgrcv): Use it.
(sys_msgrcv): Use umove_or_printaddr.
(tprint_sembuf): Rename to tprint_sembuf_array.
(tprint_sembuf): New function.
(tprint_sembuf_array): Use it.
(sys_semop, sys_semtimedop): Update callers.
(sys_shmctl, sys_shmat, sys_shmdt): Use printaddr.
(sys_mq_open, printmqattr): Use printaddr and umove_or_printaddr.
* tests/ipc_msg.c (main): Update msgctl IPC_RMID regexp.
* tests/ipc_shm.c (main): Update shmctl IPC_RMID regexp.
2015-07-20 22:03:06 +00:00
2f444dc871 kexec.c: use printaddr and umove_or_printaddr
* kexec.c (print_seg): New function.
(print_kexec_segments): Use it.  Use printaddr and umove_or_printaddr.
(kexec_load): Use printaddr.  Update for RVAL_DECODED.
2015-07-20 01:42:01 +00:00
4eef291671 keyctl.c: make use of RVAL_DECODED
* keyctl.c (sys_add_key, sys_request_key): Update for RVAL_DECODED.
(keyctl_join_session_keyring, keyctl_handle_key,
keyctl_set_reqkey_keyring): Remove.
(keyctl_get_keyring_id, keyctl_update_key, keyctl_handle_key_key,
keyctl_read_key, keyctl_keyring_search, keyctl_chown_key,
keyctl_instantiate_key, keyctl_instantiate_key_iov, keyctl_negate_key,
keyctl_reject_key, keyctl_set_timeout, keyctl_get_persistent,
keyctl_setperm_key): Change to return void.
Update for RVAL_DECODED.
(sys_keyctl): Update callers.  Update for RVAL_DECODED.
2015-07-20 01:42:01 +00:00
5f6ca3d475 keyctl.c: use printaddr
* keyctl.c (keyctl_read_key): Use printaddr.
2015-07-20 01:42:01 +00:00
583526e44a ldt.c: make use of RVAL_DECODED
* ldt.c (sys_modify_ldt, sys_set_thread_area, sys_get_thread_area):
Update for RVAL_DECODED.
2015-07-20 01:42:01 +00:00
79a45942b6 ldt.c: use printaddr and umove_or_printaddr
* ldt.c [I386 || X86_64 || X32] (print_user_desc):
Use umove_or_printaddr.
[I386 || X86_64 || X32] (sys_modify_ldt): Use printaddr.
[(M68K || MIPS] (set_thread_area): Likewise.
[I386 || X86_64 || X32] (set_thread_area): Do not fetch data
if !verbose.
[I386 || X86_64 || X32] (get_thread_area): Remove redundant check
for syserror.
2015-07-20 01:42:01 +00:00
4e33965809 link.c: make use of RVAL_DECODED
* link.c (sys_link, sys_linkat, sys_unlinkat, sys_symlinkat): Update
for RVAL_DECODED.
2015-07-20 01:42:01 +00:00
ed88a50630 lseek.c: make use of RVAL_DECODED
* lseek.c (sys_lseek): Update for RVAL_DECODED.
2015-07-20 01:42:01 +00:00
7db808d749 lseek.c: use printnum_int64
* lseek.c (sys_llseek): Use printnum_int64.
2015-07-20 01:42:01 +00:00
85813ceb2d mem.c: make use of RVAL_DECODED
* mem.c (print_mmap): Change to return void.
Update for RVAL_DECODED.
(sys_old_mmap, sys_old_mmap_pgoff, sys_mmap, sys_mmap_pgoff,
sys_mmap_4koff): Update callers.  Update for RVAL_DECODED.
(sys_brk, sys_munmap, sys_mprotect, sys_mremap, sys_madvise,
sys_mlockall, sys_msync, sys_remap_file_pages, sys_mbind,
sys_set_mempolicy, sys_migrate_pages, [POWERPC] subpage_prot):
Update for RVAL_DECODED.
2015-07-20 01:42:01 +00:00
2c389f6751 mem.c: use printaddr and umove_or_printaddr
* mem.c (sys_brk, print_mmap, sys_munmap, sys_mprotect, sys_mremap,
sys_madvise, sys_msync, sys_mincore, sys_remap_file_pages, get_nodes,
sys_mbind, [POWERPC] sys_subpage_prot): Use printaddr.
(sys_get_mempolicy): Use printaddr and umove_or_printaddr.
2015-07-20 01:42:01 +00:00
c15dd41453 mknod.c: make use of RVAL_DECODED
* mknod.c (decode_mknod): Change to return void.
Update for RVAL_DECODED.
(sys_mknod, sys_mknodat): Update callers.  Update for RVAL_DECODED.
[SPARC || SPARC64] (xmknod): Update for RVAL_DECODED.
2015-07-20 01:42:01 +00:00
ef08ed1a03 mount.c: make use of RVAL_DECODED
* mount.c (sys_mount): Update for RVAL_DECODED.
2015-07-20 01:42:01 +00:00
5935850c4d mount.c: use printaddr
* mount.c (sys_mount): Use printaddr.
2015-07-20 01:42:00 +00:00
771c2a4651 Alias sys_connect to sys_bind
* linux/dummy.h (sys_connect): Alias to sys_bind.
* net.c (sys_connect): Remove.
2015-07-20 01:42:00 +00:00
219b3a79b4 net.c: make use of RVAL_DECODED
* net.c (sys_socket, sys_bind, sys_listen, sys_send, sys_sendto,
sys_sendmsg, sys_shutdown, sys_setsockopt): Update for RVAL_DECODED.
2015-07-20 01:42:00 +00:00
6c277da205 net.c: use printaddr and umove_or_printaddr
* net.c (printsock): Use printaddr and umove_or_printaddr.
(printcmsghdr, printmsghdr, printmmsghdr, decode_mmsg, do_sockname,
sys_recv, sys_recvfrom, sys_recvmsg, do_pipe, print_linger, print_ucred,
print_tpacket_stats, print_icmp_filter, print_getsockopt,
print_group_req, print_tpacket_req, print_packet_mreq,
print_setsockopt): Use printaddr.
(print_mreq, print_mreq6): Use umove_or_printaddr.
2015-07-20 01:42:00 +00:00
10020ae191 tests: add sigaltstack.test
* tests/sigaltstack.c: New file.
* tests/sigaltstack.expected: Likewise.
* tests/sigaltstack.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add sigaltstack.
(TESTS): Add sigaltstack.test.
(EXTRA_DIST): sigaltstack.expected.
* tests/.gitignore: Add sigaltstack.
2015-07-18 00:01:40 +00:00
b1c448cd47 bootstrap: delete personality test directories beforehand
* bootstrap: Delete tests-m32 and tests-mx32 directories
before creating them.
2015-07-18 00:01:40 +00:00
0e946ab2c2 defs.h: do not include <signal.h>
* printsiginfo.h: New file.
* Makefile.am (strace_SOURCES): Add it.
* defs.h: Do not include <signal.h>.
(printsiginfo): Remove.
* printsiginfo.c: Include <signal.h> and "printsiginfo.h".
* strace.c: Likewise.
* sigaltstack.c: Include <signal.h>.
* signal.c: Likewise.
* sigreturn.c: Likewise.
* time.c: Likewise.
2015-07-18 00:01:40 +00:00
1e08a160f7 resource.c: move printrusage and printrusage32 to a separate file
* printrusage.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* resource.c (printrusage, [ALPHA] printrusage32): Move
to printrusage.c.
2015-07-18 00:01:40 +00:00
d62d8fd671 open.c: make use of RVAL_DECODED
* open.c (decode_open, sys_creat): Update for RVAL_DECODED.
2015-07-18 00:01:40 +00:00
ada84324ae personality.c: make use of RVAL_DECODED
* personality.c (sys_personality): Update for RVAL_DECODED.
2015-07-18 00:01:40 +00:00
a528eb5b49 printsiginfo.c: use umove_or_printaddr
* printsiginfo.c (printsiginfo_at): Use umove_or_printaddr.
2015-07-18 00:01:40 +00:00
210a6b6884 prctl.c: make use of RVAL_DECODED
* prctl.c (prctl_enter, prctl_exit): Merge into sys_prctl.
(sys_prctl, sys_arch_prctl): Update for RVAL_DECODED.
2015-07-18 00:01:40 +00:00
7c53e984ac prctl.c: use printaddr and umove_or_printaddr
* prctl.c (prctl_exit): Use printaddr and umove_or_printaddr.
2015-07-18 00:01:40 +00:00
14446ebcf6 process.c: use printaddr
* process.c (sys_ptrace): Use printaddr.
2015-07-18 00:01:40 +00:00
684c9e9d3d process_vm.c: make use of RVAL_DECODED
* process_vm.c (sys_process_vm_writev): Update for RVAL_DECODED.
2015-07-18 00:01:40 +00:00
66a344c006 process_vm.c: use printaddr
* process_vm.c (sys_process_vm_readv): Use printaddr.
2015-07-18 00:01:40 +00:00
307945d4d9 reboot.c: make use of RVAL_DECODED
* reboot.c (sys_reboot): Update for RVAL_DECODED.
2015-07-18 00:01:40 +00:00
0564623abf Enhance quotactl decoding
* quota.c (decode_cmd_data): Use umove_or_printaddr.
(sys_quotactl): Do not disable the parser in verbose mode.
Decode all "set" commands on entering syscall.
2015-07-18 00:01:40 +00:00
8ef8a4c095 readahead.c: make use of RVAL_DECODED
* readahead.c (sys_readahead.c): Update for RVAL_DECODED.
2015-07-18 00:01:40 +00:00
8e0a18fa7f readlink.c: use printaddr
* readlink.c (decode_readlink): Use printaddr.
2015-07-18 00:01:40 +00:00
fe62e3312b renameat.c: make use of RVAL_DECODED
* renameat.c (sys_renameat, sys_renameat2): Update for RVAL_DECODED.
2015-07-18 00:01:40 +00:00
2b15a5848e resource.c: make use of RVAL_DECODED
* resource.c (sys_setrlimit, sys_getpriority, sys_setpriority):
Update for RVAL_DECODED.
2015-07-18 00:01:39 +00:00
7cc79b4137 resource.c: use umove_or_printaddr
* resource.c (print_rlimit64, print_rlimit32, printrusage32,
printrusage, sys_times): Use umove_or_printaddr.
(decode_rlimit64): Remove.
(decode_rlimit): Remove redundant checks.
[defined(current_wordsize) && current_wordsize != 4] (decode_rlimit):
Define to print_rlimit64.
(sys_prlimit64): Replace decode_rlimit64 with print_rlimit64.
2015-07-18 00:01:39 +00:00
10c408acea sched.c: make use of RVAL_DECODED
* sched.c (sys_sched_setscheduler, sys_sched_setparam,
sys_sched_get_priority_min): Update for RVAL_DECODED.
2015-07-18 00:01:39 +00:00
f8bf1d5633 sched.c: use printnum_int and printaddr
* sched.c (sys_sched_setscheduler, sys_sched_getparam,
sys_sched_setparam): Use printnum_int for sched_param decoding.
(sched_rr_get_interval): Use printaddr.
2015-07-18 00:01:39 +00:00
8277ec9c60 scsi.c: use printaddr
* scsi.c (print_sg_io_buffer): Use printaddr.
2015-07-18 00:01:39 +00:00
1252d26db8 seccomp.c: make use of RVAL_DECODED
* seccomp.c (sys_seccomp): Update for RVAL_DECODED.
2015-07-17 01:16:16 +00:00
931ebbfd92 seccomp.c: use printaddr and umove_or_printaddr
* seccomp.c (decode_fprog, decode_seccomp_set_mode_strict):
Use printaddr.
(print_seccomp_filter): Use umove_or_printaddr.
2015-07-17 01:16:16 +00:00
401295ea32 sigaltstack.c: use printaddr and umove_or_printaddr
* sigaltstack.c (print_stack_t): Use umove_or_printaddr and printaddr.
2015-07-17 01:16:16 +00:00
0e45b50ce6 signal.c: make use of RVAL_DECODED
* signal.c (sys_sigsuspend, sys_kill, sys_tgkill, sys_rt_sigsuspend,
sys_rt_sigqueueinfo, sys_rt_tgsigqueueinfo, sys_restart_syscall,
do_signalfd): Update for RVAL_DECODED.
2015-07-17 00:54:55 +00:00
735843e23a signal.c: use printaddr and umove_or_printaddr
* signal.c (print_sigset_addr_len, decode_old_sigaction):
Use printaddr and umove_or_printaddr.
(sys_signal): Use printaddr.
(sys_sigprocmask, sys_sigpending, sys_rt_sigprocmask,
sys_rt_sigpending): Remove redundant checks for syserror.
(decode_new_sigaction): Use umove_or_printaddr.
2015-07-17 00:54:55 +00:00
490d58c394 sram_alloc.c: make use of RVAL_DECODED
* sram_alloc.c [BFIN] (sys_sram_alloc): Update for RVAL_DECODED.
2015-07-16 23:44:57 +00:00
fd55b54112 statfs.c: use umove_or_printaddr
* statfs.c (printstatfs, printstatfs64, printcompat_statfs64):
Use umove_or_printaddr.
2015-07-16 23:44:57 +00:00
9afb4d06c0 swapon.c: make use of RVAL_DECODED
* swapon.c (sys_swapon): Update for RVAL_DECODED.
2015-07-16 23:44:57 +00:00
63bae232d2 swapon.c: move fallback definitions of swap options to xlat/
* swapon.c: Move definitions of SWAP_FLAG_* flags ...
* xlat/swap_flags.in: ... here.
2015-07-16 23:44:57 +00:00
69c1c4e46a sync_file_range2: fix typo in flags decoding
* sync_file_range.c (sys_sync_file_range2): Fix typo in flags decoding.
2015-07-16 23:44:57 +00:00
d6ed7948f7 sync_file_range.c: make use of RVAL_DECODED
* sync_file_range.c (sys_sync_file_range, sys_sync_file_range2): Update
for RVAL_DECODED.
2015-07-16 23:44:57 +00:00
5717e7af0d syslog.c: use umove_or_printaddr and RVAL_DECODED
* sysctl.c (sys_sysctl): Use umove_or_printaddr and RVAL_DECODED.
2015-07-16 23:44:57 +00:00
be6d79146c sysinfo.c: use umove_or_printaddr
* sysinfo.c (sys_sysinfo): Use umove_or_printaddr.
2015-07-16 22:58:12 +00:00
279df2cc75 syslog.c: make use of RVAL_DECODED
* syslog.c (sys_syslog): Update for RVAL_DECODED.
2015-07-16 22:58:12 +00:00
aa06f46d01 syslog.c: use printaddr
* syslog.c (sys_syslog): Use printaddr.
2015-07-16 22:58:12 +00:00
040de57477 sysmips.c: cleanup
* sysmips.c [MIPS] (sys_sysmips): Use switch statement.  Use printaddr.
Fix misprinted ", " delimiter.
2015-07-16 22:58:12 +00:00
034f98e10d sysmips.c: make use of RVAL_DECODED
* sysmips.c [MIPS] (sys_sysmips): Update for RVAL_DECODED.
2015-07-16 22:58:12 +00:00
76c8f66c4d time.c: make use of RVAL_DECODED
* time.c (sys_settimeofday, sys_osf_settimeofday, sys_clock_settime,
sys_timerfd, sys_timerfd_create, sys_timerfd_settime): Update
for RVAL_DECODED.
(timerfd_gettime): Decode struct itimerspec argument on exiting syscall.
2015-07-16 22:58:12 +00:00
7117835861 time.c: use printaddr, printnum_int, and umoven_or_printaddr
* time.c (sys_nanosleep): Use printaddr.
(printitv_bitness, tprint_timex32, tprint_timex, printsigevent32,
printsigevent): Use umoven_or_printaddr.
(sys_timer_create): Use printnum_int.
(sys_getitimer, sys_osf_getitimer, sys_setitimer, sys_osf_setitimer,
do_adjtimex, sys_timer_settime, sys_timer_gettime): Remove
redundant checks for syserror.
2015-07-16 22:58:12 +00:00
9f7027371c sprinttv: do not fetch data in case of syserror
* time.c (sprinttv): Do not fetch data in case syserror.
Print address instead of {...} in case of umove failure.
(sys_gettimeofday, sys_osf_gettimeofday, sys_adjtime, sys_clock_gettime,
clock_nanosleep): Remove now redundant checks for syserror.
2015-07-16 22:58:12 +00:00
927f026d4c truncate.c: make use of RVAL_DECODED
* truncate.c (sys_truncate, sys_truncate64, sys_ftruncate,
sys_ftruncate64): Update for RVAL_DECODED.
2015-07-16 22:58:12 +00:00
ff235c89ea umask.c: make use of RVAL_DECODED
* umask.c (sys_umask): Update for RVAL_DECODED.
2015-07-16 22:58:12 +00:00
c1f37f6e7a umount.c: make use of RVAL_DECODED
* umount.c (sys_umount2): Update for RVAL_DECODED.
2015-07-16 22:58:12 +00:00
c9a199278b utimes.c: make use of RVAL_DECODED
* utimes.c (decode_utimes): Change to return void.
Update for RVAL_DECODED.
(sys_utimes, sys_futimesat, sys_utimensat, sys_osf_utimes):
Update callers.  Update for RVAL_DECODED.
2015-07-16 22:57:52 +00:00
8ef543929a tests/uid.test: adopt for alpha
Make the test work on alpha that has getxuid syscall instead of getuid.

* tests/uid.awk (BEGIN): Update getuid regexp to match both getuid
and getxuid syscalls.
* tests/uid.c (main): Allow __NR_getxuid as an alternative
to __NR_getuid.
* tests/uid.test: If getuid syscall is not available, probe for
getxuid syscall.
2015-07-16 22:13:56 +00:00
14278620c9 uid.c: make use of RVAL_DECODED
* uid.c (sys_setuid, sys_setreuid, sys_setresuid, sys_chown, sys_fchown,
sys_setgroups): Update for RVAL_DECODED.
2015-07-16 01:36:55 +00:00
288a87049c uid.c: use printaddr and umoven_or_printaddr
* uid.c (get_print_uid): Use umoven_or_printaddr.
(sys_getresuid): Do not check for syserror, get_print_uid now does
the right thing.
(sys_setgroups, sys_getgroups): Add const qualifier to local variables
that are assigned once.  Use printaddr.
2015-07-16 01:36:55 +00:00
fdd0fce3d3 ia64: wire up utimensat syscall
* linux/ia64/syscallent.h (utimensat): New entry.
2015-07-16 01:36:55 +00:00
e5fe1400c0 decode_utimes: enclose timespec array in square brackets
* utimes.c (decode_utimes): enclose timespec array in square brackets
instead of curly brackets.
2015-07-16 01:36:55 +00:00
9809e3ab0a uname.c: use umove_or_printaddr
* uname.c (sys_uname): Use umove_or_printaddr.
2015-07-16 01:36:55 +00:00
d27cccaeff tests: add utime.test
* tests/utime.c: New file.
* tests/utime.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add utime.
(TESTS): Add utime.test.
* tests/.gitignore: Add utime.
2015-07-16 01:36:47 +00:00
8d51f43946 utime.c: make use of RVAL_DECODED
* utime.c (sys_utime): Update for RVAL_DECODED.
2015-07-16 01:35:27 +00:00
cec41dd2b3 utime.c: use umoven_or_printaddr
* utime.c (sys_utime): Use umoven_or_printaddr.
2015-07-16 01:35:27 +00:00
90cfe8fbff wait.c: use printaddr and umove_or_printaddr
* wait.c (waitid): Do not check for NULL the address passed
to printrusage.
(printwaitn): Likewise.
Use printaddr and umove_or_printaddr for fetching wait status.
2015-07-15 00:49:27 +00:00
f6026b6e65 wait: move fallback definitions of wait options to xlat/
* wait.c: Move definitions of __W* flags ...
* xlat/wait4_options.in: ... here.
2015-07-15 00:33:20 +00:00
b60b2a5aa3 tests: add xattr.test
* tests/xattr.c: New file.
* tests/xattr.expected: Likewise.
* tests/xattr.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add xattr.
(TESTS): Add xattr.test.
(EXTRA_DIST): Add xattr.expected.
* tests/.gitignore: Add xattr.
2015-07-15 00:09:08 +00:00
6156d81cef xattr.c: make use of RVAL_DECODED
* xattr.c (sys_setxattr, sys_fsetxattr, sys_removexattr,
sys_fremovexattr): Update for RVAL_DECODED.
2015-07-14 23:38:58 +00:00
105c35bb19 print_xattr_val: do not fetch data in case of !verbose || syserror
* xattr.c (print_xattr_val): Do not fetch data in case
of !verbose || syserror.   Use printaddr.
2015-07-14 23:34:06 +00:00
8ae9c0913e print_xattr_list: use printaddr
* xattr.c (print_xattr_list): Use printaddr.
2015-07-14 23:31:35 +00:00
d45548d82e print_xattr_val: remove unused argument
* xattr.c (print_xattr_val): Remove unused "failed" argument.
(sys_setxattr, sys_fsetxattr, sys_getxattr, sys_fgetxattr): Update
all callers.
2015-07-14 23:29:47 +00:00
7a9ec1273c print_xattr_list: remove redundant address check
* xattr.c (print_xattr_list): Do not check for NULL the address passed
to printstr.
2015-07-14 23:29:12 +00:00
b10ae62d31 ipc.c: make use of RVAL_DECODED
* ipc.c (sys_mq_notify, sys_mq_open, sys_mq_timedreceive,
sys_mq_timedsend, sys_msgctl, sys_msgget, sys_msgsnd, sys_semctl,
sys_semget, sys_semop, sys_semtimedop, sys_shmctl, sys_shmdt,
sys_shmget): Update for RVAL_DECODED.
(sys_shmat): Decode all arguments on entering syscall.
2015-07-14 22:07:35 +00:00
61b7989a01 umoven_or_printaddr: do not fetch data if not in verbose mode
After this change, umoven_or_printaddr and its callers, including
printnum_* and printpair_*, will not fetch data in !verbose mode.

* util.c (umoven_or_printaddr): Do not call umoven if !verbose.
2015-07-14 22:07:35 +00:00
850ba4b1e9 Change printnum_* printers to honor syserror
With this change, printnum_* printers will not attempt to fetch data
in case of exiting(tcp) && syserror(tcp).
All "at exiting" decoders that call these printers have been made
ready for this change in previous commits.

* util.c (DEF_PRINTNUM, DEF_PRINTPAIR): Use umove_or_printaddr.
* prctl.c (prctl_exit): Use printnum_int and printnum_long.
(sys_arch_prctl): Do not check for syserror.
2015-07-14 21:59:26 +00:00
fd3cdc04d8 term.c: enhance tty ioctl parser
Decode as much data on entering syscall as possible.

* term.c (decode_termios, decode_termio, decode_winsize, decode_ttysize,
decode_modem_flags): New functions.
(term_ioctl): Use them.  Update for RVAL_DECODED.
2015-07-13 20:16:24 +00:00
483c15f4be Change comparisons with function pointers to comparisons with SENs
* pathtrace.c (pathtrace_match): Change all comparisons with function
pointers to a single SEN based switch.
* syscall.c (dumpio, trace_syscall_entering): Change all comparisons
with function pointers to comparisons with SENs.
* ipc.c (sys_ipc): Remove.
* sock.c (sys_socketcall): Likewise.
* linux/dummy.h (sys_ipc, sys_socketcall): New aliases.
2015-07-12 22:31:49 +00:00
28e32df56f Add unique syscall entry numbers (SENs)
* Makefile.am (BUILT_SOURCES, CLEANFILES): Add sen.h.
(syscallent_names, syscallent_patterns, syscallent_files): New variables.
(sen.h): New rule.
* defs.h (struct sysent): Add sen field.
* generate_sen.sh: New file.
* linux/syscall.h: Include "sen.h".
* syscall.c (SEN_NAME): New temporary macro.
(SEN): Use it to prepend syscall entry number.
2015-07-12 22:31:49 +00:00
140ecf8766 Introduce SEN macro
* syscall.c (SEN): New temporary macro.
* linux/dummy.h (sys_printargs): New macro.
* linux/subcall.h: Wrap all sys_func entries using SEN.
* linux/*/syscallent*.h: Likewise.
2015-07-12 22:31:40 +00:00
3d0e1f331f scsi.c: enhance SG_IO ioctl parser
Fix SG_IO ioctl output in case of failed umove

* scsi.c: Include <linux/ioctl.h> instead of <sys/ioctl.h>.
Update for RVAL_DECODED.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): Do not print address in case of failed umove.
(scsi_ioctl): Use printaddr.
2015-07-10 22:58:48 +00:00
317d19e8e9 ptp.c: enhance ptp ioctl parser
* ptp.c: Include <linux/ioctl.h> instead of <sys/ioctl.h>.
Update for RVAL_DECODED.
(ptp_ioctl): Use umove_or_printaddr.
2015-07-10 22:54:29 +00:00
eddefd64c3 mtd.c: enhance mtd and ubi ioctl parsers
Decode as much data on entering syscall as possible.

* xlat/mtd_file_mode_options.in: New file.
* mtd.c: Include <linux/ioctl.h> instead of <sys/ioctl.h>.
Include "xlat/mtd_file_mode_options.h".
Update for RVAL_DECODED.
(mtd_ioctl, ubi_ioctl): Use printnum_int and umove_or_printaddr.
2015-07-10 22:52:58 +00:00
b93c110079 sock.c: enhance socket ioctl parser
Decode as much data on entering syscall as possible.

* sock.c: Update for RVAL_DECODED.
(print_addr): Remove.
(print_ifreq_addr, print_ifreq, print_ifc_len, decode_ifconf): New
functions.
(sock_ioctl) Use them.  Use umove_or_printaddr.
2015-07-10 22:30:46 +00:00
a0beac1538 block.c: enhance block ioctl parser
* block.c: Update for RVAL_DECODED.
Define BLKROTATIONAL and BLKZEROOUT.
(block_ioctl): Decode them.  Use printnum_short, printnum_int,
printnum_long, printpair_int64, and umove_or_printaddr.
(print_blkpg_req, block_ioctl): Use umove_or_printaddr.
2015-07-10 22:26:56 +00:00
1dbe6839eb blkpg_ops: add BLKPG_RESIZE_PARTITION constant
* xlat/blkpg_ops.in: Add BLKPG_RESIZE_PARTITION.

Reported-by: Christian Neukirchen <chneukirchen@gmail.com>
2015-07-09 11:57:18 +00:00
3cfabeb881 loop.c: enhance loop ioctl parser
Decode as much data on entering syscall as possible.

* loop.c: Include <linux/ioctl.h> instead of <sys/ioctl.h>.
Update for RVAL_DECODED.
(decode_loop_info, decode_loop_info64): New functions.
(loop_ioctl): Use them.  Decode LOOP_SET_STATUS, LOOP_SET_STATUS64,
LOOP_SET_FD, LOOP_CHANGE_FD, LOOP_CTL_ADD and LOOP_CTL_REMOVE on
entering syscall.
Print LOOP_SET_FD and LOOP_CHANGE_FD arguments using printfd.
2015-07-09 02:04:34 +00:00
97317d9d83 rtc.c: enhance rtc ioctl parser
* rtc.c: Update for RVAL_DECODED.
(print_rtc): Rename to print_rtc_time.
(decode_rtc_time, decode_rtc_wkalrm): New functions.
(rtc_ioctl): Use them.
[RTC_VL_READ]: Decode RTC_VL_READ.
Use printnum_long for RTC_IRQP_READ and RTC_EPOCH_READ decoding.
2015-07-09 02:01:58 +00:00
b679508f6e Use printpair_int
* evdev.c (repeat_ioctl): Use printpair_int.
* net.c (do_pipe, sys_socketpair): Likewise.
2015-07-09 01:43:44 +00:00
69127a3a8d Add several generic integer pairs printing functions
Add functions to fetch and print pairs of integer types.
Note that these printers do not attempt to fetch data
in case of exiting(tcp) && syserror(tcp).

printnum_* printers will follow as soon as all callers are made ready
for this change.

* defs.h (printpair_int, printpair_long, printpair_int64): New
prototypes.
* util.c (DEF_PRINTPAIR): New macro.
(printpair_int, printpair_long, printpair_int64): New functions.
2015-07-09 01:41:51 +00:00
c88163e5bd Add two generic integer printing functions
Add printnum_short and printnum_int64 in addition to already existing
printnum_int and printnum_long.

* defs.h (printnum_short, printnum_int64): New prototypes.
* util.c (DEF_PRINTNUM): New macro.
(printnum_int, printnum_long): Use DEF_PRINTNUM.
(printnum_short, printnum_int64): New functions.
2015-07-09 01:35:41 +00:00
332a32619c Add address printing functions
printaddr is a simple function implementing "print NULL or address"
idiom.
umoven_or_printaddr is a wrapper around umoven that has the same return
value semantics as umoven but also prints the address when the data
is not going to be fetched (in case of exiting(tcp) && syserror(tcp))
or cannot be fetched (umoven fails).
umove_or_printaddr is a macro wrapper around umoven_or_printaddr that
mirrors umove wrapper around umoven.

* defs.h (printaddr, umoven_or_printaddr): New prototypes.
(umove_or_printaddr): New macro.
* util.c (printaddr, umoven_or_printaddr): New functions.
2015-07-09 01:21:56 +00:00
204c2bc9cb Implement RVAL_DECODED flag
Implement a method for "on entering" parsers to return
"done with decoding" information to their callers.

If a syscall parser called from trace_syscall_entering returns a value
with RVAL_DECODED bit set, record this value in tcp->sys_func_rval
and use it in trace_syscall_exiting instead of calling the parser on
exiting syscall.

If an ioctl parser returned RVAL_DECODED, this would tell
SYS_FUNC(ioctl) that the decoding is finished but fallback printing of
the ioctl command argument is needed, while e.g. RVAL_DONE+1 would mean
that the decoding is finished and no fallback decoding is needed.

* defs.h (struct tcb): Add sys_func_rval.
(RVAL_DECODED): New macro.
* syscall.c (trace_syscall_entering): Initialize tcp->sys_func_rval
along with setting TCB_INSYSCALL flag.
(trace_syscall_exiting): Use tcp->sys_func_rval instead of calling
tcp->s_ent->sys_func when the former has RVAL_DECODED flag set.
Reset tcp->sys_func_rval along with clearing TCB_INSYSCALL flag.
* ioctl.c (sys_ioctl): Set RVAL_DECODED flag on exiting.
Print ioctl argument iff RVAL_DECODED is set and fallback decoding
is requested.
2015-07-09 01:08:01 +00:00
746db06d91 time.c: move rtc ioctl parser to a separate file
* rtc.c: new file
* Makefile.am (strace_SOURCES): Add it.
* time.c (print_rtc, rtc_ioctl): Move to rtc.c.
2015-07-05 21:37:26 +00:00
8c3e8e7db7 term.c: fix typo
* term.c: Rename TCLFLSH to TCFLSH.
2015-07-05 21:37:26 +00:00
34bd4d255f Do not include sys/filio.h
* configure.ac (AC_CHECK_HEADERS): Remove sys/filio.h.
* term.c: Do not include <sys/filio.h>.
2015-07-05 16:20:14 +00:00
4f63c11388 ioctl: prepare ioctl_decode_command_number for future changes
* ioctl.c (ioctl_decode_command_number): Change 1st arg to struct tcb*.
(sys_ioctl): Update callers.
2015-07-02 22:32:27 +00:00
802c942a36 ioctl: simplify ioctl_decode signature
* ioctl.c (ioctl_decode): Remove 2nd and 3rd parameters.
(sys_ioctl): Update callers.
2015-07-02 22:32:21 +00:00
2803e75450 ioctl: consistently use name "code" for ioctl request code
* ioctl.c (evdev_decode_number, hiddev_decode_number,
ioctl_decode_command_number): Rename "arg" to "code".
2015-07-02 22:23:53 +00:00
044eef2186 Move ioctl syscall parser to ioctl.c
* io.c (sys_ioctl): Move ...
* ioctl.c: ... here.
(ioctl_lookup, ioctl_next_match, ioctl_print_code, ioctl_decode,
ioctl_decode_command_number): Declare as static.
* defs.h (ioctl_lookup, ioctl_next_match, ioctl_print_code,
ioctl_decode, ioctl_decode_command_number): Remove.
2015-07-02 21:42:51 +00:00
e10b4f02eb ioctl: remove obsolete registry of ioctl characters
* ioctl.c: Remove registry of ioctl characters.
2015-07-02 21:34:39 +00:00
4b80f34c93 Fix filtering of <unavailable> syscalls
* syscall.c (trace_syscall_exiting): Skip filtered syscalls also in case
of get_regs or get_syscall_result failure.
* tests/filter-unavailable.c: New file.
* tests/filter-unavailable.expected: Likewise.
* tests/filter-unavailable.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add filter-unavailable.
(filter_unavailable_LDFLAGS): Add -pthread.
(TESTS): Add filter-unavailable.test.
(EXTRA_DIST): Add filter-unavailable.expected.
* tests/.gitignore: Add filter-unavailable.

Reported-by: Bryan Matsuo <bryan.matsuo@gmail.com>
2015-06-30 17:28:02 +00:00
de4a680206 Fix -qq option in conjunction with -o option
This change makes -qq option work in conjunction with -o option,
thus complementing commit v4.7-222-g01997cf.

* strace.c (init): Do not reset qflag.
2015-06-30 16:32:41 +00:00
6455f0a11e xtensa: wire up new syscalls
* linux/xtensa/syscallent.h (bpf, execveat): New entries.
2015-06-30 16:32:41 +00:00
4c3ea5df3c bfin: wire up new syscalls
* linux/bfin/syscallent.h (kcmp, finit_module, sched_setattr,
sched_getattr, renameat2, seccomp, getrandom, memfd_create,
bpf, execveat): New entries.
2015-06-30 16:28:36 +00:00
25d729fd5a alpha: wire up new syscalls
* linux/alpha/syscallent.h (getrandom, memfd_create, execveat):
New entries.
2015-06-30 15:41:19 +00:00
68cb82e0f1 tests: skip stat32 test if struct stat is defined incorrectly
If stat.st_mode returned by syscall is 0, it means that the definition
of struct stat in <asm/stat.h> is incorrect.  This is the case e.g. on
mips n32 where the only available stat syscall is 64-bit but at the same
time struct stat defined by <asm/stat.h> is 32-bit.

* tests/stat.c (main) [NR_stat]: Return 77 if st_mode is 0.
2015-06-17 21:07:56 +00:00
d93c4e80b3 Consistenly use #ifdef to check for AC_DEFINE'd macros
* aio.c (print_common_flags): Use #ifdef in the check for
HAVE_STRUCT_IOCB_U_C_FLAGS.
* defs.h: Use #ifdef in the check for HAVE_LITTLE_ENDIAN_LONG_LONG.
* net.c: Use #ifdef in the check for HAVE_SENDMSG.
* syscall.c (dumpio): Likewise.
* printstat.h (DO_PRINTSTAT): Use #ifdef in checks for
HAVE_STRUCT_STAT_ST_* macros.
* util.c: Use #ifdef in checks for HAVE_SYS_XATTR_H.
2015-06-17 20:09:13 +00:00
0c5619538f xattr: move fallback definitions of xattr flags to xlat/
* xattr.c: Include <sys/xattr.h> insread of <linux/xattr.h>.
Move definitions of XATTR_* flags ...
* xlat/xattrflags.in: ... here.
2015-06-17 19:56:11 +00:00
f64a4395d9 link: move fallback definitions of AT_* constants to xlat/
* link.c: Move definitions of AT_* constants ...
* xlat/at_flags.in: ... here.
2015-06-17 19:45:26 +00:00
fddeeba9b8 net: move fallback definitions of SOL_* constants to xlat/
* net.c: Move definitions of SOL_* constants ...
* xlat/socketlayers.in: ... here.
2015-06-17 19:23:30 +00:00
003cc9f66a futex: move fallback definitions of futex constants to xlat/
* futex.c: Move definitions of FUTEX_OP_CMP_* constants ...
* xlat/futexwakecmps.in: ... here.
* futex.c: Move definitions of other FUTEX_OP_* constants ...
* xlat/futexwakeops.in: ... here.
* futex.c: Move definitions of remaining FUTEX_* constants except
FUTEX_PRIVATE_FLAG and FUTEX_CLOCK_REALTIME flags ...
* xlat/futexops.in: ... here.
2015-06-17 19:23:25 +00:00
14f4038ad7 clone: move definitions of cloning flags to xlat/
* clone.c: Include <sched.h>.  Move definitions of CLONE_* flags ...
* xlat/clone_flags.in: ... here.
2015-06-17 18:36:53 +00:00
cf7ee30c6b Update mount flags constants
* mount.c: Remove definitions of mount flags constants.
* xlat/mount_flags.in: Update from linux v4.0, add default values.
2015-06-16 10:55:19 +00:00
a863072706 mount: update parser to match kernel behaviour
* mount.c (sys_mount): Do not decode type and data strings for
MS_SHARED, MS_PRIVATE, MS_SLAVE, and MS_UNBINDABLE mount flags
that do not imply valid strings.
2015-06-16 10:55:19 +00:00
c8cf5fed1d mount: robustify MS_MGC_VAL decoding
* mount.c (sys_mount): When printing mount flags, do not assume that
(flags & MS_MGC_MSK) == MS_MGC_VAL.
2015-06-16 01:30:49 +00:00
7bee462a64 net: decode setsockopt() multicast arguments
* configure.ac (AC_CHECK_FUNCS): Add inet_pton.
* net.c (print_mreq, print_mreq6): New functions.
(print_setsockopt): Use them to decode IP_ADD_MEMBERSHIP,
IP_DROP_MEMBERSHIP, IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP,
IPV6_JOIN_ANYCAST, and IPV6_LEAVE_ANYCAST.
* tests/ip_mreq.c: New file.
* tests/ip_mreq.expected: Likewise.
* tests/ip_mreq.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add ip_mreq.
(TESTS): Add ip_mreq.test.
(EXTRA_DIST): ip_mreq.expected.
* tests/.gitignore: Add ip_mreq.

Based on patch by Ben Noordhuis <info@bnoordhuis.nl>.
2015-06-08 23:02:27 +00:00
0b95590ee2 Update IPV6 socket options constants
* xlat/sockipv6options.in: Update from linux v4.0.
2015-06-08 23:02:27 +00:00
ae28093c65 net: factor out interface index printing code
* net.c (print_ifindex): New function.
(printsock) [HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID]: Use it.
2015-06-05 20:13:21 +00:00
6c8ef051f7 Consistently use error_msg instead of fprintf(stderr)
* linux/alpha/get_scno.c: Use error_msg.
* linux/arm/get_scno.c: Likewise.
* linux/mips/get_scno.c: Likewise.
* linux/sh/get_scno.c: Likewise.
* linux/x86_64/get_scno.c: Likewise.
* exit.c (sys_exit): Likewise.
* pathtrace.c (pathtrace_select, pathtrace_match): Likewise.
* strace.c (alloctcb, droptcb, detach, startup_attach,
test_ptrace_seize, init, cleanup, print_debug_info,
maybe_allocate_tcb, startup_tcb, trace): Likewise.
* syscall.c (update_personality, trace_syscall_exiting,
get_scno): Likewise.
* unwind.c (DPRINTF): Likewise.
* tests/bexecve.test: Update patterns.
* tests/detach-stopped.test: Likewise.
2015-05-25 23:31:31 +00:00
df3899149e Consistently print OOM diagnostic messages
* bjm.c (sys_query_module): Use error_msg to print OOM diagnostics.
* util.c (dumpiov, dumpstr): Likewise.
2015-05-25 22:25:22 +00:00
3e9d71feaa Introduce memory allocation wrappers
Introduce wrappers to the following functions that do memory allocation:
malloc, calloc, realloc, strdup.

This commit is a follow-up to the related discussions in strace-devel ML:
http://sourceforge.net/p/strace/mailman/message/33618180/
http://sourceforge.net/p/strace/mailman/message/33733470/

* defs.h (xmalloc, xcalloc, xreallocarray, xstrdup): New prototypes.
* xmalloc.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* count.c (count_syscall, call_summary_pers): Use xcalloc.
* desc.c (decode_select): Use xmalloc.
* dirent.c (sys_getdents, sys_getdents64): Likewise.
* net.c (sys_recvmmsg): Use xstrdup.
* pathtrace.c (storepath): Use xreallocarray.
(pathtrace_match): Use xmalloc.
* strace.c (die_out_of_memory): Move to xmalloc.c.
(expand_tcbtab): Use xcalloc and xreallocarray.
(startup_child): Use xstrdup.
(init): Use xmalloc, xcalloc, and xstrdup.
* syscall.c (reallocate_qual): Use xreallocarray.
(qualify): Use xstrdup.
* unwind.c (unwind_tcb_init): Use xmalloc.
(build_mmap_cache): Use xcalloc, xreallocarray, and xstrdup.
(get_symbol_name): Use xreallocarray.
(stacktrace_walk, queue_put): Use xmalloc.
* util.c (printstr): Use xmalloc.
* vsprintf.c (strace_vfprintf): Likewise.
2015-05-25 22:25:22 +00:00
8c20d8926c Fix ioctl entries on 32-bit architectures with 64-bit aligned structures
Some ioctl constants are defined to different values on those 32-bit
architectures where structures containing a 64-bit field are aligned on
a 8-byte boundary and have a size multiple of 8 bytes, and on other
32-bit architectures.

* configure.ac: Check the size of a structure containing a 64-bit field.
* linux/32/ioctls_inc.h: Rename to ...
* linux/32/ioctls_inc_align32.h: ... this.
* linux/32/ioctls_inc_align64.h: New file.
* linux/32/ioctls_inc.h: Include either 32/ioctls_inc_align32.h
or ioctls_inc_align64.h depending on SIZEOF_STRUCT_I64_I32.
* Makefile.am (EXTRA_DIST): Add linux/32/ioctls_inc_align32.h and
* linux/32/ioctls_inc_align64.h.
* tests/ioctl.c (main): Test for VIDIOC_ENUMINPUT.
* tests/ioctl.expected: Check VIDIOC_ENUMINPUT decoding.

Reported-by: Philippe De Muyter <phdm@macqel.be>
2015-05-21 22:53:42 +00:00
f95cf99556 maint: make linux/kvm.h parseable on arm
* maint/ioctls_sym.sh [AARCH64 || ARM]: Add missing definitions for
structures referenced from linux/kvm.h.
2015-05-21 17:48:38 +00:00
e459ba943e v4l2: add decoding for VIDIOC_S_CROP's arg
* v4l2.c (v4l2_ioctl): Add decoding for VIDIOC_S_CROP's arg.
2015-05-21 17:48:38 +00:00
bd8dd776db Add support for Altera's Nios-II softcore architecture
This commit adds strace support for Altera's Nios-II.  The architecture
is supported by Linux since v3.19, and it implements the generic syscall
ABI.

* configure.ac: Add nios2 support.
* cacheflush.c [NIOS2] (sys_cacheflush): New function.
* linux/nios2/*: New Nios-II specific files.
* Makefile.am (EXTRA_DIST): Add them.

Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
2015-05-19 22:41:49 +00:00
86b4fb5bc5 v4l2: VIDIOC_CROPCAP: add missing braces around arg printout
* v4l2.c (v4l2_ioctl): case VIDIOC_CROPCAP: add missing braces around arg
printout.
2015-05-19 22:31:10 +00:00
7e88896a16 maint: avoid effects of locale when sorting files
* maint/ioctls_gen.sh: Invoke sort with LC_COLLATE=C.
* maint/ioctls_hex.sh: Likewise.
* maint/ioctls_sym.sh: Likewise.

Reported-by: Philippe De Muyter <phdm@macqel.be>
2015-05-19 18:00:07 +00:00
6779e71acc v4l2: add decoding for VIDIOC_CREATE_BUFS's arg.
* v4l2.c (v4l2_ioctl): Add decoding for VIDIOC_CREATE_BUFS's arg.
2015-04-18 13:26:48 +00:00
f34b97f89d mips o32: decode indirect syscall
Implement decoding of MIPS O32 specific indirect syscall.

* syscall.c [LINUX_MIPSO32] (decode_mips_subcall, sys_syscall):
New functions.
(trace_syscall_entering) [LINUX_MIPSO32]: Use decode_mips_subcall.
* linux/mips/syscallent-o32.h (4000): Change sys_func to sys_syscall.

Reported-and-tested-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
2015-04-17 23:02:15 +00:00
71fb134da6 debian: add gawk to Build-Depends
* debian/control (Build-Depends): Add gawk.
Patch by Reiner Herrmann <reiner@reiner-h.de>.

This fixes Debian bug #780992.
2015-04-14 17:22:54 +00:00
b704e8fbb4 tests: fix bexecve.test for the case of mixed personalities
Fix bexecve.test when the executable being run does not match the
native architecture.

* tests/bexecve.test: Use "set_ptracer_any" instead of "sh".
Allow for a personality switch notification in the strace output.
2015-04-14 16:04:08 +00:00
25c804ce42 tests: add a test for "resuming interrupted nanosleep"
* tests/restart_syscall.test: New test.
* tests/restart_syscall.expected: New file.
* tests/restart_syscall_unknown.expected: Likewise.
* tests/Makefile.am (TESTS): Add restart_syscall.test.
(EXTRA_DIST): Add restart_syscall.expected
(TEST_LOG_COMPILER): Change to "env".
(OS, ARCH, AM_TEST_LOG_FLAGS): Define.
and restart_syscall_unknown.expected.
2015-04-07 23:01:47 +00:00
dfd4e3f338 tests: strip executable bit from *.expected files 2015-04-07 21:11:50 +00:00
a0bd3749fc Declare syscall parsers using SYS_FUNC macro
Introduce SYS_FUNC macro to declare and define all syscall parsers.

* Makefile.am (BUILT_SOURCES, CLEANFILES): Add sys_func.h.
(sys_func.h): New rule.
* defs.h (SYS_FUNC_NAME, SYS_FUNC): New macros.
* linux/syscall.h: Include "sys_func.h".
[NEED_UID16_PARSERS]: Use SYS_FUNC to declare uid16 syscall parsers.
Remove other declarations.
* linux/alpha/syscallent.h (160, 161): Add sys_ prefix to osf_statfs
and osf_fstatfs syscall parsers.
* *.c: Use SYS_FUNC to define syscall parsers.
2015-04-07 11:22:49 +00:00
cc59f14fb8 Fix confusing "resuming interrupted unknown" message
Dmitry reported seeing the following:

    $ sleep 2 & sleep 1; ./strace -erestart_syscall -p $!
    [1] 12345
    Process 12345 attached
    restart_syscall(<... resuming interrupted unknown ...>) = 0

Fixing it by replacing "unknown" with "system call".

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-04-07 12:46:59 +02:00
79c5c5d792 tests: workaround old gawk versions that do not provide @include support
Some of our tests use GNU awk @include extension, but not all currently
used versions of GNU awk support it.  Skip these tests if gawk does not
provide @include support.

* tests/init.sh (check_gawk): New function.
(match_awk): Use it.
2015-04-07 00:10:39 +00:00
a402810530 tests: rewrite umovestr2.test without using grep
The regular expression generated by umovestr2.c on systems with large
page size is too big for GNU grep.  Rewrite the test to use diff
instead of grep.

* tests/umovestr2.test: Use match_diff instead of match_grep.
* tests/umovestr2.c (main): Convert output from regexp to plain text.
2015-04-06 22:17:28 +00:00
87af1935fb Cleanup process_vm_writev syscall decoding
* process_vm.c (sys_process_vm_writev): Do not check for syserror,
it is not applicable on entering syscall.
2015-03-31 21:00:39 +00:00
ea1fea6982 umovestr: read chunks of memory up to pagesize at a time
* defs.h (get_pagesize): New prototype.
* mem.c (get_pagesize) Make global.
* util.c (PAGMASK): Remove.
(vm_read_mem): New process_vm_readv proxy function.
(umoven, umovestr): Use it.
(umovestr): Read chunks up to pagesize at a time.
2015-03-31 20:56:38 +00:00
48321344d7 umovestr: fix short read bug
* util.c (umovestr): Check the right address.
* tests/umovestr.c: New file.
* tests/umovestr2.c: Likewise.
* tests/umovestr.expected: Likewise.
* tests/umovestr.test: New test.
* tests/umovestr2.test: Likewise.
* tests/Makefile.am (check_PROGRAMS): Add umovestr and umovestr2.
(TESTS): Add umovestr.test and umovestr2.test.
(EXTRA_DIST): Add umovestr.expected.
* tests/.gitignore: Add umovestr and umovestr2.

Reported-by: Josef T. Burger <bolo@cs.wisc.edu>
2015-03-31 20:52:41 +00:00
b2893c9e9e When process_vm_readv fails with EPERM, try PTRACE_PEEKDATA
process_vm_readv() and ptrace(PTRACE_PEEKDATA) have inconsistent access
control rules wrt traced processes: process_vm_readv() is more likely to
fail with EPERM than ptrace(PTRACE_PEEKDATA) when tracing a process that
has execve'd a privileged executable.

* util.c (umoven, umovestr): If process_vm_readv returned EPERM,
fall back to ptrace(PTRACE_PEEKDATA).

Reported-by: Andrew Guertin <lists@dolphinling.net>
2015-03-31 15:06:01 +00:00
5647cf86fc Use macros for gcc attributes
* defs.h (error_msg, perror_msg, error_msg_and_die, perror_msg_and_die,
die_out_of_memory, printllval, printnum_int, printnum_long, tprintf):
Use ATTRIBUTE_* macros for gcc attributes.
* file.c (struct stat64): Likewise.
* statfs.c (struct compat_statfs64): Likewise.
* strace.c (die, exec_or_die, init): Likewise.
* linux/sparc/arch_sigreturn.c: Likewise.
* linux/ubi-user.h: Likewise.
2015-03-30 00:33:06 +00:00
c84d0b8363 Introduce macros for gcc attributes
Define macros for gcc attributes that are already in use
or going to be used soon.

* defs.h (GNUC_PREREQ, ATTRIBUTE_NORETURN, ATTRIBUTE_FORMAT,
ATTRIBUTE_ALIGNED, ATTRIBUTE_PACKED, ATTRIBUTE_MALLOC,
ATTRIBUTE_NOINLINE, ATTRIBUTE_ALLOC_SIZE): New macros.
2015-03-30 00:32:56 +00:00
3460dc486d Include <linux/ioctl.h> for _IOC_* macros
Fix a compilation failure with musl libc.

* evdev.c: Include <linux/ioctl.h>.
* ioctl.c: Include <linux/ioctl.h> instead of <asm/ioctl.h>.
* ioctlsort.c: Likewise.

Reported-by: Dima Krasner <dima@dimakrasner.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
2015-03-28 22:37:30 +00:00
d34e00b293 Include <sys/stat.h> for S_I* macros
Fix a compilation failure with musl libc.

* mknod.c: Include <sys/stat.h>.
* printmode.c: Likewise.

Reported-by: Dima Krasner <dima@dimakrasner.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
2015-03-28 22:37:06 +00:00
537c964fe9 signal.c: move siginfo_t parsers to a separate file
* printsiginfo.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* defs.h (printsiginfo): Change second argument's type from int to bool.
* signal.c: Stop defining siginfo_t related constants.
Move inclusion of xlat/sig*_codes.h files to printsiginfo.c
(printsigsource, printsigval, printsiginfo_at): Move to printsiginfo.c.
(printsiginfo): Change second argument's type from int to bool,
split, and move to printsiginfo.c.
2015-03-27 23:41:00 +00:00
f7430b7065 Update siginfo_t constants
* xlat/sigbus_codes.in: Add BUS_MCEERR_AR and BUS_MCEERR_AO,
add default values.
* xlat/sigtrap_codes.in: Add TRAP_BRANCH and TRAP_HWBKPT,
add default values.
* xlat/sigsegv_codes.in: Add SEGV_BNDERR, add default values.
* xlat/sigchld_codes.in: Add default values.
* xlat/sigemt_codes.in: Likewise.
* xlat/sigfpe_codes.in: Likewise.
* xlat/sigill_codes.in: Likewise.
* xlat/siginfo_codes.in: Likewise.
* xlat/sigpoll_codes.in: Likewise.
* xlat/sigsys_codes.in: Likewise.
2015-03-27 22:51:51 +00:00
174bb2b36e signal.c: move sigaltstack parser to a separate file
* sigaltstack.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* signal.c (print_stack_t, sys_sigaltstack): Move to sigaltstack.c.
* xlat/sigaltstack_flags.in: Add default values.
2015-03-26 15:43:07 +00:00
b6ef71b6f4 Move sparc64 get_scno() code where it belongs
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-25 15:22:49 +01:00
588a90f0f0 sparc: rename personality 2 files to personality 1
Run-tested in qemu 32-bit sparc.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-25 15:21:57 +01:00
df4dd8b540 sparc: delete personality 1
Personality 1 for sparc and sparc64 appears to be an old attempt
to support stracing Solaris binaries.

It stalled after the only syscall, solaris_open, was covered:
all other solaris_foo's are printargs.

This change deletes personality 1. Now sparc is an one-personality
arch, and sparc64 is a two-personality one.

For clarity, pure renaming of personality 2 files to personality 1 for sparc64
is performed in the next commit - this prevents a state where syscallent1.h
seems to indergo a lot of changes, where in fact in is deleted, and then
replaced by syscallent2.h

Therefore, tree at this commit will not build.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-25 15:21:57 +01:00
602d717a62 qemu_multiarch_testing/*: make it easier to do debug in sandboxes
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-24 20:54:26 +01:00
430143bf8d sparc: fix v4.10-25-g8497b62 fallout
Before:

$ sleep 3 & ./strace -p $!
Process 8703 attached
syscall: unknown syscall trap 1a800003 00025d58
syscall_516(0, 0x40080000, 0, 0xfc000f00, 0x28, 0xefc03b18) = 0
exit_group(0)                           = ?
+++ exited with 0 +++

After:

$ sleep 3 & ./strace -p $!
Process 8725 attached
restart_syscall(<... resuming interrupted nanosleep ...>) = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-24 19:39:47 +01:00
ea00900a85 get_scno: add diagnostics for invalid syscall numbers
* syscall.c (get_scno): Print a debug level message
for !SCNO_IS_VALID syscall numbers.
2015-03-24 01:59:07 +00:00
9945ec97c6 arm: fix v4.10-25-g8497b62 fallout
Starting with commit v4.10-25-g8497b62,

arm$ ./strace true
pid 1234 stray syscall exit
Segmentation fault

Fix this by updating ARM syscall sanity check.
In particular, get_scno() should not set TCB_INSYSCALL flag because
other code assumes that s_ent is properly initialized when this flag
is set.

* linux/arm/get_scno.c: Check syscall number after fetching.
Do not apply the check to SCNO_IN_RANGE syscalls.
Do not set TCB_INSYSCALL flag.
Extend diagnostics and move it to debug level.
2015-03-24 01:41:51 +00:00
8e8d7d219e mips: fix pipe syscall decoding
* linux/mips/arch_getrval2.c: New file.
* Makefile.am (EXTRA_DIST): Add it.
* defs.h [MIPS] (HAVE_GETRVAL2): Define.
2015-03-24 00:05:43 +00:00
a3c483545a sigreturn.c: split arch specific code into separate arch files
Split code that use arch-specific registers to separate arch files.

* sigreturn.c (sys_sigreturn): Move arch-specific code
to linux/*/arch_sigreturn.c, include "arch_sigreturn.c".
* linux/arch_sigreturn.c: New file.
* Makefile.am (EXTRA_DIST): Add linux/arch_sigreturn.c
and linux/*/arch_sigreturn.c files.
2015-03-23 22:25:05 +00:00
d70d1c4aa6 syscall.c: split arch specific code into separate arch files
Split code that use arch-specific registers to separate arch files.

* syscall.c: Move definitions of variables containing fetched registers
to linux/*/arch_regs.c files.
[HAVE_GETRVAL2] (getrval2): Move arch-specific code
to linux/*/arch_getrval2.c, include "arch_getrval2.c".
(print_pc): Move arch-specific code to linux/*/print_pc.c files,
include "print_pc.c".
[X86_64] (x86_64_getregs_old): Rename to getregs_old, move to
linux/x86_64/getregs_old.c, include "getregs_old.c".
[POWERPC] (powerpc_getregs_old): Rename to getregs_old, move to
linux/powerpc/getregs_old.c, include "getregs_old.c".
(get_regs) [X86_64, POWERPC]: Update callers.
(get_scno): Move arch-specific code to linux/*/get_scno.c,
include "get_scno.c".
(get_syscall_args): Move arch-specific code
to linux/*/get_syscall_args.c, include "get_syscall_args.c".
(get_error): Move arch-specific code to linux/*/get_error.c,
include "get_error.c".
(get_syscall_result): Move arch-specific code
to linux/*/get_syscall_result.c, include "get_syscall_result.c".
* Makefile.am (EXTRA_DIST): Add new linux/*/*.c files.
2015-03-23 22:24:59 +00:00
1b78607767 syscall.c: prepare for the split
Move functions that use arch-specific registers to the end of file.
2015-03-23 20:20:00 +00:00
144cda220b Move get_regs error check from trace_syscall_entering to get_scno
Starting with commit v4.10-25-g8497b62, get_scno() can be called outside
trace_syscall_entering(), so move the get_regs_error check from
trace_syscall_entering() to get_scno().

* syscall.c (trace_syscall_entering): Move get_regs_error check ...
(get_scno): ... here.
2015-03-23 20:15:29 +00:00
78ed3f3558 alpha, ia64, sh, sparc, sparc64: fix pipe and pipe2 syscalls decoding
Fix pipe syscall decoding on alpha.
Fix pipe2 syscall decoding on ia64, sh, sparc, and sparc64.

* configure.ac (AC_CHECK_FUNCS): Add pipe2.
* defs.h [ALPHA || IA64 || SH || SPARC || SPARC64] (HAVE_GETRVAL2):
Define.
* net.c (do_pipe): Check HAVE_GETRVAL2 instead of architecture macros.
Do not use getrval2 for pipe2 decoding.
Print address if umove call fails.
* syscall.c (getrval2): Check HAVE_GETRVAL2 instead of architecture
macros.  Implement for [ALPHA].
* tests/pipe.c: New file.
* tests/pipe.expected: New file.
* tests/pipe.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add pipe.
(TESTS): Add pipe.test.
(EXTRA_DIST): Add pipe.expected.
* tests/.gitignore: Add pipe.
2015-03-23 03:16:51 +00:00
c215569efe decode_socket_subcall: fetch all arguments with a single umoven call
* syscall.c (decode_socket_subcall): Replace umoven fetch loop
with a single umoven call.
2015-03-22 15:52:40 +00:00
68ba190f0a New test: test/many_looping_threads.c
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-21 20:59:39 +01:00
f1e5b6a91e test/.gitignore: add missing test targets
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-21 20:19:02 +01:00
7d27c63806 Trivial optimization in sys_sigreturn()
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-21 20:11:53 +01:00
7e69ed98cd Change last parameter of umoven() from char* to void*
Saves tons of casts.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-21 19:50:53 +01:00
9dce83b8bd Remove unused struct tcb::inst field
It is unused since we dropped support for kernels without PTRACE_SETOPTIONS.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-21 19:34:47 +01:00
35431577b5 test/Makefile: add missing test targets
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-21 18:54:16 +01:00
364728dba0 Move the comment about termination logic where it belongs
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-21 18:40:53 +01:00
4bb2ffd464 startup_tcb() never fails, remove code which checks for failures
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-21 18:13:45 +01:00
8497b6222e Show the syscall name in "resuming interrupted call" message
When signal is received, or if we have attached to a process,
current syscall (if process is in one) gets restarted.

Some syscalls are restarted via "restart_syscall()" mechanism.
On such sycalls, we don't show _which_ syscall gets restarted.

IOW: users want to see "resuming interrupted nanosleep"
instead of "resuming interrupted call" when they attach to "sleep 999".

Kernel does expose this information. The only thing we need is
to fetch syscall# on attach, and save it.

This patch does this. It adds tcp->s_prev_ent, which is
a pointer to struct_sysent of the previous syscall of this tracee.
It can be NULL.

sys_restart_syscall() is made to use it when the message is generated.

To similarly handle restart_syscall() *after signals*, not just
on attach, on each syscall exit patch saves exited syscall's data
in the same member (tcp->s_prev_ent).

Example:

    $ sleep 3 & strace -p $!
    Process 8728 attached
    restart_syscall(<... resuming interrupted nanosleep ...>) = 0
    _exit(0)                                = ?
    +++ exited with 0 +++

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2015-03-21 18:04:53 +01:00
e7d671bd4a tests: add a test for mmap/mprotect/munmap decoding
* tests/mmap.c: New file.
* tests/mmap64.c: New file.
* tests/mmap.test: New test.
* tests/mmap64.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add mmap and mmap64.
(mmap64_CFLAGS): Define.
(TESTS): Add mmap.test and mmap64.test.
* tests/.gitignore: Add mmap and mmap64.
2015-03-20 02:15:11 +00:00
b4aefa7595 sparc, sparc64: fix decoding of mmap2
* linux/sparc/syscallent.h (mmap2): Decode with sys_mmap_4koff,
not sys_mmap.
* linux/sparc64/syscallent2.h (mmap2): Decode with sys_mmap_pgoff,
not sys_mmap.
2015-03-20 00:28:31 +00:00
485f8fb250 tests: add a test for SECCOMP_MODE_FILTER decoding
* tests/seccomp.c: New file.
* tests/seccomp.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add seccomp.
(TESTS): Add seccomp.test.
* tests/.gitignore: Add seccomp.
2015-03-19 00:40:49 +00:00
226bf1c21b tests: factor out common awk code
Factor out awk code used in several tests to match.awk.

* tests/match.awk: New file.
* tests/Makefile.am (EXTRA_DIST): Add it.
* tests/caps.awk: Use it.
* tests/getdents.awk: Likewise.
* tests/getrandom.awk: Likewise.
* tests/select.awk: Likewise.
* tests/sigaction.awk: Likewise.
* tests/init.sh (match_awk): Use gawk not awk.  Define AWKPATH.
* tests/getdents.test: Likewise.
2015-03-18 22:41:17 +00:00
6add1b09d6 tests: skip netlink based tests when resources are not available
* tests/netlink_inet_diag.c (main): Return 77 if socket, bind,
or listen syscall fail.
* tests/netlink_unix_diag.c (main): Likewise.
2015-03-18 22:39:20 +00:00
babe7f6a30 aarch64, arm: decode extra padded compat struct statfs64
According to arch/arm/kernel/sys_oabi-compat.c,
struct statfs64 has extra padding with EABI.

* statfs.c [AARCH64 || defined ARM] (COMPAT_STATFS64_PADDED_SIZE):
Define.
(do_statfs64_fstatfs64): New function, factored out from sys_statfs64.
[COMPAT_STATFS64_PADDED_SIZE]: Check it in addition to
sizeof(struct compat_statfs64).
(sys_statfs64, sys_fstatfs64): Use do_statfs64_fstatfs64.

Reported-and-tested-by: Elliott Hughes <enh@google.com>
2015-03-18 17:39:15 +00:00
8f54664d68 tests: factor out common shell code to functions
Factor out shell code used in several tests to common functions.

* tests/fanotify_mark.expected: New file.
* tests/ioctl.expected: New file.
* tests/net-fd.expected: New file.
* tests/net.expected: New file.
* tests/statfs.expected: New file.
* tests/sun_path.expected: New file.
* tests/uio.expected: New file.
* tests/ipc.sh: New file.
* tests/Makefile.am (EXTRA_DIST): Add them.
* tests/init.sh (dump_log_and_fail_with, run_prog,
run_prog_skip_if_failed, run_strace, run_strace_merge,
match_awk, match_diff, match_grep): New functions.
* tests/*.test: Use them.
2015-03-18 02:29:36 +00:00
1b5b5670eb Show f_flags field in printstatfs
printstatfs64 was right, but printstatfs was missing f_flags.
Noticed on aarch64.

* statfs.c (printstatfs) [_STATFS_F_FLAGS]: Print statfs.f_flags.

Signed-off-by: Elliott Hughes <enh@google.com>
2015-03-18 01:31:23 +00:00
68804b3267 tests/uid*: use fchown* instead of chown*
Newer architectures have no chown syscall, so use fchown* syscalls
for testing printuid.

* tests/uid.test: Use fchown instead of chown.
* tests/uid.c: Test __NR_fchown instead of __NR_chown.
(main): Use __NR_fchown instead of __NR_chown.
* tests/uid32.c: Test __NR_fchown32 instead of __NR_chown32.
(main): Use __NR_fchown32 instead of __NR_chown32.
* tests/uid16.c: Test __NR_fchown and __NR_fchown32 instead
of __NR_chown and __NR_chown32.
(main): Use __NR_fchown instead of __NR_chown.
* tests/uid.awk: Update regexp.
2015-03-16 18:20:57 +00:00
f79252f072 stat64-v.test: add newfstatat syscall support
Newer architectures have no stat syscall, so stat() is implemented there
using newfstatat syscall.

* tests/stat.c (STAT_FNAME): Rename to STAT_PREFIX.  Update callers.
[_FILE_OFFSET_BITS == 64] (STAT_PREFIX): Add newfstatat support.
(main) [!NR_stat]: Add newfstatat support.

Reported-by: Andreas Schwab <schwab@suse.de>
2015-03-16 17:39:19 +00:00
71d6ffc6ed aarch64: properly decode generic syscalls
* linux/aarch64/syscallent1.h: Don't override entries 277 to 1023.
2015-03-16 16:25:09 +01:00
33557845ad tests: verify that all patterns match
* tests/ipc_msg.test: Count matches to verify that all patterns match.
* tests/ipc_sem.test: Likewise.
* tests/ipc_shm.test: Likewise.
* tests/stat32-v.test: Likewise.
* tests/stat64-v.test: Likewise.
2015-03-16 16:22:24 +01:00
bce1ff5f88 Fix stat64 st_[acm]time decoding for personalities with 32-bit time_t
STRUCT_STAT.st_[acm]time are declared as unsigned int for some
personalities, while time_t is signed.

* printstat.h (DO_PRINTSTAT): If st_[acm]time have the same size as int,
explicitly cast them to int.
* tests/stat64-v.test: Test that negative time_t is decoded properly.

Reported-by: Andreas Schwab <schwab@suse.de>
2015-03-16 14:23:09 +00:00
499c5aad0c semctl: fix indirect syscall decoding
On architectures where the semctl call is implemented by the ipc syscall
the 4th argument is passed by reference.

* ipc.c (sys_semctl): Handle the indirect ipc subcall case.
* tests/ipc_sem.c (main): Optionally match indirection
in the 4th argument of semctl calls.

Reported-by: Andreas Schwab <schwab@suse.de>
2015-03-16 14:23:09 +00:00
3aa45f3cc2 tests/ipc_*: match IPC_64 flag
* tests/ipc_msg.c (main): Optionally match "IPC_64|" in the third
argument of the ipc call.
* tests/ipc_sem.c (main): Likewise.
* tests/ipc_shm.c (main): Likewise.
2015-03-16 14:26:58 +01:00
fa5ce37246 Fix crash in ipc_sem test
Properly use union semun as argument of semctl.

* tests/ipc_sem.c (main): Properly use union semun as argument of
semctl.  Don't handle EFAULT specially.
* tests/ipc_sem.test: Revert last change.
2015-03-16 12:18:36 +01:00
712f0e12bd m68k: fix sigreturn decoding
* sigreturn.c (sys_sigreturn) [M68K]: Fetch the words of the
signal mask from the proper place.
2015-03-16 10:55:20 +01:00
0e3811d791 aarch64: fix ioctl decoding
* linux/aarch64/ioctls_inc0.h: Rename from ioctls_inc1.h.
* linux/aarch64/ioctls_inc1.h: Rename from ioctls_inc0.h.
* linux/aarch64/ioctls_arch0.h: Rename from ioctls_arch1.h.
* linux/aarch64/ioctls_arch1.h: Rename from ioctls_arch0.h.
2015-03-16 10:15:29 +01:00
95336102eb tests/select.test: handle architectures using pselect6 syscall
* tests/select.awk (BEGIN): Update regexps to match both select
and pselect6 syscalls.
* tests/select.test: Probe for both select and pselect6 syscall.
2015-03-12 17:22:07 +01:00
64fc9cedc4 Distribute linux/aarch64/arch_regs.h
* Makefile.am (EXTRA_DIST): Add linux/aarch64/arch_regs.h.
2015-03-12 14:15:50 +01:00
dbadf7bcc8 Fix decoding of mmap2 for arm
* syscallent.h (mmap2): Decode with sys_mmap_4koff, not
sys_mmap_pgoff.
2015-03-12 10:52:22 +01:00
a897136801 m68k: define HAVE_SA_RESTORER
On m68k the kernel sigaction structure has the sa_restorer member for
historical reasons.

* signal.c (HAVE_SA_RESTORER): Define for M68K.
2015-03-12 10:24:27 +01:00
d76d306952 aarch64: fix rt_sigreturn decoding
* sigreturn.c (sys_sigreturn) [AARCH64]: Fix personality check.
2015-03-11 16:34:09 +00:00
91bdbb46ff maint: post-release administrivia
* NEWS: Add header line for next release.
2015-03-09 22:05:40 +00:00
1191 changed files with 64925 additions and 29208 deletions

26
.gitignore vendored
View File

@ -4,6 +4,8 @@
.libs
.version
.*.swp
*.gcda
*.gcno
*.gdb
core
.gdbinit
@ -38,7 +40,31 @@ Makefile.in
/ioctls_all[012].h
/ioctlsort[012]
/sen.h
/sys_func.h
/strace-*.tar.xz
/tests-m32
/tests-mx32
/libmpers-m32.a
/libmpers-mx32.a
/m32_funcs.h
/m32_printer_decls.h
/m32_printer_defs.h
/m32_type_defs.h
/mpers-m32
/mpers-m32.stamp
/mpers-mx32
/mpers-mx32.stamp
/mpers.am
/mpers_xlat.h
/mx32_funcs.h
/mx32_printer_decls.h
/mx32_printer_defs.h
/mx32_type_defs.h
/native_printer_decls.h
/native_printer_defs.h
/printers.h
/*.mpers.i

View File

@ -1,6 +1,7 @@
# Map git author names and email addresses to canonical/preferred form.
<ak@linux.intel.com> <ak@suse.de>
<holger@freyther.de> <zecke@selfish.org>
<kirill@shutemov.name> <kirill.shutemov@linux.intel.com>
<schwab@linux-m68k.org> <schwab@redhat.com>
<schwab@linux-m68k.org> <schwab@suse.de>
<vda.linux@googlemail.com> <dvlasenk@redhat.com>

39
.travis.yml Normal file
View File

@ -0,0 +1,39 @@
language: c
dist: trusty
script: ./travis-ci.sh
sudo: required
compiler:
- gcc
- clang-3.6
- musl-gcc
addons:
apt:
packages:
- gcc-multilib
- lcov
install:
- pip install --user codecov
env:
global:
- SLEEP_A_BIT="sleep 0.2"
- VERBOSE="1"
matrix:
- TARGET=x86_64
- TARGET=x32
- TARGET=x86
matrix:
exclude:
- compiler: clang-3.6
env: TARGET=x32
- compiler: musl-gcc
env: TARGET=x32
- compiler: musl-gcc
env: TARGET=x86

View File

@ -39,6 +39,7 @@ Greg Banks gbanks@pocketpenguins.com
Henrik Storner storner@osiris.ping.dk
Jakub Jelinek jj@ultra.linux.cz
Jeff Mahoney jeffm@suse.com
Jian Zhen zhenjl@gmail.com
Joe Ilacqua spike@world.std.com
Johannes Stezenbach js@sig21.net
Ju"rgen Fluk louis@marco.de

View File

@ -1,4 +1,32 @@
# Automake input for strace.
#
# Copyright (c) 2002-2009 Roland McGrath <roland@redhat.com>
# Copyright (c) 2006-2016 Dmitry V. Levin <ldv@altlinux.org>
# Copyright (c) 2008-2015 Mike Frysinger <vapier@gentoo.org>
# Copyright (c) 2015 Elvira Khabirova <lineprinter0@gmail.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if HAVE_M32_RUNTIME
TESTS_M32 = tests-m32
@ -21,16 +49,39 @@ AM_CFLAGS = $(WARN_CFLAGS)
AM_CPPFLAGS = -I$(builddir)/$(OS)/$(ARCH) \
-I$(srcdir)/$(OS)/$(ARCH) \
-I$(builddir)/$(OS) \
-I$(srcdir)/$(OS)
-I$(srcdir)/$(OS) \
-I$(builddir) \
-I$(srcdir)
include xlat/Makemodule.am
strace_CPPFLAGS = $(AM_CPPFLAGS)
strace_CFLAGS = $(AM_CFLAGS)
strace_LDFLAGS =
strace_LDADD = libstrace.a
noinst_LIBRARIES = libstrace.a
libstrace_a_CPPFLAGS = $(strace_CPPFLAGS)
libstrace_a_CFLAGS = $(strace_CFLAGS)
libstrace_a_SOURCES = \
fstatfs.c \
fstatfs64.c \
statfs.c \
statfs64.c \
sync_file_range.c \
sync_file_range2.c \
upeek.c \
# end of libstrace_a_SOURCES
strace_SOURCES = \
access.c \
affinity.c \
aio.c \
alpha.c \
bjm.c \
block.c \
bpf.c \
btrfs.c \
cacheflush.c \
capability.c \
caps0.h \
@ -38,45 +89,91 @@ strace_SOURCES = \
chdir.c \
chmod.c \
clone.c \
copy_file_range.c \
count.c \
defs.h \
desc.c \
dirent.c \
dirent64.c \
empty.h \
epoll.c \
evdev.c \
eventfd.c \
execve.c \
exit.c \
fadvise.c \
fallocate.c \
fanotify.c \
fchownat.c \
fcntl.c \
fetch_seccomp_fprog.c \
fetch_struct_flock.c \
fetch_struct_statfs.c \
file.c \
file_handle.c \
file_ioctl.c \
fs_x_ioctl.c \
flock.c \
flock.h \
futex.c \
gcc_compat.h \
get_robust_list.c \
getcpu.c \
getcwd.c \
getrandom.c \
hdio.c \
hostname.c \
inotify.c \
io.c \
ioctl.c \
ioperm.c \
iopl.c \
ioprio.c \
ipc.c \
ipc_defs.h \
ipc_msg.c \
ipc_msgctl.c \
ipc_sem.c \
ipc_shm.c \
ipc_shmctl.c \
kcmp.c \
kernel_types.h \
kexec.c \
keyctl.c \
ldt.c \
link.c \
linux/asm_stat.h \
linux/x32/asm_stat.h \
lookup_dcookie.c \
loop.c \
lseek.c \
mem.c \
membarrier.c \
memfd_create.c \
mknod.c \
mount.c \
mpers_type.h \
mq.c \
mtd.c \
native_defs.h \
net.c \
numa.c \
open.c \
or1k_atomic.c \
pathtrace.c \
perf.c \
personality.c \
poll.c \
prctl.c \
print_mq_attr.c \
print_msgbuf.c \
print_sigevent.c \
print_statfs.c \
print_time.c \
print_timex.c \
printmode.c \
printrusage.c \
printsiginfo.c \
printsiginfo.h \
printstat.h \
process.c \
process_vm.c \
@ -89,19 +186,24 @@ strace_SOURCES = \
regs.h \
renameat.c \
resource.c \
rtc.c \
sched.c \
scsi.c \
seccomp.c \
seccomp_fprog.h \
sendfile.c \
sigaltstack.c \
sigevent.h \
signal.c \
signalfd.c \
sigreturn.c \
sock.c \
socketutils.c \
sram_alloc.c \
statfs.c \
statfs.h \
strace.c \
stream.c \
swapon.c \
sync_file_range.c \
syscall.c \
sysctl.c \
sysinfo.c \
@ -109,32 +211,44 @@ strace_SOURCES = \
sysmips.c \
term.c \
time.c \
times.c \
truncate.c \
ubi.c \
uid.c \
uid16.c \
umask.c \
umount.c \
uname.c \
userfaultfd.c \
util.c \
utime.c \
utimes.c \
v4l2.c \
vsprintf.c \
wait.c \
xattr.c
xattr.c \
xlat.h \
xmalloc.c \
# end of strace_SOURCES
if USE_LIBUNWIND
strace_SOURCES += unwind.c
strace_CPPFLAGS = $(AM_CPPFLAGS) $(libunwind_CPPFLAGS)
strace_LDFLAGS = $(libunwind_LDFLAGS)
strace_LDADD = $(libunwind_LIBS)
else
strace_CPPFLAGS = $(AM_CPPFLAGS)
strace_CPPFLAGS += $(libunwind_CPPFLAGS)
strace_LDFLAGS += $(libunwind_LDFLAGS)
strace_LDADD += $(libunwind_LIBS)
endif
noinst_HEADERS = defs.h
@CODE_COVERAGE_RULES@
CODE_COVERAGE_BRANCH_COVERAGE = 1
CODE_COVERAGE_GENHTML_OPTIONS = $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT) \
--prefix $(shell realpath -Ls $(abs_top_srcdir)/..)
CODE_COVERAGE_IGNORE_PATTERN = '/usr/include/*'
strace_CPPFLAGS += $(CODE_COVERAGE_CPPFLAGS)
strace_CFLAGS += $(CODE_COVERAGE_CFLAGS)
strace_LDADD += $(CODE_COVERAGE_LDFLAGS)
# Enable this to get link map generated
#strace_CFLAGS = $(AM_CFLAGS) -Wl,-Map=strace.mapfile
#strace_LDFLAGS += -Wl,-Map=strace.mapfile
EXTRA_DIST = \
$(man_MANS) \
@ -159,12 +273,21 @@ EXTRA_DIST = \
debian/strace64.manpages \
debian/watch \
errnoent.sh \
generate_sen.sh \
ioctlsort.c \
linux/32/ioctls_inc.h \
linux/32/ioctls_inc_align32.h \
linux/32/ioctls_inc_align64.h \
linux/32/syscallent.h \
linux/64/ioctls_inc.h \
linux/64/syscallent.h \
linux/aarch64/arch_regs.c \
linux/aarch64/arch_regs.h \
linux/aarch64/arch_sigreturn.c \
linux/aarch64/errnoent1.h \
linux/aarch64/get_error.c \
linux/aarch64/get_scno.c \
linux/aarch64/get_syscall_args.c\
linux/aarch64/ioctls_arch0.h \
linux/aarch64/ioctls_arch1.h \
linux/aarch64/ioctls_inc0.h \
@ -172,66 +295,142 @@ EXTRA_DIST = \
linux/aarch64/signalent1.h \
linux/aarch64/syscallent.h \
linux/aarch64/syscallent1.h \
linux/alpha/arch_getrval2.c \
linux/alpha/arch_regs.c \
linux/alpha/arch_regs.h \
linux/alpha/arch_sigreturn.c \
linux/alpha/errnoent.h \
linux/alpha/get_error.c \
linux/alpha/get_scno.c \
linux/alpha/get_syscall_args.c \
linux/alpha/get_syscall_result.c\
linux/alpha/ioctls_arch0.h \
linux/alpha/ioctls_inc0.h \
linux/alpha/signalent.h \
linux/alpha/syscallent.h \
linux/alpha/userent.h \
linux/arc/arch_regs.c \
linux/arc/get_error.c \
linux/arc/get_scno.c \
linux/arc/get_syscall_args.c \
linux/arc/ioctls_arch0.h \
linux/arc/ioctls_inc0.h \
linux/arc/syscallent.h \
linux/arch_regs.h \
linux/arch_sigreturn.c \
linux/arm/arch_regs.c \
linux/arm/arch_regs.h \
linux/arm/arch_sigreturn.c \
linux/arm/get_error.c \
linux/arm/get_scno.c \
linux/arm/get_syscall_args.c \
linux/arm/ioctls_arch0.h \
linux/arm/ioctls_inc0.h \
linux/arm/syscallent.h \
linux/arm/userent.h \
linux/avr32/arch_regs.c \
linux/avr32/get_error.c \
linux/avr32/get_scno.c \
linux/avr32/get_syscall_args.c \
linux/avr32/ioctls_arch0.h \
linux/avr32/ioctls_inc0.h \
linux/avr32/syscallent.h \
linux/avr32/userent.h \
linux/bfin/arch_regs.c \
linux/bfin/get_error.c \
linux/bfin/get_scno.c \
linux/bfin/get_syscall_args.c \
linux/bfin/get_syscall_result.c \
linux/bfin/ioctls_arch0.h \
linux/bfin/ioctls_inc0.h \
linux/bfin/syscallent.h \
linux/bfin/userent.h \
linux/crisv10/arch_regs.c \
linux/crisv10/arch_sigreturn.c \
linux/crisv10/get_error.c \
linux/crisv10/get_scno.c \
linux/crisv10/get_syscall_args.c \
linux/crisv10/get_syscall_result.c \
linux/crisv10/userent.h \
linux/crisv32/arch_regs.c \
linux/crisv32/arch_sigreturn.c \
linux/crisv32/get_error.c \
linux/crisv32/get_scno.c \
linux/crisv32/get_syscall_args.c \
linux/crisv32/get_syscall_result.c \
linux/crisv32/userent.h \
linux/dummy.h \
linux/errnoent.h \
linux/hppa/arch_regs.c \
linux/hppa/arch_regs.h \
linux/hppa/errnoent.h \
linux/hppa/get_error.c \
linux/hppa/get_scno.c \
linux/hppa/get_syscall_args.c \
linux/hppa/get_syscall_result.c \
linux/hppa/ioctls_arch0.h \
linux/hppa/ioctls_inc0.h \
linux/hppa/signalent.h \
linux/hppa/syscallent.h \
linux/i386/arch_regs.c \
linux/i386/arch_regs.h \
linux/i386/arch_sigreturn.c \
linux/i386/get_error.c \
linux/i386/get_scno.c \
linux/i386/get_syscall_args.c \
linux/i386/ioctls_arch0.h \
linux/i386/ioctls_inc0.h \
linux/i386/syscallent.h \
linux/i386/userent.h \
linux/i386/userent0.h \
linux/ia64/arch_getrval2.c \
linux/ia64/arch_regs.c \
linux/ia64/arch_regs.h \
linux/ia64/arch_sigreturn.c \
linux/ia64/get_error.c \
linux/ia64/get_scno.c \
linux/ia64/get_syscall_args.c \
linux/ia64/ioctls_arch0.h \
linux/ia64/ioctls_inc0.h \
linux/ia64/syscallent.h \
linux/ia64/userent.h \
linux/inet_diag.h \
linux/m68k/arch_regs.c \
linux/m68k/arch_sigreturn.c \
linux/m68k/get_error.c \
linux/m68k/get_scno.c \
linux/m68k/get_syscall_args.c \
linux/m68k/get_syscall_result.c \
linux/m68k/ioctls_arch0.h \
linux/m68k/ioctls_inc0.h \
linux/m68k/syscallent.h \
linux/m68k/userent.h \
linux/metag/arch_regs.c \
linux/metag/get_error.c \
linux/metag/get_scno.c \
linux/metag/get_syscall_args.c \
linux/metag/ioctls_arch0.h \
linux/metag/ioctls_inc0.h \
linux/metag/syscallent.h \
linux/microblaze/arch_regs.c \
linux/microblaze/arch_sigreturn.c \
linux/microblaze/get_error.c \
linux/microblaze/get_scno.c \
linux/microblaze/get_syscall_args.c \
linux/microblaze/get_syscall_result.c \
linux/microblaze/ioctls_arch0.h \
linux/microblaze/ioctls_inc0.h \
linux/microblaze/syscallent.h \
linux/microblaze/userent.h \
linux/mips/arch_getrval2.c \
linux/mips/arch_regs.c \
linux/mips/arch_regs.h \
linux/mips/arch_sigreturn.c \
linux/mips/errnoent.h \
linux/mips/genstub.sh \
linux/mips/get_error.c \
linux/mips/get_scno.c \
linux/mips/get_syscall_args.c \
linux/mips/ioctls_arch0.h \
linux/mips/ioctls_inc0.h \
linux/mips/signalent.h \
@ -242,20 +441,44 @@ EXTRA_DIST = \
linux/mips/syscallent.h \
linux/mips/userent.h \
linux/mtd-abi.h \
linux/netlink_diag.h \
linux/nios2/arch_regs.c \
linux/nios2/get_error.c \
linux/nios2/get_scno.c \
linux/nios2/get_syscall_args.c \
linux/nios2/ioctls_arch0.h \
linux/nios2/ioctls_inc0.h \
linux/nios2/syscallent.h \
linux/or1k/arch_regs.c \
linux/or1k/get_error.c \
linux/or1k/get_scno.c \
linux/or1k/get_syscall_args.c \
linux/or1k/ioctls_arch0.h \
linux/or1k/ioctls_inc0.h \
linux/or1k/syscallent.h \
linux/or1k/userent.h \
linux/personality.h \
linux/powerpc/arch_regs.c \
linux/powerpc/arch_regs.h \
linux/powerpc/arch_sigreturn.c \
linux/powerpc/errnoent.h \
linux/powerpc/get_error.c \
linux/powerpc/get_scno.c \
linux/powerpc/get_syscall_args.c \
linux/powerpc/getregs_old.c \
linux/powerpc/ioctls_arch0.h \
linux/powerpc/ioctls_inc0.h \
linux/powerpc/syscallent.h \
linux/powerpc/userent.h \
linux/powerpc64/arch_regs.c \
linux/powerpc64/arch_regs.h \
linux/powerpc64/arch_sigreturn.c \
linux/powerpc64/errnoent.h \
linux/powerpc64/errnoent1.h \
linux/powerpc64/get_error.c \
linux/powerpc64/get_scno.c \
linux/powerpc64/get_syscall_args.c \
linux/powerpc64/getregs_old.c \
linux/powerpc64/ioctls_arch0.h \
linux/powerpc64/ioctls_arch1.h \
linux/powerpc64/ioctls_inc0.h \
@ -265,66 +488,92 @@ EXTRA_DIST = \
linux/powerpc64/syscallent1.h \
linux/powerpc64/userent.h \
linux/ptp_clock.h \
linux/s390/arch_regs.c \
linux/s390/arch_regs.h \
linux/s390/arch_sigreturn.c \
linux/s390/get_error.c \
linux/s390/get_scno.c \
linux/s390/get_syscall_args.c \
linux/s390/ioctls_arch0.h \
linux/s390/ioctls_inc0.h \
linux/s390/syscallent.h \
linux/s390/userent.h \
linux/s390/userent0.h \
linux/s390/userent1.h \
linux/s390x/arch_regs.c \
linux/s390x/arch_regs.h \
linux/s390x/arch_sigreturn.c \
linux/s390x/get_error.c \
linux/s390x/get_scno.c \
linux/s390x/get_syscall_args.c \
linux/s390x/ioctls_arch0.h \
linux/s390x/ioctls_inc0.h \
linux/s390x/syscallent.h \
linux/s390x/userent.h \
linux/sh/arch_getrval2.c \
linux/sh/arch_regs.c \
linux/sh/get_error.c \
linux/sh/get_scno.c \
linux/sh/get_syscall_args.c \
linux/sh/get_syscall_result.c \
linux/sh/ioctls_arch0.h \
linux/sh/ioctls_inc0.h \
linux/sh/syscallent.h \
linux/sh/userent.h \
linux/sh/userent0.h \
linux/sh64/arch_regs.c \
linux/sh64/arch_regs.h \
linux/sh64/get_error.c \
linux/sh64/get_scno.c \
linux/sh64/get_syscall_args.c \
linux/sh64/get_syscall_result.c \
linux/sh64/ioctls_arch0.h \
linux/sh64/ioctls_inc0.h \
linux/sh64/syscallent.h \
linux/sh64/userent.h \
linux/signalent.h \
linux/sock_diag.h \
linux/sparc/arch_getrval2.c \
linux/sparc/arch_regs.c \
linux/sparc/arch_regs.h \
linux/sparc/dummy2.h \
linux/sparc/arch_sigreturn.c \
linux/sparc/errnoent.h \
linux/sparc/errnoent1.h \
linux/sparc/gen.pl \
linux/sparc/ioctlent1.h \
linux/sparc/get_error.c \
linux/sparc/get_scno.c \
linux/sparc/get_syscall_args.c \
linux/sparc/ioctls_arch0.h \
linux/sparc/ioctls_inc0.h \
linux/sparc/signalent.h \
linux/sparc/signalent1.h \
linux/sparc/syscall1.h \
linux/sparc/syscallent.h \
linux/sparc/syscallent1.h \
linux/sparc/userent.h \
linux/sparc64/arch_getrval2.c \
linux/sparc64/arch_regs.c \
linux/sparc64/arch_regs.h \
linux/sparc64/dummy2.h \
linux/sparc64/arch_sigreturn.c \
linux/sparc64/errnoent.h \
linux/sparc64/errnoent1.h \
linux/sparc64/errnoent2.h \
linux/sparc64/ioctlent1.h \
linux/sparc64/get_error.c \
linux/sparc64/get_scno.c \
linux/sparc64/get_syscall_args.c\
linux/sparc64/ioctls_arch0.h \
linux/sparc64/ioctls_arch2.h \
linux/sparc64/ioctls_arch1.h \
linux/sparc64/ioctls_inc0.h \
linux/sparc64/ioctls_inc2.h \
linux/sparc64/ioctls_inc1.h \
linux/sparc64/signalent.h \
linux/sparc64/signalent1.h \
linux/sparc64/signalent2.h \
linux/sparc64/syscall1.h \
linux/sparc64/syscallent.h \
linux/sparc64/syscallent1.h \
linux/sparc64/syscallent2.h \
linux/sparc64/userent.h \
linux/subcall.h \
linux/syscall.h \
linux/tile/arch_regs.c \
linux/tile/arch_regs.h \
linux/tile/arch_sigreturn.c \
linux/tile/errnoent1.h \
linux/tile/get_error.c \
linux/tile/get_scno.c \
linux/tile/get_syscall_args.c \
linux/tile/ioctls_arch0.h \
linux/tile/ioctls_arch1.h \
linux/tile/ioctls_inc0.h \
@ -337,8 +586,13 @@ EXTRA_DIST = \
linux/unix_diag.h \
linux/userent.h \
linux/userent0.h \
linux/x32/arch_regs.c \
linux/x32/arch_regs.h \
linux/x32/arch_sigreturn.c \
linux/x32/errnoent1.h \
linux/x32/get_error.c \
linux/x32/get_scno.c \
linux/x32/get_syscall_args.c \
linux/x32/ioctls_arch0.h \
linux/x32/ioctls_arch1.h \
linux/x32/ioctls_inc0.h \
@ -347,10 +601,16 @@ EXTRA_DIST = \
linux/x32/syscallent.h \
linux/x32/syscallent1.h \
linux/x32/userent.h \
linux/x86_64/arch_regs.c \
linux/x86_64/arch_regs.h \
linux/x86_64/arch_sigreturn.c \
linux/x86_64/errnoent1.h \
linux/x86_64/errnoent2.h \
linux/x86_64/gentab.pl \
linux/x86_64/get_error.c \
linux/x86_64/get_scno.c \
linux/x86_64/get_syscall_args.c \
linux/x86_64/getregs_old.c \
linux/x86_64/ioctls_arch0.h \
linux/x86_64/ioctls_arch1.h \
linux/x86_64/ioctls_arch2.h \
@ -363,6 +623,11 @@ EXTRA_DIST = \
linux/x86_64/syscallent1.h \
linux/x86_64/syscallent2.h \
linux/x86_64/userent.h \
linux/xtensa/arch_regs.c \
linux/xtensa/get_error.c \
linux/xtensa/get_scno.c \
linux/xtensa/get_syscall_args.c \
linux/xtensa/get_syscall_result.c \
linux/xtensa/ioctls_arch0.h \
linux/xtensa/ioctls_inc0.h \
linux/xtensa/syscallent.h \
@ -371,6 +636,10 @@ EXTRA_DIST = \
maint/ioctls_hex.sh \
maint/ioctls_sym.sh \
maint/print_ioctlent.c \
mpers.awk \
mpers.sh \
mpers_test.sh \
mpers_xlat.h \
signalent.sh \
strace-graph \
strace-log-merge \
@ -385,11 +654,26 @@ EXTRA_DIST = \
srpm: dist-xz
rpmbuild --define '%_srcrpmdir .' -ts $(distdir).tar.xz
BUILT_SOURCES = .version
$(srcdir)/.version:
$(AM_V_GEN)echo $(VERSION) > $@-t && mv $@-t $@
strace_SOURCES_c = \
$(filter %.c,$(strace_SOURCES)) $(filter %.c,$(libstrace_a_SOURCES))
sys_func.h: $(patsubst %,$(srcdir)/%,$(strace_SOURCES_c))
for f in $^; do \
sed -n 's/^SYS_FUNC(.*/extern &;/p' $$f; \
done | sort -u > $@
syscallent_names = subcall.h syscallent.h syscallent1.h \
syscallent-n32.h syscallent-n64.h syscallent-o32.h
syscallent_patterns = $(patsubst %,\%/%,$(syscallent_names))
syscallent_files = $(filter $(syscallent_patterns),$(EXTRA_DIST))
sen.h: $(patsubst %,$(srcdir)/%,$(syscallent_files))
for f in $^; do cat -- $$f; done | \
$(srcdir)/generate_sen.sh > $@
dist-hook:
$(AM_V_GEN)echo $(VERSION) > $(distdir)/.tarball-version
@ -415,8 +699,15 @@ ioctlsort_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_FOR_BUILD)
ioctls_inc_h = $(wildcard $(srcdir)/$(OS)/$(ARCH)/ioctls_inc*.h)
ioctlent_h = $(patsubst $(srcdir)/$(OS)/$(ARCH)/ioctls_inc%,ioctlent%,$(ioctls_inc_h))
BUILT_SOURCES += $(ioctlent_h)
CLEANFILES = $(ioctlent_h)
ioctl_redefs_h = $(filter-out ioctl_redefs0.h,$(subst ioctlent,ioctl_redefs,$(ioctlent_h)))
ioctl_redefs%.h: ioctlent%.h ioctlent0.h
sort $< > $<-t
sort ioctlent0.h | comm -23 $<-t - | \
sed -n 's/^{ "\([^"]\+\)", \(0x[[:xdigit:]]\+\) },$$/#ifdef \1\n# undef \1\n# define \1 \2\n#endif/p' \
> $@-t
rm -f $<-t
mv $@-t $@
ioctlent%.h: ioctlsort%
./$< > $@
@ -430,6 +721,125 @@ ioctlsort%.o: ioctls_all%.h $(srcdir)/ioctlsort.c
ioctls_all%.h: $(srcdir)/$(OS)/$(ARCH)/ioctls_inc%.h $(srcdir)/$(OS)/$(ARCH)/ioctls_arch%.h
cat $^ > $@
BUILT_SOURCES = $(ioctl_redefs_h) $(ioctlent_h) \
native_printer_decls.h native_printer_defs.h printers.h sen.h sys_func.h .version
CLEANFILES = $(ioctl_redefs_h) $(ioctlent_h) $(mpers_preproc_files) \
native_printer_decls.h native_printer_defs.h printers.h sen.h sys_func.h
DISTCLEANFILES = gnu/stubs-32.h gnu/stubs-x32.h
# defines mpers_source_files
include mpers.am
srcdir_mpers_source_files = $(patsubst %,$(srcdir)/%,$(mpers_source_files))
mpers_preproc_files = $(mpers_source_files:.c=.c.mpers.i)
mpers_NAME =
mpers_PREFIX = $(mpers_NAME)_
mpers_DEFS = $(DEFS)
mpers_INCLUDES = $(DEFAULT_INCLUDES) $(INCLUDES)
mpers_CPPFLAGS = $(strace_CPPFLAGS) $(CPPFLAGS)
mpers_sh_opts = $(mpers_DEFS) $(mpers_INCLUDES) $(mpers_CPPFLAGS)
libmpers_CPPFLAGS = $(strace_CPPFLAGS) -DIN_MPERS
libmpers_CFLAGS = $(strace_CFLAGS)
# mpers targets
mpers-m%.stamp: $(srcdir_mpers_source_files) | printers.h
for f in $^; do \
CC="$(CC)" CFLAGS="$(mpers_sh_opts)" \
CPP="$(CPP)" CPPFLAGS="$(mpers_sh_opts) -DIN_MPERS -DMPERS_IS_$(mpers_NAME)" \
$(srcdir)/mpers.sh -$(mpers_NAME) $$f || exit; \
done
> $@
m%_type_defs.h: $(srcdir_mpers_source_files)
for f in $^; do \
sed -n 's/^#include DEF_MPERS_TYPE(\([^)]\+\))/#ifdef MPERS_$(mpers_PREFIX)\1\n# define \1 MPERS_$(mpers_PREFIX)\1\n#endif/p' $$f || exit; \
done > $@-t
echo '#undef MPERS_PRINTER_NAME' >> $@-t
echo '#define MPERS_PRINTER_NAME(printer_name) printer_name' >> $@-t
echo '#include "$(mpers_PREFIX)printer_decls.h"' >> $@-t
echo '#include MPERS_$(mpers_PREFIX)IOCTL_MACROS' >> $@-t
mv $@-t $@
m%_funcs.h: $(srcdir_mpers_source_files)
for f in $^; do \
sed -n 's/^SYS_FUNC(\([^)]\+\))/#undef sys_\1\n#define sys_\1 $(mpers_PREFIX)sys_\1/p' $$f || exit; \
done > $@-t && \
echo '#include "sys_func.h"' >> $@-t
mv $@-t $@
# printers
%.c.mpers.i: $(srcdir)/%.c
$(CPP) -P $(mpers_sh_opts) -DIN_MPERS_BOOTSTRAP $< -o $@
mpers_printer_decl_pattern = ^MPERS_PRINTER_DECL(\([^,)]\+\),[[:space:]]*\([^,)]\+\),[[:space:]]*\([^)]\+\))$$
printers.h: $(mpers_preproc_files)
echo '/* Generated by Makefile from $^; do not edit. */' > $@-t
echo 'typedef struct {' >> $@-t
for f in $^; do \
sed -n 's/$(mpers_printer_decl_pattern)/ \1 (*\2)(\3);\n#define \2 MPERS_PRINTER_NAME(\2)\n/p' $$f \
|| exit; \
done >> $@-t
echo '} struct_printers;' >> $@-t
echo 'extern const struct_printers *printers;' >> $@-t
echo '#define MPERS_PRINTER_NAME(printer_name) printers->printer_name' >> $@-t
mv $@-t $@
%_printer_decls.h: $(mpers_preproc_files)
echo '/* Generated by Makefile from $^; do not edit. */' > $@-t
for f in $^; do \
sed -n 's/$(mpers_printer_decl_pattern)/extern \1 $(mpers_PREFIX)\2(\3);/p' $$f \
|| exit; \
done >> $@-t
mv $@-t $@
%_printer_defs.h: $(mpers_preproc_files)
echo '/* Generated by Makefile from $^; do not edit. */' > $@-t
for f in $^; do \
sed -n 's/$(mpers_printer_decl_pattern)/\.\2 = $(mpers_PREFIX)\2,/p' $$f \
|| exit; \
done >> $@-t
mv $@-t $@
native_printer_decls.h native_printer_defs.h: mpers_PREFIX =
if HAVE_M32_MPERS
strace_LDADD += libmpers-m32.a
noinst_LIBRARIES += libmpers-m32.a
libmpers_m32_a_SOURCES = $(mpers_source_files)
libmpers_m32_a_CPPFLAGS = $(libmpers_CPPFLAGS) -DMPERS_IS_m32 -I$(builddir)/mpers-m32
libmpers_m32_a_CFLAGS = $(libmpers_CFLAGS)
mpers_m32_targets = mpers-m32.stamp m32_type_defs.h m32_funcs.h m32_printer_decls.h m32_printer_defs.h
BUILT_SOURCES += $(mpers_m32_targets)
CLEANFILES += $(mpers_m32_targets)
$(mpers_m32_targets): mpers_NAME = m32
endif # HAVE_M32_MPERS
if HAVE_MX32_MPERS
strace_LDADD += libmpers-mx32.a
noinst_LIBRARIES += libmpers-mx32.a
libmpers_mx32_a_SOURCES = $(mpers_source_files)
libmpers_mx32_a_CPPFLAGS = $(libmpers_CPPFLAGS) -DMPERS_IS_mx32 -I$(builddir)/mpers-mx32
libmpers_mx32_a_CFLAGS = $(libmpers_CFLAGS)
mpers_mx32_targets = mpers-mx32.stamp mx32_type_defs.h mx32_funcs.h mx32_printer_decls.h mx32_printer_defs.h
BUILT_SOURCES += $(mpers_mx32_targets)
CLEANFILES += $(mpers_mx32_targets)
$(mpers_mx32_targets): mpers_NAME = mx32
endif # HAVE_MX32_MPERS
clean-local:
-rm -rf mpers-m32 mpers-mx32
if MAINTAINER_MODE
gen_changelog_start_date = 2009-07-08 20:00

125
NEWS
View File

@ -1,3 +1,128 @@
Noteworthy changes in release 4.12 (2016-05-31)
===============================================
* Improvements
* Implemented simultaneous use of -p option and tracing of a command.
(addresses Debian bug #549942).
* Implemented caching of netlink conversations to reduce amount of time
spent in decoding socket details in -yy mode.
* Implemented -yy mode decoding of protocol:portid pairs associated with
netlink socket descriptors.
* Implemented decoding of copy_file_range, preadv2, and pwritev2 syscalls.
* Implemented dumping of preadv, preadv2, pwritev, pwritev2, and vmsplice
syscalls.
* Implemented decoding of BTRFS_* and UFFDIO_* ioctl commands.
* Enhanced decoding of BLK*, EVIOC*, RTC_*, and VIDIOC_* ioctl commands.
* Enhanced decoding of fstatfs, fstatfs64, get_mempolicy, getdents,
getdents64, getgroups, getpriority, kill, mbind, migrate_pages, mknod,
mknodat, personality, poll, ppoll, quotactl, rt_sigpending,
rt_sigqueueinfo, rt_sigtimedwait, rt_tgsigqueueinfo, sched_getaffinity,
sched_setaffinity, seccomp, set_mempolicy, setgroups, setpriority, statfs,
statfs64, tgkill, waitid, and xattr family syscalls.
* Enhanced decoding of getxpid, getxuid, and getxgid syscalls on alpha.
* Enhanced decoding of pipe syscall on alpha, ia64, mips, sh, and sparc.
* Added decoding of bind, listen, and setsockopt direct syscalls on sparc.
* Added decoding of osf_statfs64 and osf_fstatfs64 syscalls on alpha.
* Added decoding of fadvise64 and fadvise64_64 on s390.
* Updated lists of AF_*, BPF_MAP_TYPE_*, CLONE_*, EPOLL*, IPV6_*, MADV_*,
MSG_*, PTRACE_*, SEGV_*, SO_*, SOL_*, *_MAGIC, and quotactl constants.
* Updated lists of ioctl commands from Linux 4.6.
* Bug fixes
* Fixed build on arc, metag, nios2, or1k, and tile architectures.
* Fixed decoding of 32-bit times syscall return value on 64-bit architectures.
* Fixed decoding of mlock2 syscall on sparc.
* Fixed decoding of osf_shmat syscall on alpha.
* Fixed decoding of syscalls unknown to the kernel on s390/s390x.
(addresses Debian bug #485979 and Fedora bug #1298294).
* Fixed decoding of preadv syscall in case of short read.
* Fixed decoding and dumping of readv syscall in case of short read.
* Fixed dumping of recvmsg and recvmmsg syscalls in case of short read.
* Fixed decoding of mincore syscall's last argument.
* Fixed remaining errors in mapping between syscall numbers and numbers
of syscall arguments.
* Applied various fixes to strace-graph script.
Noteworthy changes in release 4.11 (2015-12-21)
===============================================
* Changes in behavior
* Some syscalls have different names depending on architecture and
personality. In these cases, syscall filtering and printing now
consistently uses the names that match corresponding __NR_* kernel
macros of the tracee's architecture and personality.
* Added strace prefix to all diagnostic messages.
* Improvements
* Enhanced and extended test suite.
* Implemented reliable tracing of processes whose personality differs
from the personality of strace, fixed decoding of 32-bit personality
syscalls on 64-bit architectures.
* When some data referenced by syscall arguments is irrelevant or cannot
be read from tracee's memory, strace now prints its address consistently.
* When a syscall is restarted using restart_syscall mechanism, strace now
shows the syscall name on architectures that expose this information.
* Print values returned by epoll_create1, eventfd, eventfd2, fanotify_init,
inotify_init1, perf_event_open, pipe, pipe2, signalfd, signalfd4, socket,
socketpair, timerfd, and timerfd_create syscalls, as well as F_DUPFD and
F_DUPFD_CLOEXEC fcntl commands, as file descriptors.
* Optimized decoding of indirect socket syscalls.
* Implemented decoding of nanoseconds along with seconds in stat family
syscalls (addresses Fedora bug #1251176).
* Implemented decoding of struct statfs.f_flags in statfs syscall.
* Implemented decoding of siginfo_t.si_syscall and siginfo_t.si_arch
in SIGSYS signal.
* Implemented decoding of indirect syscall on mips o32.
* Implemented decoding of IPPROTO_IP control messages.
* Implemented decoding of setsockopt syscall multicast arguments.
* Enhanced decoding of struct sigevent.
* Enhanced decoding of block, loop, mtd, ptp, rtc, SG_IO, socket, tty,
and v4l2 ioctl syscall arguments.
* Enhanced decoding of epoll_create, fcntl, fcntl64, futex, getdents,
getdents64, getsockopt, io_*, mount, msgctl, prctl, quotactl, recvfrom,
sendfile, setsockopt, and shmctl syscalls.
* Implemented decoding of bpf, execveat, ioperm, iopl, kcmp, kexec_file_load,
lookup_dcookie, membarrier, memfd_create, mlock2, name_to_handle_at,
open_by_handle_at, sched_getattr, sched_setattr, and userfaultfd syscalls.
* Updated lists of AF_*, EPOLL_*, FALLOC_FL_*, F_*, INPUT_PROP_*, IPPROTO_*,
IPV6_*, IP_*, KEY_*, LOCK_*, MNT_*, MS_*, PACKET_*, PERF_FLAG_*, PF_*,
PR_*, PTRACE_O_*, RENAME_*, SCTP_*, SECBIT_*, SO_*, TCP_*, and siginfo_t
constants.
* Added Nios II architecture support.
* Added new syscall entries to match Linux 4.4.
* Bug fixes
* Fixed potential short read of strings from tracee's memory.
* Fixed -qq option in conjunction with -o option.
* Fixed filtering of <unavailable> syscalls.
* Fixed decoding of ioctl syscall command on aarch64 and 32-bit architectures
with 64-bit aligned structures.
* Fixed decoding of eventfd2, epoll_create1, signalfd4, and sync_file_range2
syscall flags arguments.
* Fixed decoding of 4th argument of clock_nanosleep syscall.
* Fixed decoding of getpagesize syscall on m68k.
* Fixed decoding of getrandom and seccomp syscalls on aarch64.
* Fixed decoding of timezone argument of gettimeofday and settimeofday
* syscalls.
* Fixed decoding of offset argument of mmap2 syscall on arm, sparc,
and sparc64.
* Fixed decoding of pipe syscall on alpha and mips.
* Fixed decoding of pipe2 syscall on ia64, sh, sparc, and sparc64.
* Fixed decoding of signal mask argument of pselect6 syscall on x32.
* Fixed decoding of signal mask of rt_sigreturn syscall on aarch64, m68k,
and x32.
* Fixed decoding of 4th argument of semctl indirect syscall.
* Fixed decoding of sa_restorer and sa_mask of sigaction syscall on m68k.
* Fixed decoding of statfs64 and fstatfs64 syscalls on arm eabi.
* Fixed decoding of struct dirent on x32.
* Fixed decoding of times syscall return value on mips n32 and x32.
* Fixed decoding of path argument of umount2 syscall
(addresses Debian bug #785050).
* Worked around a kernel bug in tracing privileged executables.
* Fixed various errors in mapping between syscall numbers and associated
information like the number of syscall arguments, the name of syscall,
and syscall decoder.
Noteworthy changes in release 4.10 (2015-03-06)
===============================================

14
README-mpers Normal file
View File

@ -0,0 +1,14 @@
To use mpers functionality, one should:
* typedef all of the target types which are compound and not typedefed
already;
* for each target type, include DEF_MPERS_TYPE(target_type_t), these can
be included conditionally;
* include MPERS_DEFS once;
* before inclusion of MPERS_DEFS include all important headers
(containing definitions of these types or other behaviour-affecting
defines);
* printers should be defined
as MPERS_PRINTER_DECL(return_type, function_name, args),
inside files that include MPERS_DEFS these printers should be called
as MPERS_FUNC_NAME(function_name)(args), in other files
they should be called just as function_name(args).

9
README.md Normal file
View File

@ -0,0 +1,9 @@
This is [strace](http://strace.io) -- a diagnostic, debugging and instructional userspace utility for Linux. It is used to monitor interactions between processes and the Linux kernel, which include system calls, signal deliveries, and changes of process state. The operation of strace is made possible by the kernel feature known as [ptrace](http://man7.org/linux/man-pages/man2/ptrace.2.html).
strace is released under a Berkeley-style license at the request of Paul Kranenburg; see the file [COPYING](https://raw.githubusercontent.com/strace/strace/master/COPYING) for details.
See the file [NEWS](https://raw.githubusercontent.com/strace/strace/master/NEWS) for information on what has changed in recent versions.
Please send bug reports and enhancements to [the strace mailing list](https://lists.sourceforge.net/lists/listinfo/strace-devel).
[![Build Status](https://travis-ci.org/strace/strace.svg?branch=master)](https://travis-ci.org/strace/strace) [![Code Coverage](https://codecov.io/github/strace/strace/coverage.svg?branch=master)](https://codecov.io/github/strace/strace?branch=master)

View File

@ -7,24 +7,20 @@
static int
decode_access(struct tcb *tcp, int offset)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[offset]);
tprints(", ");
printflags(access_flags, tcp->u_arg[offset + 1], "?_OK");
}
return 0;
printpath(tcp, tcp->u_arg[offset]);
tprints(", ");
printflags(access_flags, tcp->u_arg[offset + 1], "?_OK");
return RVAL_DECODED;
}
int
sys_access(struct tcb *tcp)
SYS_FUNC(access)
{
return decode_access(tcp, 0);
}
int
sys_faccessat(struct tcb *tcp)
SYS_FUNC(faccessat)
{
if (entering(tcp))
print_dirfd(tcp, tcp->u_arg[0]);
print_dirfd(tcp, tcp->u_arg[0]);
return decode_access(tcp, 1);
}

View File

@ -1,57 +1,110 @@
/*
* Copyright (c) 2002-2004 Roland McGrath <roland@redhat.com>
* Copyright (c) 2009-2016 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <sched.h>
static unsigned int
get_cpuset_size(void)
{
static unsigned int cpuset_size;
if (!cpuset_size) {
pid_t pid = getpid();
cpuset_size = 128;
while (cpuset_size &&
sched_getaffinity(pid, cpuset_size, NULL) == -1 &&
EINVAL == errno) {
cpuset_size <<= 1;
}
if (!cpuset_size)
cpuset_size = 128;
}
return cpuset_size;
}
static void
print_affinitylist(struct tcb *tcp, long list, unsigned int len)
print_affinitylist(struct tcb *tcp, const unsigned long addr, const unsigned int len)
{
int first = 1;
unsigned long w, min_len;
const unsigned int max_size = get_cpuset_size();
const unsigned int umove_size = len < max_size ? len : max_size;
const unsigned int size =
(umove_size + current_wordsize - 1) & -current_wordsize;
const unsigned int ncpu = size * 8;
void *cpu;
if (abbrev(tcp) && len / sizeof(w) > max_strlen)
min_len = len - max_strlen * sizeof(w);
else
min_len = 0;
for (; len >= sizeof(w) && len > min_len;
len -= sizeof(w), list += sizeof(w)) {
if (umove(tcp, list, &w) < 0)
break;
if (first)
tprints("{");
else
tprints(", ");
first = 0;
tprintf("%lx", w);
if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
!addr || !len || !(cpu = calloc(size, 1))) {
printaddr(addr);
return;
}
if (len) {
if (first)
tprintf("%#lx", list);
else
tprintf(", %s}", (len >= sizeof(w) && len > min_len ?
"???" : "..."));
} else {
tprints(first ? "{}" : "}");
if (!umoven_or_printaddr(tcp, addr, umove_size, cpu)) {
int i = 0;
const char *sep = "";
tprints("[");
for (;; i++) {
i = next_set_bit(cpu, i, ncpu);
if (i < 0)
break;
tprintf("%s%d", sep, i);
sep = " ";
}
if (size < len)
tprintf("%s...", sep);
tprints("]");
}
free(cpu);
}
int
sys_sched_setaffinity(struct tcb *tcp)
SYS_FUNC(sched_setaffinity)
{
const int pid = tcp->u_arg[0];
const unsigned int len = tcp->u_arg[1];
tprintf("%d, %u, ", pid, len);
print_affinitylist(tcp, tcp->u_arg[2], len);
return RVAL_DECODED;
}
SYS_FUNC(sched_getaffinity)
{
const int pid = tcp->u_arg[0];
const unsigned int len = tcp->u_arg[1];
if (entering(tcp)) {
tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
}
return 0;
}
int
sys_sched_getaffinity(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
} else {
if (tcp->u_rval == -1)
tprintf("%#lx", tcp->u_arg[2]);
else
print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
tprintf("%d, %u, ", pid, len);
} else {
print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
}
return 0;
}

353
aio.c
View File

@ -29,46 +29,26 @@
*/
#include "defs.h"
#ifdef HAVE_LIBAIO_H
# include <libaio.h>
#endif
#include <linux/aio_abi.h>
/* Not defined in libaio.h */
#ifndef IOCB_RESFD
# define IOCB_RESFD (1 << 0)
#endif
int
sys_io_setup(struct tcb *tcp)
SYS_FUNC(io_setup)
{
if (entering(tcp))
tprintf("%ld, ", tcp->u_arg[0]);
else {
if (syserror(tcp))
tprintf("0x%0lx", tcp->u_arg[1]);
else {
unsigned long user_id;
if (umove(tcp, tcp->u_arg[1], &user_id) == 0)
tprintf("{%lu}", user_id);
else
tprints("{...}");
}
}
tprintf("%u, ", (unsigned int) tcp->u_arg[0]);
else
printnum_ulong(tcp, tcp->u_arg[1]);
return 0;
}
int
sys_io_destroy(struct tcb *tcp)
SYS_FUNC(io_destroy)
{
if (entering(tcp))
tprintf("%lu", tcp->u_arg[0]);
return 0;
}
tprintf("%lu", tcp->u_arg[0]);
#ifdef HAVE_LIBAIO_H
return RVAL_DECODED;
}
enum iocb_sub {
SUB_NONE, SUB_COMMON, SUB_POLL, SUB_VECTOR
SUB_NONE, SUB_COMMON, SUB_VECTOR
};
static enum iocb_sub
@ -82,8 +62,8 @@ tprint_lio_opcode(unsigned cmd)
{ "pwrite", SUB_COMMON },
{ "fsync", SUB_NONE },
{ "fdsync", SUB_NONE },
{ "op4", SUB_NONE },
{ "poll", SUB_POLL },
{ "preadx", SUB_NONE },
{ "poll", SUB_NONE },
{ "noop", SUB_NONE },
{ "preadv", SUB_VECTOR },
{ "pwritev", SUB_VECTOR },
@ -98,176 +78,173 @@ tprint_lio_opcode(unsigned cmd)
}
static void
print_common_flags(struct iocb *iocb)
print_common_flags(const struct iocb *cb)
{
#if HAVE_STRUCT_IOCB_U_C_FLAGS
if (iocb->u.c.flags & IOCB_RESFD)
tprintf(", resfd=%d", iocb->u.c.resfd);
if (iocb->u.c.flags & ~IOCB_RESFD)
tprintf(", flags=%x", iocb->u.c.flags);
#else
# warning "libaio.h is too old => limited io_submit decoding"
/* IOCB_FLAG_RESFD is available since v2.6.22-rc1~47 */
#ifdef IOCB_FLAG_RESFD
if (cb->aio_flags & IOCB_FLAG_RESFD)
tprintf(", resfd=%d", cb->aio_resfd);
if (cb->aio_flags & ~IOCB_FLAG_RESFD)
tprintf(", flags=%x", cb->aio_flags);
#endif
}
#endif /* HAVE_LIBAIO_H */
int
sys_io_submit(struct tcb *tcp)
static bool
iocb_is_valid(const struct iocb *cb)
{
if (entering(tcp)) {
#ifdef HAVE_LIBAIO_H
long nr = tcp->u_arg[1];
/* if nr <= 0, we end up printing just "{}" */
tprintf("%lu, %ld, {", tcp->u_arg[0], tcp->u_arg[1]);
{
long i;
struct iocb **iocbs = (void *)tcp->u_arg[2];
//FIXME: decoding of 32-bit call by 64-bit strace
for (i = 0; i < nr; i++, iocbs++) {
enum iocb_sub sub;
struct iocb *iocbp;
struct iocb iocb;
if (i)
tprints(", ");
if (umove(tcp, (unsigned long)iocbs, &iocbp)) {
tprintf("%#lx", (unsigned long)iocbs);
/* No point in trying to read iocbs+1 etc */
/* (nr can be ridiculously large): */
break;
}
if (umove(tcp, (unsigned long)iocbp, &iocb)) {
tprintf("{%#lx}", (unsigned long)iocbp);
continue;
}
tprints("{");
if (iocb.data)
tprintf("data:%p, ", iocb.data);
if (iocb.key)
tprintf("key:%u, ", iocb.key);
sub = tprint_lio_opcode(iocb.aio_lio_opcode);
if (iocb.aio_reqprio)
tprintf(", reqprio:%d", iocb.aio_reqprio);
tprintf(", filedes:%d", iocb.aio_fildes);
switch (sub) {
case SUB_COMMON:
#if HAVE_DECL_IO_CMD_PWRITE
if (iocb.aio_lio_opcode == IO_CMD_PWRITE) {
tprints(", str:");
printstr(tcp, (unsigned long)iocb.u.c.buf,
iocb.u.c.nbytes);
} else
#endif
tprintf(", buf:%p", iocb.u.c.buf);
tprintf(", nbytes:%lu, offset:%lld",
iocb.u.c.nbytes,
iocb.u.c.offset);
print_common_flags(&iocb);
break;
case SUB_VECTOR:
tprintf(", %lld", iocb.u.v.offset);
print_common_flags(&iocb);
tprints(", ");
tprint_iov(tcp, iocb.u.v.nr,
(unsigned long)iocb.u.v.vec,
#if HAVE_DECL_IO_CMD_PWRITEV
iocb.aio_lio_opcode == IO_CMD_PWRITEV
#else
0
#endif
);
break;
case SUB_POLL:
tprintf(", %x", iocb.u.poll.events);
break;
case SUB_NONE:
break;
}
tprints("}");
}
}
tprints("}");
#else
# warning "libaio.h is not available => no io_submit decoding"
tprintf("%lu, %ld, %#lx", tcp->u_arg[0], tcp->u_arg[1], tcp->u_arg[2]);
#endif
}
return 0;
return cb->aio_buf == (unsigned long) cb->aio_buf &&
cb->aio_nbytes == (size_t) cb->aio_nbytes &&
(ssize_t) cb->aio_nbytes >= 0;
}
int
sys_io_cancel(struct tcb *tcp)
static enum iocb_sub
print_iocb_header(const struct iocb *cb)
{
if (entering(tcp)) {
#ifdef HAVE_LIBAIO_H
struct iocb iocb;
#endif
tprintf("%lu, ", tcp->u_arg[0]);
#ifdef HAVE_LIBAIO_H
if (umove(tcp, tcp->u_arg[1], &iocb) == 0) {
tprintf("{%p, %u, %u, %u, %d}, ",
iocb.data, iocb.key,
(unsigned)iocb.aio_lio_opcode,
(unsigned)iocb.aio_reqprio, iocb.aio_fildes);
} else
#endif
tprints("{...}, ");
} else {
if (tcp->u_rval < 0)
tprints("{...}");
else {
#ifdef HAVE_LIBAIO_H
struct io_event event;
if (umove(tcp, tcp->u_arg[2], &event) == 0)
tprintf("{%p, %p, %ld, %ld}",
event.data, event.obj,
event.res, event.res2);
else
#endif
tprints("{...}");
}
}
return 0;
enum iocb_sub sub;
if (cb->aio_data)
tprintf("data=%#" PRIx64 ", ",
(uint64_t) cb->aio_data);
if (cb->aio_key)
tprintf("key=%u, ", cb->aio_key);
sub = tprint_lio_opcode(cb->aio_lio_opcode);
if (cb->aio_reqprio)
tprintf(", reqprio=%hd", cb->aio_reqprio);
tprintf(", fildes=%d", cb->aio_fildes);
return sub;
}
int
sys_io_getevents(struct tcb *tcp)
static void
print_iocb(struct tcb *tcp, const struct iocb *cb)
{
if (entering(tcp)) {
tprintf("%ld, %ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1],
tcp->u_arg[2]);
} else {
if (tcp->u_rval == 0) {
tprints("{}");
enum iocb_sub sub = print_iocb_header(cb);
switch (sub) {
case SUB_COMMON:
if (cb->aio_lio_opcode == 1 && iocb_is_valid(cb)) {
tprints(", str=");
printstr(tcp, (unsigned long) cb->aio_buf,
(unsigned long) cb->aio_nbytes);
} else {
#ifdef HAVE_LIBAIO_H
struct io_event *events = (void *)tcp->u_arg[3];
long i, nr = tcp->u_rval;
for (i = 0; i < nr; i++, events++) {
struct io_event event;
if (i == 0)
tprints("{");
else
tprints(", ");
if (umove(tcp, (unsigned long)events, &event) != 0) {
tprints("{...}");
continue;
}
tprintf("{%p, %p, %ld, %ld}", event.data,
event.obj, event.res, event.res2);
}
tprints("}, ");
#else
tprints("{...}");
#endif
tprintf(", buf=%#" PRIx64, (uint64_t) cb->aio_buf);
}
tprintf(", nbytes=%" PRIu64 ", offset=%" PRId64,
(uint64_t) cb->aio_nbytes, (int64_t) cb->aio_offset);
print_common_flags(cb);
break;
case SUB_VECTOR:
if (iocb_is_valid(cb)) {
tprints(", iovec=");
tprint_iov(tcp, cb->aio_nbytes, cb->aio_buf,
cb->aio_lio_opcode == 8);
} else {
tprintf(", buf=%#" PRIx64 ", nbytes=%" PRIu64,
(uint64_t) cb->aio_buf,
(uint64_t) cb->aio_nbytes);
}
tprintf(", offset=%" PRId64, (int64_t) cb->aio_offset);
print_common_flags(cb);
break;
case SUB_NONE:
break;
}
}
print_timespec(tcp, tcp->u_arg[4]);
static bool
print_iocbp(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
{
unsigned long addr;
struct iocb cb;
if (elem_size < sizeof(long)) {
addr = * (unsigned int *) elem_buf;
} else {
addr = * (unsigned long *) elem_buf;
}
tprints("{");
if (!umove_or_printaddr(tcp, addr, &cb))
print_iocb(tcp, &cb);
tprints("}");
return true;
}
SYS_FUNC(io_submit)
{
const long nr = widen_to_long(tcp->u_arg[1]);
const unsigned long addr = tcp->u_arg[2];
unsigned long iocbp;
tprintf("%lu, %ld, ", tcp->u_arg[0], nr);
if (nr < 0)
printaddr(addr);
else
print_array(tcp, addr, nr, &iocbp, current_wordsize,
umoven_or_printaddr, print_iocbp, 0);
return RVAL_DECODED;
}
static bool
print_io_event(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
{
struct io_event *event = elem_buf;
tprintf("{data=%#" PRIx64 ", obj=%#" PRIx64
", res=%" PRId64 ", res2=%" PRId64 "}",
(uint64_t) event->data, (uint64_t) event->obj,
(int64_t) event->res, (int64_t) event->res2);
return true;
}
SYS_FUNC(io_cancel)
{
if (entering(tcp)) {
tprintf("%lu, ", tcp->u_arg[0]);
struct iocb cb;
if (!umove_or_printaddr(tcp, tcp->u_arg[1], &cb)) {
tprints("{");
print_iocb_header(&cb);
tprints("}");
}
tprints(", ");
} else {
struct io_event event;
if (!umove_or_printaddr(tcp, tcp->u_arg[2], &event))
print_io_event(tcp, &event, sizeof(event), 0);
}
return 0;
}
SYS_FUNC(io_getevents)
{
if (entering(tcp)) {
tprintf("%lu, %ld, %ld, ",
tcp->u_arg[0],
widen_to_long(tcp->u_arg[1]),
widen_to_long(tcp->u_arg[2]));
} else {
struct io_event buf;
print_array(tcp, tcp->u_arg[3], tcp->u_rval, &buf, sizeof(buf),
umoven_or_printaddr, print_io_event, 0);
tprints(", ");
/*
* Since the timeout parameter is read by the kernel
* on entering syscall, it has to be decoded the same way
* whether the syscall has failed or not.
*/
temporarily_clear_syserror(tcp);
print_timespec(tcp, tcp->u_arg[4]);
restore_cleared_syserror(tcp);
}
return 0;
}

83
alpha.c Normal file
View File

@ -0,0 +1,83 @@
/*
* Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#ifdef ALPHA
static int
decode_getxxid(struct tcb *tcp, const char *what)
{
if (entering(tcp))
return 0;
long rval = getrval2(tcp);
if (rval == -1)
return 0;
static const char const fmt[] = "%s %ld";
static char outstr[sizeof(fmt) + 3 * sizeof(rval)];
snprintf(outstr, sizeof(outstr), fmt, what, rval);
tcp->auxstr = outstr;
return RVAL_STR;
}
SYS_FUNC(getxpid)
{
return decode_getxxid(tcp, "ppid");
}
SYS_FUNC(getxuid)
{
return decode_getxxid(tcp, "euid");
}
SYS_FUNC(getxgid)
{
return decode_getxxid(tcp, "egid");
}
SYS_FUNC(osf_statfs)
{
printpath(tcp, tcp->u_arg[0]);
tprints(", ");
printaddr(tcp->u_arg[1]);
tprints(", ");
tprintf("%lu", tcp->u_arg[2]);
return RVAL_DECODED;
}
SYS_FUNC(osf_fstatfs)
{
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printaddr(tcp->u_arg[1]);
tprints(", ");
tprintf("%lu", tcp->u_arg[2]);
return RVAL_DECODED;
}
#endif /* ALPHA */

172
bjm.c
View File

@ -30,168 +30,32 @@
#include "defs.h"
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/resource.h>
#include <sys/utsname.h>
/* Bits of module.flags. */
#define MOD_UNINITIALIZED 0
#define MOD_RUNNING 1
#define MOD_DELETED 2
#define MOD_AUTOCLEAN 4
#define MOD_VISITED 8
#define MOD_USED_ONCE 16
#define MOD_JUST_FREED 32
#define MOD_INITIALIZING 64
/* Values for query_module's which. */
#define QM_MODULES 1
#define QM_DEPS 2
#define QM_REFS 3
#define QM_SYMBOLS 4
#define QM_INFO 5
struct module_symbol
{
unsigned long value;
const char *name;
};
struct module_info
{
unsigned long addr;
unsigned long size;
unsigned long flags;
long usecount;
};
#include "xlat/qm_which.h"
#include "xlat/modflags.h"
#include "xlat/delete_module_flags.h"
int
sys_query_module(struct tcb *tcp)
SYS_FUNC(create_module)
{
if (entering(tcp)) {
printstr(tcp, tcp->u_arg[0], -1);
tprints(", ");
printxval(qm_which, tcp->u_arg[1], "QM_???");
tprints(", ");
} else {
size_t ret;
printpath(tcp, tcp->u_arg[0]);
tprintf(", %lu", tcp->u_arg[1]);
if (!verbose(tcp) || syserror(tcp) ||
umove(tcp, tcp->u_arg[4], &ret) < 0) {
tprintf("%#lx, %lu, %#lx", tcp->u_arg[2],
tcp->u_arg[3], tcp->u_arg[4]);
} else if (tcp->u_arg[1]==QM_INFO) {
struct module_info mi;
if (umove(tcp, tcp->u_arg[2], &mi) < 0) {
tprintf("%#lx, ", tcp->u_arg[2]);
} else {
tprintf("{address=%#lx, size=%lu, flags=",
mi.addr, mi.size);
printflags(modflags, mi.flags, "MOD_???");
tprintf(", usecount=%lu}, ", mi.usecount);
}
tprintf("%lu", (unsigned long)ret);
} else if ((tcp->u_arg[1]==QM_MODULES) ||
(tcp->u_arg[1]==QM_DEPS) ||
(tcp->u_arg[1]==QM_REFS)) {
tprints("{");
if (!abbrev(tcp)) {
char* data = malloc(tcp->u_arg[3]);
char* mod = data;
size_t idx;
if (!data) {
fprintf(stderr, "out of memory\n");
tprintf(" /* %lu entries */ ", (unsigned long)ret);
} else {
if (umoven(tcp, tcp->u_arg[2],
tcp->u_arg[3], data) < 0) {
tprintf(" /* %lu entries */ ", (unsigned long)ret);
} else {
for (idx = 0; idx < ret; idx++) {
tprintf("%s%s",
(idx ? ", " : ""),
mod);
mod += strlen(mod)+1;
}
}
free(data);
}
} else
tprintf(" /* %lu entries */ ", (unsigned long)ret);
tprintf("}, %lu", (unsigned long)ret);
} else if (tcp->u_arg[1]==QM_SYMBOLS) {
tprints("{");
if (!abbrev(tcp)) {
char* data = malloc(tcp->u_arg[3]);
struct module_symbol* sym = (struct module_symbol*)data;
size_t idx;
if (!data) {
fprintf(stderr, "out of memory\n");
tprintf(" /* %lu entries */ ", (unsigned long)ret);
} else {
if (umoven(tcp, tcp->u_arg[2],
tcp->u_arg[3], data) < 0) {
tprintf(" /* %lu entries */ ", (unsigned long)ret);
} else {
for (idx = 0; idx < ret; idx++) {
tprintf("%s{name=%s, value=%lu}",
(idx ? " " : ""),
data+(long)sym->name,
sym->value);
sym++;
}
}
free(data);
}
} else
tprintf(" /* %lu entries */ ", (unsigned long)ret);
tprintf("}, %ld", (unsigned long)ret);
} else {
printstr(tcp, tcp->u_arg[2], tcp->u_arg[3]);
tprintf(", %#lx", tcp->u_arg[4]);
}
}
return 0;
return RVAL_DECODED | RVAL_HEX;
}
int
sys_create_module(struct tcb *tcp)
SYS_FUNC(delete_module)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
tprintf(", %lu", tcp->u_arg[1]);
}
return RVAL_HEX;
printstr(tcp, tcp->u_arg[0], -1);
tprints(", ");
printflags(delete_module_flags, tcp->u_arg[1], "O_???");
return RVAL_DECODED;
}
int
sys_delete_module(struct tcb *tcp)
SYS_FUNC(init_module)
{
if (entering(tcp)) {
printstr(tcp, tcp->u_arg[0], -1);
tprints(", ");
printflags(delete_module_flags, tcp->u_arg[1], "O_???");
}
return 0;
}
tprintf("%#lx, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
printstr(tcp, tcp->u_arg[2], -1);
int
sys_init_module(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%#lx, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
printstr(tcp, tcp->u_arg[2], -1);
}
return 0;
return RVAL_DECODED;
}
#define MODULE_INIT_IGNORE_MODVERSIONS 1
@ -199,12 +63,8 @@ sys_init_module(struct tcb *tcp)
#include "xlat/module_init_flags.h"
int
sys_finit_module(struct tcb *tcp)
SYS_FUNC(finit_module)
{
if (exiting(tcp))
return 0;
/* file descriptor */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
@ -214,5 +74,5 @@ sys_finit_module(struct tcb *tcp)
/* flags */
printflags(module_init_flags, tcp->u_arg[2], "MODULE_INIT_???");
return 0;
return RVAL_DECODED;
}

284
block.c
View File

@ -1,5 +1,6 @@
/*
* Copyright (c) 2009, 2010 Jeff Mahoney <jeffm@suse.com>
* Copyright (c) 2011-2016 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -26,16 +27,16 @@
*/
#include "defs.h"
#include DEF_MPERS_TYPE(struct_blk_user_trace_setup)
#include DEF_MPERS_TYPE(struct_blkpg_ioctl_arg)
#include DEF_MPERS_TYPE(struct_blkpg_partition)
#include <linux/blkpg.h>
#include <linux/fs.h>
#include <linux/hdreg.h>
/* ioctls <= 114 are present in Linux 2.4. The following ones have been
* added since then and headers containing them may not be available on
* every system. */
#define BLKTRACE_BDEV_SIZE 32
struct blk_user_trace_setup {
typedef struct blk_user_trace_setup {
char name[BLKTRACE_BDEV_SIZE]; /* output */
uint16_t act_mask; /* input */
uint32_t buf_size; /* input */
@ -43,106 +44,105 @@ struct blk_user_trace_setup {
uint64_t start_lba;
uint64_t end_lba;
uint32_t pid;
};
} struct_blk_user_trace_setup;
typedef struct blkpg_ioctl_arg struct_blkpg_ioctl_arg;
typedef struct blkpg_partition struct_blkpg_partition;
#include MPERS_DEFS
/*
* ioctl numbers <= 114 are present in Linux 2.4. The following ones have been
* added since then and headers containing them may not be available on every
* system.
*/
#ifndef BLKTRACESETUP
#define BLKTRACESETUP _IOWR(0x12,115,struct blk_user_trace_setup)
# define BLKTRACESETUP _IOWR(0x12, 115, struct_blk_user_trace_setup)
#endif
#ifndef BLKTRACESTART
#define BLKTRACESTART _IO(0x12,116)
# define BLKTRACESTART _IO(0x12,116)
#endif
#ifndef BLKTRACESTOP
#define BLKTRACESTOP _IO(0x12,117)
# define BLKTRACESTOP _IO(0x12,117)
#endif
#ifndef BLKTRACETEARDOWN
#define BLKTRACETEARDOWN _IO(0x12,118)
# define BLKTRACETEARDOWN _IO(0x12,118)
#endif
#ifndef BLKDISCARD
#define BLKDISCARD _IO(0x12,119)
# define BLKDISCARD _IO(0x12,119)
#endif
#ifndef BLKIOMIN
#define BLKIOMIN _IO(0x12,120)
# define BLKIOMIN _IO(0x12,120)
#endif
#ifndef BLKIOOPT
#define BLKIOOPT _IO(0x12,121)
# define BLKIOOPT _IO(0x12,121)
#endif
#ifndef BLKALIGNOFF
#define BLKALIGNOFF _IO(0x12,122)
# define BLKALIGNOFF _IO(0x12,122)
#endif
#ifndef BLKPBSZGET
#define BLKPBSZGET _IO(0x12,123)
# define BLKPBSZGET _IO(0x12,123)
#endif
#ifndef BLKDISCARDZEROES
#define BLKDISCARDZEROES _IO(0x12,124)
# define BLKDISCARDZEROES _IO(0x12,124)
#endif
#ifndef BLKSECDISCARD
#define BLKSECDISCARD _IO(0x12,125)
# define BLKSECDISCARD _IO(0x12,125)
#endif
#ifndef BLKROTATIONAL
# define BLKROTATIONAL _IO(0x12,126)
#endif
#ifndef BLKZEROOUT
# define BLKZEROOUT _IO(0x12,127)
#endif
#ifndef BLKDAXGET
# define BLKDAXGET _IO(0x12,129)
#endif
#include "xlat/blkpg_ops.h"
static void
print_blkpg_req(struct tcb *tcp, struct blkpg_ioctl_arg *blkpg)
print_blkpg_req(struct tcb *tcp, const struct_blkpg_ioctl_arg *blkpg)
{
struct blkpg_partition p;
struct_blkpg_partition p;
tprints("{");
printxval(blkpg_ops, blkpg->op, "BLKPG_???");
tprintf(", flags=%d, datalen=%d, ",
tprintf(", flags=%d, datalen=%d, data=",
blkpg->flags, blkpg->datalen);
if (umove(tcp, (long) blkpg->data, &p) < 0)
tprintf("%#lx}", (long) blkpg->data);
else {
if (!umove_or_printaddr(tcp, (long) blkpg->data, &p)) {
tprintf("{start=%lld, length=%lld, pno=%d, devname=",
p.start, p.length, p.pno);
(long long) p.start, (long long) p.length, p.pno);
print_quoted_string(p.devname, sizeof(p.devname),
QUOTE_0_TERMINATED);
tprints(", volname=");
print_quoted_string(p.volname, sizeof(p.volname),
QUOTE_0_TERMINATED);
tprints("}}");
tprints("}");
}
tprints("}");
}
int
block_ioctl(struct tcb *tcp, const unsigned int code, long arg)
MPERS_PRINTER_DECL(int, block_ioctl, struct tcb *tcp,
const unsigned int code, const long arg)
{
switch (code) {
/* take arg as a value, not as a pointer */
case BLKRASET:
case BLKFRASET:
if (entering(tcp))
tprintf(", %ld", arg);
tprintf(", %lu", arg);
break;
/* take a signed int */
case BLKROSET:
case BLKBSZSET:
#ifdef FIFREEZE
/* First seen in linux-2.6.29 */
case FIFREEZE:
case FITHAW:
#endif
if (entering(tcp)) {
int val;
if (umove(tcp, arg, &val) < 0)
tprintf(", %#lx", arg);
else
tprintf(", %d", val);
}
break;
/* returns an unsigned short */
/* return an unsigned short */
case BLKSECTGET:
if (exiting(tcp)) {
unsigned short val;
if (syserror(tcp) || umove(tcp, arg, &val) < 0)
tprintf(", %#lx", arg);
else
tprintf(", %u", (unsigned)val);
}
case BLKROTATIONAL:
if (entering(tcp))
return 0;
tprints(", ");
printnum_short(tcp, arg, "%hu");
break;
/* return a signed int */
@ -150,13 +150,15 @@ block_ioctl(struct tcb *tcp, const unsigned int code, long arg)
case BLKBSZGET:
case BLKSSZGET:
case BLKALIGNOFF:
if (exiting(tcp)) {
int val;
if (syserror(tcp) || umove(tcp, arg, &val) < 0)
tprintf(", %#lx", arg);
else
tprintf(", %d", val);
}
case BLKDAXGET:
if (entering(tcp))
return 0;
/* fall through */
/* take a signed int */
case BLKROSET:
case BLKBSZSET:
tprints(", ");
printnum_int(tcp, arg, "%d");
break;
/* return an unsigned int */
@ -164,143 +166,93 @@ block_ioctl(struct tcb *tcp, const unsigned int code, long arg)
case BLKIOMIN:
case BLKIOOPT:
case BLKDISCARDZEROES:
if (exiting(tcp)) {
unsigned int val;
if (syserror(tcp) || umove(tcp, arg, &val) < 0)
tprintf(", %#lx", arg);
else
tprintf(", %u", val);
}
if (entering(tcp))
return 0;
tprints(", ");
printnum_int(tcp, arg, "%u");
break;
/* return a signed long */
case BLKRAGET:
case BLKFRAGET:
if (exiting(tcp)) {
long val;
if (syserror(tcp) || umove(tcp, arg, &val) < 0)
tprintf(", %#lx", arg);
else
tprintf(", %ld", val);
}
if (entering(tcp))
return 0;
tprints(", ");
printnum_slong(tcp, arg);
break;
/* returns an unsigned long */
case BLKGETSIZE:
if (exiting(tcp)) {
unsigned long val;
if (syserror(tcp) || umove(tcp, arg, &val) < 0)
tprintf(", %#lx", arg);
else
tprintf(", %lu", val);
}
if (entering(tcp))
return 0;
tprints(", ");
printnum_ulong(tcp, arg);
break;
#ifdef HAVE_BLKGETSIZE64
/* return an uint64_t */
/* returns an uint64_t */
case BLKGETSIZE64:
if (exiting(tcp)) {
uint64_t val;
if (syserror(tcp) || umove(tcp, arg, &val) < 0)
tprintf(", %#lx", arg);
else
tprintf(", %" PRIu64, val);
}
if (entering(tcp))
return 0;
tprints(", ");
printnum_int64(tcp, arg, "%" PRIu64);
break;
#endif
/* More complex types */
/* takes a pair of uint64_t */
case BLKDISCARD:
case BLKSECDISCARD:
if (entering(tcp)) {
uint64_t range[2];
if (umove(tcp, arg, range) < 0)
tprintf(", %#lx", arg);
else
tprintf(", {%" PRIx64 ", %" PRIx64 "}",
range[0], range[1]);
}
case BLKZEROOUT:
tprints(", ");
printpair_int64(tcp, arg, "%" PRIu64);
break;
case HDIO_GETGEO:
if (exiting(tcp)) {
struct hd_geometry geo;
if (syserror(tcp) || umove(tcp, arg, &geo) < 0)
tprintf(", %#lx", arg);
else
tprintf(", {heads=%u, sectors=%u, "
"cylinders=%u, start=%lu}",
(unsigned)geo.heads,
(unsigned)geo.sectors,
(unsigned)geo.cylinders,
geo.start);
}
break;
/* More complex types */
case BLKPG: {
struct_blkpg_ioctl_arg blkpg;
case BLKPG:
if (entering(tcp)) {
struct blkpg_ioctl_arg blkpg;
if (umove(tcp, arg, &blkpg) < 0)
tprintf(", %#lx", arg);
else {
tprints(", ");
print_blkpg_req(tcp, &blkpg);
}
}
tprints(", ");
if (!umove_or_printaddr(tcp, arg, &blkpg))
print_blkpg_req(tcp, &blkpg);
break;
}
case BLKTRACESETUP:
if (entering(tcp)) {
struct blk_user_trace_setup buts;
if (umove(tcp, arg, &buts) < 0)
tprintf(", %#lx", arg);
else
tprintf(", {act_mask=%u, buf_size=%u, "
"buf_nr=%u, start_lba=%" PRIu64 ", "
"end_lba=%" PRIu64 ", pid=%u}",
(unsigned)buts.act_mask, buts.buf_size,
buts.buf_nr, buts.start_lba,
buts.end_lba, buts.pid);
}
if (exiting(tcp)) {
struct blk_user_trace_setup buts;
if (syserror(tcp) || umove(tcp, arg, &buts) < 0)
tprintf(", %#lx", arg);
else {
tprints(", {name=");
struct_blk_user_trace_setup buts;
tprints(", ");
if (umove_or_printaddr(tcp, arg, &buts))
break;
tprintf("{act_mask=%u, buf_size=%u, "
"buf_nr=%u, start_lba=%" PRIu64 ", "
"end_lba=%" PRIu64 ", pid=%u",
(unsigned)buts.act_mask, buts.buf_size,
buts.buf_nr, buts.start_lba,
buts.end_lba, buts.pid);
return 1;
} else {
struct_blk_user_trace_setup buts;
if (!syserror(tcp) && !umove(tcp, arg, &buts)) {
tprints(", name=");
print_quoted_string(buts.name, sizeof(buts.name),
QUOTE_0_TERMINATED);
tprints("}");
}
tprints("}");
break;
}
break;
#ifdef FITRIM
/* First seen in linux-2.6.37 */
case FITRIM:
if (entering(tcp)) {
struct fstrim_range fstrim;
if (umove(tcp, arg, &fstrim))
tprintf(", %#lx", arg);
else
tprintf(", {start=%#" PRIx64 ", len=%#" PRIx64 ", "
"minlen=%#" PRIx64 "}", (uint64_t) fstrim.start,
(uint64_t) fstrim.len, (uint64_t) fstrim.minlen);
}
break;
#endif
/* No arguments or unhandled */
/* No arguments */
case BLKRRPART:
case BLKFLSBUF:
case BLKTRACESTART:
case BLKTRACESTOP:
case BLKTRACETEARDOWN:
case BLKFLSBUF: /* Requires driver knowlege */
case BLKRRPART: /* No args */
default:
if (entering(tcp))
tprintf(", %#lx", arg);
break;
default:
return RVAL_DECODED;
}
};
return 1;
return RVAL_DECODED | 1;
}

View File

@ -1,18 +1,21 @@
#!/bin/sh -eu
for m in -m32 -mx32; do
mkdir -p tests$m
find tests$m -type l -delete
sed "s/^AM_CFLAGS[[:space:]]*=.*/& $m/" \
tests/Makefile.am > tests$m/Makefile.am
for m in m32 mx32; do
tests=tests-$m
rm -rf $tests
mkdir $tests
s='[[:space:]]*'
sed "s/@arch@/@arch_$m@/;s/^MPERS_NAME$s=.*/& $m/;s/^ARCH_MFLAGS$s=.*/& -$m/" \
tests/Makefile.am > $tests/Makefile.am
for f in tests/*; do
case "${f##*/}" in
Makefile*) continue;;
esac
ln -s ../"$f" tests$m/
ln -s ../"$f" $tests/
done
done
./generate_mpers_am.sh
./xlat/gen.sh
exec autoreconf -f -i "$@"

215
bpf.c Normal file
View File

@ -0,0 +1,215 @@
/*
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#ifdef HAVE_LINUX_BPF_H
# include <linux/bpf.h>
#endif
#include "xlat/bpf_commands.h"
#include "xlat/bpf_map_types.h"
#include "xlat/bpf_prog_types.h"
#include "xlat/bpf_map_update_elem_flags.h"
static int
bpf_map_create(struct tcb *tcp, const long addr, unsigned int size)
{
struct {
uint32_t map_type, key_size, value_size, max_entries;
} attr = {};
if (!size) {
printaddr(addr);
return RVAL_DECODED | RVAL_FD;
}
if (size > sizeof(attr))
size = sizeof(attr);
if (umoven_or_printaddr(tcp, addr, size, &attr))
return RVAL_DECODED | RVAL_FD;
tprints("{map_type=");
printxval(bpf_map_types, attr.map_type, "BPF_MAP_TYPE_???");
tprintf(", key_size=%u, value_size=%u, max_entries=%u}",
attr.key_size, attr.value_size, attr.max_entries);
return RVAL_DECODED | RVAL_FD;
}
static void
bpf_map_update_elem(struct tcb *tcp, const long addr, unsigned int size)
{
struct {
uint32_t map_fd;
uint64_t ATTRIBUTE_ALIGNED(8) key;
uint64_t ATTRIBUTE_ALIGNED(8) value;
uint64_t flags;
} attr = {};
if (!size) {
printaddr(addr);
return;
}
if (size > sizeof(attr))
size = sizeof(attr);
if (umoven_or_printaddr(tcp, addr, size, &attr))
return;
tprints("{map_fd=");
printfd(tcp, attr.map_fd);
tprintf(", key=%#" PRIx64 ", value=%#" PRIx64 ", flags=",
attr.key, attr.value);
printxval64(bpf_map_update_elem_flags, attr.flags, "BPF_???");
tprints("}");
}
static void
bpf_map_delete_elem(struct tcb *tcp, const long addr, unsigned int size)
{
struct {
uint32_t map_fd;
uint64_t ATTRIBUTE_ALIGNED(8) key;
} attr = {};
if (!size) {
printaddr(addr);
return;
}
if (size > sizeof(attr))
size = sizeof(attr);
if (umoven_or_printaddr(tcp, addr, size, &attr))
return;
tprints("{map_fd=");
printfd(tcp, attr.map_fd);
tprintf(", key=%#" PRIx64 "}", attr.key);
}
static int
bpf_map_io(struct tcb *tcp, const long addr, unsigned int size, const char *text)
{
struct bpf_io_elem_struct {
uint32_t map_fd;
uint64_t ATTRIBUTE_ALIGNED(8) key;
uint64_t ATTRIBUTE_ALIGNED(8) value;
} attr = {};
if (exiting(tcp)) {
if (!syserror(tcp) && !umove_or_printaddr(tcp, addr, &attr))
tprintf(", %s=%#" PRIx64, text, attr.value);
tprints("}");
return RVAL_DECODED;
}
if (!size) {
printaddr(addr);
return RVAL_DECODED;
}
if (size > sizeof(attr))
size = sizeof(attr);
if (umoven_or_printaddr(tcp, addr, size, &attr))
return RVAL_DECODED;
tprints("{map_fd=");
printfd(tcp, attr.map_fd);
tprintf(", key=%#" PRIx64, attr.key);
return 0;
}
static int
bpf_prog_load(struct tcb *tcp, const long addr, unsigned int size)
{
struct {
uint32_t prog_type, insn_cnt;
uint64_t ATTRIBUTE_ALIGNED(8) insns, license;
uint32_t log_level, log_size;
uint64_t ATTRIBUTE_ALIGNED(8) log_buf;
uint32_t kern_version;
} attr = {};
if (!size) {
printaddr(addr);
return RVAL_DECODED | RVAL_FD;
}
if (size > sizeof(attr))
size = sizeof(attr);
if (umoven_or_printaddr(tcp, addr, size, &attr))
return RVAL_DECODED | RVAL_FD;
tprints("{prog_type=");
printxval(bpf_prog_types, attr.prog_type, "BPF_PROG_TYPE_???");
tprintf(", insn_cnt=%u, insns=%#" PRIx64 ", license=",
attr.insn_cnt, attr.insns);
printstr(tcp, attr.license, -1);
tprintf(", log_level=%u, log_size=%u, log_buf=%#" PRIx64 ", kern_version=%u}",
attr.log_level, attr.log_size, attr.log_buf, attr.kern_version);
return RVAL_DECODED | RVAL_FD;
}
SYS_FUNC(bpf)
{
const int cmd = tcp->u_arg[0];
const long addr = tcp->u_arg[1];
const unsigned int size = tcp->u_arg[2];
int rc = RVAL_DECODED;
if (entering(tcp)) {
printxval(bpf_commands, cmd, "BPF_???");
tprints(", ");
}
switch (cmd) {
case BPF_MAP_CREATE:
rc = bpf_map_create(tcp, addr, size);
break;
case BPF_MAP_LOOKUP_ELEM:
rc = bpf_map_io(tcp, addr, size, "value");
break;
case BPF_MAP_UPDATE_ELEM:
bpf_map_update_elem(tcp, addr, size);
break;
case BPF_MAP_DELETE_ELEM:
bpf_map_delete_elem(tcp, addr, size);
break;
case BPF_MAP_GET_NEXT_KEY:
rc = bpf_map_io(tcp, addr, size, "next_key");
break;
case BPF_PROG_LOAD:
rc = bpf_prog_load(tcp, addr, size);
break;
default:
printaddr(addr);
break;
}
if (rc & RVAL_DECODED)
tprintf(", %u", size);
return rc;
}

1354
btrfs.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,34 @@
/*
* Copyright (c) 1999 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
* Copyright (c) 2010 Mike Frysinger <vapier@gentoo.org>
* Copyright (c) 2010 Carmelo Amoroso <carmelo.amoroso@st.com>
* Copyright (c) 2015 Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
* Copyright (c) 2014-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#ifdef HAVE_ASM_CACHECTL_H
@ -20,21 +51,20 @@ static const struct xlat cacheflush_flags[] = {
XLAT_END
};
int
sys_cacheflush(struct tcb *tcp)
SYS_FUNC(cacheflush)
{
if (entering(tcp)) {
/* addr */
tprintf("%#lx, ", tcp->u_arg[0]);
/* scope */
printxval(cacheflush_scope, tcp->u_arg[1], "FLUSH_SCOPE_???");
tprints(", ");
/* flags */
printflags(cacheflush_flags, tcp->u_arg[2], "FLUSH_CACHE_???");
/* len */
tprintf(", %lu", tcp->u_arg[3]);
}
return 0;
/* addr */
printaddr(tcp->u_arg[0]);
tprints(", ");
/* scope */
printxval(cacheflush_scope, tcp->u_arg[1], "FLUSH_SCOPE_???");
tprints(", ");
/* flags */
printflags(cacheflush_flags, tcp->u_arg[2], "FLUSH_CACHE_???");
/* len */
tprintf(", %lu", tcp->u_arg[3]);
return RVAL_DECODED;
}
#endif /* M68K */
@ -46,18 +76,16 @@ static const struct xlat cacheflush_flags[] = {
XLAT_END
};
int
sys_cacheflush(struct tcb *tcp)
SYS_FUNC(cacheflush)
{
if (entering(tcp)) {
/* start addr */
tprintf("%#lx, ", tcp->u_arg[0]);
/* length */
tprintf("%ld, ", tcp->u_arg[1]);
/* flags */
printxval(cacheflush_flags, tcp->u_arg[1], "?CACHE");
}
return 0;
/* start addr */
printaddr(tcp->u_arg[0]);
/* length */
tprintf(", %lu, ", tcp->u_arg[1]);
/* flags */
printxval(cacheflush_flags, tcp->u_arg[2], "?CACHE");
return RVAL_DECODED;
}
#endif /* BFIN */
@ -78,17 +106,28 @@ static const struct xlat cacheflush_flags[] = {
XLAT_END
};
int
sys_cacheflush(struct tcb *tcp)
SYS_FUNC(cacheflush)
{
if (entering(tcp)) {
/* addr */
tprintf("%#lx, ", tcp->u_arg[0]);
/* len */
tprintf("%lu, ", tcp->u_arg[1]);
/* flags */
printflags(cacheflush_flags, tcp->u_arg[2], "CACHEFLUSH_???");
}
return 0;
/* addr */
printaddr(tcp->u_arg[0]);
/* len */
tprintf(", %lu, ", tcp->u_arg[1]);
/* flags */
printflags(cacheflush_flags, tcp->u_arg[2], "CACHEFLUSH_???");
return RVAL_DECODED;
}
#endif /* SH */
#ifdef NIOS2
SYS_FUNC(cacheflush)
{
/* addr */
printaddr(tcp->u_arg[0]);
/* len */
tprintf(", %lu, ", tcp->u_arg[3]);
/* scope and flags (cache type) are currently ignored */
return RVAL_DECODED;
}
#endif /* NIOS2 */

View File

@ -1,3 +1,32 @@
/*
* Copyright (c) 2000 Wichert Akkerman <wakkerma@debian.org>
* Copyright (c) 2011 Denys Vlasenko <dvlasenk@redhat.com>
* Copyright (c) 2005-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
/* these constants are the same as in <linux/capability.h> */
@ -51,13 +80,8 @@ get_cap_header(struct tcb *tcp, unsigned long addr)
static void
print_cap_header(struct tcb *tcp, unsigned long addr, cap_user_header_t h)
{
if (!addr) {
tprints("NULL");
return;
}
if (!h) {
tprintf("%#lx", addr);
if (!addr || !h) {
printaddr(addr);
return;
}
@ -86,14 +110,8 @@ print_cap_data(struct tcb *tcp, unsigned long addr, const cap_user_header_t h)
struct user_cap_data_struct data[2];
unsigned int len;
if (!addr) {
tprints("NULL");
return;
}
if (!h || !verbose(tcp) ||
(exiting(tcp) && syserror(tcp))) {
tprintf("%#lx", addr);
if (!addr || !h) {
printaddr(addr);
return;
}
@ -103,10 +121,8 @@ print_cap_data(struct tcb *tcp, unsigned long addr, const cap_user_header_t h)
else
len = 1;
if (umoven(tcp, addr, len * sizeof(data[0]), (char *) data) < 0) {
tprintf("%#lx", addr);
if (umoven_or_printaddr(tcp, addr, len * sizeof(data[0]), data))
return;
}
tprints("{");
print_cap_bits(data[0].effective, len > 1 ? data[1].effective : 0);
@ -117,8 +133,7 @@ print_cap_data(struct tcb *tcp, unsigned long addr, const cap_user_header_t h)
tprints("}");
}
int
sys_capget(struct tcb *tcp)
SYS_FUNC(capget)
{
cap_user_header_t h;
@ -133,14 +148,12 @@ sys_capget(struct tcb *tcp)
return 0;
}
int
sys_capset(struct tcb *tcp)
SYS_FUNC(capset)
{
if (entering(tcp)) {
cap_user_header_t h = get_cap_header(tcp, tcp->u_arg[0]);
print_cap_header(tcp, tcp->u_arg[0], h);
tprints(", ");
print_cap_data(tcp, tcp->u_arg[1], h);
}
return 0;
cap_user_header_t h = get_cap_header(tcp, tcp->u_arg[0]);
print_cap_header(tcp, tcp->u_arg[0], h);
tprints(", ");
print_cap_data(tcp, tcp->u_arg[1], h);
return RVAL_DECODED;
}

10
chdir.c
View File

@ -1,10 +1,8 @@
#include "defs.h"
int
sys_chdir(struct tcb *tcp)
SYS_FUNC(chdir)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
}
return 0;
printpath(tcp, tcp->u_arg[0]);
return RVAL_DECODED;
}

40
chmod.c
View File

@ -1,35 +1,31 @@
#include "defs.h"
static int
decode_chmod(struct tcb *tcp, int offset)
static void
decode_chmod(struct tcb *tcp, const int offset)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[offset]);
tprintf(", %#lo", tcp->u_arg[offset + 1]);
}
return 0;
printpath(tcp, tcp->u_arg[offset]);
tprintf(", %#lo", tcp->u_arg[offset + 1]);
}
int
sys_chmod(struct tcb *tcp)
SYS_FUNC(chmod)
{
return decode_chmod(tcp, 0);
decode_chmod(tcp, 0);
return RVAL_DECODED;
}
int
sys_fchmodat(struct tcb *tcp)
SYS_FUNC(fchmodat)
{
if (entering(tcp))
print_dirfd(tcp, tcp->u_arg[0]);
return decode_chmod(tcp, 1);
print_dirfd(tcp, tcp->u_arg[0]);
decode_chmod(tcp, 1);
return RVAL_DECODED;
}
int
sys_fchmod(struct tcb *tcp)
SYS_FUNC(fchmod)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprintf(", %#lo", tcp->u_arg[1]);
}
return 0;
printfd(tcp, tcp->u_arg[0]);
tprintf(", %#lo", tcp->u_arg[1]);
return RVAL_DECODED;
}

95
clone.c
View File

@ -1,32 +1,41 @@
/*
* Copyright (c) 1999-2000 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2002-2005 Roland McGrath <roland@redhat.com>
* Copyright (c) 2008 Jan Kratochvil <jan.kratochvil@redhat.com>
* Copyright (c) 2009-2013 Denys Vlasenko <dvlasenk@redhat.com>
* Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
/* defines copied from linux/sched.h since we can't include that
* ourselves (it conflicts with *lots* of libc includes)
*/
#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
#define CLONE_VM 0x00000100 /* set if VM shared between processes */
#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
#define CLONE_THREAD 0x00010000 /* Same thread group? */
#define CLONE_NEWNS 0x00020000 /* New namespace group? */
#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
#define CLONE_STOPPED 0x02000000 /* Start in stopped state */
#define CLONE_NEWUTS 0x04000000 /* New utsname group? */
#define CLONE_NEWIPC 0x08000000 /* New ipcs */
#define CLONE_NEWUSER 0x10000000 /* New user namespace */
#define CLONE_NEWPID 0x20000000 /* New pid namespace */
#define CLONE_NEWNET 0x40000000 /* New network namespace */
#define CLONE_IO 0x80000000 /* Clone io context */
#include <sched.h>
#ifndef CSIGNAL
# define CSIGNAL 0x000000ff
#endif
#include "xlat/clone_flags.h"
@ -68,8 +77,7 @@
extern void print_user_desc(struct tcb *, long);
#endif /* I386 || X86_64 || X32 */
int
sys_clone(struct tcb *tcp)
SYS_FUNC(clone)
{
if (exiting(tcp)) {
const char *sep = "|";
@ -123,29 +131,22 @@ sys_clone(struct tcb *tcp)
return 0;
}
int
sys_setns(struct tcb *tcp)
SYS_FUNC(setns)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printflags(clone_flags, tcp->u_arg[1], "CLONE_???");
}
return 0;
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printflags(clone_flags, tcp->u_arg[1], "CLONE_???");
return RVAL_DECODED;
}
int
sys_unshare(struct tcb *tcp)
SYS_FUNC(unshare)
{
if (entering(tcp))
printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
return 0;
printflags_long(clone_flags, tcp->u_arg[0], "CLONE_???");
return RVAL_DECODED;
}
int
sys_fork(struct tcb *tcp)
SYS_FUNC(fork)
{
if (exiting(tcp))
return RVAL_UDECIMAL;
return 0;
return RVAL_DECODED | RVAL_UDECIMAL;
}

View File

@ -1,4 +1,34 @@
dnl Process this file with autoconf to create configure. Use autoreconf.
# Configure template for strace.
#
# Copyright (c) 1999-2001 Wichert Akkerman <wichert@deephackmode.org>
# Copyright (c) 2002-2009 Roland McGrath <roland@redhat.com>
# Copyright (c) 2006-2016 Dmitry V. Levin <ldv@altlinux.org>
# Copyright (c) 2008-2015 Mike Frysinger <vapier@gentoo.org>
# Copyright (c) 2015 Elvira Khabirova <lineprinter0@gmail.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
AC_PREREQ(2.57)
AC_INIT([strace],
m4_esyscmd([./git-version-gen .tarball-version]),
@ -6,15 +36,22 @@ AC_INIT([strace],
AC_CONFIG_SRCDIR([strace.c])
AC_CONFIG_AUX_DIR([.])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign dist-xz no-dist-gzip silent-rules parallel-tests])
AM_INIT_AUTOMAKE([foreign nostdinc dist-xz no-dist-gzip silent-rules parallel-tests])
AM_MAINTAINER_MODE
AC_CANONICAL_HOST
AC_PROG_CC
AC_PROG_CPP
AX_PROG_CC_FOR_BUILD
AC_PROG_INSTALL
AC_PROG_RANLIB
AC_USE_SYSTEM_EXTENSIONS
AX_CODE_COVERAGE
AC_MSG_CHECKING([for supported architecture])
arch_m32=
arch_mx32=
case "$host_cpu" in
bfin)
arch=bfin
@ -34,6 +71,7 @@ m68k)
;;
sparc64*)
arch=sparc64
arch_m32=sparc
AC_DEFINE([SPARC64], 1, [Define for the SPARC64 architecture.])
;;
sparc*)
@ -59,6 +97,7 @@ powerpc*)
# error 32 bit
#endif], [], arch=powerpc64, arch=powerpc)
if test "$arch" = "powerpc64"; then
arch_m32=powerpc
AC_DEFINE([POWERPC64], 1, [Define for the PowerPC64 architecture.])
fi
;;
@ -68,6 +107,7 @@ arm*)
;;
aarch64*)
arch=aarch64
arch_m32=arm
AC_DEFINE([AARCH64], 1, [Define for the AArch64 architecture.])
;;
avr32*)
@ -99,11 +139,13 @@ sh*)
AC_DEFINE([SH], 1, [Define for the SH architecture.])
;;
x86?64*)
arch_m32=i386
AC_TRY_COMPILE(
[#ifndef __ILP32__
# error not x32
#endif], [], arch=x32, arch=x86_64)
if test "$arch" = "x86_64"; then
arch_mx32=x32
AC_DEFINE([X86_64], 1, [Define for the 64bit AMD x86-64 architecture.])
else
AC_DEFINE([X32], 1, [Define for the 32bit AMD x86-64 architecture.])
@ -125,6 +167,11 @@ microblaze*)
arch=microblaze
AC_DEFINE([MICROBLAZE], 1, [Define for the MicroBlaze architecture.])
;;
nios2*)
arch=nios2
AC_DEFINE([NIOS2], 1, [Define for the Nios-II architecture.])
;;
or1k*)
arch=or1k
AC_DEFINE([OR1K], 1, [Define for the OpenRISC 1000 architecture.])
@ -142,24 +189,36 @@ xtensa*)
esac
AC_MSG_RESULT($arch)
test -n "$arch_m32" ||
arch_m32=$arch
test -n "$arch_mx32" ||
arch_mx32=$arch
AC_SUBST(arch)
AC_SUBST(arch_m32)
AC_SUBST(arch_mx32)
if test "$arch" = mips; then
AC_CACHE_CHECK([for MIPS ABI], [ac_cv_mips_abi],
AC_CACHE_CHECK([for _MIPS_SIM], [st_cv__MIPS_SIM],
[AC_COMPUTE_INT([st_cv__MIPS_SIM], [_MIPS_SIM],
[#include <sgidefs.h>],
[AC_MSG_ERROR([_MIPS_SIM cannot be determined])])])
AC_CACHE_CHECK([for MIPS ABI], [st_cv_mips_abi],
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[#include <sgidefs.h>]],
[[int i[_MIPS_SIM == _MIPS_SIM_ABI32 ? 1 : - 1];]])],
[ac_cv_mips_abi=o32],
[st_cv_mips_abi=o32],
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[#include <sgidefs.h>]],
[[int i[_MIPS_SIM == _MIPS_SIM_NABI32 ? 1 : - 1];]])],
[ac_cv_mips_abi=n32],
[st_cv_mips_abi=n32],
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[#include <sgidefs.h>]],
[[int i[_MIPS_SIM == _MIPS_SIM_ABI64 ? 1 : - 1];]])],
[ac_cv_mips_abi=n64],
[ac_cv_mips_abi=unknown])])])])
case "$ac_cv_mips_abi" in
[st_cv_mips_abi=n64],
[st_cv_mips_abi=unknown])])])])
case "$st_cv_mips_abi" in
o32) AC_DEFINE([LINUX_MIPSO32], [1], [Define for _MIPS_SIM_ABI32.]);;
n32) AC_DEFINE([LINUX_MIPSN32], [1], [Define for _MIPS_SIM_NABI32.]);;
n64) AC_DEFINE([LINUX_MIPSN64], [1], [Define for _MIPS_SIM_ABI64.]);;
@ -192,126 +251,223 @@ AC_ARG_ENABLE([gcc-Werror],
)
AC_SUBST([WARN_CFLAGS])
AC_PROG_CPP
AC_PROG_INSTALL
AC_C_CONST
AC_C_BIGENDIAN
AC_HEADER_STDC
AC_HEADER_STDBOOL
AC_HEADER_DIRENT
AC_HEADER_STAT
AC_CHECK_MEMBERS(m4_normalize([
struct stat.st_blksize,
struct stat.st_blocks,
struct stat.st_flags,
struct stat.st_fstype,
struct stat.st_gen,
struct stat.st_rdev
]))
AC_C_CONST
AC_C_TYPEOF
AC_TYPE_GETGROUPS
AC_TYPE_MODE_T
AC_TYPE_SIGNAL
AC_TYPE_UID_T
AC_TYPE_MODE_T
AC_TYPE_GETGROUPS
AC_HEADER_DIRENT
AC_HEADER_MAJOR
AC_CHECK_TYPES([sig_atomic_t],,, [#include <signal.h>])
AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_scope_id],,,
[#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>])
AC_LITTLE_ENDIAN_LONG_LONG
AC_HEADER_STAT
AC_HEADER_STDBOOL
AC_HEADER_STDC
AC_CHECK_FUNCS(m4_normalize([
fanotify_mark
fopen64
fork
fputs_unlocked
fstatat
ftruncate
futimens
if_indextoname
inet_ntop
inet_pton
pipe2
prctl
preadv
process_vm_readv
pwritev
sendmsg
recvmmsg
sendmmsg
sigaction
signalfd
stpcpy
strerror
strsignal
sync_file_range
utimensat
]))
AC_CHECK_TYPES([sig_atomic_t, struct sigcontext],,, [#include <signal.h>])
AC_CHECK_TYPES([struct mmsghdr],,, [#include <sys/socket.h>])
AC_CHECK_TYPES([__kernel_long_t, __kernel_ulong_t],,,
[#include <asm/posix_types.h>])
AC_CHECK_TYPES([struct stat64, struct __old_kernel_stat],,,
[#include <sys/types.h>
#include <asm/stat.h>])
AC_CHECK_TYPES(m4_normalize([
struct pt_all_user_regs,
struct ia64_fpreg,
struct ptrace_peeksiginfo_args
]),,, [#include <sys/ptrace.h>])
AC_CHECK_TYPES(m4_normalize([
struct flock,
struct flock64,
struct __kernel_flock,
struct __kernel_flock64
]),,,
[#include <sys/types.h>
#include <linux/fcntl.h>])
AC_CHECK_MEMBERS(m4_normalize([
struct stat.st_atim.tv_nsec,
struct stat.st_blksize,
struct stat.st_blocks,
struct stat.st_ctim.tv_nsec,
struct stat.st_flags,
struct stat.st_fstype,
struct stat.st_gen,
struct stat.st_mtim.tv_nsec,
struct stat.st_rdev
]))
AC_CHECK_MEMBERS([struct msghdr.msg_control],,, [#include <sys/socket.h>])
AC_CHECK_MEMBERS([struct timex.tai],,, [#include <sys/timex.h>])
AC_CHECK_MEMBERS([struct utsname.domainname],,, [#include <sys/utsname.h>])
AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_scope_id],,,
[#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>])
AC_CHECK_MEMBERS(m4_normalize([
struct stat.st_atime_nsec,
struct stat.st_ctime_nsec,
struct stat.st_mtime_nsec
]),,, [#include <sys/types.h>
#include <asm/stat.h>])
AC_CHECK_MEMBERS(m4_normalize([
siginfo_t.si_syscall,
siginfo_t.si_timerid,
siginfo_t.si_overrun
]),,, [#include <signal.h>])
AC_CHECK_HEADERS(m4_normalize([
asm/cachectl.h
asm/sysmips.h
bluetooth/bluetooth.h
elf.h
inttypes.h
ioctls.h
linux/bsg.h
linux/falloc.h
linux/fiemap.h
linux/filter.h
linux/hiddev.h
linux/ip_vs.h
linux/ipc.h
linux/mmtimer.h
linux/msg.h
linux/perf_event.h
linux/seccomp.h
linux/securebits.h
linux/sem.h
linux/shm.h
linux/userfaultfd.h
linux/utsname.h
mqueue.h
netinet/sctp.h
poll.h
scsi/sg.h
stropts.h
sys/conf.h
sys/epoll.h
sys/eventfd.h
sys/fanotify.h
sys/filio.h
sys/ioctl.h
sys/poll.h
sys/ipc.h
sys/msg.h
sys/reg.h
sys/vfs.h
sys/sem.h
sys/shm.h
sys/signalfd.h
sys/xattr.h
]))
AC_CHECK_HEADERS([linux/icmp.h linux/in6.h linux/netlink.h linux/if_packet.h],
[], [], [#include <stddef.h>
#include <sys/socket.h>
#include <asm/types.h>])
AC_CHECK_HEADERS([asm/sigcontext.h], [], [], [#include <signal.h>])
AC_CHECK_TYPES([struct sigcontext],,, [#include <signal.h>])
AC_CHECK_HEADERS([asm/sigcontext.h],,, [#include <signal.h>])
AC_CHECK_HEADERS([netinet/tcp.h netinet/udp.h],,, [#include <netinet/in.h>])
AC_CHECK_TYPES([struct mmsghdr],,, [#include <sys/socket.h>])
AC_CHECK_MEMBERS([struct msghdr.msg_control],,, [#include <sys/socket.h>])
AC_CHECK_HEADERS([linux/mqueue.h],,, [#include <linux/types.h>])
AC_CHECK_TYPES([struct stat64],,, [#include <sys/types.h>
#include <asm/stat.h>])
AC_CHECK_TYPES([struct __old_kernel_stat],,, [#include <asm/stat.h>])
AC_CHECK_TYPES([struct statfs64],,, [#include <sys/vfs.h>])
AC_CHECK_HEADERS([linux/icmp.h linux/in6.h linux/netlink.h linux/if_packet.h],,,
[#include <stddef.h>
#include <sys/socket.h>
#include <asm/types.h>])
AC_CHECK_TYPES([struct pt_all_user_regs, struct ia64_fpreg, struct ptrace_peeksiginfo_args],,,
[#include <sys/ptrace.h>])
AC_CHECK_MEMBERS([struct utsname.domainname],,, [#include <sys/utsname.h>])
AC_CHECK_MEMBERS([struct sigevent._sigev_un._pad,
struct sigevent.__pad,
siginfo_t.si_syscall,
siginfo_t.si_timerid,
siginfo_t.si_overrun],,, [#include <signal.h>])
AC_CHECK_MEMBERS([struct sysinfo.totalhigh,
struct sysinfo.freehigh,
struct sysinfo.mem_unit],,, [#include <sys/sysinfo.h>])
AC_CHECK_TYPES([struct flock64],,, [#include <fcntl.h>])
AC_CHECK_HEADERS([libaio.h], [
AC_CHECK_MEMBERS([struct iocb.u.c.flags],,, [#include <libaio.h>])
AC_CHECK_DECLS([IO_CMD_PWRITE, IO_CMD_PWRITEV],,, [#include <libaio.h>])
])
AC_CHECK_HEADERS(m4_normalize([
linux/netfilter_arp/arp_tables.h
linux/netfilter_bridge/ebtables.h
linux/netfilter_ipv4/ip_tables.h
linux/netfilter_ipv6/ip6_tables.h
]),,, [#include <netinet/in.h>
#include <net/if.h>])
AC_CHECK_HEADERS([linux/input.h], [
AC_CHECK_MEMBERS([struct input_absinfo.resolution],,, [#include <linux/input.h>])
])
AC_CHECK_HEADERS([linux/bpf.h], [
AC_CACHE_CHECK([whether union bpf_attr.log_buf initialization works],
[st_cv_have_union_bpf_attr_log_buf],
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[#include <linux/bpf.h>]],
[[union bpf_attr a = { .log_buf = 0 };]])],
[st_cv_have_union_bpf_attr_log_buf=yes],
[st_cv_have_union_bpf_attr_log_buf=no])])
if test $st_cv_have_union_bpf_attr_log_buf = yes; then
AC_DEFINE(HAVE_UNION_BPF_ATTR_LOG_BUF, [1],
[Define to 1 if union bpf_attr.log_buf initialization works])
fi
])
AC_CHECK_TYPES([struct statfs], [
AC_CHECK_MEMBERS([struct statfs.f_frsize],,, [#include <linux/types.h>
#include <asm/statfs.h>])
AC_CHECK_MEMBERS([struct statfs.f_flags],,, [#include <linux/types.h>
#include <asm/statfs.h>])
AC_CHECK_MEMBERS([struct statfs.f_fsid.val],,, [#include <linux/types.h>
#include <asm/statfs.h>])
AC_CHECK_MEMBERS([struct statfs.f_fsid.__val],,, [#include <linux/types.h>
#include <asm/statfs.h>])
],, [#include <linux/types.h>
#include <asm/statfs.h>])
AC_CHECK_TYPES([struct statfs64], [
AC_CHECK_MEMBERS([struct statfs64.f_frsize],,, [#include <linux/types.h>
#include <asm/statfs.h>])
AC_CHECK_MEMBERS([struct statfs64.f_flags],,, [#include <linux/types.h>
#include <asm/statfs.h>])
AC_CHECK_MEMBERS([struct statfs64.f_fsid.val],,, [#include <linux/types.h>
#include <asm/statfs.h>])
AC_CHECK_MEMBERS([struct statfs64.f_fsid.__val],,, [#include <linux/types.h>
#include <asm/statfs.h>])
],, [#include <linux/types.h>
#include <asm/statfs.h>])
AC_CHECK_TYPES([struct blk_user_trace_setup],,, [#include <linux/blktrace_api.h>])
AC_CHECK_HEADERS([linux/btrfs.h], [
AC_CHECK_MEMBERS(m4_normalize([
struct btrfs_ioctl_feature_flags.compat_flags,
struct btrfs_ioctl_fs_info_args.nodesize,
struct btrfs_ioctl_defrag_range_args.start
struct btrfs_ioctl_search_args_v2.buf_size
]),,, [ #include <stdio.h>
#include <linux/btrfs.h>])
AC_CHECK_DECLS(m4_normalize([BTRFS_COMPRESS_NONE, BTRFS_COMPRESS_ZLIB,
BTRFS_COMPRESS_LZO]),,,[ #include <stdio.h>
#include <linux/btrfs.h>])])
AC_CHECK_DECLS([sys_errlist])
AC_CHECK_DECLS(m4_normalize([
PTRACE_PEEKUSER,
@ -696,7 +852,10 @@ AC_CHECK_DECLS(m4_normalize([
V4L2_CTRL_TYPE_STRING,
V4L2_CTRL_TYPE_BITMASK,
V4L2_CTRL_TYPE_INTEGER_MENU
]),,, [#include <linux/videodev2.h>])
]),,, [#include <sys/time.h>
#include <linux/ioctl.h>
#include <linux/types.h>
#include <linux/videodev2.h>])
AC_CACHE_CHECK([for BLKGETSIZE64], [ac_cv_have_blkgetsize64],
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
@ -710,6 +869,7 @@ AC_CACHE_CHECK([for BLKGETSIZE64], [ac_cv_have_blkgetsize64],
AC_CHECK_SIZEOF([long])
AC_CHECK_SIZEOF([long long])
AC_CHECK_SIZEOF([off_t],,[#include <sys/types.h>])
AC_CHECK_SIZEOF([struct i64_i32],,[struct i64_i32 {long long i64; int i32;};])
AC_CACHE_CHECK([for SIGRTMIN], [st_cv_SIGRTMIN],
[[st_cv_SIGRTMIN="$(echo SIGRTMIN |
@ -845,33 +1005,8 @@ if test "$arch" = mips && test "$no_create" != yes; then
fi
fi
have_m32=no
case "$arch" in
aarch64|powerpc64|sparc64|tile|x32|x86_64)
AC_MSG_CHECKING([for -m32 runtime support])
saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -m32"
AC_RUN_IFELSE([AC_LANG_SOURCE([[int main(){return 0;}]])],
[have_m32=yes],[have_m32=no],[have_m32=no])
CFLAGS="$saved_CFLAGS"
AC_MSG_RESULT($have_m32)
;;
esac
AM_CONDITIONAL([HAVE_M32_RUNTIME], [test "$have_m32" = yes])
have_mx32=no
case "$arch" in
x86_64)
AC_MSG_CHECKING([for -mx32 runtime support])
saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -mx32"
AC_RUN_IFELSE([AC_LANG_SOURCE([[int main(){return 0;}]])],
[have_mx32=yes],[have_mx32=no],[have_mx32=no])
CFLAGS="$saved_CFLAGS"
AC_MSG_RESULT($have_mx32)
;;
esac
AM_CONDITIONAL([HAVE_MX32_RUNTIME], [test "$have_mx32" = yes])
st_MPERS([m32], [aarch64|powerpc64|sparc64|tile|x32|x86_64])
st_MPERS([mx32], [x86_64])
AC_CONFIG_FILES([Makefile tests/Makefile tests-m32/Makefile tests-mx32/Makefile])
AC_OUTPUT

50
copy_file_range.c Normal file
View File

@ -0,0 +1,50 @@
/*
* Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
SYS_FUNC(copy_file_range)
{
/* int fd_in */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* loff_t *off_in */
printnum_int64(tcp, tcp->u_arg[1], "%" PRId64);
tprints(", ");
/* int fd_out */
printfd(tcp, tcp->u_arg[2]);
tprints(", ");
/* loff_t *off_out */
printnum_int64(tcp, tcp->u_arg[3], "%" PRId64);
tprints(", ");
/* size_t len */
tprintf("%lu, ", tcp->u_arg[4]);
/* unsigned int flags */
tprintf("%u", (unsigned int) tcp->u_arg[5]);
return RVAL_DECODED;
}

18
count.c
View File

@ -58,11 +58,8 @@ count_syscall(struct tcb *tcp, const struct timeval *syscall_exiting_tv)
if (!SCNO_IN_RANGE(scno))
return;
if (!counts) {
counts = calloc(nsyscalls, sizeof(*counts));
if (!counts)
die_out_of_memory();
}
if (!counts)
counts = xcalloc(nsyscalls, sizeof(*counts));
cc = &counts[scno];
cc->calls++;
@ -115,8 +112,9 @@ time_cmp(void *a, void *b)
static int
syscall_cmp(void *a, void *b)
{
return strcmp(sysent[*((int *) a)].sys_name,
sysent[*((int *) b)].sys_name);
const char *a_name = sysent[*((int *) a)].sys_name;
const char *b_name = sysent[*((int *) b)].sys_name;
return strcmp(a_name ? a_name : "", b_name ? b_name : "");
}
static int
@ -143,7 +141,7 @@ set_sortby(const char *sortby)
else if (strcmp(sortby, "nothing") == 0)
sortfun = NULL;
else {
error_msg_and_die("invalid sortby: '%s'", sortby);
error_msg_and_help("invalid sortby: '%s'", sortby);
}
}
@ -171,9 +169,7 @@ call_summary_pers(FILE *outf)
fprintf(outf, "%6.6s %11.11s %11.11s %9.9s %9.9s %s\n",
dashes, dashes, dashes, dashes, dashes, dashes);
sorted_count = calloc(sizeof(int), nsyscalls);
if (!sorted_count)
die_out_of_memory();
sorted_count = xcalloc(sizeof(int), nsyscalls);
call_cum = error_cum = tv_cum.tv_sec = tv_cum.tv_usec = 0;
if (overhead.tv_sec == -1) {
tv_mul(&overhead, &shortest, 8);

52
debian/changelog vendored
View File

@ -1,5 +1,51 @@
strace (4.10-1) experimental; urgency=low
strace (4.12-1) unstable; urgency=low
[ Dmitry V. Levin ]
* New upstream version.
+ implemented simultaneous use of -p option and tracing of a command,
closes: #549942
+ fixed decoding of syscalls unknown to the kernel on s390/s390x,
closes: #485979
-- Dmitry V. Levin <ldv@altlinux.org> Tue, 31 May 2016 11:12:13 +0000
strace (4.11-1) unstable; urgency=low
[ Dmitry V. Levin ]
* New upstream version.
+ fixed decoding of path argument of umount2 syscall, closes: #785050
[ Steve McIntyre ]
* Drop patches against old upstream - all upstream now.
* Add simple upstream patch to fix printing of 32-bit times syscall
return value on 64-bit architectures.
-- Steve McIntyre <93sam@debian.org> Fri, 08 Jan 2015 00:52:05 +0000
strace (4.10-3) unstable; urgency=medium
* Really fix mips* builds - fix sys_syscall() handling.
Closes: #781753
* Clean up strace64.substvars at clean time
* Remove ancient changelog entries that annoy lintian
* Update Standards-Version to 3.9.6 (no changes needed)
-- Steve McIntyre <93sam@debian.org> Wed, 08 Jul 2015 23:44:03 +0100
strace (4.10-2) unstable; urgency=medium
* Fix building on arm64 using patches from upstream. Closes: #790770
* Fix various test suite failures using patches from upstream.
Closes: #781040
* Fix mips o32 build. Thanks to Arturo Borrero Gonzalez
<arturo.borrero.glez@gmail.com> for tracking this.
* Add build-dependency on gawk for the test suite. Closes: #780992
-- Steve McIntyre <93sam@debian.org> Thu, 02 Jul 2015 02:03:25 +0100
strace (4.10-1) unstable; urgency=low
[ Dmitry V. Levin ]
* New upstream version.
+ enhanced ioctl decoding, closes: #692913
+ enabled mips64el build, closes: #773375
@ -7,7 +53,7 @@ strace (4.10-1) experimental; urgency=low
+ updated generic and added arch-specific PTRACE_* constants,
closes: #734554
-- Dmitry V. Levin <ldv@altlinux.org> Fri, 06 Mar 2015 13:14:15 +0000
-- Steve McIntyre <93sam@debian.org> Sat, 21 Mar 2015 22:18:25 +0000
strace (4.9-2) unstable; urgency=medium
@ -767,7 +813,7 @@ strace (3.1-11) unstable; urgency=low
* Ported to libc6 / glibc2 (Bug# 11729)
* Compress manpage
-- Wichert Akkerman <wakkerma@wi.leidenuniv.nl> Fri, 1 Aug 1997 00:13:38 +02
-- Wichert Akkerman <wakkerma@wi.leidenuniv.nl> Fri, 1 Aug 1997 00:13:38 +0200
strace (3.1-10) unstable; urgency=low

4
debian/control vendored
View File

@ -2,8 +2,8 @@ Source: strace
Maintainer: Steve McIntyre <93sam@debian.org>
Section: utils
Priority: optional
Build-Depends: libc6-dev (>= 2.2.2) [!alpha !ia64], libc6.1-dev (>= 2.2.2) [alpha ia64], gcc-multilib [i386 powerpc s390 sparc], debhelper (>= 7.0.0)
Standards-Version: 3.9.5
Build-Depends: libc6-dev (>= 2.2.2) [!alpha !ia64], libc6.1-dev (>= 2.2.2) [alpha ia64], gcc-multilib [i386 powerpc s390 sparc], debhelper (>= 7.0.0), gawk, libunwind-dev [amd64]
Standards-Version: 3.9.6
Homepage: http://sourceforge.net/projects/strace/
Package: strace

2
debian/rules vendored
View File

@ -62,7 +62,7 @@ build64/Makefile:
clean:
dh_testdir
dh_testroot
rm -rf build build64 strace64.1
rm -rf build build64 strace64.1 debian/strace64.substvars
dh_clean
binary: binary-indep binary-arch

379
defs.h
View File

@ -50,11 +50,13 @@
/* #include <ctype.h> */
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/syscall.h>
#include "mpers_type.h"
#include "gcc_compat.h"
#ifndef HAVE_STRERROR
const char *strerror(int);
#endif
@ -67,10 +69,6 @@ const char *strerror(int);
extern char *stpcpy(char *dst, const char *src);
#endif
#if !defined __GNUC__
# define __attribute__(x) /*nothing*/
#endif
#ifndef offsetof
# define offsetof(type, member) \
(((char *) &(((type *) NULL)->member)) - ((char *) (type *) NULL))
@ -152,26 +150,47 @@ extern char *stpcpy(char *dst, const char *src);
#if defined(SPARC) || defined(SPARC64)
# define PERSONALITY0_WORDSIZE 4
# define PERSONALITY1_WORDSIZE 4
# if defined(SPARC64)
# define SUPPORTED_PERSONALITIES 3
# define PERSONALITY2_WORDSIZE 8
# else
# define SUPPORTED_PERSONALITIES 2
# endif /* SPARC64 */
#endif /* SPARC[64] */
# define PERSONALITY1_WORDSIZE 8
# ifdef HAVE_M32_MPERS
# define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
# define MPERS_m32_IOCTL_MACROS "ioctl_redefs1.h"
# endif
# endif
#endif
#ifdef X86_64
# define SUPPORTED_PERSONALITIES 3
# define PERSONALITY0_WORDSIZE 8
# define PERSONALITY1_WORDSIZE 4
# define PERSONALITY2_WORDSIZE 4
# ifdef HAVE_M32_MPERS
# define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
# define MPERS_m32_IOCTL_MACROS "ioctl_redefs1.h"
# endif
# ifdef HAVE_MX32_MPERS
# define PERSONALITY2_INCLUDE_FUNCS "mx32_funcs.h"
# define PERSONALITY2_INCLUDE_PRINTERS_DECLS "mx32_printer_decls.h"
# define PERSONALITY2_INCLUDE_PRINTERS_DEFS "mx32_printer_defs.h"
# define MPERS_mx32_IOCTL_MACROS "ioctl_redefs2.h"
# endif
#endif
#ifdef X32
# define SUPPORTED_PERSONALITIES 2
# define PERSONALITY0_WORDSIZE 4
# define PERSONALITY1_WORDSIZE 4
# ifdef HAVE_M32_MPERS
# define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
# define MPERS_m32_IOCTL_MACROS "ioctl_redefs1.h"
# endif
#endif
#ifdef ARM
@ -181,15 +200,26 @@ extern char *stpcpy(char *dst, const char *src);
#ifdef AARCH64
/* The existing ARM personality, then AArch64 */
# define SUPPORTED_PERSONALITIES 2
# define PERSONALITY0_WORDSIZE 4
# define PERSONALITY1_WORDSIZE 8
# define DEFAULT_PERSONALITY 1
# define PERSONALITY0_WORDSIZE 8
# define PERSONALITY1_WORDSIZE 4
# ifdef HAVE_M32_MPERS
# define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
# define MPERS_m32_IOCTL_MACROS "ioctl_redefs1.h"
# endif
#endif
#ifdef POWERPC64
# define SUPPORTED_PERSONALITIES 2
# define PERSONALITY0_WORDSIZE 8
# define PERSONALITY1_WORDSIZE 4
# ifdef HAVE_M32_MPERS
# define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
# define MPERS_m32_IOCTL_MACROS "ioctl_redefs1.h"
# endif
#endif
#ifdef TILE
@ -199,6 +229,12 @@ extern char *stpcpy(char *dst, const char *src);
# ifdef __tilepro__
# define DEFAULT_PERSONALITY 1
# endif
# ifdef HAVE_M32_MPERS
# define PERSONALITY1_INCLUDE_FUNCS "m32_funcs.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DECLS "m32_printer_decls.h"
# define PERSONALITY1_INCLUDE_PRINTERS_DEFS "m32_printer_defs.h"
# define MPERS_m32_IOCTL_MACROS "ioctl_redefs1.h"
# endif
#endif
#ifndef SUPPORTED_PERSONALITIES
@ -211,9 +247,38 @@ extern char *stpcpy(char *dst, const char *src);
# define PERSONALITY0_WORDSIZE SIZEOF_LONG
#endif
#ifndef PERSONALITY0_INCLUDE_PRINTERS_DECLS
# define PERSONALITY0_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
#endif
#ifndef PERSONALITY0_INCLUDE_PRINTERS_DEFS
# define PERSONALITY0_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
#endif
#ifndef PERSONALITY1_INCLUDE_PRINTERS_DECLS
# define PERSONALITY1_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
#endif
#ifndef PERSONALITY1_INCLUDE_PRINTERS_DEFS
# define PERSONALITY1_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
#endif
#ifndef PERSONALITY2_INCLUDE_PRINTERS_DECLS
# define PERSONALITY2_INCLUDE_PRINTERS_DECLS "native_printer_decls.h"
#endif
#ifndef PERSONALITY2_INCLUDE_PRINTERS_DEFS
# define PERSONALITY2_INCLUDE_PRINTERS_DEFS "native_printer_defs.h"
#endif
#ifndef PERSONALITY1_INCLUDE_FUNCS
# define PERSONALITY1_INCLUDE_FUNCS "empty.h"
#endif
#ifndef PERSONALITY2_INCLUDE_FUNCS
# define PERSONALITY2_INCLUDE_FUNCS "empty.h"
#endif
typedef struct sysent {
unsigned nargs;
int sys_flags;
int sen;
int (*sys_func)();
const char *sys_name;
} struct_sysent;
@ -239,15 +304,15 @@ struct tcb {
#if SUPPORTED_PERSONALITIES > 1
unsigned int currpers; /* Personality at the time of scno update */
#endif
int sys_func_rval; /* Syscall entry parser's return value */
int curcol; /* Output column for this process */
FILE *outf; /* Output file for this process */
const char *auxstr; /* Auxiliary info from syscall (see RVAL_STR) */
const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */
const struct_sysent *s_prev_ent; /* for "resuming interrupted SYSCALL" msg */
struct timeval stime; /* System time usage as of last process wait */
struct timeval dtime; /* Delta for system time usage */
struct timeval etime; /* Syscall entry time */
/* Support for tracing forked processes: */
long inst[2]; /* Saved clone args (badly named) */
#ifdef USE_LIBUNWIND
struct UPT_info* libunwind_ui;
@ -302,17 +367,15 @@ typedef uint8_t qualbits_t;
#define abbrev(tcp) ((tcp)->qual_flg & QUAL_ABBREV)
#define filtered(tcp) ((tcp)->flags & TCB_FILTERED)
struct xlat {
unsigned int val;
const char *str;
};
#define XLAT(x) { x, #x }
#define XLAT_END { 0, NULL }
#include "xlat.h"
extern const struct xlat addrfams[];
extern const struct xlat at_flags[];
extern const struct xlat dirent_types[];
extern const struct xlat evdev_abs[];
extern const struct xlat open_access_modes[];
extern const struct xlat open_mode_flags[];
extern const struct xlat resource_flags[];
extern const struct xlat whence_codes[];
/* Format of syscall return values */
@ -334,6 +397,8 @@ extern const struct xlat whence_codes[];
#define RVAL_STR 020 /* Print `auxstr' field after return val */
#define RVAL_NONE 040 /* Print nothing */
#define RVAL_DECODED 0100 /* syscall decoding finished */
#define TRACE_FILE 001 /* Trace file-related syscalls. */
#define TRACE_IPC 002 /* Trace IPC-related syscalls. */
#define TRACE_NETWORK 004 /* Trace network-related syscalls. */
@ -346,6 +411,12 @@ extern const struct xlat whence_codes[];
#define STACKTRACE_CAPTURE_ON_ENTER 01000 /* Capture stacktrace on "entering" stage */
#define TRACE_INDIRECT_SUBCALL 02000 /* Syscall is an indirect socket/ipc subcall. */
#define IOCTL_NUMBER_UNKNOWN 0
#define IOCTL_NUMBER_HANDLED 1
#define IOCTL_NUMBER_STOP_LOOKUP 010
#define indirect_ipccall(tcp) (tcp->s_ent->sys_flags & TRACE_INDIRECT_SUBCALL)
#if defined(ARM) || defined(AARCH64) \
|| defined(I386) || defined(X32) || defined(X86_64) \
|| defined(IA64) \
@ -390,13 +461,22 @@ extern unsigned os_release;
#undef KERNEL_VERSION
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
enum bitness_t { BITNESS_CURRENT = 0, BITNESS_32 };
void error_msg(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
void perror_msg(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
void error_msg_and_die(const char *fmt, ...)
ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN;
void error_msg_and_help(const char *fmt, ...)
ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN;
void perror_msg_and_die(const char *fmt, ...)
ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN;
void die_out_of_memory(void) ATTRIBUTE_NORETURN;
void error_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
void perror_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
void error_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2)));
void perror_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2)));
void die_out_of_memory(void) __attribute__ ((noreturn));
void *xmalloc(size_t size) ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1));
void *xcalloc(size_t nmemb, size_t size)
ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1, 2));
void *xreallocarray(void *ptr, size_t nmemb, size_t size)
ATTRIBUTE_ALLOC_SIZE((2, 3));
char *xstrdup(const char *str) ATTRIBUTE_MALLOC;
#if USE_CUSTOM_PRINTF
/*
@ -418,14 +498,44 @@ extern void call_summary(FILE *);
extern void clear_regs(void);
extern void get_regs(pid_t pid);
extern int get_scno(struct tcb *tcp);
extern const char *syscall_name(long scno);
extern int umoven(struct tcb *, long, unsigned int, char *);
extern bool is_erestart(struct tcb *);
extern void temporarily_clear_syserror(struct tcb *);
extern void restore_cleared_syserror(struct tcb *);
extern int umoven(struct tcb *, long, unsigned int, void *);
#define umove(pid, addr, objp) \
umoven((pid), (addr), sizeof(*(objp)), (char *) (objp))
umoven((pid), (addr), sizeof(*(objp)), (void *) (objp))
extern int umoven_or_printaddr(struct tcb *, long, unsigned int, void *);
#define umove_or_printaddr(pid, addr, objp) \
umoven_or_printaddr((pid), (addr), sizeof(*(objp)), (void *) (objp))
extern int umovestr(struct tcb *, long, unsigned int, char *);
extern int upeek(int pid, long, long *);
#if defined(SPARC) || defined(SPARC64) || defined(IA64) || defined(SH)
extern bool
print_array(struct tcb *tcp,
const unsigned long start_addr,
const size_t nmemb,
void *const elem_buf,
const size_t elem_size,
int (*const umoven_func)(struct tcb *,
long,
unsigned int,
void *),
bool (*const print_func)(struct tcb *,
void *elem_buf,
size_t elem_size,
void *opaque_data),
void *const opaque_data);
#if defined ALPHA || defined IA64 || defined MIPS \
|| defined SH || defined SPARC || defined SPARC64
# define HAVE_GETRVAL2
extern long getrval2(struct tcb *);
#else
# undef HAVE_GETRVAL2
#endif
extern const char *signame(const int);
@ -433,71 +543,105 @@ extern void pathtrace_select(const char *);
extern int pathtrace_match(struct tcb *);
extern int getfdpath(struct tcb *, int, char *, unsigned);
extern const char *xlookup(const struct xlat *, const unsigned int);
extern const char *xlat_search(const struct xlat *, const size_t, const unsigned int);
extern const char *xlookup(const struct xlat *, const uint64_t);
extern const char *xlat_search(const struct xlat *, const size_t, const uint64_t);
extern unsigned long get_pagesize(void);
extern int string_to_uint(const char *str);
extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits);
#define QUOTE_0_TERMINATED 0x01
#define QUOTE_OMIT_LEADING_TRAILING_QUOTES 0x02
extern int string_quote(const char *, char *, unsigned int, unsigned int);
extern int print_quoted_string(const char *, unsigned int, unsigned int);
/* a refers to the lower numbered u_arg,
* b refers to the higher numbered u_arg
*/
#if HAVE_LITTLE_ENDIAN_LONG_LONG
# define LONG_LONG(a,b) \
((long long)((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32)))
#else
#ifdef WORDS_BIGENDIAN
# define LONG_LONG(a,b) \
((long long)((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32)))
#else
# define LONG_LONG(a,b) \
((long long)((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32)))
#endif
extern int getllval(struct tcb *, unsigned long long *, int);
extern int printllval(struct tcb *, const char *, int)
__attribute__ ((format (printf, 2, 0)));
ATTRIBUTE_FORMAT((printf, 2, 0));
extern void printxval(const struct xlat *, const unsigned int, const char *);
extern void printaddr(long);
extern void printxvals(const uint64_t, const char *, const struct xlat *, ...)
ATTRIBUTE_SENTINEL;
extern int printargs(struct tcb *);
extern int printargs_lu(struct tcb *);
extern int printargs_ld(struct tcb *);
extern void addflags(const struct xlat *, int);
extern int printflags(const struct xlat *, int, const char *);
extern const char *sprintflags(const char *, const struct xlat *, int);
extern const char *sprintmode(int);
extern int printargs_u(struct tcb *);
extern int printargs_d(struct tcb *);
extern void addflags(const struct xlat *, uint64_t);
extern int printflags64(const struct xlat *, uint64_t, const char *);
extern const char *sprintflags(const char *, const struct xlat *, uint64_t);
extern const char *sprintmode(unsigned int);
extern const char *sprinttime(time_t);
extern void dumpiov_in_msghdr(struct tcb *, long);
extern void dumpiov_in_msghdr(struct tcb *, long, unsigned long);
extern void dumpiov_in_mmsghdr(struct tcb *, long);
extern void dumpiov(struct tcb *, int, long);
extern void dumpiov_upto(struct tcb *, int, long, unsigned long);
#define dumpiov(tcp, len, addr) \
dumpiov_upto((tcp), (len), (addr), (unsigned long) -1L)
extern void dumpstr(struct tcb *, long, int);
extern void printstr(struct tcb *, long, long);
extern void printnum_int(struct tcb *, long, const char *)
__attribute__ ((format (printf, 3, 0)));
extern void printnum_long(struct tcb *, long, const char *)
__attribute__ ((format (printf, 3, 0)));
extern bool printnum_short(struct tcb *, long, const char *)
ATTRIBUTE_FORMAT((printf, 3, 0));
extern bool printnum_int(struct tcb *, long, const char *)
ATTRIBUTE_FORMAT((printf, 3, 0));
extern bool printnum_int64(struct tcb *, long, const char *)
ATTRIBUTE_FORMAT((printf, 3, 0));
#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
extern bool printnum_long_int(struct tcb *, long, const char *, const char *)
ATTRIBUTE_FORMAT((printf, 3, 0))
ATTRIBUTE_FORMAT((printf, 4, 0));
# define printnum_slong(tcp, addr) \
printnum_long_int((tcp), (addr), "%" PRId64, "%d")
# define printnum_ulong(tcp, addr) \
printnum_long_int((tcp), (addr), "%" PRIu64, "%u")
# define printnum_ptr(tcp, addr) \
printnum_long_int((tcp), (addr), "%#" PRIx64, "%#x")
#elif SIZEOF_LONG > 4
# define printnum_slong(tcp, addr) \
printnum_int64((tcp), (addr), "%" PRId64)
# define printnum_ulong(tcp, addr) \
printnum_int64((tcp), (addr), "%" PRIu64)
# define printnum_ptr(tcp, addr) \
printnum_int64((tcp), (addr), "%#" PRIx64)
#else
# define printnum_slong(tcp, addr) \
printnum_int((tcp), (addr), "%d")
# define printnum_ulong(tcp, addr) \
printnum_int((tcp), (addr), "%u")
# define printnum_ptr(tcp, addr) \
printnum_int((tcp), (addr), "%#x")
#endif
extern bool printpair_int(struct tcb *, long, const char *)
ATTRIBUTE_FORMAT((printf, 3, 0));
extern bool printpair_int64(struct tcb *, long, const char *)
ATTRIBUTE_FORMAT((printf, 3, 0));
extern void printpath(struct tcb *, long);
extern void printpathn(struct tcb *, long, unsigned int);
#define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}"))
#define TIMEVAL_TEXT_BUFSIZE TIMESPEC_TEXT_BUFSIZE
extern void printtv_bitness(struct tcb *, long, enum bitness_t, int);
#define printtv(tcp, addr) \
printtv_bitness((tcp), (addr), BITNESS_CURRENT, 0)
#define printtv_special(tcp, addr) \
printtv_bitness((tcp), (addr), BITNESS_CURRENT, 1)
extern char *sprinttv(char *, struct tcb *, long, enum bitness_t, int special);
extern void print_timespec(struct tcb *, long);
extern void sprint_timespec(char *, struct tcb *, long);
extern void printsiginfo(const siginfo_t *, int);
extern void printsiginfo_at(struct tcb *tcp, long addr);
#define TIMESPEC_TEXT_BUFSIZE \
(sizeof(intmax_t)*3 * 2 + sizeof("{tv_sec=%jd, tv_nsec=%jd}"))
extern void printfd(struct tcb *, int);
extern bool print_sockaddr_by_inode(const unsigned long, const char *);
extern bool print_sockaddr_by_inode_cached(const unsigned long);
extern void print_dirfd(struct tcb *, int);
extern void printsock(struct tcb *, long, int);
extern void print_sock_optmgmt(struct tcb *, long, int);
extern void printrusage(struct tcb *, long);
#ifdef ALPHA
extern void printrusage32(struct tcb *, long);
extern const char *sprint_timeval32(struct tcb *tcp, long);
extern void print_timeval32(struct tcb *tcp, long);
extern void print_timeval32_pair(struct tcb *tcp, long);
extern void print_itimerval32(struct tcb *tcp, long);
#endif
extern void printuid(const char *, const unsigned int);
extern void print_sigset_addr_len(struct tcb *, long, long);
@ -507,27 +651,24 @@ extern const char *sprintsigmask_n(const char *, const void *, unsigned int);
extern void printsignal(int);
extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov);
extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long, int decode_iov, unsigned long);
extern void tprint_open_modes(int);
extern const char *sprint_open_modes(int);
extern void print_loff_t(struct tcb *, long);
extern void print_seccomp_filter(struct tcb *tcp, unsigned long);
extern void tprint_open_modes(unsigned int);
extern const char *sprint_open_modes(unsigned int);
extern void print_seccomp_filter(struct tcb *, unsigned long);
extern void print_seccomp_fprog(struct tcb *, unsigned long, unsigned short);
extern const struct_ioctlent *ioctl_lookup(const unsigned int);
extern const struct_ioctlent *ioctl_next_match(const struct_ioctlent *);
extern void ioctl_print_code(const unsigned int);
extern int ioctl_decode(struct tcb *, const unsigned int, long);
extern int ioctl_decode_command_number(const unsigned int);
extern int block_ioctl(struct tcb *, const unsigned int, long);
extern int evdev_ioctl(struct tcb *, const unsigned int, long);
struct strace_statfs;
extern void print_struct_statfs(struct tcb *tcp, long);
extern void print_struct_statfs64(struct tcb *tcp, long, unsigned long);
extern int file_ioctl(struct tcb *, const unsigned int, long);
extern int fs_x_ioctl(struct tcb *, const unsigned int, long);
extern int loop_ioctl(struct tcb *, const unsigned int, long);
extern int mtd_ioctl(struct tcb *, const unsigned int, long);
extern int ptp_ioctl(struct tcb *, const unsigned int, long);
extern int rtc_ioctl(struct tcb *, const unsigned int, long);
extern int scsi_ioctl(struct tcb *, const unsigned int, long);
extern int sock_ioctl(struct tcb *, const unsigned int, long);
extern int term_ioctl(struct tcb *, const unsigned int, long);
extern int ubi_ioctl(struct tcb *, const unsigned int, long);
extern int v4l2_ioctl(struct tcb *, const unsigned int, long);
extern int uffdio_ioctl(struct tcb *, const unsigned int, long);
extern int tv_nz(const struct timeval *);
extern int tv_cmp(const struct timeval *, const struct timeval *);
@ -546,6 +687,36 @@ extern void unwind_print_stacktrace(struct tcb* tcp);
extern void unwind_capture_stacktrace(struct tcb* tcp);
#endif
static inline int
printflags(const struct xlat *x, unsigned int flags, const char *dflt)
{
return printflags64(x, flags, dflt);
}
static inline int
printflags_long(const struct xlat *x, unsigned long flags, const char *dflt)
{
return printflags64(x, flags, dflt);
}
static inline void
printxval64(const struct xlat *x, const uint64_t val, const char *dflt)
{
printxvals(val, dflt, x, NULL);
}
static inline void
printxval(const struct xlat *x, const unsigned int val, const char *dflt)
{
printxvals(val, dflt, x, NULL);
}
static inline void
printxval_long(const struct xlat *x, const unsigned long val, const char *dflt)
{
printxvals(val, dflt, x, NULL);
}
/* Strace log generation machinery.
*
* printing_tcp: tcb which has incomplete line being printed right now.
@ -567,7 +738,7 @@ extern struct tcb *printing_tcp;
extern void printleader(struct tcb *);
extern void line_ended(void);
extern void tabto(void);
extern void tprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
extern void tprintf(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
extern void tprints(const char *str);
#if SUPPORTED_PERSONALITIES > 1
@ -598,12 +769,21 @@ extern unsigned current_wordsize;
# define widen_to_long(v) ((long)(v))
#endif
/*
* Widen without sign-extension a signed integer type to unsigned long long.
*/
#define widen_to_ull(v) \
(sizeof(v) == sizeof(int) ? (unsigned long long) (unsigned int) (v) : \
sizeof(v) == sizeof(long) ? (unsigned long long) (unsigned long) (v) : \
(unsigned long long) (v))
extern const struct_sysent sysent0[];
extern const char *const errnoent0[];
extern const char *const signalent0[];
extern const struct_ioctlent ioctlent0[];
extern qualbits_t *qual_vec[SUPPORTED_PERSONALITIES];
#define qual_flags (qual_vec[current_personality])
#if SUPPORTED_PERSONALITIES > 1
extern const struct_sysent *sysent;
extern const char *const *errnoent;
@ -615,12 +795,25 @@ extern const struct_ioctlent *ioctlent;
# define signalent signalent0
# define ioctlent ioctlent0
#endif
extern unsigned nsyscalls;
extern unsigned nerrnos;
extern unsigned nsignals;
extern unsigned nioctlents;
extern unsigned num_quals;
#ifdef IN_MPERS_BOOTSTRAP
/* Transform multi-line MPERS_PRINTER_DECL statements to one-liners. */
# define MPERS_PRINTER_DECL(type, name, ...) MPERS_PRINTER_DECL(type, name, __VA_ARGS__)
#else /* !IN_MPERS_BOOTSTRAP */
# if SUPPORTED_PERSONALITIES > 1
# include "printers.h"
# else
# include "native_printer_decls.h"
# endif
# define MPERS_PRINTER_DECL(type, name, ...) type MPERS_FUNC_NAME(name)(__VA_ARGS__)
#endif /* !IN_MPERS_BOOTSTRAP */
/*
* If you need non-NULL sysent[scno].sys_func and sysent[scno].sys_name
*/
@ -630,3 +823,31 @@ extern unsigned num_quals;
/* Only ensures that sysent[scno] isn't out of range */
#define SCNO_IN_RANGE(scno) \
((unsigned long)(scno) < nsyscalls)
#define MPERS_FUNC_NAME__(prefix, name) prefix ## name
#define MPERS_FUNC_NAME_(prefix, name) MPERS_FUNC_NAME__(prefix, name)
#define MPERS_FUNC_NAME(name) MPERS_FUNC_NAME_(MPERS_PREFIX, name)
#define SYS_FUNC_NAME(syscall_name) MPERS_FUNC_NAME(syscall_name)
#define SYS_FUNC(syscall_name) int SYS_FUNC_NAME(sys_ ## syscall_name)(struct tcb *tcp)
/*
* The kernel used to define 64-bit types on 64-bit systems on a per-arch
* basis. Some architectures would use unsigned long and others would use
* unsigned long long. These types were exported as part of the
* kernel-userspace ABI and now must be maintained forever. This matches
* what the kernel exports for each architecture so we don't need to cast
* every printing of __u64 or __s64 to stdint types.
*/
#if SIZEOF_LONG == 4
# define PRI__64 "ll"
#elif defined ALPHA || defined IA64 || defined MIPS || defined POWERPC
# define PRI__64 "l"
#else
# define PRI__64 "ll"
#endif
#define PRI__d64 PRI__64"d"
#define PRI__u64 PRI__64"u"
#define PRI__x64 PRI__64"x"

565
desc.c
View File

@ -29,288 +29,49 @@
*/
#include "defs.h"
#include <fcntl.h>
#include <sys/file.h>
#ifdef HAVE_SYS_EPOLL_H
# include <sys/epoll.h>
#endif
#ifdef HAVE_LINUX_PERF_EVENT_H
# include <linux/perf_event.h>
#endif
#include "xlat/fcntlcmds.h"
#include "xlat/fdflags.h"
#include "xlat/flockcmds.h"
#include "xlat/lockfcmds.h"
#include "xlat/notifyflags.h"
#include "xlat/perf_event_open_flags.h"
/*
* Assume that F_SETLK64, F_SETLKW64, and F_GETLK64 are either defined
* or not defined altogether.
*/
#if defined(F_SETLK64) && F_SETLK64 + 0 != F_SETLK
# define USE_PRINTFLOCK64 1
#else
# define USE_PRINTFLOCK64 0
#endif
#if USE_PRINTFLOCK64
# ifndef HAVE_STRUCT_FLOCK64
struct flock64 {
short int l_type, l_whence;
int64_t l_start, l_len;
int l_pid;
};
# endif
static void
printflock64(struct tcb *tcp, long addr, int getlk)
SYS_FUNC(close)
{
struct flock64 fl;
printfd(tcp, tcp->u_arg[0]);
if (umove(tcp, addr, &fl) < 0) {
tprints("{...}");
return;
}
tprints("{type=");
printxval(lockfcmds, fl.l_type, "F_???");
tprints(", whence=");
printxval(whence_codes, fl.l_whence, "SEEK_???");
tprintf(", start=%lld, len=%lld", (long long) fl.l_start, (long long) fl.l_len);
if (getlk)
tprintf(", pid=%lu}", (unsigned long) fl.l_pid);
else
tprints("}");
}
#endif /* USE_PRINTFLOCK64 */
static void
printflock(struct tcb *tcp, long addr, int getlk)
{
struct flock fl;
int r;
#if SUPPORTED_PERSONALITIES > 1
if (
# if SIZEOF_OFF_T > SIZEOF_LONG
current_personality > 0 &&
#endif
current_wordsize != sizeof(fl.l_start)) {
if (current_wordsize == 4) {
/* 32-bit x86 app on x86_64 and similar cases */
struct {
short int l_type;
short int l_whence;
int32_t l_start; /* off_t */
int32_t l_len; /* off_t */
int32_t l_pid; /* pid_t */
} fl32;
r = umove(tcp, addr, &fl32);
if (r >= 0) {
fl.l_type = fl32.l_type;
fl.l_whence = fl32.l_whence;
fl.l_start = fl32.l_start;
fl.l_len = fl32.l_len;
fl.l_pid = fl32.l_pid;
}
} else {
/* let people know we have a problem here */
tprintf("<decode error: unsupported wordsize %d>",
current_wordsize);
return;
}
} else
#endif
{
r = umove(tcp, addr, &fl);
}
if (r < 0) {
tprints("{...}");
return;
}
tprints("{type=");
printxval(lockfcmds, fl.l_type, "F_???");
tprints(", whence=");
printxval(whence_codes, fl.l_whence, "SEEK_???");
#if SIZEOF_OFF_T > SIZEOF_LONG
tprintf(", start=%lld, len=%lld", fl.l_start, fl.l_len);
#else
tprintf(", start=%ld, len=%ld", fl.l_start, fl.l_len);
#endif
if (getlk)
tprintf(", pid=%lu}", (unsigned long) fl.l_pid);
else
tprints("}");
return RVAL_DECODED;
}
int
sys_fcntl(struct tcb *tcp)
SYS_FUNC(dup)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printxval(fcntlcmds, tcp->u_arg[1], "F_???");
switch (tcp->u_arg[1]) {
case F_SETFD:
tprints(", ");
printflags(fdflags, tcp->u_arg[2], "FD_???");
break;
case F_SETOWN: case F_DUPFD:
#ifdef F_DUPFD_CLOEXEC
case F_DUPFD_CLOEXEC:
#endif
tprintf(", %ld", tcp->u_arg[2]);
break;
case F_SETFL:
tprints(", ");
tprint_open_modes(tcp->u_arg[2]);
break;
case F_SETLK: case F_SETLKW:
tprints(", ");
printflock(tcp, tcp->u_arg[2], 0);
break;
#if USE_PRINTFLOCK64
case F_SETLK64: case F_SETLKW64:
tprints(", ");
printflock64(tcp, tcp->u_arg[2], 0);
break;
#endif /* USE_PRINTFLOCK64 */
#ifdef F_NOTIFY
case F_NOTIFY:
tprints(", ");
printflags(notifyflags, tcp->u_arg[2], "DN_???");
break;
#endif
#ifdef F_SETLEASE
case F_SETLEASE:
tprints(", ");
printxval(lockfcmds, tcp->u_arg[2], "F_???");
break;
#endif
}
}
else {
switch (tcp->u_arg[1]) {
case F_DUPFD:
#ifdef F_DUPFD_CLOEXEC
case F_DUPFD_CLOEXEC:
#endif
case F_SETFD: case F_SETFL:
case F_SETLK: case F_SETLKW:
case F_SETOWN: case F_GETOWN:
#ifdef F_NOTIFY
case F_NOTIFY:
#endif
#ifdef F_SETLEASE
case F_SETLEASE:
#endif
break;
case F_GETFD:
if (syserror(tcp) || tcp->u_rval == 0)
return 0;
tcp->auxstr = sprintflags("flags ", fdflags, tcp->u_rval);
return RVAL_HEX|RVAL_STR;
case F_GETFL:
if (syserror(tcp))
return 0;
tcp->auxstr = sprint_open_modes(tcp->u_rval);
return RVAL_HEX|RVAL_STR;
case F_GETLK:
tprints(", ");
printflock(tcp, tcp->u_arg[2], 1);
break;
#if USE_PRINTFLOCK64
case F_GETLK64:
tprints(", ");
printflock64(tcp, tcp->u_arg[2], 1);
break;
#endif
#ifdef F_GETLEASE
case F_GETLEASE:
if (syserror(tcp))
return 0;
tcp->auxstr = xlookup(lockfcmds, tcp->u_rval);
return RVAL_HEX|RVAL_STR;
#endif
default:
tprintf(", %#lx", tcp->u_arg[2]);
break;
}
}
return 0;
}
printfd(tcp, tcp->u_arg[0]);
#ifdef LOCK_SH
int
sys_flock(struct tcb *tcp)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printflags(flockcmds, tcp->u_arg[1], "LOCK_???");
}
return 0;
}
#endif /* LOCK_SH */
int
sys_close(struct tcb *tcp)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
}
return 0;
}
int
sys_dup(struct tcb *tcp)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
}
return RVAL_FD;
return RVAL_DECODED | RVAL_FD;
}
static int
do_dup2(struct tcb *tcp, int flags_arg)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printfd(tcp, tcp->u_arg[1]);
if (flags_arg >= 0) {
tprints(", ");
printfd(tcp, tcp->u_arg[1]);
if (flags_arg >= 0) {
tprints(", ");
printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
}
printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
}
return RVAL_FD;
return RVAL_DECODED | RVAL_FD;
}
int
sys_dup2(struct tcb *tcp)
SYS_FUNC(dup2)
{
return do_dup2(tcp, -1);
}
int
sys_dup3(struct tcb *tcp)
SYS_FUNC(dup3)
{
return do_dup2(tcp, 2);
}
#if defined(ALPHA)
int
sys_getdtablesize(struct tcb *tcp)
{
return 0;
}
#endif
static int
decode_select(struct tcb *tcp, long *args, enum bitness_t bitness)
decode_select(struct tcb *tcp, long *args,
void (*print_tv_ts) (struct tcb *, const long),
const char * (*sprint_tv_ts) (struct tcb *, const long))
{
int i, j;
int nfds, fdsize;
@ -338,26 +99,18 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness)
if (entering(tcp)) {
tprintf("%d", (int) args[0]);
if (verbose(tcp) && fdsize > 0) {
if (verbose(tcp) && fdsize > 0)
fds = malloc(fdsize);
if (!fds)
die_out_of_memory();
}
for (i = 0; i < 3; i++) {
arg = args[i+1];
if (arg == 0) {
tprints(", NULL");
continue;
}
tprints(", ");
if (!fds) {
tprintf(", %#lx", arg);
printaddr(arg);
continue;
}
if (umoven(tcp, arg, fdsize, (char *) fds) < 0) {
tprints(", [?]");
if (umoven_or_printaddr(tcp, arg, fdsize, fds))
continue;
}
tprints(", [");
tprints("[");
for (j = 0, sep = "";; j++) {
j = next_set_bit(fds, j, nfds);
if (j < 0)
@ -370,9 +123,8 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness)
}
free(fds);
tprints(", ");
printtv_bitness(tcp, args[4], bitness, 0);
}
else {
print_tv_ts(tcp, args[4]);
} else {
static char outstr[1024];
char *outptr;
#define end_outstr (outstr + sizeof(outstr))
@ -388,8 +140,6 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness)
}
fds = malloc(fdsize);
if (!fds)
die_out_of_memory();
outptr = outstr;
sep = "";
@ -397,7 +147,7 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness)
int first = 1;
arg = args[i+1];
if (!arg || umoven(tcp, arg, fdsize, (char *) fds) < 0)
if (!arg || !fds || umoven(tcp, arg, fdsize, fds) < 0)
continue;
for (j = 0;; j++) {
j = next_set_bit(fds, j, nfds);
@ -427,9 +177,9 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness)
free(fds);
/* This contains no useful information on SunOS. */
if (args[4]) {
if (outptr < end_outstr - (10 + TIMEVAL_TEXT_BUFSIZE)) {
outptr += sprintf(outptr, "%sleft ", sep);
outptr = sprinttv(outptr, tcp, args[4], bitness, /*special:*/ 0);
const char *str = sprint_tv_ts(tcp, args[4]);
if (outptr + sizeof("left ") + strlen(sep) + strlen(str) < end_outstr) {
outptr += sprintf(outptr, "%sleft %s", sep, str);
}
}
*outptr = '\0';
@ -440,225 +190,82 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness)
return 0;
}
int
sys_oldselect(struct tcb *tcp)
SYS_FUNC(oldselect)
{
long args[5];
long long_args[5];
#undef oldselect_args
#if SIZEOF_LONG == 4
# define oldselect_args long_args
#else
unsigned int oldselect_args[5];
unsigned int i;
#endif
if (umoven(tcp, tcp->u_arg[0], sizeof args, (char *) args) < 0) {
tprints("[...]");
if (umove(tcp, tcp->u_arg[0], &oldselect_args) < 0) {
printaddr(tcp->u_arg[0]);
return 0;
}
return decode_select(tcp, args, BITNESS_CURRENT);
#ifndef oldselect_args
for (i = 0; i < 5; i++) {
long_args[i] = oldselect_args[i];
}
#endif
return decode_select(tcp, long_args, print_timeval, sprint_timeval);
#undef oldselect_args
}
#ifdef ALPHA
int
sys_osf_select(struct tcb *tcp)
SYS_FUNC(osf_select)
{
long *args = tcp->u_arg;
return decode_select(tcp, args, BITNESS_32);
return decode_select(tcp, tcp->u_arg, print_timeval32, sprint_timeval32);
}
#endif
#include "xlat/epollctls.h"
#include "xlat/epollevents.h"
#include "xlat/epollflags.h"
/* Not aliased to printargs_ld: we want it to have a distinct address */
int
sys_epoll_create(struct tcb *tcp)
SYS_FUNC(select)
{
return printargs_ld(tcp);
return decode_select(tcp, tcp->u_arg, print_timeval, sprint_timeval);
}
int
sys_epoll_create1(struct tcb *tcp)
{
if (entering(tcp))
printflags(epollflags, tcp->u_arg[0], "EPOLL_???");
return 0;
}
#ifdef HAVE_SYS_EPOLL_H
static void
print_epoll_event(struct epoll_event *ev)
{
tprints("{");
printflags(epollevents, ev->events, "EPOLL???");
/* We cannot know what format the program uses, so print u32 and u64
which will cover every value. */
tprintf(", {u32=%" PRIu32 ", u64=%" PRIu64 "}}",
ev->data.u32, ev->data.u64);
}
#endif
int
sys_epoll_ctl(struct tcb *tcp)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printxval(epollctls, tcp->u_arg[1], "EPOLL_CTL_???");
tprints(", ");
printfd(tcp, tcp->u_arg[2]);
tprints(", ");
if (tcp->u_arg[3] == 0)
tprints("NULL");
else {
#ifdef HAVE_SYS_EPOLL_H
struct epoll_event ev;
if (
#ifdef EPOLL_CTL_DEL
(tcp->u_arg[1] != EPOLL_CTL_DEL) &&
#endif
umove(tcp, tcp->u_arg[3], &ev) == 0)
print_epoll_event(&ev);
else
#endif
tprintf("%lx", tcp->u_arg[3]);
}
}
return 0;
}
static void
epoll_wait_common(struct tcb *tcp)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
} else {
if (syserror(tcp))
tprintf("%lx", tcp->u_arg[1]);
else if (tcp->u_rval == 0)
tprints("{}");
else {
#ifdef HAVE_SYS_EPOLL_H
struct epoll_event ev, *start, *cur, *end;
int failed = 0;
tprints("{");
start = (struct epoll_event *) tcp->u_arg[1];
end = start + tcp->u_rval;
for (cur = start; cur < end; ++cur) {
if (cur > start)
tprints(", ");
if (umove(tcp, (long) cur, &ev) == 0)
print_epoll_event(&ev);
else {
tprints("?");
failed = 1;
break;
}
}
tprints("}");
if (failed)
tprintf(" %#lx", (long) start);
#else
tprints("{...}");
#endif
}
tprintf(", %d, %d", (int) tcp->u_arg[2], (int) tcp->u_arg[3]);
}
}
int
sys_epoll_wait(struct tcb *tcp)
{
epoll_wait_common(tcp);
return 0;
}
int
sys_epoll_pwait(struct tcb *tcp)
{
epoll_wait_common(tcp);
if (exiting(tcp)) {
tprints(", ");
/* NB: kernel requires arg[5] == NSIG / 8 */
print_sigset_addr_len(tcp, tcp->u_arg[4], tcp->u_arg[5]);
tprintf(", %lu", tcp->u_arg[5]);
}
return 0;
}
int
sys_select(struct tcb *tcp)
{
return decode_select(tcp, tcp->u_arg, BITNESS_CURRENT);
}
int
sys_pselect6(struct tcb *tcp)
{
int rc = decode_select(tcp, tcp->u_arg, BITNESS_CURRENT);
if (entering(tcp)) {
long r;
struct {
unsigned long ptr;
unsigned long len;
} data;
#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
if (current_wordsize == 4) {
struct {
uint32_t ptr;
uint32_t len;
} data32;
r = umove(tcp, tcp->u_arg[5], &data32);
data.ptr = data32.ptr;
data.len = data32.len;
} else
#endif
r = umove(tcp, tcp->u_arg[5], &data);
if (r < 0)
tprintf(", %#lx", tcp->u_arg[5]);
else {
tprints(", {");
/* NB: kernel requires data.len == NSIG / 8 */
print_sigset_addr_len(tcp, data.ptr, data.len);
tprintf(", %lu}", data.len);
}
}
return rc;
}
#include "kernel_types.h"
static int
do_eventfd(struct tcb *tcp, int flags_arg)
umove_kulong_array_or_printaddr(struct tcb *tcp, const long addr,
kernel_ulong_t *ptr, size_t n)
{
#if defined X86_64 || defined X32
if (current_personality == 1) {
#else
if (current_wordsize < sizeof(*ptr)) {
#endif
uint32_t ptr32[n];
int r = umove_or_printaddr(tcp, addr, &ptr32);
if (!r) {
size_t i;
for (i = 0; i < n; ++i)
ptr[i] = (kernel_ulong_t) ptr32[i];
}
return r;
}
return umoven_or_printaddr(tcp, addr, n * sizeof(*ptr), ptr);
}
SYS_FUNC(pselect6)
{
int rc = decode_select(tcp, tcp->u_arg, print_timespec, sprint_timespec);
if (entering(tcp)) {
tprintf("%lu", tcp->u_arg[0]);
if (flags_arg >= 0) {
tprints(", ");
printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
kernel_ulong_t data[2];
tprints(", ");
if (!umove_kulong_array_or_printaddr(tcp, tcp->u_arg[5],
data, ARRAY_SIZE(data))) {
tprints("{");
/* NB: kernel requires data[1] == NSIG / 8 */
print_sigset_addr_len(tcp, (unsigned long) data[0],
(unsigned long) data[1]);
tprintf(", %llu}", (unsigned long long) data[1]);
}
}
return 0;
}
int
sys_eventfd(struct tcb *tcp)
{
return do_eventfd(tcp, -1);
}
int
sys_eventfd2(struct tcb *tcp)
{
return do_eventfd(tcp, 1);
}
int
sys_perf_event_open(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%#lx, %d, %d, %d, ",
tcp->u_arg[0],
(int) tcp->u_arg[1],
(int) tcp->u_arg[2],
(int) tcp->u_arg[3]);
printflags(perf_event_open_flags, tcp->u_arg[4],
"PERF_FLAG_???");
}
return 0;
return rc;
}

210
dirent.c
View File

@ -1,52 +1,69 @@
/*
* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2005-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <dirent.h>
#include DEF_MPERS_TYPE(kernel_dirent)
#include "kernel_types.h"
#include MPERS_DEFS
#define D_NAME_LEN_MAX 256
struct kernel_dirent {
unsigned long d_ino;
unsigned long d_off;
unsigned short d_reclen;
char d_name[1];
};
static void
print_old_dirent(struct tcb *tcp, long addr)
{
#ifdef SH64
typedef struct kernel_dirent old_dirent_t;
#else
typedef struct {
uint32_t d_ino;
uint32_t d_off;
unsigned short d_reclen;
char d_name[1];
} old_dirent_t;
#endif
old_dirent_t d;
kernel_dirent d;
if (!verbose(tcp) || umove(tcp, addr, &d) < 0) {
tprintf("%#lx", addr);
if (umove_or_printaddr(tcp, addr, &d))
return;
}
tprintf("{d_ino=%lu, d_off=%lu, d_reclen=%u, d_name=",
(unsigned long) d.d_ino, (unsigned long) d.d_off, d.d_reclen);
tprintf("{d_ino=%llu, d_off=%llu, d_reclen=%u, d_name=",
widen_to_ull(d.d_ino),
widen_to_ull(d.d_off), d.d_reclen);
if (d.d_reclen > D_NAME_LEN_MAX)
d.d_reclen = D_NAME_LEN_MAX;
printpathn(tcp, addr + offsetof(old_dirent_t, d_name), d.d_reclen);
printpathn(tcp, addr + offsetof(kernel_dirent, d_name), d.d_reclen);
tprints("}");
}
int
sys_readdir(struct tcb *tcp)
SYS_FUNC(readdir)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
} else {
if (syserror(tcp) || tcp->u_rval == 0 || !verbose(tcp))
tprintf("%#lx", tcp->u_arg[1]);
if (tcp->u_rval == 0)
printaddr(tcp->u_arg[1]);
else
print_old_dirent(tcp, tcp->u_arg[1]);
/* Not much point in printing this out, it is always 1. */
@ -56,38 +73,38 @@ sys_readdir(struct tcb *tcp)
return 0;
}
#include "xlat/direnttypes.h"
int
sys_getdents(struct tcb *tcp)
SYS_FUNC(getdents)
{
unsigned int i, len, dents = 0;
char *buf;
unsigned char *buf;
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
return 0;
}
const unsigned int count = tcp->u_arg[2];
if (syserror(tcp) || !verbose(tcp)) {
tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
printaddr(tcp->u_arg[1]);
tprintf(", %u", count);
return 0;
}
/* Beware of insanely large or too small values in tcp->u_rval */
if (tcp->u_rval > 1024*1024)
len = 1024*1024;
else if (tcp->u_rval < (int) sizeof(struct kernel_dirent))
else if (tcp->u_rval < (int) sizeof(kernel_dirent))
len = 0;
else
len = tcp->u_rval;
if (len) {
buf = malloc(len);
if (!buf)
die_out_of_memory();
if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
if (!buf || umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
printaddr(tcp->u_arg[1]);
tprintf(", %u", count);
free(buf);
return 0;
}
@ -96,20 +113,22 @@ sys_getdents(struct tcb *tcp)
}
if (!abbrev(tcp))
tprints("{");
for (i = 0; len && i <= len - sizeof(struct kernel_dirent); ) {
struct kernel_dirent *d = (struct kernel_dirent *) &buf[i];
tprints("[");
for (i = 0; len && i <= len - sizeof(kernel_dirent); ) {
kernel_dirent *d = (kernel_dirent *) &buf[i];
if (!abbrev(tcp)) {
int oob = d->d_reclen < sizeof(struct kernel_dirent) ||
int oob = d->d_reclen < sizeof(kernel_dirent) ||
i + d->d_reclen - 1 >= len;
int d_name_len = oob ? len - i : d->d_reclen;
d_name_len -= offsetof(struct kernel_dirent, d_name) + 1;
d_name_len -= offsetof(kernel_dirent, d_name) + 1;
if (d_name_len > D_NAME_LEN_MAX)
d_name_len = D_NAME_LEN_MAX;
tprintf("%s{d_ino=%lu, d_off=%lu, d_reclen=%u, d_name=",
i ? " " : "", d->d_ino, d->d_off, d->d_reclen);
tprintf("%s{d_ino=%llu, d_off=%llu, d_reclen=%u"
", d_name=", i ? ", " : "",
widen_to_ull(d->d_ino),
widen_to_ull(d->d_off), d->d_reclen);
if (print_quoted_string(d->d_name, d_name_len,
QUOTE_0_TERMINATED) > 0) {
@ -120,108 +139,21 @@ sys_getdents(struct tcb *tcp)
if (oob)
tprints("?");
else
printxval(direnttypes, buf[i + d->d_reclen - 1], "DT_???");
printxval(dirent_types, buf[i + d->d_reclen - 1], "DT_???");
tprints("}");
}
dents++;
if (d->d_reclen < sizeof(struct kernel_dirent)) {
tprints("/* d_reclen < sizeof(struct kernel_dirent) */");
if (d->d_reclen < sizeof(kernel_dirent)) {
tprints("/* d_reclen < sizeof(struct dirent) */");
break;
}
i += d->d_reclen;
}
if (!abbrev(tcp))
tprints("}");
tprints("]");
else
tprintf("/* %u entries */", dents);
tprintf(", %lu", tcp->u_arg[2]);
free(buf);
return 0;
}
int
sys_getdents64(struct tcb *tcp)
{
/* the minimum size of a valid dirent64 structure */
const unsigned int d_name_offset = offsetof(struct dirent64, d_name);
unsigned int i, len, dents = 0;
char *buf;
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
return 0;
}
if (syserror(tcp) || !verbose(tcp)) {
tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
return 0;
}
/* Beware of insanely large or too small tcp->u_rval */
if (tcp->u_rval > 1024*1024)
len = 1024*1024;
else if (tcp->u_rval < (int) d_name_offset)
len = 0;
else
len = tcp->u_rval;
if (len) {
buf = malloc(len);
if (!buf)
die_out_of_memory();
if (umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
free(buf);
return 0;
}
} else {
buf = NULL;
}
if (!abbrev(tcp))
tprints("{");
for (i = 0; len && i <= len - d_name_offset; ) {
struct dirent64 *d = (struct dirent64 *) &buf[i];
if (!abbrev(tcp)) {
int d_name_len;
if (d->d_reclen >= d_name_offset
&& i + d->d_reclen <= len) {
d_name_len = d->d_reclen - d_name_offset;
} else {
d_name_len = len - i - d_name_offset;
}
if (d_name_len > D_NAME_LEN_MAX)
d_name_len = D_NAME_LEN_MAX;
tprintf("%s{d_ino=%" PRIu64 ", d_off=%" PRId64
", d_reclen=%u, d_type=",
i ? " " : "",
d->d_ino,
d->d_off,
d->d_reclen);
printxval(direnttypes, d->d_type, "DT_???");
tprints(", d_name=");
if (print_quoted_string(d->d_name, d_name_len,
QUOTE_0_TERMINATED) > 0) {
tprints("...");
}
tprints("}");
}
if (d->d_reclen < d_name_offset) {
tprints("/* d_reclen < offsetof(struct dirent64, d_name) */");
break;
}
i += d->d_reclen;
dents++;
}
if (!abbrev(tcp))
tprints("}");
else
tprintf("/* %u entries */", dents);
tprintf(", %lu", tcp->u_arg[2]);
tprintf(", %u", count);
free(buf);
return 0;
}

126
dirent64.c Normal file
View File

@ -0,0 +1,126 @@
/*
* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2005-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <dirent.h>
#include "xlat/dirent_types.h"
#define D_NAME_LEN_MAX 256
SYS_FUNC(getdents64)
{
/* the minimum size of a valid dirent64 structure */
const unsigned int d_name_offset = offsetof(struct dirent64, d_name);
unsigned int i, len, dents = 0;
char *buf;
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
return 0;
}
const unsigned int count = tcp->u_arg[2];
if (syserror(tcp) || !verbose(tcp)) {
printaddr(tcp->u_arg[1]);
tprintf(", %u", count);
return 0;
}
/* Beware of insanely large or too small values in tcp->u_rval */
if (tcp->u_rval > 1024*1024)
len = 1024*1024;
else if (tcp->u_rval < (int) d_name_offset)
len = 0;
else
len = tcp->u_rval;
if (len) {
buf = malloc(len);
if (!buf || umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
printaddr(tcp->u_arg[1]);
tprintf(", %u", count);
free(buf);
return 0;
}
} else {
buf = NULL;
}
if (!abbrev(tcp))
tprints("[");
for (i = 0; len && i <= len - d_name_offset; ) {
struct dirent64 *d = (struct dirent64 *) &buf[i];
if (!abbrev(tcp)) {
int d_name_len;
if (d->d_reclen >= d_name_offset
&& i + d->d_reclen <= len) {
d_name_len = d->d_reclen - d_name_offset;
} else {
d_name_len = len - i - d_name_offset;
}
if (d_name_len > D_NAME_LEN_MAX)
d_name_len = D_NAME_LEN_MAX;
tprintf("%s{d_ino=%" PRIu64 ", d_off=%" PRId64
", d_reclen=%u, d_type=",
i ? ", " : "",
d->d_ino,
d->d_off,
d->d_reclen);
printxval(dirent_types, d->d_type, "DT_???");
tprints(", d_name=");
if (print_quoted_string(d->d_name, d_name_len,
QUOTE_0_TERMINATED) > 0) {
tprints("...");
}
tprints("}");
}
if (d->d_reclen < d_name_offset) {
tprints("/* d_reclen < offsetof(struct dirent64, d_name) */");
break;
}
i += d->d_reclen;
dents++;
}
if (!abbrev(tcp))
tprints("]");
else
tprintf("/* %u entries */", dents);
tprintf(", %u", count);
free(buf);
return 0;
}

0
empty.h Normal file
View File

117
epoll.c Normal file
View File

@ -0,0 +1,117 @@
/*
* Copyright (c) 2004-2007 Ulrich Drepper <drepper@redhat.com>
* Copyright (c) 2004 Roland McGrath <roland@redhat.com>
* Copyright (c) 2005-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <fcntl.h>
#include <sys/epoll.h>
SYS_FUNC(epoll_create)
{
tprintf("%d", (int) tcp->u_arg[0]);
return RVAL_DECODED | RVAL_FD;
}
#include "xlat/epollflags.h"
SYS_FUNC(epoll_create1)
{
printflags(epollflags, tcp->u_arg[0], "EPOLL_???");
return RVAL_DECODED | RVAL_FD;
}
#include "xlat/epollevents.h"
static bool
print_epoll_event(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
{
const struct epoll_event *ev = elem_buf;
tprints("{");
printflags(epollevents, ev->events, "EPOLL???");
/* We cannot know what format the program uses, so print u32 and u64
which will cover every value. */
tprintf(", {u32=%" PRIu32 ", u64=%" PRIu64 "}}",
ev->data.u32, ev->data.u64);
return true;
}
#include "xlat/epollctls.h"
SYS_FUNC(epoll_ctl)
{
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
const unsigned int op = tcp->u_arg[1];
printxval(epollctls, op, "EPOLL_CTL_???");
tprints(", ");
printfd(tcp, tcp->u_arg[2]);
tprints(", ");
struct epoll_event ev;
if (EPOLL_CTL_DEL == op)
printaddr(tcp->u_arg[3]);
else if (!umove_or_printaddr(tcp, tcp->u_arg[3], &ev))
print_epoll_event(tcp, &ev, sizeof(ev), 0);
return RVAL_DECODED;
}
static void
epoll_wait_common(struct tcb *tcp)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
} else {
struct epoll_event ev;
print_array(tcp, tcp->u_arg[1], tcp->u_rval, &ev, sizeof(ev),
umoven_or_printaddr, print_epoll_event, 0);
tprintf(", %d, %d", (int) tcp->u_arg[2], (int) tcp->u_arg[3]);
}
}
SYS_FUNC(epoll_wait)
{
epoll_wait_common(tcp);
return 0;
}
SYS_FUNC(epoll_pwait)
{
epoll_wait_common(tcp);
if (exiting(tcp)) {
tprints(", ");
/* NB: kernel requires arg[5] == NSIG / 8 */
print_sigset_addr_len(tcp, tcp->u_arg[4], tcp->u_arg[5]);
tprintf(", %lu", tcp->u_arg[5]);
}
return 0;
}

545
evdev.c
View File

@ -1,6 +1,6 @@
/*
* Copyright (c) 2015 Etienne Gemsa <etienne.gemsa@lse.epita.fr>
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -29,30 +29,46 @@
#include "defs.h"
#ifdef HAVE_LINUX_INPUT_H
#include <linux/input.h>
#include "xlat/evdev_abs.h"
#include "xlat/evdev_autorepeat.h"
#include "xlat/evdev_ff_status.h"
#include "xlat/evdev_ff_types.h"
#include "xlat/evdev_keycode.h"
#include "xlat/evdev_leds.h"
#include "xlat/evdev_misc.h"
#include "xlat/evdev_mtslots.h"
#include "xlat/evdev_prop.h"
#include "xlat/evdev_relative_axes.h"
#include "xlat/evdev_snd.h"
#include "xlat/evdev_switch.h"
#include "xlat/evdev_sync.h"
#ifndef SYN_MAX
# define SYN_MAX 0xf
#endif
#include DEF_MPERS_TYPE(struct_ff_effect)
# include <linux/ioctl.h>
# include <linux/input.h>
typedef struct ff_effect struct_ff_effect;
#endif /* HAVE_LINUX_BTRFS_H */
#include MPERS_DEFS
#ifdef HAVE_LINUX_INPUT_H
# include "xlat/evdev_autorepeat.h"
# include "xlat/evdev_ff_status.h"
# include "xlat/evdev_ff_types.h"
# include "xlat/evdev_keycode.h"
# include "xlat/evdev_leds.h"
# include "xlat/evdev_misc.h"
# include "xlat/evdev_mtslots.h"
# include "xlat/evdev_prop.h"
# include "xlat/evdev_relative_axes.h"
# include "xlat/evdev_snd.h"
# include "xlat/evdev_switch.h"
# include "xlat/evdev_sync.h"
# ifndef SYN_MAX
# define SYN_MAX 0xf
# endif
static void
decode_envelope(struct ff_envelope *envelope)
decode_envelope(void *const data)
{
tprintf(", envelope={attack_length=%" PRIu16 ", attack_level=%" PRIu16
", fade_length=%" PRIu16 ", fade_level=%" PRIx32 "}",
const struct ff_envelope *const envelope = data;
tprintf(", envelope={attack_length=%" PRIu16
", attack_level=%" PRIu16
", fade_length=%" PRIu16
", fade_level=%#x}",
envelope->attack_length,
envelope->attack_level,
envelope->fade_length,
@ -62,136 +78,151 @@ decode_envelope(struct ff_envelope *envelope)
static int
ff_effect_ioctl(struct tcb *tcp, long arg)
{
struct ff_effect ffe;
tprints(", ");
if (!verbose(tcp) || umove(tcp, arg, &ffe) < 0)
return 0;
struct_ff_effect ffe;
tprints(", {type=");
if (umove_or_printaddr(tcp, arg, &ffe))
return 1;
tprints("{type=");
printxval(evdev_ff_types, ffe.type, "FF_???");
tprintf(", id=%" PRIu16 ", direction=%" PRIu16,
ffe.id, ffe.direction);
tprintf(", id=%" PRIu16
", direction=%" PRIu16 ", ",
ffe.id,
ffe.direction);
if (!abbrev(tcp)) {
tprintf(", trigger={button=%" PRIu16 ", interval=%" PRIu16 "}",
ffe.trigger.button, ffe.trigger.interval);
tprintf(", replay={lenght=%" PRIu16 ", delay=%" PRIu16 "}",
ffe.replay.length, ffe.replay.delay);
switch (ffe.type) {
case FF_CONSTANT:
tprintf(", constant_ef={%" PRIi16,
ffe.u.constant.level);
decode_envelope(&ffe.u.constant.envelope);
tprints("}");
return 1;
case FF_RAMP:
tprintf(", ramp={start_level=%" PRIi16
", end_level=%" PRIi16,
ffe.u.ramp.start_level,
ffe.u.ramp.end_level);
decode_envelope(&ffe.u.ramp.envelope);
tprints("}");
return 1;
case FF_PERIODIC:
tprintf(", periodic_ef={waveform=%" PRIu16
", period=%" PRIu16
", magnitude=%" PRIi16
", offset=%" PRIi16
", phase=%" PRIu16,
ffe.u.periodic.waveform,
ffe.u.periodic.period,
ffe.u.periodic.magnitude,
ffe.u.periodic.offset,
ffe.u.periodic.phase);
decode_envelope(&ffe.u.periodic.envelope);
tprintf(", custom_len=%" PRIu32
", *custom_data=%#lx}",
ffe.u.periodic.custom_len,
(unsigned long)ffe.u.periodic.custom_data);
return 1;
case FF_RUMBLE:
tprintf(", rumble={strong_magnitude=%" PRIu16
", weak_magnitude=%" PRIu16 "}",
ffe.u.rumble.strong_magnitude,
ffe.u.rumble.weak_magnitude);
return 1;
case FF_SPRING:
case FF_FRICTION:
case FF_DAMPER:
case FF_INERTIA:
case FF_CUSTOM:
break;
default :
break;
}
if (abbrev(tcp)) {
tprints("...}");
return 1;
}
tprints(", ...}");
tprintf("trigger={button=%" PRIu16
", interval=%" PRIu16 "}"
", replay={length=%" PRIu16
", delay=%" PRIu16 "}",
ffe.trigger.button,
ffe.trigger.interval,
ffe.replay.length,
ffe.replay.delay);
switch (ffe.type) {
case FF_CONSTANT:
tprintf(", constant={level=%" PRId16,
ffe.u.constant.level);
decode_envelope(&ffe.u.constant.envelope);
tprints("}");
break;
case FF_RAMP:
tprintf(", ramp={start_level=%" PRId16
", end_level=%" PRId16,
ffe.u.ramp.start_level,
ffe.u.ramp.end_level);
decode_envelope(&ffe.u.ramp.envelope);
tprints("}");
break;
case FF_PERIODIC:
tprintf(", periodic={waveform=%" PRIu16
", period=%" PRIu16
", magnitude=%" PRId16
", offset=%" PRId16
", phase=%" PRIu16,
ffe.u.periodic.waveform,
ffe.u.periodic.period,
ffe.u.periodic.magnitude,
ffe.u.periodic.offset,
ffe.u.periodic.phase);
decode_envelope(&ffe.u.periodic.envelope);
tprintf(", custom_len=%u"
", custom_data=%#lx}",
ffe.u.periodic.custom_len,
(unsigned long) ffe.u.periodic.custom_data);
break;
case FF_RUMBLE:
tprintf(", rumble={strong_magnitude=%" PRIu16
", weak_magnitude=%" PRIu16 "}",
ffe.u.rumble.strong_magnitude,
ffe.u.rumble.weak_magnitude);
break;
default:
break;
}
tprints("}");
return 1;
}
static int
abs_ioctl(struct tcb *tcp, long arg)
{
tprints(", ");
struct input_absinfo absinfo;
if (!verbose(tcp) || umove(tcp, arg, &absinfo) < 0)
return 0;
if (!umove_or_printaddr(tcp, arg, &absinfo)) {
tprintf("{value=%u"
", minimum=%u, ",
absinfo.value,
absinfo.minimum);
if (!abbrev(tcp)) {
tprintf("maximum=%u"
", fuzz=%u"
", flat=%u",
absinfo.maximum,
absinfo.fuzz,
absinfo.flat);
# ifdef HAVE_STRUCT_INPUT_ABSINFO_RESOLUTION
tprintf(", resolution=%u",
absinfo.resolution);
# endif
} else {
tprints("...");
}
tprintf(", {value=%" PRIu32 ", minimum=%" PRIu32,
absinfo.value, absinfo.minimum);
if (!abbrev(tcp)) {
tprintf(", maximum=%" PRIu32 ", fuzz=%" PRIu32,
absinfo.maximum, absinfo.fuzz);
tprintf(", flat=%" PRIu32, absinfo.flat);
#ifdef HAVE_STRUCT_INPUT_ABSINFO_RESOLUTION
tprintf(", resolution=%" PRIu32, absinfo.resolution);
#endif
tprints("}");
} else {
tprints(", ...}");
}
return 1;
}
static int
keycode_ioctl(struct tcb *tcp, long arg)
{
tprints(", ");
unsigned int keycode[2];
if (!arg) {
tprints(", NULL");
return 1;
if (!umove_or_printaddr(tcp, arg, &keycode)) {
tprintf("[%u, ", keycode[0]);
printxval(evdev_keycode, keycode[1], "KEY_???");
tprints("]");
}
if (!verbose(tcp) || umove(tcp, arg, &keycode) < 0)
return 0;
tprintf(", [%u, ", keycode[0]);
printxval(evdev_keycode, keycode[1], "KEY_???");
tprints("]");
return 1;
}
#ifdef EVIOCGKEYCODE_V2
# ifdef EVIOCGKEYCODE_V2
static int
keycode_V2_ioctl(struct tcb *tcp, long arg)
{
tprints(", ");
struct input_keymap_entry ike;
if (!arg) {
tprints(", NULL");
if (umove_or_printaddr(tcp, arg, &ike))
return 1;
}
if (!verbose(tcp) || umove(tcp, arg, &ike) < 0)
return 0;
tprintf("{flags=%" PRIu8
", len=%" PRIu8 ", ",
ike.flags,
ike.len);
tprintf(", {flags=%" PRIu8 ", len=%" PRIu8, ike.flags, ike.len);
if (!abbrev(tcp)) {
unsigned int i;
tprintf(", index=%" PRIu16 ", keycode=", ike.index);
tprintf("index=%" PRIu16 ", keycode=", ike.index);
printxval(evdev_keycode, ike.keycode, "KEY_???");
tprints(", scancode=[");
for (i = 0; i < ARRAY_SIZE(ike.scancode); i++) {
@ -199,30 +230,34 @@ keycode_V2_ioctl(struct tcb *tcp, long arg)
tprints(", ");
tprintf("%" PRIx8, ike.scancode[i]);
}
tprints("]}");
tprints("]");
} else {
tprints(", ...}");
tprints("...");
}
tprints("}");
return 1;
}
#endif /* EVIOCGKEYCODE_V2 */
# endif /* EVIOCGKEYCODE_V2 */
static int
getid_ioctl(struct tcb *tcp, long arg)
{
tprints(", ");
struct input_id id;
if (!verbose(tcp) || umove(tcp, arg, &id) < 0)
return 0;
if (!umove_or_printaddr(tcp, arg, &id))
tprintf("{ID_BUS=%" PRIu16
", ID_VENDOR=%" PRIu16
", ID_PRODUCT=%" PRIu16
", ID_VERSION=%" PRIu16 "}",
id.bustype,
id.vendor,
id.product,
id.version);
tprintf(", {ID_BUS=%" PRIu16 ", ID_VENDOR=%" PRIu16,
id.bustype, id.vendor);
if (!abbrev(tcp)) {
tprintf(", ID_PRODUCT=%" PRIu16 ", ID_VERSION=%" PRIu16 "}",
id.product, id.version);
} else {
tprints(", ...}");
}
return 1;
}
@ -230,8 +265,7 @@ static int
decode_bitset(struct tcb *tcp, long arg, const struct xlat decode_nr[],
const unsigned int max_nr, const char *dflt)
{
if (!verbose(tcp))
return 0;
tprints(", ");
unsigned int size;
if ((unsigned long) tcp->u_rval > max_nr)
@ -240,10 +274,10 @@ decode_bitset(struct tcb *tcp, long arg, const struct xlat decode_nr[],
size = tcp->u_rval;
char decoded_arg[size];
if (umoven(tcp, arg, size, decoded_arg) < 0)
return 0;
if (umove_or_printaddr(tcp, arg, &decoded_arg))
return 1;
tprints(", [");
tprints("[");
int bit_displayed = 0;
int i = next_set_bit(decoded_arg, 0, size);
@ -268,212 +302,225 @@ decode_bitset(struct tcb *tcp, long arg, const struct xlat decode_nr[],
return 1;
}
#ifdef EVIOCGMTSLOTS
# ifdef EVIOCGMTSLOTS
static int
mtslots_ioctl(struct tcb *tcp, const unsigned int code, long arg)
{
const size_t size = _IOC_SIZE(code) / sizeof(int32_t);
if (!size)
return 0;
tprints(", ");
int32_t buffer[size];
const size_t size = _IOC_SIZE(code) / sizeof(int);
if (!size) {
printaddr(arg);
return 1;
}
if (!verbose(tcp) || umove(tcp, arg, &buffer) < 0)
return 0;
int buffer[size];
tprints(", {code=");
if (umove_or_printaddr(tcp, arg, &buffer))
return 1;
tprints("{code=");
printxval(evdev_mtslots, buffer[0], "ABS_MT_???");
unsigned int i;
tprints(", values=[");
unsigned int i;
for (i = 1; i < ARRAY_SIZE(buffer); i++)
tprintf("%s%d", i > 1 ? ", " : "", buffer[i]);
tprints("]}");
return 1;
}
#endif /* EVIOCGMTSLOTS */
# endif /* EVIOCGMTSLOTS */
#ifdef EVIOCGREP
# if defined EVIOCGREP || defined EVIOCSREP
static int
repeat_ioctl(struct tcb *tcp, long arg)
{
unsigned int val[2];
if (!verbose(tcp) || umove(tcp, arg, &val) < 0)
return 0;
tprintf(", [%" PRIu32 " %" PRIu32 "]", val[0], val[1]);
tprints(", ");
printpair_int(tcp, arg, "%u");
return 1;
}
#endif /* EVIOCGREP */
# endif /* EVIOCGREP || EVIOCSREP */
static int
evdev_read_ioctl(struct tcb *tcp, const unsigned int code, long arg)
bit_ioctl(struct tcb *tcp, const unsigned int ev_nr, const long arg)
{
if (entering(tcp))
return 1;
if (syserror(tcp))
return 0;
if ((_IOC_NR(code) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) {
switch (_IOC_NR(code) - 0x20) {
case EV_SYN:
return decode_bitset(tcp, arg, evdev_sync,
SYN_MAX, "SYN_???");
case EV_KEY:
return decode_bitset(tcp, arg, evdev_keycode,
KEY_MAX, "KEY_???");
case EV_REL:
return decode_bitset(tcp, arg, evdev_relative_axes,
REL_MAX, "REL_???");
case EV_ABS:
return decode_bitset(tcp, arg,
evdev_abs, ABS_MAX, "ABS_???");
case EV_MSC:
return decode_bitset(tcp, arg,
evdev_misc, MSC_MAX, "MSC_???");
#ifdef EV_SW
case EV_SW:
return decode_bitset(tcp, arg,
evdev_switch, SW_MAX, "SW_???");
#endif
case EV_LED:
return decode_bitset(tcp, arg,
evdev_leds, LED_MAX, "LED_???");
case EV_SND:
return decode_bitset(tcp, arg,
evdev_snd, SND_MAX, "SND_???");
case EV_REP:
return decode_bitset(tcp, arg, evdev_autorepeat,
REP_MAX, "REP_???");
case EV_FF:
return decode_bitset(tcp, arg, evdev_ff_types,
FF_MAX, "FF_???");
case EV_PWR:
printnum_int(tcp, arg, "%d");
return 1;
case EV_FF_STATUS:
return decode_bitset(tcp, arg, evdev_ff_status,
FF_STATUS_MAX, "FF_STATUS_???");
default:
return 0;
}
switch (ev_nr) {
case EV_SYN:
return decode_bitset(tcp, arg, evdev_sync,
SYN_MAX, "SYN_???");
case EV_KEY:
return decode_bitset(tcp, arg, evdev_keycode,
KEY_MAX, "KEY_???");
case EV_REL:
return decode_bitset(tcp, arg, evdev_relative_axes,
REL_MAX, "REL_???");
case EV_ABS:
return decode_bitset(tcp, arg, evdev_abs,
ABS_MAX, "ABS_???");
case EV_MSC:
return decode_bitset(tcp, arg, evdev_misc,
MSC_MAX, "MSC_???");
# ifdef EV_SW
case EV_SW:
return decode_bitset(tcp, arg, evdev_switch,
SW_MAX, "SW_???");
# endif
case EV_LED:
return decode_bitset(tcp, arg, evdev_leds,
LED_MAX, "LED_???");
case EV_SND:
return decode_bitset(tcp, arg, evdev_snd,
SND_MAX, "SND_???");
case EV_REP:
return decode_bitset(tcp, arg, evdev_autorepeat,
REP_MAX, "REP_???");
case EV_FF:
return decode_bitset(tcp, arg, evdev_ff_types,
FF_MAX, "FF_???");
case EV_PWR:
tprints(", ");
printnum_int(tcp, arg, "%d");
return 1;
case EV_FF_STATUS:
return decode_bitset(tcp, arg, evdev_ff_status,
FF_STATUS_MAX, "FF_STATUS_???");
default:
tprints(", ");
printaddr(arg);
return 1;
}
}
if ((_IOC_NR(code) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0)))
return abs_ioctl(tcp, arg);
static int
evdev_read_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
{
/* fixed-number fixed-length commands */
switch (code) {
case EVIOCGVERSION:
tprints(", ");
printnum_int(tcp, arg, "%" PRIx32);
printnum_int(tcp, arg, "%#x");
return 1;
case EVIOCGEFFECTS:
tprints(", ");
printnum_int(tcp, arg, "%" PRIu32);
printnum_int(tcp, arg, "%u");
return 1;
case EVIOCGID:
return getid_ioctl(tcp, arg);
#ifdef EVIOCGREP
# ifdef EVIOCGREP
case EVIOCGREP:
return repeat_ioctl(tcp, arg);;
#endif
return repeat_ioctl(tcp, arg);
# endif
case EVIOCGKEYCODE:
return keycode_ioctl(tcp, arg);
#ifdef EVIOCGKEYCODE_V2
# ifdef EVIOCGKEYCODE_V2
case EVIOCGKEYCODE_V2:
return keycode_V2_ioctl(tcp, arg);
#endif
# endif
}
/* fixed-number variable-length commands */
switch (_IOC_NR(code)) {
#ifdef EVIOCGMTSLOTS
# ifdef EVIOCGMTSLOTS
case _IOC_NR(EVIOCGMTSLOTS(0)):
return mtslots_ioctl(tcp, code, arg);
#endif
# endif
case _IOC_NR(EVIOCGNAME(0)):
case _IOC_NR(EVIOCGPHYS(0)):
case _IOC_NR(EVIOCGUNIQ(0)):
tprints(", ");
printstr(tcp, arg, tcp->u_rval - 1);
if (syserror(tcp))
printaddr(arg);
else
printstr(tcp, arg, tcp->u_rval);
return 1;
#ifdef EVIOCGPROP
# ifdef EVIOCGPROP
case _IOC_NR(EVIOCGPROP(0)):
return decode_bitset(tcp, arg,
evdev_prop, INPUT_PROP_MAX, "PROP_???");
#endif
return decode_bitset(tcp, arg, evdev_prop,
INPUT_PROP_MAX, "PROP_???");
# endif
case _IOC_NR(EVIOCGSND(0)):
return decode_bitset(tcp, arg,
evdev_snd, SND_MAX, "SND_???");
#ifdef EVIOCGSW
return decode_bitset(tcp, arg, evdev_snd,
SND_MAX, "SND_???");
# ifdef EVIOCGSW
case _IOC_NR(EVIOCGSW(0)):
return decode_bitset(tcp, arg,
evdev_switch, SW_MAX, "SW_???");
#endif
return decode_bitset(tcp, arg, evdev_switch,
SW_MAX, "SW_???");
# endif
case _IOC_NR(EVIOCGKEY(0)):
return decode_bitset(tcp, arg,
evdev_keycode, KEY_MAX, "KEY_???");
return decode_bitset(tcp, arg, evdev_keycode,
KEY_MAX, "KEY_???");
case _IOC_NR(EVIOCGLED(0)):
return decode_bitset(tcp, arg,
evdev_leds, LED_MAX, "LED_???");
default:
return 0;
return decode_bitset(tcp, arg, evdev_leds,
LED_MAX, "LED_???");
}
/* multi-number fixed-length commands */
if ((_IOC_NR(code) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0)))
return abs_ioctl(tcp, arg);
/* multi-number variable-length commands */
if ((_IOC_NR(code) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0)))
return bit_ioctl(tcp, _IOC_NR(code) & EV_MAX, arg);
return 0;
}
static int
evdev_write_ioctl(struct tcb *tcp, const unsigned int code, long arg)
evdev_write_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
{
if (exiting(tcp))
return 1;
if ((_IOC_NR(code) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0)))
return abs_ioctl(tcp, arg);
/* fixed-number fixed-length commands */
switch (code) {
#ifdef EVIOCSREP
# ifdef EVIOCSREP
case EVIOCSREP:
return repeat_ioctl(tcp, arg);
#endif
# endif
case EVIOCSKEYCODE:
return keycode_ioctl(tcp, arg);
#ifdef EVIOCSKEYCODE_V2
# ifdef EVIOCSKEYCODE_V2
case EVIOCSKEYCODE_V2:
return keycode_V2_ioctl(tcp, arg);
#endif
# endif
case EVIOCSFF:
return ff_effect_ioctl(tcp, arg);
case EVIOCRMFF:
#ifdef EVIOCSCLOCKID
case EVIOCSCLOCKID:
#endif
tprintf(", %d", (int) arg);
return 1;
case EVIOCGRAB:
#ifdef EVIOCREVOKE
# ifdef EVIOCREVOKE
case EVIOCREVOKE:
#endif
# endif
tprintf(", %lu", arg);
return 1;
# ifdef EVIOCSCLOCKID
case EVIOCSCLOCKID:
tprints(", ");
printnum_int(tcp, arg, "%u");
return 1;
default:
return 0;
# endif
}
/* multi-number fixed-length commands */
if ((_IOC_NR(code) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0)))
return abs_ioctl(tcp, arg);
return 0;
}
int
evdev_ioctl(struct tcb *tcp, const unsigned int code, long arg)
MPERS_PRINTER_DECL(int, evdev_ioctl, struct tcb *tcp,
const unsigned int code, const long arg)
{
switch(_IOC_DIR(code)) {
case _IOC_READ:
if (entering(tcp))
return 0;
return evdev_read_ioctl(tcp, code, arg);
case _IOC_WRITE:
if (!evdev_write_ioctl(tcp, code, arg))
tprintf(", %lx", arg);
return 1;
return evdev_write_ioctl(tcp, code, arg) | RVAL_DECODED;
default:
return 0;
return RVAL_DECODED;
}
}

57
eventfd.c Normal file
View File

@ -0,0 +1,57 @@
/*
* Copyright (c) 2007 Ulrich Drepper <drepper@redhat.com>
* Copyright (c) 2008-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <fcntl.h>
#ifdef HAVE_SYS_EVENTFD_H
# include <sys/eventfd.h>
#endif
#include "xlat/efd_flags.h"
static int
do_eventfd(struct tcb *tcp, int flags_arg)
{
tprintf("%u", (unsigned int) tcp->u_arg[0]);
if (flags_arg >= 0) {
tprints(", ");
printflags(efd_flags, tcp->u_arg[flags_arg], "EFD_???");
}
return RVAL_DECODED | RVAL_FD;
}
SYS_FUNC(eventfd)
{
return do_eventfd(tcp, -1);
}
SYS_FUNC(eventfd2)
{
return do_eventfd(tcp, 1);
}

181
execve.c
View File

@ -1,86 +1,145 @@
/*
* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993-1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2007 Roland McGrath <roland@redhat.com>
* Copyright (c) 2011-2012 Denys Vlasenko <vda.linux@googlemail.com>
* Copyright (c) 2010-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
static void
printargv(struct tcb *tcp, long addr)
{
union {
unsigned int p32;
unsigned long p64;
char data[sizeof(long)];
} cp;
const char *sep;
unsigned int n = 0;
unsigned wordsize = current_wordsize;
if (!addr || !verbose(tcp)) {
printaddr(addr);
return;
}
cp.p64 = 1;
for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
if (umoven(tcp, addr, wordsize, cp.data) < 0) {
tprintf("%#lx", addr);
const char *const start_sep = "[";
const char *sep = start_sep;
const unsigned int wordsize = current_wordsize;
unsigned int n;
for (n = 0; addr; sep = ", ", addr += wordsize, ++n) {
union {
unsigned int p32;
unsigned long p64;
char data[sizeof(long)];
} cp;
if (umoven(tcp, addr, wordsize, cp.data)) {
if (sep == start_sep)
printaddr(addr);
else
tprints(", ???]");
return;
}
if (wordsize == 4)
cp.p64 = cp.p32;
if (cp.p64 == 0)
if (!(wordsize < sizeof(cp.p64) ? cp.p32 : cp.p64)) {
if (sep == start_sep)
tprints(start_sep);
break;
}
if (abbrev(tcp) && n >= max_strlen) {
tprintf("%s...", sep);
break;
}
tprints(sep);
printstr(tcp, cp.p64, -1);
addr += wordsize;
printstr(tcp, wordsize < sizeof(cp.p64) ? cp.p32 : cp.p64, -1);
}
if (cp.p64)
tprintf("%s...", sep);
tprints("]");
}
static void
printargc(const char *fmt, struct tcb *tcp, long addr)
printargc(struct tcb *tcp, long addr)
{
int count;
char *cp;
for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
addr += sizeof(char *);
if (!addr || !verbose(tcp)) {
printaddr(addr);
return;
}
tprintf(fmt, count, count == 1 ? "" : "s");
bool unterminated = false;
unsigned int count = 0;
char *cp = NULL;
for (; addr; addr += current_wordsize, ++count) {
if (umoven(tcp, addr, current_wordsize, &cp)) {
if (count) {
unterminated = true;
break;
}
printaddr(addr);
return;
}
if (!cp)
break;
}
tprintf("[/* %u var%s%s */]",
count, count == 1 ? "" : "s",
unterminated ? ", unterminated" : "");
}
int
sys_execve(struct tcb *tcp)
static void
decode_execve(struct tcb *tcp, const unsigned int index)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
if (!verbose(tcp))
tprintf(", %#lx", tcp->u_arg[1]);
else {
tprints(", [");
printargv(tcp, tcp->u_arg[1]);
tprints("]");
}
if (!verbose(tcp))
tprintf(", %#lx", tcp->u_arg[2]);
else if (abbrev(tcp))
printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
else {
tprints(", [");
printargv(tcp, tcp->u_arg[2]);
tprints("]");
}
}
return 0;
printpath(tcp, tcp->u_arg[index + 0]);
tprints(", ");
printargv(tcp, tcp->u_arg[index + 1]);
tprints(", ");
(abbrev(tcp) ? printargc : printargv) (tcp, tcp->u_arg[index + 2]);
}
SYS_FUNC(execve)
{
decode_execve(tcp, 0);
return RVAL_DECODED;
}
SYS_FUNC(execveat)
{
print_dirfd(tcp, tcp->u_arg[0]);
decode_execve(tcp, 1);
tprints(", ");
printflags(at_flags, tcp->u_arg[4], "AT_???");
return RVAL_DECODED;
}
#if defined(SPARC) || defined(SPARC64)
int
sys_execv(struct tcb *tcp)
SYS_FUNC(execv)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
if (!verbose(tcp))
tprintf(", %#lx", tcp->u_arg[1]);
else {
tprints(", [");
printargv(tcp, tcp->u_arg[1]);
tprints("]");
}
}
return 0;
printpath(tcp, tcp->u_arg[0]);
tprints(", ");
printargv(tcp, tcp->u_arg[1]);
return RVAL_DECODED;
}
#endif /* SPARC || SPARC64 */

5
exit.c
View File

@ -1,10 +1,9 @@
#include "defs.h"
int
sys_exit(struct tcb *tcp)
SYS_FUNC(exit)
{
if (exiting(tcp)) {
fprintf(stderr, "_exit returned!\n");
error_msg("_exit returned!");
return -1;
}
/* special case: we stop tracing this process, finish line now */

View File

@ -1,35 +1,65 @@
/*
* Copyright (c) 2004 Ulrich Drepper <drepper@redhat.com>
* Copyright (c) 2004 Roland McGrath <roland@redhat.com>
* Copyright (c) 2007 Daniel Jacobowitz <dan@codesourcery.com>
* Copyright (c) 2009 Andreas Schwab <schwab@redhat.com>
* Copyright (c) 2009 Kirill A. Shutemov <kirill@shutemov.name>
* Copyright (c) 2011-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <fcntl.h>
#include "xlat/advise.h"
int
sys_fadvise64(struct tcb *tcp)
SYS_FUNC(fadvise64)
{
if (entering(tcp)) {
int argn;
printfd(tcp, tcp->u_arg[0]);
argn = printllval(tcp, ", %lld", 1);
tprintf(", %ld, ", tcp->u_arg[argn++]);
printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???");
}
return 0;
int argn;
printfd(tcp, tcp->u_arg[0]);
argn = printllval(tcp, ", %lld", 1);
tprintf(", %ld, ", tcp->u_arg[argn++]);
printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???");
return RVAL_DECODED;
}
int
sys_fadvise64_64(struct tcb *tcp)
SYS_FUNC(fadvise64_64)
{
if (entering(tcp)) {
int argn;
printfd(tcp, tcp->u_arg[0]);
argn = printllval(tcp, ", %lld, ", 1);
argn = printllval(tcp, "%lld, ", argn);
int argn;
printfd(tcp, tcp->u_arg[0]);
argn = printllval(tcp, ", %lld, ", 1);
argn = printllval(tcp, "%lld, ", argn);
#if defined __ARM_EABI__ || defined AARCH64 || defined POWERPC || defined XTENSA
printxval(advise, tcp->u_arg[1], "POSIX_FADV_???");
printxval(advise, tcp->u_arg[1], "POSIX_FADV_???");
#else
printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???");
printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???");
#endif
}
return 0;
return RVAL_DECODED;
}

View File

@ -6,25 +6,23 @@
#include "xlat/falloc_flags.h"
int
sys_fallocate(struct tcb *tcp)
SYS_FUNC(fallocate)
{
if (entering(tcp)) {
int argn;
int argn;
/* fd */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* fd */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* mode */
printflags(falloc_flags, tcp->u_arg[1], "FALLOC_FL_???");
tprints(", ");
/* mode */
printflags(falloc_flags, tcp->u_arg[1], "FALLOC_FL_???");
tprints(", ");
/* offset */
argn = printllval(tcp, "%llu, ", 2);
/* offset */
argn = printllval(tcp, "%llu, ", 2);
/* len */
printllval(tcp, "%llu", argn);
}
return 0;
/* len */
printllval(tcp, "%llu", argn);
return RVAL_DECODED;
}

View File

@ -1,3 +1,30 @@
/*
* Copyright (c) 2014-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include "xlat/fan_classes.h"
@ -10,15 +37,10 @@
# define FAN_NOFD -1
#endif
int
sys_fanotify_init(struct tcb *tcp)
SYS_FUNC(fanotify_init)
{
unsigned flags;
unsigned int flags = tcp->u_arg[0];
if (exiting(tcp))
return 0;
flags = tcp->u_arg[0];
printxval(fan_classes, flags & FAN_ALL_CLASS_BITS, "FAN_CLASS_???");
flags &= ~FAN_ALL_CLASS_BITS;
if (flags) {
@ -28,35 +50,29 @@ sys_fanotify_init(struct tcb *tcp)
tprints(", ");
tprint_open_modes((unsigned) tcp->u_arg[1]);
return 0;
return RVAL_DECODED | RVAL_FD;
}
#include "xlat/fan_mark_flags.h"
#include "xlat/fan_event_flags.h"
int
sys_fanotify_mark(struct tcb *tcp)
SYS_FUNC(fanotify_mark)
{
unsigned long long mask = 0;
int argn;
if (exiting(tcp))
return 0;
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printflags(fan_mark_flags, (unsigned) tcp->u_arg[1], "FAN_MARK_???");
printflags(fan_mark_flags, tcp->u_arg[1], "FAN_MARK_???");
tprints(", ");
/*
* the mask argument is defined as 64-bit,
* but kernel uses the lower 32 bits only.
*/
argn = getllval(tcp, &mask, 2);
unsigned long long mask = 0;
int argn = getllval(tcp, &mask, 2);
#ifdef HPPA
/* Parsic is weird. See arch/parisc/kernel/sys_parisc32.c. */
mask = (mask << 32) | (mask >> 32);
#endif
printflags(fan_event_flags, mask, "FAN_???");
printflags64(fan_event_flags, mask, "FAN_???");
tprints(", ");
if ((int) tcp->u_arg[argn] == FAN_NOFD)
tprints("FAN_NOFD, ");
@ -64,5 +80,5 @@ sys_fanotify_mark(struct tcb *tcp)
print_dirfd(tcp, tcp->u_arg[argn]);
printpath(tcp, tcp->u_arg[argn + 1]);
return 0;
return RVAL_DECODED;
}

View File

@ -1,15 +1,13 @@
#include "defs.h"
int
sys_fchownat(struct tcb *tcp)
SYS_FUNC(fchownat)
{
if (entering(tcp)) {
print_dirfd(tcp, tcp->u_arg[0]);
printpath(tcp, tcp->u_arg[1]);
printuid(", ", tcp->u_arg[2]);
printuid(", ", tcp->u_arg[3]);
tprints(", ");
printflags(at_flags, tcp->u_arg[4], "AT_???");
}
return 0;
print_dirfd(tcp, tcp->u_arg[0]);
printpath(tcp, tcp->u_arg[1]);
printuid(", ", tcp->u_arg[2]);
printuid(", ", tcp->u_arg[3]);
tprints(", ");
printflags(at_flags, tcp->u_arg[4], "AT_???");
return RVAL_DECODED;
}

242
fcntl.c Normal file
View File

@ -0,0 +1,242 @@
/*
* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include "flock.h"
#include "xlat/f_owner_types.h"
#include "xlat/f_seals.h"
#include "xlat/fcntlcmds.h"
#include "xlat/fcntl64cmds.h"
#include "xlat/fdflags.h"
#include "xlat/lockfcmds.h"
#include "xlat/notifyflags.h"
static void
print_struct_flock64(const struct_kernel_flock64 *fl, const int getlk)
{
tprints("{l_type=");
printxval(lockfcmds, (unsigned short) fl->l_type, "F_???");
tprints(", l_whence=");
printxval(whence_codes, (unsigned short) fl->l_whence, "SEEK_???");
tprintf(", l_start=%lld, l_len=%lld",
(long long) fl->l_start, (long long) fl->l_len);
if (getlk)
tprintf(", l_pid=%lu", (unsigned long) fl->l_pid);
tprints("}");
}
static void
printflock64(struct tcb *tcp, const long addr, const int getlk)
{
struct_kernel_flock64 fl;
if (fetch_struct_flock64(tcp, addr, &fl))
print_struct_flock64(&fl, getlk);
}
static void
printflock(struct tcb *tcp, const long addr, const int getlk)
{
struct_kernel_flock64 fl;
if (fetch_struct_flock(tcp, addr, &fl))
print_struct_flock64(&fl, getlk);
}
static void
print_f_owner_ex(struct tcb *tcp, const long addr)
{
struct { int type, pid; } owner;
if (umove_or_printaddr(tcp, addr, &owner))
return;
tprints("{type=");
printxval(f_owner_types, owner.type, "F_OWNER_???");
tprintf(", pid=%d}", owner.pid);
}
static int
print_fcntl(struct tcb *tcp)
{
const unsigned int cmd = tcp->u_arg[1];
switch (cmd) {
case F_SETFD:
tprints(", ");
printflags(fdflags, tcp->u_arg[2], "FD_???");
break;
case F_SETOWN:
case F_SETPIPE_SZ:
tprintf(", %ld", tcp->u_arg[2]);
break;
case F_DUPFD:
case F_DUPFD_CLOEXEC:
tprintf(", %ld", tcp->u_arg[2]);
return RVAL_DECODED | RVAL_FD;
case F_SETFL:
tprints(", ");
tprint_open_modes(tcp->u_arg[2]);
break;
case F_SETLK:
case F_SETLKW:
tprints(", ");
printflock(tcp, tcp->u_arg[2], 0);
break;
case F_OFD_SETLK:
case F_OFD_SETLKW:
tprints(", ");
printflock64(tcp, tcp->u_arg[2], 0);
break;
case F_SETOWN_EX:
tprints(", ");
print_f_owner_ex(tcp, tcp->u_arg[2]);
break;
case F_NOTIFY:
tprints(", ");
printflags_long(notifyflags, tcp->u_arg[2], "DN_???");
break;
case F_SETLEASE:
tprints(", ");
printxval_long(lockfcmds, tcp->u_arg[2], "F_???");
break;
case F_ADD_SEALS:
tprints(", ");
printflags_long(f_seals, tcp->u_arg[2], "F_SEAL_???");
break;
case F_SETSIG:
tprints(", ");
tprints(signame(tcp->u_arg[2]));
break;
case F_GETOWN:
case F_GETPIPE_SZ:
break;
case F_GETFD:
if (entering(tcp) || syserror(tcp) || tcp->u_rval == 0)
return 0;
tcp->auxstr = sprintflags("flags ", fdflags,
(unsigned long) tcp->u_rval);
return RVAL_HEX | RVAL_STR;
case F_GETFL:
if (entering(tcp) || syserror(tcp))
return 0;
tcp->auxstr = sprint_open_modes(tcp->u_rval);
return RVAL_HEX | RVAL_STR;
case F_GETLK:
if (entering(tcp))
return 0;
tprints(", ");
printflock(tcp, tcp->u_arg[2], 1);
break;
case F_OFD_GETLK:
if (entering(tcp))
return 0;
tprints(", ");
printflock64(tcp, tcp->u_arg[2], 1);
break;
case F_GETOWN_EX:
if (entering(tcp))
return 0;
tprints(", ");
print_f_owner_ex(tcp, tcp->u_arg[2]);
break;
case F_GETLEASE:
if (entering(tcp) || syserror(tcp))
return 0;
tcp->auxstr = xlookup(lockfcmds, (unsigned long) tcp->u_rval);
return RVAL_HEX | RVAL_STR;
case F_GET_SEALS:
if (entering(tcp) || syserror(tcp) || tcp->u_rval == 0)
return 0;
tcp->auxstr = sprintflags("seals ", f_seals,
(unsigned long) tcp->u_rval);
return RVAL_HEX | RVAL_STR;
case F_GETSIG:
if (entering(tcp) || syserror(tcp) || tcp->u_rval == 0)
return 0;
tcp->auxstr = signame(tcp->u_rval);
return RVAL_STR;
default:
tprintf(", %#lx", tcp->u_arg[2]);
break;
}
return RVAL_DECODED;
}
SYS_FUNC(fcntl)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
const unsigned int cmd = tcp->u_arg[1];
const char *str = xlookup(fcntlcmds, cmd);
if (str) {
tprints(str);
} else {
/*
* fcntl syscall does not recognize these
* constants, but we would like to show them
* for better debugging experience.
*/
printxval(fcntl64cmds, cmd, "F_???");
}
}
return print_fcntl(tcp);
}
SYS_FUNC(fcntl64)
{
const unsigned int cmd = tcp->u_arg[1];
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
const char *str = xlookup(fcntl64cmds, cmd);
if (str) {
tprints(str);
} else {
printxval(fcntlcmds, cmd, "F_???");
}
}
switch (cmd) {
case F_SETLK64:
case F_SETLKW64:
tprints(", ");
printflock64(tcp, tcp->u_arg[2], 0);
return RVAL_DECODED;
case F_GETLK64:
if (exiting(tcp)) {
tprints(", ");
printflock64(tcp, tcp->u_arg[2], 1);
}
return 0;
}
return print_fcntl(tcp);
}

52
fetch_seccomp_fprog.c Normal file
View File

@ -0,0 +1,52 @@
/*
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include DEF_MPERS_TYPE(seccomp_fprog_t)
#include "seccomp_fprog.h"
typedef struct seccomp_fprog seccomp_fprog_t;
#include MPERS_DEFS
MPERS_PRINTER_DECL(bool, fetch_seccomp_fprog,
struct tcb *tcp, const long addr, void *p)
{
struct seccomp_fprog *pfp = p;
seccomp_fprog_t mfp;
if (sizeof(*pfp) == sizeof(mfp))
return !umove_or_printaddr(tcp, addr, pfp);
if (umove_or_printaddr(tcp, addr, &mfp))
return false;
pfp->len = mfp.len;
pfp->filter = mfp.filter;
return true;
}

92
fetch_struct_flock.c Normal file
View File

@ -0,0 +1,92 @@
/*
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include DEF_MPERS_TYPE(struct_flock)
#include DEF_MPERS_TYPE(struct_flock64)
#include "flock.h"
typedef struct_kernel_flock struct_flock;
typedef struct_kernel_flock64 struct_flock64;
#include MPERS_DEFS
#define SIZEOF_MEMBER(type, member) \
sizeof(((type *) NULL)->member)
#define FLOCK_MEMBERS_EQ(type, member) \
(SIZEOF_MEMBER(struct_kernel_flock64, member) == SIZEOF_MEMBER(type, member) \
&& offsetof(struct_kernel_flock64, member) == offsetof(type, member))
#define FLOCK_STRUCTS_EQ(type) \
(sizeof(struct_kernel_flock64) == sizeof(type) \
&& FLOCK_MEMBERS_EQ(type, l_type) \
&& FLOCK_MEMBERS_EQ(type, l_whence) \
&& FLOCK_MEMBERS_EQ(type, l_start) \
&& FLOCK_MEMBERS_EQ(type, l_len) \
&& FLOCK_MEMBERS_EQ(type, l_pid))
MPERS_PRINTER_DECL(bool, fetch_struct_flock,
struct tcb *tcp, const long addr, void *p)
{
struct_kernel_flock64 *pfl = p;
struct_flock mfl;
if (FLOCK_STRUCTS_EQ(struct_flock))
return !umove_or_printaddr(tcp, addr, pfl);
if (umove_or_printaddr(tcp, addr, &mfl))
return false;
pfl->l_type = mfl.l_type;
pfl->l_whence = mfl.l_whence;
pfl->l_start = mfl.l_start;
pfl->l_len = mfl.l_len;
pfl->l_pid = mfl.l_pid;
return true;
}
MPERS_PRINTER_DECL(bool, fetch_struct_flock64,
struct tcb *tcp, const long addr, void *p)
{
struct_kernel_flock64 *pfl = p;
struct_flock64 mfl;
if (FLOCK_STRUCTS_EQ(struct_flock64))
return !umove_or_printaddr(tcp, addr, pfl);
if (umove_or_printaddr(tcp, addr, &mfl))
return false;
pfl->l_type = mfl.l_type;
pfl->l_whence = mfl.l_whence;
pfl->l_start = mfl.l_start;
pfl->l_len = mfl.l_len;
pfl->l_pid = mfl.l_pid;
return true;
}

121
fetch_struct_statfs.c Normal file
View File

@ -0,0 +1,121 @@
/*
* Copyright (c) 2014-2016 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include DEF_MPERS_TYPE(struct_statfs)
#include DEF_MPERS_TYPE(struct_statfs64)
#include <linux/types.h>
#include <asm/statfs.h>
typedef struct statfs struct_statfs;
typedef struct statfs64 struct_statfs64;
#include MPERS_DEFS
#include "statfs.h"
MPERS_PRINTER_DECL(bool, fetch_struct_statfs,
struct tcb *tcp, const long addr, struct strace_statfs *p)
{
struct_statfs b;
if (umove_or_printaddr(tcp, addr, &b))
return false;
p->f_type = widen_to_ull(b.f_type);
p->f_bsize = widen_to_ull(b.f_bsize);
p->f_blocks = widen_to_ull(b.f_blocks);
p->f_bfree = widen_to_ull(b.f_bfree);
p->f_bavail = widen_to_ull(b.f_bavail);
p->f_files = widen_to_ull(b.f_files);
p->f_ffree = widen_to_ull(b.f_ffree);
#if defined HAVE_STRUCT_STATFS_F_FSID_VAL
p->f_fsid[0] = widen_to_ull(b.f_fsid.val[0]);
p->f_fsid[1] = widen_to_ull(b.f_fsid.val[1]);
#elif defined HAVE_STRUCT_STATFS_F_FSID___VAL
p->f_fsid[0] = widen_to_ull(b.f_fsid.__val[0]);
p->f_fsid[1] = widen_to_ull(b.f_fsid.__val[1]);
#endif
p->f_namelen = widen_to_ull(b.f_namelen);
#ifdef HAVE_STRUCT_STATFS_F_FRSIZE
p->f_frsize = widen_to_ull(b.f_frsize);
#endif
#ifdef HAVE_STRUCT_STATFS_F_FLAGS
p->f_flags = widen_to_ull(b.f_flags);
#endif
return true;
}
#if defined ARM || (defined AARCH64 && defined IN_MPERS)
/* See arch/arm/kernel/sys_oabi-compat.c for details. */
# define COMPAT_STATFS64_PADDED_SIZE (sizeof(struct_statfs64) + 4)
#endif
MPERS_PRINTER_DECL(bool, fetch_struct_statfs64,
struct tcb *tcp, const long addr, const unsigned long size,
struct strace_statfs *p)
{
struct_statfs64 b;
if (sizeof(b) != size
#ifdef COMPAT_STATFS64_PADDED_SIZE
&& sizeof(b) != COMPAT_STATFS64_PADDED_SIZE
#endif
) {
printaddr(addr);
return false;
}
if (umove_or_printaddr(tcp, addr, &b))
return false;
p->f_type = widen_to_ull(b.f_type);
p->f_bsize = widen_to_ull(b.f_bsize);
p->f_blocks = widen_to_ull(b.f_blocks);
p->f_bfree = widen_to_ull(b.f_bfree);
p->f_bavail = widen_to_ull(b.f_bavail);
p->f_files = widen_to_ull(b.f_files);
p->f_ffree = widen_to_ull(b.f_ffree);
#if defined HAVE_STRUCT_STATFS64_F_FSID_VAL
p->f_fsid[0] = widen_to_ull(b.f_fsid.val[0]);
p->f_fsid[1] = widen_to_ull(b.f_fsid.val[1]);
#elif defined HAVE_STRUCT_STATFS64_F_FSID___VAL
p->f_fsid[0] = widen_to_ull(b.f_fsid.__val[0]);
p->f_fsid[1] = widen_to_ull(b.f_fsid.__val[1]);
#endif
p->f_namelen = widen_to_ull(b.f_namelen);
#ifdef HAVE_STRUCT_STATFS64_F_FRSIZE
p->f_frsize = widen_to_ull(b.f_frsize);
#endif
#ifdef HAVE_STRUCT_STATFS64_F_FLAGS
p->f_flags = widen_to_ull(b.f_flags);
#endif
return true;
}

146
file.c
View File

@ -47,7 +47,7 @@
#define off_t __kernel_off_t
#define loff_t __kernel_loff_t
#include <asm/stat.h>
#include "asm_stat.h"
#undef dev_t
#undef ino_t
@ -87,6 +87,14 @@
#include "printstat.h"
/* all locally defined structures provide these fields */
#undef HAVE_STRUCT_STAT_ST_ATIME_NSEC
#define HAVE_STRUCT_STAT_ST_ATIME_NSEC 1
#undef HAVE_STRUCT_STAT_ST_CTIME_NSEC
#define HAVE_STRUCT_STAT_ST_CTIME_NSEC 1
#undef HAVE_STRUCT_STAT_ST_MTIME_NSEC
#define HAVE_STRUCT_STAT_ST_MTIME_NSEC 1
#undef STAT32_PERSONALITY
#if SUPPORTED_PERSONALITIES > 1
# if defined AARCH64 || defined X86_64 || defined X32
@ -110,11 +118,7 @@ struct stat32 {
unsigned int __unused4;
unsigned int __unused5;
};
# ifdef AARCH64
# define STAT32_PERSONALITY 0
# else
# define STAT32_PERSONALITY 1
# endif
# define STAT32_PERSONALITY 1
# elif defined POWERPC64
struct stat32 {
unsigned int st_dev;
@ -174,19 +178,6 @@ struct stat32 {
# undef HAVE_STRUCT_STAT_ST_FSTYPE
# undef HAVE_STRUCT_STAT_ST_GEN
# include "printstat.h"
static void
printstat32(struct tcb *tcp, long addr)
{
struct stat32 statbuf;
if (umove(tcp, addr, &statbuf) < 0) {
tprints("{...}");
return;
}
do_printstat32(tcp, &statbuf);
}
#endif /* STAT32_PERSONALITY */
#if defined(SPARC) || defined(SPARC64)
@ -223,20 +214,6 @@ struct solstat {
# undef HAVE_STRUCT_STAT_ST_FSTYPE
# undef HAVE_STRUCT_STAT_ST_GEN
# include "printstat.h"
static void
printstatsol(struct tcb *tcp, long addr)
{
struct solstat statbuf;
if (umove(tcp, addr, &statbuf) < 0) {
tprints("{...}");
return;
}
do_printstat_sol(tcp, &statbuf);
}
#endif /* SPARC || SPARC64 */
static void
@ -244,39 +221,31 @@ printstat(struct tcb *tcp, long addr)
{
struct stat statbuf;
if (!addr) {
tprints("NULL");
return;
}
if (syserror(tcp) || !verbose(tcp)) {
tprintf("%#lx", addr);
return;
}
#ifdef STAT32_PERSONALITY
if (current_personality == STAT32_PERSONALITY) {
printstat32(tcp, addr);
struct stat32 statbuf;
if (!umove_or_printaddr(tcp, addr, &statbuf))
do_printstat32(tcp, &statbuf);
return;
}
#endif
#if defined(SPARC) || defined(SPARC64)
if (current_personality == 1) {
printstatsol(tcp, addr);
struct solstat statbuf;
if (!umove_or_printaddr(tcp, addr, &statbuf))
do_printstat_sol(tcp, &statbuf);
return;
}
#endif /* SPARC || SPARC64 */
if (umove(tcp, addr, &statbuf) < 0) {
tprints("{...}");
return;
}
do_printstat(tcp, &statbuf);
if (!umove_or_printaddr(tcp, addr, &statbuf))
do_printstat(tcp, &statbuf);
}
int
sys_stat(struct tcb *tcp)
SYS_FUNC(stat)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
@ -287,8 +256,7 @@ sys_stat(struct tcb *tcp)
return 0;
}
int
sys_fstat(struct tcb *tcp)
SYS_FUNC(fstat)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
@ -305,7 +273,6 @@ sys_fstat(struct tcb *tcp)
* Linux x86_64 and x32 have unified `struct stat' but their i386 personality
* needs `struct stat64'.
* linux/arch/x86/include/uapi/asm/stat.h defines `struct stat64' only for i386.
* __GNUC__ is needed for the required __attribute__ below.
*
* Similarly, aarch64 has a unified `struct stat' but its arm personality
* needs `struct stat64' (unlike x86, it shouldn't be packed).
@ -332,7 +299,7 @@ struct stat64 {
unsigned long long st_ino;
}
# if defined X86_64 || defined X32
__attribute__((packed))
ATTRIBUTE_PACKED
# define STAT64_SIZE 96
# else
# define STAT64_SIZE 104
@ -362,15 +329,6 @@ printstat64(struct tcb *tcp, long addr)
(void) sizeof(char[sizeof statbuf == STAT64_SIZE ? 1 : -1]);
# endif
if (!addr) {
tprints("NULL");
return;
}
if (syserror(tcp) || !verbose(tcp)) {
tprintf("%#lx", addr);
return;
}
# ifdef STAT32_PERSONALITY
if (current_personality != STAT32_PERSONALITY) {
printstat(tcp, addr);
@ -378,16 +336,11 @@ printstat64(struct tcb *tcp, long addr)
}
# endif /* STAT32_PERSONALITY */
if (umove(tcp, addr, &statbuf) < 0) {
tprints("{...}");
return;
}
do_printstat64(tcp, &statbuf);
if (!umove_or_printaddr(tcp, addr, &statbuf))
do_printstat64(tcp, &statbuf);
}
int
sys_stat64(struct tcb *tcp)
SYS_FUNC(stat64)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
@ -398,8 +351,7 @@ sys_stat64(struct tcb *tcp)
return 0;
}
int
sys_fstat64(struct tcb *tcp)
SYS_FUNC(fstat64)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
@ -412,22 +364,19 @@ sys_fstat64(struct tcb *tcp)
#else
int
sys_stat64(struct tcb *tcp)
SYS_FUNC(stat64)
{
return sys_stat(tcp);
}
int
sys_fstat64(struct tcb *tcp)
SYS_FUNC(fstat64)
{
return sys_fstat(tcp);
}
#endif /* HAVE_STRUCT_STAT64 */
int
sys_newfstatat(struct tcb *tcp)
SYS_FUNC(newfstatat)
{
if (entering(tcp)) {
print_dirfd(tcp, tcp->u_arg[0]);
@ -475,33 +424,23 @@ printoldstat(struct tcb *tcp, long addr)
struct __old_kernel_stat statbuf;
struct stat newstatbuf;
if (!addr) {
tprints("NULL");
return;
}
if (syserror(tcp) || !verbose(tcp)) {
tprintf("%#lx", addr);
return;
}
# if defined(SPARC) || defined(SPARC64)
if (current_personality == 1) {
printstatsol(tcp, addr);
struct solstat statbuf;
if (!umove_or_printaddr(tcp, addr, &statbuf))
do_printstat_sol(tcp, &statbuf);
return;
}
# endif
if (umove(tcp, addr, &statbuf) < 0) {
tprints("{...}");
return;
if (!umove_or_printaddr(tcp, addr, &statbuf)) {
convertoldstat(&statbuf, &newstatbuf);
do_printstat(tcp, &newstatbuf);
}
convertoldstat(&statbuf, &newstatbuf);
do_printstat(tcp, &newstatbuf);
}
int
sys_oldstat(struct tcb *tcp)
SYS_FUNC(oldstat)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
@ -512,8 +451,7 @@ sys_oldstat(struct tcb *tcp)
return 0;
}
int
sys_oldfstat(struct tcb *tcp)
SYS_FUNC(oldfstat)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
@ -528,8 +466,7 @@ sys_oldfstat(struct tcb *tcp)
#if defined(SPARC) || defined(SPARC64)
int
sys_xstat(struct tcb *tcp)
SYS_FUNC(xstat)
{
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
@ -541,8 +478,7 @@ sys_xstat(struct tcb *tcp)
return 0;
}
int
sys_fxstat(struct tcb *tcp)
SYS_FUNC(fxstat)
{
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);

140
file_handle.c Normal file
View File

@ -0,0 +1,140 @@
/*
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#ifndef MAX_HANDLE_SZ
# define MAX_HANDLE_SZ 128
#endif
typedef struct {
unsigned int handle_bytes;
int handle_type;
} file_handle_header;
SYS_FUNC(name_to_handle_at)
{
file_handle_header h;
const long addr = tcp->u_arg[2];
if (entering(tcp)) {
/* dirfd */
print_dirfd(tcp, tcp->u_arg[0]);
/* pathname */
printpath(tcp, tcp->u_arg[1]);
tprints(", ");
/* handle */
if (umove_or_printaddr(tcp, addr, &h)) {
tprints(", ");
/* mount_id */
printaddr(tcp->u_arg[3]);
tprints(", ");
/* flags */
printflags(at_flags, tcp->u_arg[4], "AT_???");
return RVAL_DECODED;
}
tprintf("{handle_bytes=%u", h.handle_bytes);
/*
* Abusing tcp->auxstr as a temporary storage.
* Will be used and cleared on syscall exit.
*/
tcp->auxstr = (void *) (unsigned long) h.handle_bytes;
return 0;
} else {
unsigned int i = (unsigned long) tcp->auxstr;
if ((!syserror(tcp) || EOVERFLOW == tcp->u_error)
&& !umove(tcp, addr, &h)) {
unsigned char f_handle[MAX_HANDLE_SZ];
if (i != h.handle_bytes)
tprintf(" => %u", h.handle_bytes);
if (!syserror(tcp)) {
tprintf(", handle_type=%d", h.handle_type);
if (h.handle_bytes > MAX_HANDLE_SZ)
h.handle_bytes = MAX_HANDLE_SZ;
if (!umoven(tcp, addr + sizeof(h), h.handle_bytes,
f_handle)) {
tprints(", f_handle=0x");
for (i = 0; i < h.handle_bytes; ++i)
tprintf("%02x", f_handle[i]);
}
}
}
tprints("}, ");
tcp->auxstr = NULL;
/* mount_id */
printnum_int(tcp, tcp->u_arg[3], "%d");
tprints(", ");
/* flags */
printflags(at_flags, tcp->u_arg[4], "AT_???");
}
return 0;
}
SYS_FUNC(open_by_handle_at)
{
file_handle_header h;
const long addr = tcp->u_arg[1];
/* mount_fd */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* handle */
if (!umove_or_printaddr(tcp, addr, &h)) {
unsigned char f_handle[MAX_HANDLE_SZ];
tprintf("{handle_bytes=%u, handle_type=%d",
h.handle_bytes, h.handle_type);
if (h.handle_bytes > MAX_HANDLE_SZ)
h.handle_bytes = MAX_HANDLE_SZ;
if (!umoven(tcp, addr + sizeof(h), h.handle_bytes, &f_handle)) {
unsigned int i;
tprints(", f_handle=0x");
for (i = 0; i < h.handle_bytes; ++i)
tprintf("%02x", f_handle[i]);
}
tprints("}");
}
tprints(", ");
/* flags */
tprint_open_modes(tcp->u_arg[2]);
return RVAL_DECODED;
}

248
file_ioctl.c Normal file
View File

@ -0,0 +1,248 @@
/*
* Copyright (c) 2016 Jeff Mahoney <jeffm@suse.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <linux/ioctl.h>
#include <linux/fs.h>
#ifdef HAVE_LINUX_FIEMAP_H
# include <linux/fiemap.h>
# include "xlat/fiemap_flags.h"
# include "xlat/fiemap_extent_flags.h"
#endif
#ifndef FICLONE
# define FICLONE _IOW(0x94, 9, int)
#endif
#ifndef FICLONERANGE
# define FICLONERANGE _IOW(0x94, 13, struct file_clone_range)
struct file_clone_range {
int64_t src_fd;
uint64_t src_offset;
uint64_t src_length;
uint64_t dest_offset;
};
#endif
#ifndef FIDEDUPERANGE
# define FIDEDUPERANGE _IOWR(0x94, 54, struct file_dedupe_range)
struct file_dedupe_range_info {
int64_t dest_fd; /* in - destination file */
uint64_t dest_offset; /* in - start of extent in destination */
uint64_t bytes_deduped; /* out - total # of bytes we were able
* to dedupe from this file. */
/* status of this dedupe operation:
* < 0 for error
* == FILE_DEDUPE_RANGE_SAME if dedupe succeeds
* == FILE_DEDUPE_RANGE_DIFFERS if data differs
*/
int32_t status; /* out - see above description */
uint32_t reserved; /* must be zero */
};
struct file_dedupe_range {
uint64_t src_offset; /* in - start of extent in source */
uint64_t src_length; /* in - length of extent */
uint16_t dest_count; /* in - total elements in info array */
uint16_t reserved1; /* must be zero */
uint32_t reserved2; /* must be zero */
struct file_dedupe_range_info info[0];
};
#endif
static bool
print_file_dedupe_range_info(struct tcb *tcp, void *elem_buf,
size_t elem_size, void *data)
{
const struct file_dedupe_range_info *info = elem_buf;
unsigned int *count = data;
if (count) {
if (*count == 0) {
tprints("...");
return false;
}
--*count;
}
if (entering(tcp)) {
tprints("{dest_fd=");
printfd(tcp, info->dest_fd);
tprintf(", dest_offset=%" PRIu64 "}",
(uint64_t) info->dest_offset);
} else {
tprintf("{bytes_deduped=%" PRIu64 ", status=%d}",
(uint64_t) info->bytes_deduped, info->status);
}
return true;
}
#ifdef HAVE_LINUX_FIEMAP_H
static bool
print_fiemap_extent(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
{
const struct fiemap_extent *fe = elem_buf;
tprintf("{fe_logical=%" PRI__u64
", fe_physical=%" PRI__u64
", fe_length=%" PRI__u64 ", ",
fe->fe_logical, fe->fe_physical, fe->fe_length);
printflags64(fiemap_extent_flags, fe->fe_flags,
"FIEMAP_EXTENT_???");
tprints("}");
return true;
}
#endif /* HAVE_LINUX_FIEMAP_H */
int
file_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
{
switch (code) {
case FICLONE: /* W */
tprintf(", %d", (int) arg);
break;
case FICLONERANGE: { /* W */
struct file_clone_range args;
tprints(", ");
if (umove_or_printaddr(tcp, arg, &args))
break;
tprints("{src_fd=");
printfd(tcp, args.src_fd);
tprintf(", src_offset=%" PRIu64
", src_length=%" PRIu64
", dest_offset=%" PRIu64 "}",
(uint64_t) args.src_offset,
(uint64_t) args.src_length,
(uint64_t) args.dest_offset);
break;
}
case FIDEDUPERANGE: { /* RW */
struct file_dedupe_range args;
struct file_dedupe_range_info info;
unsigned int *limit = NULL;
unsigned int count = 2;
bool rc;
if (entering(tcp))
tprints(", ");
else if (syserror(tcp))
break;
else
tprints(" => ");
if (umove_or_printaddr(tcp, arg, &args))
break;
tprints("{");
if (entering(tcp)) {
tprintf("src_offset=%" PRIu64
", src_length=%" PRIu64
", dest_count=%hu, ",
(uint64_t) args.src_offset,
(uint64_t) args.src_length,
(uint16_t) args.dest_count);
}
tprints("info=");
/* Limit how many elements we print in abbrev mode. */
if (abbrev(tcp) && args.dest_count > count)
limit = &count;
rc = print_array(tcp, arg + offsetof(typeof(args), info),
args.dest_count, &info, sizeof(info),
umoven_or_printaddr,
print_file_dedupe_range_info, limit);
tprints("}");
if (!rc || exiting(tcp))
break;
return 0;
}
#ifdef HAVE_LINUX_FIEMAP_H
case FS_IOC_FIEMAP: {
struct fiemap args;
if (entering(tcp))
tprints(", ");
else if (syserror(tcp))
break;
else
tprints(" => ");
if (umove_or_printaddr(tcp, arg, &args))
break;
if (entering(tcp)) {
tprintf("{fm_start=%" PRI__u64 ", "
"fm_length=%" PRI__u64 ", "
"fm_flags=",
args.fm_start, args.fm_length);
printflags64(fiemap_flags, args.fm_flags,
"FIEMAP_FLAG_???");
tprintf(", fm_extent_count=%u}", args.fm_extent_count);
return 0;
}
tprints("{fm_flags=");
printflags64(fiemap_flags, args.fm_flags,
"FIEMAP_FLAG_???");
tprintf(", fm_mapped_extents=%u",
args.fm_mapped_extents);
tprints(", fm_extents=");
if (abbrev(tcp)) {
tprints("...");
} else {
struct fiemap_extent fe;
print_array(tcp,
arg + offsetof(typeof(args), fm_extents),
args.fm_mapped_extents, &fe, sizeof(fe),
umoven_or_printaddr,
print_fiemap_extent, 0);
}
tprints("}");
break;
}
#endif /* HAVE_LINUX_FIEMAP_H */
default:
return RVAL_DECODED;
};
return RVAL_DECODED | 1;
}

43
flock.c Normal file
View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <sys/file.h>
#include "xlat/flockcmds.h"
SYS_FUNC(flock)
{
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printflags(flockcmds, tcp->u_arg[1], "LOCK_???");
return RVAL_DECODED;
}

44
flock.h Normal file
View File

@ -0,0 +1,44 @@
/*
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <linux/fcntl.h>
#if defined HAVE_STRUCT_FLOCK
typedef struct flock struct_kernel_flock;
#elif defined HAVE_STRUCT___KERNEL_FLOCK
typedef struct __kernel_flock struct_kernel_flock;
#else
# error struct flock definition not found in <linux/fcntl.h>
#endif
#if defined HAVE_STRUCT_FLOCK64
typedef struct flock64 struct_kernel_flock64;
#elif defined HAVE_STRUCT___KERNEL_FLOCK64
typedef struct __kernel_flock64 struct_kernel_flock64;
#else
# error struct flock64 definition not found in <linux/fcntl.h>
#endif

65
fs_x_ioctl.c Normal file
View File

@ -0,0 +1,65 @@
/*
* Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
* Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <linux/fs.h>
int
fs_x_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
{
switch (code) {
#ifdef FITRIM
/* First seen in linux-2.6.37 */
case FITRIM: {
struct fstrim_range fstrim;
tprints(", ");
if (!umove_or_printaddr(tcp, arg, &fstrim))
tprintf("{start=%#" PRIx64
", len=%#" PRIx64
", minlen=%#" PRIx64 "}",
(uint64_t) fstrim.start,
(uint64_t) fstrim.len,
(uint64_t) fstrim.minlen);
break;
}
#endif
/* No arguments */
#ifdef FIFREEZE
case FIFREEZE:
case FITHAW:
break;
#endif
default:
return RVAL_DECODED;
}
return RVAL_DECODED | 1;
}

12
fstatfs.c Normal file
View File

@ -0,0 +1,12 @@
#include "defs.h"
SYS_FUNC(fstatfs)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
} else {
print_struct_statfs(tcp, tcp->u_arg[1]);
}
return 0;
}

14
fstatfs64.c Normal file
View File

@ -0,0 +1,14 @@
#include "defs.h"
SYS_FUNC(fstatfs64)
{
const unsigned long size = tcp->u_arg[1];
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprintf(", %lu, ", size);
} else {
print_struct_statfs64(tcp, tcp->u_arg[2], size);
}
return 0;
}

217
futex.c
View File

@ -1,139 +1,116 @@
/*
* Copyright (c) 2002-2003 Roland McGrath <roland@redhat.com>
* Copyright (c) 2007-2008 Ulrich Drepper <drepper@redhat.com>
* Copyright (c) 2009 Andreas Schwab <schwab@redhat.com>
* Copyright (c) 2014-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#ifdef HAVE_LINUX_FUTEX_H
# include <linux/futex.h>
#endif
#ifndef FUTEX_WAIT
# define FUTEX_WAIT 0
#endif
#ifndef FUTEX_WAKE
# define FUTEX_WAKE 1
#endif
#ifndef FUTEX_FD
# define FUTEX_FD 2
#endif
#ifndef FUTEX_REQUEUE
# define FUTEX_REQUEUE 3
#endif
#ifndef FUTEX_CMP_REQUEUE
# define FUTEX_CMP_REQUEUE 4
#endif
#ifndef FUTEX_WAKE_OP
# define FUTEX_WAKE_OP 5
#endif
#ifndef FUTEX_LOCK_PI
# define FUTEX_LOCK_PI 6
# define FUTEX_UNLOCK_PI 7
# define FUTEX_TRYLOCK_PI 8
#endif
#ifndef FUTEX_WAIT_BITSET
# define FUTEX_WAIT_BITSET 9
#endif
#ifndef FUTEX_WAKE_BITSET
# define FUTEX_WAKE_BITSET 10
#endif
#ifndef FUTEX_WAIT_REQUEUE_PI
# define FUTEX_WAIT_REQUEUE_PI 11
#endif
#ifndef FUTEX_CMP_REQUEUE_PI
# define FUTEX_CMP_REQUEUE_PI 12
#endif
#ifndef FUTEX_PRIVATE_FLAG
# define FUTEX_PRIVATE_FLAG 128
#endif
#ifndef FUTEX_CLOCK_REALTIME
# define FUTEX_CLOCK_REALTIME 256
#endif
#ifndef FUTEX_WAIT_PRIVATE
# define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_WAKE_PRIVATE
# define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_REQUEUE_PRIVATE
# define FUTEX_REQUEUE_PRIVATE (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_CMP_REQUEUE_PRIVATE
# define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_WAKE_OP_PRIVATE
# define FUTEX_WAKE_OP_PRIVATE (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_LOCK_PI_PRIVATE
# define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_UNLOCK_PI_PRIVATE
# define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_TRYLOCK_PI_PRIVATE
# define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_WAIT_BITSET_PRIVATE
# define FUTEX_WAIT_BITSET_PRIVATE (FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_WAKE_BITSET_PRIVATE
# define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_WAIT_REQUEUE_PI_PRIVATE
# define FUTEX_WAIT_REQUEUE_PI_PRIVATE (FUTEX_WAIT_REQUEUE_PI | FUTEX_PRIVATE_FLAG)
#endif
#ifndef FUTEX_CMP_REQUEUE_PI_PRIVATE
# define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | FUTEX_PRIVATE_FLAG)
#endif
#include "xlat/futexops.h"
#ifndef FUTEX_OP_SET
# define FUTEX_OP_SET 0
# define FUTEX_OP_ADD 1
# define FUTEX_OP_OR 2
# define FUTEX_OP_ANDN 3
# define FUTEX_OP_XOR 4
# define FUTEX_OP_CMP_EQ 0
# define FUTEX_OP_CMP_NE 1
# define FUTEX_OP_CMP_LT 2
# define FUTEX_OP_CMP_LE 3
# define FUTEX_OP_CMP_GT 4
# define FUTEX_OP_CMP_GE 5
#endif
#include "xlat/futexwakeops.h"
#include "xlat/futexwakecmps.h"
int
sys_futex(struct tcb *tcp)
SYS_FUNC(futex)
{
if (entering(tcp)) {
long int cmd = tcp->u_arg[1] & 127;
tprintf("%p, ", (void *) tcp->u_arg[0]);
printxval(futexops, tcp->u_arg[1], "FUTEX_???");
tprintf(", %ld", tcp->u_arg[2]);
if (cmd == FUTEX_WAKE_BITSET)
tprintf(", %lx", tcp->u_arg[5]);
else if (cmd == FUTEX_WAIT) {
tprints(", ");
printtv(tcp, tcp->u_arg[3]);
} else if (cmd == FUTEX_WAIT_BITSET) {
tprints(", ");
printtv(tcp, tcp->u_arg[3]);
tprintf(", %lx", tcp->u_arg[5]);
} else if (cmd == FUTEX_REQUEUE)
tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI)
tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
else if (cmd == FUTEX_WAKE_OP) {
tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
if ((tcp->u_arg[5] >> 28) & 8)
tprints("FUTEX_OP_OPARG_SHIFT|");
printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
if ((tcp->u_arg[5] >> 24) & 8)
tprints("FUTEX_OP_OPARG_SHIFT|");
printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
} else if (cmd == FUTEX_WAIT_REQUEUE_PI) {
tprints(", ");
printtv(tcp, tcp->u_arg[3]);
tprintf(", %p", (void *) tcp->u_arg[4]);
}
const long uaddr = tcp->u_arg[0];
const int op = tcp->u_arg[1];
const int cmd = op & 127;
const long timeout = tcp->u_arg[3];
const long uaddr2 = tcp->u_arg[4];
const unsigned int val = tcp->u_arg[2];
const unsigned int val2 = tcp->u_arg[3];
const unsigned int val3 = tcp->u_arg[5];
printaddr(uaddr);
tprints(", ");
printxval(futexops, op, "FUTEX_???");
tprintf(", %u", val);
switch (cmd) {
case FUTEX_WAIT:
case FUTEX_LOCK_PI:
tprints(", ");
print_timespec(tcp, timeout);
break;
case FUTEX_WAIT_BITSET:
tprints(", ");
print_timespec(tcp, timeout);
tprintf(", %x", val3);
break;
case FUTEX_WAKE_BITSET:
tprintf(", %x", val3);
break;
case FUTEX_REQUEUE:
tprintf(", %u, ", val2);
printaddr(uaddr2);
break;
case FUTEX_CMP_REQUEUE:
case FUTEX_CMP_REQUEUE_PI:
tprintf(", %u, ", val2);
printaddr(uaddr2);
tprintf(", %u", val3);
break;
case FUTEX_WAKE_OP:
tprintf(", %u, ", val2);
printaddr(uaddr2);
tprints(", {");
if ((val3 >> 28) & 8)
tprints("FUTEX_OP_OPARG_SHIFT|");
printxval(futexwakeops, (val3 >> 28) & 0x7, "FUTEX_OP_???");
tprintf(", %u, ", (val3 >> 12) & 0xfff);
if ((val3 >> 24) & 8)
tprints("FUTEX_OP_OPARG_SHIFT|");
printxval(futexwakecmps, (val3 >> 24) & 0x7, "FUTEX_OP_CMP_???");
tprintf(", %u}", val3 & 0xfff);
break;
case FUTEX_WAIT_REQUEUE_PI:
tprints(", ");
print_timespec(tcp, timeout);
tprints(", ");
printaddr(uaddr2);
break;
case FUTEX_WAKE:
case FUTEX_UNLOCK_PI:
case FUTEX_TRYLOCK_PI:
break;
default:
tprintf(", %lx, %lx, %x", timeout, uaddr2, val3);
break;
}
return 0;
return RVAL_DECODED;
}

79
gcc_compat.h Normal file
View File

@ -0,0 +1,79 @@
/*
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef GCC_COMPAT_H_
#define GCC_COMPAT_H_
#if defined __GNUC__ && defined __GNUC_MINOR__
# define GNUC_PREREQ(maj, min) \
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
#else
# define __attribute__(x) /* empty */
# define GNUC_PREREQ(maj, min) 0
#endif
#if GNUC_PREREQ(2, 5)
# define ATTRIBUTE_NORETURN __attribute__((__noreturn__))
#else
# define ATTRIBUTE_NORETURN /* empty */
#endif
#if GNUC_PREREQ(2, 7)
# define ATTRIBUTE_FORMAT(args) __attribute__((__format__ args))
# define ATTRIBUTE_ALIGNED(arg) __attribute__((__aligned__(arg)))
# define ATTRIBUTE_PACKED __attribute__((__packed__))
#else
# define ATTRIBUTE_FORMAT(args) /* empty */
# define ATTRIBUTE_ALIGNED(arg) /* empty */
# define ATTRIBUTE_PACKED /* empty */
#endif
#if GNUC_PREREQ(3, 0)
# define ATTRIBUTE_MALLOC __attribute__((__malloc__))
#else
# define ATTRIBUTE_MALLOC /* empty */
#endif
#if GNUC_PREREQ(3, 1)
# define ATTRIBUTE_NOINLINE __attribute__((__noinline__))
#else
# define ATTRIBUTE_NOINLINE /* empty */
#endif
#if GNUC_PREREQ(4, 0)
# define ATTRIBUTE_SENTINEL __attribute__((__sentinel__))
#else
# define ATTRIBUTE_SENTINEL /* empty */
#endif
#if GNUC_PREREQ(4, 3)
# define ATTRIBUTE_ALLOC_SIZE(args) __attribute__((__alloc_size__ args))
#else
# define ATTRIBUTE_ALLOC_SIZE(args) /* empty */
#endif
#endif

13
generate_mpers_am.sh Executable file
View File

@ -0,0 +1,13 @@
#!/bin/sh -e
list="$(sed -n '/^strace_SOURCES[[:space:]]*=/,/^[[:space:]]*# end of strace_SOURCES/ s/^[[:space:]]*\([[:alnum:]][^.]*\.c\)[[:space:]]*\\$/\1/p' Makefile.am |
xargs -r grep -lx '#[[:space:]]*include[[:space:]]\+MPERS_DEFS' |
tr '\n' ' ')"
cat > mpers.am <<EOF
# Generated by $0; do not edit.
mpers_source_files = $list
EOF
sed -n 's/^#[[:space:]]*include[[:space:]]*"xlat\/\([^."]\+\)\.h".*/extern const struct xlat \1[];/p' \
$list > mpers_xlat.h

8
generate_sen.sh Executable file
View File

@ -0,0 +1,8 @@
#!/bin/sh -e
echo 'enum {'
echo 'SEN_printargs = 0,'
sed -n '/printargs/! s/.*SEN(\([^)]*\)).*/\1/p' |
sort -u |
sed 's/.*/SEN_&,/'
echo '};'

View File

@ -1,29 +1,40 @@
/*
* Copyright (c) 2012-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
int
sys_get_robust_list(struct tcb *tcp)
SYS_FUNC(get_robust_list)
{
if (entering(tcp)) {
tprintf("%ld, ", (long) (pid_t) tcp->u_arg[0]);
tprintf("%d, ", (int) tcp->u_arg[0]);
} else {
void *addr;
size_t len;
if (syserror(tcp) ||
!tcp->u_arg[1] ||
umove(tcp, tcp->u_arg[1], &addr) < 0) {
tprintf("%#lx, ", tcp->u_arg[1]);
} else {
tprintf("[%p], ", addr);
}
if (syserror(tcp) ||
!tcp->u_arg[2] ||
umove(tcp, tcp->u_arg[2], &len) < 0) {
tprintf("%#lx", tcp->u_arg[2]);
} else {
tprintf("[%lu]", (unsigned long) len);
}
printnum_ptr(tcp, tcp->u_arg[1]);
tprints(", ");
printnum_ulong(tcp, tcp->u_arg[2]);
}
return 0;
}

View File

@ -1,23 +1,13 @@
#include "defs.h"
int
sys_getcpu(struct tcb *tcp)
SYS_FUNC(getcpu)
{
if (exiting(tcp)) {
unsigned u;
if (tcp->u_arg[0] == 0)
tprints("NULL, ");
else if (umove(tcp, tcp->u_arg[0], &u) < 0)
tprintf("%#lx, ", tcp->u_arg[0]);
else
tprintf("[%u], ", u);
if (tcp->u_arg[1] == 0)
tprints("NULL, ");
else if (umove(tcp, tcp->u_arg[1], &u) < 0)
tprintf("%#lx, ", tcp->u_arg[1]);
else
tprintf("[%u], ", u);
tprintf("%#lx", tcp->u_arg[2]);
printnum_int(tcp, tcp->u_arg[0], "%u");
tprints(", ");
printnum_int(tcp, tcp->u_arg[1], "%u");
tprints(", ");
printaddr(tcp->u_arg[2]);
}
return 0;
}

View File

@ -1,11 +1,10 @@
#include "defs.h"
int
sys_getcwd(struct tcb *tcp)
SYS_FUNC(getcwd)
{
if (exiting(tcp)) {
if (syserror(tcp))
tprintf("%#lx", tcp->u_arg[0]);
printaddr(tcp->u_arg[0]);
else
printpathn(tcp, tcp->u_arg[0], tcp->u_rval - 1);
tprintf(", %lu", tcp->u_arg[1]);

View File

@ -1,12 +1,11 @@
#include "defs.h"
#include "xlat/getrandom_flags.h"
int
sys_getrandom(struct tcb *tcp)
SYS_FUNC(getrandom)
{
if (exiting(tcp)) {
if (syserror(tcp))
tprintf("%#lx", tcp->u_arg[0]);
printaddr(tcp->u_arg[0]);
else
printstr(tcp, tcp->u_arg[0], tcp->u_rval);
tprintf(", %lu, ", tcp->u_arg[1]);

64
hdio.c Normal file
View File

@ -0,0 +1,64 @@
/*
* Copyright (c) 2009, 2010 Jeff Mahoney <jeffm@suse.com>
* Copyright (c) 2011-2016 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include DEF_MPERS_TYPE(struct_hd_geometry)
#include <linux/hdreg.h>
typedef struct hd_geometry struct_hd_geometry;
#include MPERS_DEFS
MPERS_PRINTER_DECL(int, hdio_ioctl, struct tcb *tcp,
const unsigned int code, const long arg)
{
switch (code) {
case HDIO_GETGEO:
if (entering(tcp))
return 0;
else {
struct_hd_geometry geo;
tprints(", ");
if (!umove_or_printaddr(tcp, arg, &geo))
tprintf("{heads=%u, sectors=%u, "
"cylinders=%hu, start=%lu}",
(unsigned) geo.heads,
(unsigned) geo.sectors,
geo.cylinders,
(unsigned long) geo.start);
}
break;
default:
return RVAL_DECODED;
}
return RVAL_DECODED | 1;
}

View File

@ -1,22 +1,19 @@
#include "defs.h"
int
sys_sethostname(struct tcb *tcp)
SYS_FUNC(sethostname)
{
if (entering(tcp)) {
printstr(tcp, tcp->u_arg[0], tcp->u_arg[1]);
tprintf(", %lu", tcp->u_arg[1]);
}
return 0;
printstr(tcp, tcp->u_arg[0], tcp->u_arg[1]);
tprintf(", %lu", tcp->u_arg[1]);
return RVAL_DECODED;
}
#if defined(ALPHA)
int
sys_gethostname(struct tcb *tcp)
SYS_FUNC(gethostname)
{
if (exiting(tcp)) {
if (syserror(tcp))
tprintf("%#lx", tcp->u_arg[0]);
printaddr(tcp->u_arg[0]);
else
printstr(tcp, tcp->u_arg[0], -1);
tprintf(", %lu", tcp->u_arg[1]);

View File

@ -1,41 +1,64 @@
/*
* Copyright (c) 2006 Bernhard Kaindl <bk@suse.de>
* Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <fcntl.h>
#include "xlat/inotify_flags.h"
#include "xlat/inotify_init_flags.h"
int
sys_inotify_add_watch(struct tcb *tcp)
SYS_FUNC(inotify_add_watch)
{
if (entering(tcp)) {
/* file descriptor */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* pathname */
printpath(tcp, tcp->u_arg[1]);
tprints(", ");
/* mask */
printflags(inotify_flags, tcp->u_arg[2], "IN_???");
}
return 0;
/* file descriptor */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* pathname */
printpath(tcp, tcp->u_arg[1]);
tprints(", ");
/* mask */
printflags(inotify_flags, tcp->u_arg[2], "IN_???");
return RVAL_DECODED;
}
int
sys_inotify_rm_watch(struct tcb *tcp)
SYS_FUNC(inotify_rm_watch)
{
if (entering(tcp)) {
/* file descriptor */
printfd(tcp, tcp->u_arg[0]);
/* watch descriptor */
tprintf(", %d", (int) tcp->u_arg[1]);
}
return 0;
/* file descriptor */
printfd(tcp, tcp->u_arg[0]);
/* watch descriptor */
tprintf(", %d", (int) tcp->u_arg[1]);
return RVAL_DECODED;
}
int
sys_inotify_init1(struct tcb *tcp)
SYS_FUNC(inotify_init1)
{
if (entering(tcp))
printflags(inotify_init_flags, tcp->u_arg[0], "IN_???");
return 0;
printflags(inotify_init_flags, tcp->u_arg[0], "IN_???");
return RVAL_DECODED | RVAL_FD;
}

421
io.c
View File

@ -32,15 +32,14 @@
#include <fcntl.h>
#include <sys/uio.h>
int
sys_read(struct tcb *tcp)
SYS_FUNC(read)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
} else {
if (syserror(tcp))
tprintf("%#lx", tcp->u_arg[1]);
printaddr(tcp->u_arg[1]);
else
printstr(tcp, tcp->u_arg[1], tcp->u_rval);
tprintf(", %lu", tcp->u_arg[2]);
@ -48,16 +47,51 @@ sys_read(struct tcb *tcp)
return 0;
}
int
sys_write(struct tcb *tcp)
SYS_FUNC(write)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
tprintf(", %lu", tcp->u_arg[2]);
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
tprintf(", %lu", tcp->u_arg[2]);
return RVAL_DECODED;
}
struct print_iovec_config {
int decode_iov;
unsigned long data_size;
};
static bool
print_iovec(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
{
const unsigned long *iov;
unsigned long iov_buf[2];
struct print_iovec_config *c = data;
if (elem_size < sizeof(iov_buf)) {
iov_buf[0] = ((unsigned int *) elem_buf)[0];
iov_buf[1] = ((unsigned int *) elem_buf)[1];
iov = iov_buf;
} else {
iov = elem_buf;
}
return 0;
tprints("{");
if (c->decode_iov) {
unsigned long len = iov[1];
if (len > c->data_size)
len = c->data_size;
c->data_size -= len;
printstr(tcp, iov[0], len);
} else {
printaddr(iov[0]);
}
tprintf(", %lu}", iov[1]);
return true;
}
/*
@ -65,75 +99,15 @@ sys_write(struct tcb *tcp)
* Example: recvmsg returing a short read.
*/
void
tprint_iov_upto(struct tcb *tcp, unsigned long len, unsigned long addr, int decode_iov, unsigned long data_size)
tprint_iov_upto(struct tcb *tcp, unsigned long len, unsigned long addr,
int decode_iov, unsigned long data_size)
{
#if SUPPORTED_PERSONALITIES > 1
union {
struct { u_int32_t base; u_int32_t len; } iov32;
struct { u_int64_t base; u_int64_t len; } iov64;
} iov;
#define sizeof_iov \
(current_wordsize == 4 ? sizeof(iov.iov32) : sizeof(iov.iov64))
#define iov_iov_base \
(current_wordsize == 4 ? (uint64_t) iov.iov32.base : iov.iov64.base)
#define iov_iov_len \
(current_wordsize == 4 ? (uint64_t) iov.iov32.len : iov.iov64.len)
#else
struct iovec iov;
#define sizeof_iov sizeof(iov)
#define iov_iov_base iov.iov_base
#define iov_iov_len iov.iov_len
#endif
unsigned long size, cur, end, abbrev_end;
int failed = 0;
unsigned long iov[2];
struct print_iovec_config config =
{ .decode_iov = decode_iov, .data_size = data_size };
if (!len) {
tprints("[]");
return;
}
size = len * sizeof_iov;
end = addr + size;
if (!verbose(tcp) || size / sizeof_iov != len || end < addr) {
tprintf("%#lx", addr);
return;
}
if (abbrev(tcp)) {
abbrev_end = addr + max_strlen * sizeof_iov;
if (abbrev_end < addr)
abbrev_end = end;
} else {
abbrev_end = end;
}
tprints("[");
for (cur = addr; cur < end; cur += sizeof_iov) {
if (cur > addr)
tprints(", ");
if (cur >= abbrev_end) {
tprints("...");
break;
}
if (umoven(tcp, cur, sizeof_iov, (char *) &iov) < 0) {
tprints("?");
failed = 1;
break;
}
tprints("{");
if (decode_iov) {
unsigned long len = iov_iov_len;
if (len > data_size)
len = data_size;
data_size -= len;
printstr(tcp, (long) iov_iov_base, len);
} else
tprintf("%#lx", (long) iov_iov_base);
tprintf(", %lu}", (unsigned long)iov_iov_len);
}
tprints("]");
if (failed)
tprintf(" %#lx", addr);
#undef sizeof_iov
#undef iov_iov_base
#undef iov_iov_len
print_array(tcp, addr, len, iov, current_wordsize * 2,
umoven_or_printaddr, print_iovec, &config);
}
void
@ -142,34 +116,27 @@ tprint_iov(struct tcb *tcp, unsigned long len, unsigned long addr, int decode_io
tprint_iov_upto(tcp, len, addr, decode_iov, (unsigned long) -1L);
}
int
sys_readv(struct tcb *tcp)
SYS_FUNC(readv)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
} else {
if (syserror(tcp)) {
tprintf("%#lx, %lu",
tcp->u_arg[1], tcp->u_arg[2]);
return 0;
}
tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1], 1,
tcp->u_rval);
tprintf(", %lu", tcp->u_arg[2]);
}
return 0;
}
int
sys_writev(struct tcb *tcp)
SYS_FUNC(writev)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
tprintf(", %lu", tcp->u_arg[2]);
}
return 0;
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
tprintf(", %lu", tcp->u_arg[2]);
return RVAL_DECODED;
}
/* The SH4 ABI does allow long longs in odd-numbered registers, but
@ -183,246 +150,170 @@ sys_writev(struct tcb *tcp)
#define PREAD_OFFSET_ARG 3
#endif
int
sys_pread(struct tcb *tcp)
SYS_FUNC(pread)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
} else {
if (syserror(tcp))
tprintf("%#lx", tcp->u_arg[1]);
printaddr(tcp->u_arg[1]);
else
printstr(tcp, tcp->u_arg[1], tcp->u_rval);
tprintf(", %lu, ", tcp->u_arg[2]);
printllval(tcp, "%llu", PREAD_OFFSET_ARG);
printllval(tcp, "%lld", PREAD_OFFSET_ARG);
}
return 0;
}
int
sys_pwrite(struct tcb *tcp)
SYS_FUNC(pwrite)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
tprintf(", %lu, ", tcp->u_arg[2]);
printllval(tcp, "%llu", PREAD_OFFSET_ARG);
}
return 0;
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
tprintf(", %lu, ", tcp->u_arg[2]);
printllval(tcp, "%lld", PREAD_OFFSET_ARG);
return RVAL_DECODED;
}
static void
print_llu_from_low_high_val(struct tcb *tcp, int arg)
print_lld_from_low_high_val(struct tcb *tcp, int arg)
{
#if SIZEOF_LONG == SIZEOF_LONG_LONG
# if SUPPORTED_PERSONALITIES > 1
# ifdef X86_64
if (current_personality != 1)
# else
if (current_wordsize == sizeof(long))
# endif
# endif
tprintf("%lu", (unsigned long) tcp->u_arg[arg]);
tprintf("%ld", tcp->u_arg[arg]);
# if SUPPORTED_PERSONALITIES > 1
else
tprintf("%lu",
tprintf("%ld",
((unsigned long) tcp->u_arg[arg + 1] << current_wordsize * 8)
| (unsigned long) tcp->u_arg[arg]);
# endif
#else
# ifdef X32
if (current_personality == 0)
tprintf("%llu", (unsigned long long) tcp->ext_arg[arg]);
tprintf("%lld", tcp->ext_arg[arg]);
else
# endif
tprintf("%llu",
((unsigned long long) (unsigned long) tcp->u_arg[arg + 1] << sizeof(long) * 8)
| (unsigned long long) (unsigned long) tcp->u_arg[arg]);
tprintf("%lld",
(widen_to_ull(tcp->u_arg[arg + 1]) << sizeof(long) * 8)
| widen_to_ull(tcp->u_arg[arg]));
#endif
}
int
sys_preadv(struct tcb *tcp)
#include "xlat/rwf_flags.h"
static int
do_preadv(struct tcb *tcp, const int flags_arg)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
} else {
if (syserror(tcp)) {
tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
return 0;
tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1], 1,
tcp->u_rval);
tprintf(", %lu, ", tcp->u_arg[2]);
print_lld_from_low_high_val(tcp, 3);
if (flags_arg >= 0) {
tprints(", ");
printflags(rwf_flags, tcp->u_arg[flags_arg], "RWF_???");
}
tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
tprintf(", %lu, ", tcp->u_arg[2]);
print_llu_from_low_high_val(tcp, 3);
}
return 0;
}
int
sys_pwritev(struct tcb *tcp)
SYS_FUNC(preadv)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
tprintf(", %lu, ", tcp->u_arg[2]);
print_llu_from_low_high_val(tcp, 3);
}
return 0;
return do_preadv(tcp, -1);
}
static void
print_off_t(struct tcb *tcp, long addr)
SYS_FUNC(preadv2)
{
unsigned long offset;
if (!addr) {
tprints("NULL");
return;
}
#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
if (current_wordsize == 4) {
uint32_t off;
if (umove(tcp, addr, &off) < 0)
tprintf("%#lx", addr);
else
tprintf("[%u]", off);
} else
#endif
if (umove(tcp, addr, &offset) < 0)
tprintf("%#lx", addr);
else
tprintf("[%lu]", offset);
return do_preadv(tcp, 5);
}
int
sys_sendfile(struct tcb *tcp)
static int
do_pwritev(struct tcb *tcp, const int flags_arg)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
tprintf(", %lu, ", tcp->u_arg[2]);
print_lld_from_low_high_val(tcp, 3);
if (flags_arg >= 0) {
tprints(", ");
printfd(tcp, tcp->u_arg[1]);
tprints(", ");
print_off_t(tcp, tcp->u_arg[2]);
tprintf(", %lu", tcp->u_arg[3]);
printflags(rwf_flags, tcp->u_arg[flags_arg], "RWF_???");
}
return 0;
return RVAL_DECODED;
}
void
print_loff_t(struct tcb *tcp, long addr)
SYS_FUNC(pwritev)
{
loff_t offset;
if (!addr)
tprints("NULL");
else if (umove(tcp, addr, &offset) < 0)
tprintf("%#lx", addr);
else
tprintf("[%llu]", (unsigned long long int) offset);
return do_pwritev(tcp, -1);
}
int
sys_sendfile64(struct tcb *tcp)
SYS_FUNC(pwritev2)
{
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
printfd(tcp, tcp->u_arg[1]);
tprints(", ");
print_loff_t(tcp, tcp->u_arg[2]);
tprintf(", %lu", tcp->u_arg[3]);
}
return 0;
return do_pwritev(tcp, 5);
}
#include "xlat/splice_flags.h"
int
sys_tee(struct tcb *tcp)
SYS_FUNC(tee)
{
if (entering(tcp)) {
/* int fd_in */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* int fd_out */
printfd(tcp, tcp->u_arg[1]);
tprints(", ");
/* size_t len */
tprintf("%lu, ", tcp->u_arg[2]);
/* unsigned int flags */
printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
}
return 0;
/* int fd_in */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* int fd_out */
printfd(tcp, tcp->u_arg[1]);
tprints(", ");
/* size_t len */
tprintf("%lu, ", tcp->u_arg[2]);
/* unsigned int flags */
printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
return RVAL_DECODED;
}
int
sys_splice(struct tcb *tcp)
SYS_FUNC(splice)
{
if (entering(tcp)) {
/* int fd_in */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* loff_t *off_in */
print_loff_t(tcp, tcp->u_arg[1]);
tprints(", ");
/* int fd_out */
printfd(tcp, tcp->u_arg[2]);
tprints(", ");
/* loff_t *off_out */
print_loff_t(tcp, tcp->u_arg[3]);
tprints(", ");
/* size_t len */
tprintf("%lu, ", tcp->u_arg[4]);
/* unsigned int flags */
printflags(splice_flags, tcp->u_arg[5], "SPLICE_F_???");
}
return 0;
/* int fd_in */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* loff_t *off_in */
printnum_int64(tcp, tcp->u_arg[1], "%" PRId64);
tprints(", ");
/* int fd_out */
printfd(tcp, tcp->u_arg[2]);
tprints(", ");
/* loff_t *off_out */
printnum_int64(tcp, tcp->u_arg[3], "%" PRId64);
tprints(", ");
/* size_t len */
tprintf("%lu, ", tcp->u_arg[4]);
/* unsigned int flags */
printflags(splice_flags, tcp->u_arg[5], "SPLICE_F_???");
return RVAL_DECODED;
}
int
sys_vmsplice(struct tcb *tcp)
SYS_FUNC(vmsplice)
{
if (entering(tcp)) {
/* int fd */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* const struct iovec *iov, unsigned long nr_segs */
tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
tprintf(", %lu, ", tcp->u_arg[2]);
/* unsigned int flags */
printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
}
return 0;
}
/* int fd */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* const struct iovec *iov, unsigned long nr_segs */
tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
tprintf(", %lu, ", tcp->u_arg[2]);
/* unsigned int flags */
printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
int
sys_ioctl(struct tcb *tcp)
{
const struct_ioctlent *iop;
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
if (!ioctl_decode_command_number(tcp->u_arg[1])) {
iop = ioctl_lookup(tcp->u_arg[1]);
if (iop) {
tprints(iop->symbol);
while ((iop = ioctl_next_match(iop)))
tprintf(" or %s", iop->symbol);
} else {
ioctl_print_code(tcp->u_arg[1]);
}
}
ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]);
}
else {
int ret = ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]);
if (!ret)
tprintf(", %#lx", tcp->u_arg[2]);
else
return ret - 1;
}
return 0;
return RVAL_DECODED;
}

210
ioctl.c
View File

@ -29,7 +29,7 @@
*/
#include "defs.h"
#include <asm/ioctl.h>
#include <linux/ioctl.h>
#include "xlat/ioctl_dirs.h"
#ifdef HAVE_LINUX_INPUT_H
@ -47,7 +47,7 @@ compare(const void *a, const void *b)
return (code1 > code2) ? 1 : (code1 < code2) ? -1 : 0;
}
const struct_ioctlent *
static const struct_ioctlent *
ioctl_lookup(const unsigned int code)
{
struct_ioctlent *iop;
@ -64,7 +64,7 @@ ioctl_lookup(const unsigned int code)
return iop;
}
const struct_ioctlent *
static const struct_ioctlent *
ioctl_next_match(const struct_ioctlent *iop)
{
const unsigned int code = iop->code;
@ -74,7 +74,7 @@ ioctl_next_match(const struct_ioctlent *iop)
return NULL;
}
void
static void
ioctl_print_code(const unsigned int code)
{
tprints("_IOC(");
@ -84,26 +84,26 @@ ioctl_print_code(const unsigned int code)
}
static int
evdev_decode_number(unsigned int arg)
evdev_decode_number(const unsigned int code)
{
unsigned int nr = _IOC_NR(arg);
const unsigned int nr = _IOC_NR(code);
if (_IOC_DIR(arg) == _IOC_WRITE) {
if (_IOC_DIR(code) == _IOC_WRITE) {
if (nr >= 0xc0 && nr <= 0xc0 + 0x3f) {
tprints("EVIOCSABS(");
printxval(evdev_abs, nr - 0xc0, "EV_???");
printxval(evdev_abs, nr - 0xc0, "ABS_???");
tprints(")");
return 1;
}
}
if (_IOC_DIR(arg) != _IOC_READ)
if (_IOC_DIR(code) != _IOC_READ)
return 0;
if (nr >= 0x20 && nr <= 0x20 + 0x1f) {
tprints("EVIOCGBIT(");
printxval(evdev_ev, nr - 0x20, "EV_???");
tprintf(", %u)", _IOC_SIZE(arg));
tprintf(", %u)", _IOC_SIZE(code));
return 1;
} else if (nr >= 0x40 && nr <= 0x40 + 0x3f) {
tprints("EVIOCGABS(");
@ -114,31 +114,31 @@ evdev_decode_number(unsigned int arg)
switch (_IOC_NR(nr)) {
case 0x06:
tprintf("EVIOCGNAME(%u)", _IOC_SIZE(arg));
tprintf("EVIOCGNAME(%u)", _IOC_SIZE(code));
return 1;
case 0x07:
tprintf("EVIOCGPHYS(%u)", _IOC_SIZE(arg));
tprintf("EVIOCGPHYS(%u)", _IOC_SIZE(code));
return 1;
case 0x08:
tprintf("EVIOCGUNIQ(%u)", _IOC_SIZE(arg));
tprintf("EVIOCGUNIQ(%u)", _IOC_SIZE(code));
return 1;
case 0x09:
tprintf("EVIOCGPROP(%u)", _IOC_SIZE(arg));
tprintf("EVIOCGPROP(%u)", _IOC_SIZE(code));
return 1;
case 0x0a:
tprintf("EVIOCGMTSLOTS(%u)", _IOC_SIZE(arg));
tprintf("EVIOCGMTSLOTS(%u)", _IOC_SIZE(code));
return 1;
case 0x18:
tprintf("EVIOCGKEY(%u)", _IOC_SIZE(arg));
tprintf("EVIOCGKEY(%u)", _IOC_SIZE(code));
return 1;
case 0x19:
tprintf("EVIOCGLED(%u)", _IOC_SIZE(arg));
tprintf("EVIOCGLED(%u)", _IOC_SIZE(code));
return 1;
case 0x1a:
tprintf("EVIOCGSND(%u)", _IOC_SIZE(arg));
tprintf("EVIOCGSND(%u)", _IOC_SIZE(code));
return 1;
case 0x1b:
tprintf("EVIOCGSW(%u)", _IOC_SIZE(arg));
tprintf("EVIOCGSW(%u)", _IOC_SIZE(code));
return 1;
default:
return 0;
@ -146,32 +146,32 @@ evdev_decode_number(unsigned int arg)
}
static int
hiddev_decode_number(unsigned int arg)
hiddev_decode_number(const unsigned int code)
{
if (_IOC_DIR(arg) == _IOC_READ) {
switch (_IOC_NR(arg)) {
if (_IOC_DIR(code) == _IOC_READ) {
switch (_IOC_NR(code)) {
case 0x04:
tprintf("HIDIOCGRAWNAME(%u)", _IOC_SIZE(arg));
tprintf("HIDIOCGRAWNAME(%u)", _IOC_SIZE(code));
return 1;
case 0x05:
tprintf("HIDIOCGRAWPHYS(%u)", _IOC_SIZE(arg));
tprintf("HIDIOCGRAWPHYS(%u)", _IOC_SIZE(code));
return 1;
case 0x06:
tprintf("HIDIOCSFEATURE(%u)", _IOC_SIZE(arg));
tprintf("HIDIOCSFEATURE(%u)", _IOC_SIZE(code));
return 1;
case 0x12:
tprintf("HIDIOCGPHYS(%u)", _IOC_SIZE(arg));
tprintf("HIDIOCGPHYS(%u)", _IOC_SIZE(code));
return 1;
default:
return 0;
}
} else if (_IOC_DIR(arg) == (_IOC_READ | _IOC_WRITE)) {
switch (_IOC_NR(arg)) {
} else if (_IOC_DIR(code) == (_IOC_READ | _IOC_WRITE)) {
switch (_IOC_NR(code)) {
case 0x06:
tprintf("HIDIOCSFEATURE(%u)", _IOC_SIZE(arg));
tprintf("HIDIOCSFEATURE(%u)", _IOC_SIZE(code));
return 1;
case 0x07:
tprintf("HIDIOCGFEATURE(%u)", _IOC_SIZE(arg));
tprintf("HIDIOCGFEATURE(%u)", _IOC_SIZE(code));
return 1;
default:
return 0;
@ -181,38 +181,40 @@ hiddev_decode_number(unsigned int arg)
return 0;
}
int
ioctl_decode_command_number(unsigned int arg)
static int
ioctl_decode_command_number(struct tcb *tcp)
{
switch (_IOC_TYPE(arg)) {
const unsigned int code = tcp->u_arg[1];
switch (_IOC_TYPE(code)) {
case 'E':
return evdev_decode_number(arg);
return evdev_decode_number(code);
case 'H':
return hiddev_decode_number(arg);
return hiddev_decode_number(code);
case 'M':
if (_IOC_DIR(arg) == _IOC_WRITE) {
tprintf("MIXER_WRITE(%u)", _IOC_NR(arg));
if (_IOC_DIR(code) == _IOC_WRITE) {
tprintf("MIXER_WRITE(%u)", _IOC_NR(code));
return 1;
} else if (_IOC_DIR(arg) == _IOC_READ) {
tprintf("MIXER_READ(%u)", _IOC_NR(arg));
} else if (_IOC_DIR(code) == _IOC_READ) {
tprintf("MIXER_READ(%u)", _IOC_NR(code));
return 1;
}
return 0;
case 'U':
if (_IOC_DIR(arg) == _IOC_READ && _IOC_NR(arg) == 0x2c) {
tprintf("UI_GET_SYSNAME(%u)", _IOC_SIZE(arg));
if (_IOC_DIR(code) == _IOC_READ && _IOC_NR(code) == 0x2c) {
tprintf("UI_GET_SYSNAME(%u)", _IOC_SIZE(code));
return 1;
}
return 0;
case 'j':
if (_IOC_DIR(arg) == _IOC_READ && _IOC_NR(arg) == 0x13) {
tprintf("JSIOCGNAME(%u)", _IOC_SIZE(arg));
if (_IOC_DIR(code) == _IOC_READ && _IOC_NR(code) == 0x13) {
tprintf("JSIOCGNAME(%u)", _IOC_SIZE(code));
return 1;
}
return 0;
case 'k':
if (_IOC_DIR(arg) == _IOC_WRITE && _IOC_NR(arg) == 0) {
tprintf("SPI_IOC_MESSAGE(%u)", _IOC_SIZE(arg));
if (_IOC_DIR(code) == _IOC_WRITE && _IOC_NR(code) == 0) {
tprintf("SPI_IOC_MESSAGE(%u)", _IOC_SIZE(code));
return 1;
}
return 0;
@ -221,13 +223,25 @@ ioctl_decode_command_number(unsigned int arg)
}
}
int
ioctl_decode(struct tcb *tcp, unsigned int code, long arg)
static int
ioctl_decode(struct tcb *tcp)
{
const unsigned int code = tcp->u_arg[1];
const long arg = tcp->u_arg[2];
switch (_IOC_TYPE(code)) {
#if defined(ALPHA) || defined(POWERPC)
case 'f': case 't': case 'T':
case 'f': {
int ret = file_ioctl(tcp, code, arg);
if (ret != RVAL_DECODED)
return ret;
}
case 't':
case 'T':
return term_ioctl(tcp, code, arg);
#else /* !ALPHA */
case 'f':
return file_ioctl(tcp, code, arg);
case 0x54:
#endif /* !ALPHA */
return term_ioctl(tcp, code, arg);
@ -236,9 +250,11 @@ ioctl_decode(struct tcb *tcp, unsigned int code, long arg)
case 'p':
return rtc_ioctl(tcp, code, arg);
case 0x03:
return hdio_ioctl(tcp, code, arg);
case 0x12:
case 'X':
return block_ioctl(tcp, code, arg);
case 'X':
return fs_x_ioctl(tcp, code, arg);
#ifdef HAVE_SCSI_SG_H
case 0x22:
return scsi_ioctl(tcp, code, arg);
@ -257,6 +273,14 @@ ioctl_decode(struct tcb *tcp, unsigned int code, long arg)
#ifdef HAVE_LINUX_INPUT_H
case 'E':
return evdev_ioctl(tcp, code, arg);
#endif
#ifdef HAVE_LINUX_USERFAULTFD_H
case 0xaa:
return uffdio_ioctl(tcp, code, arg);
#endif
#ifdef HAVE_LINUX_BTRFS_H
case 0x94:
return btrfs_ioctl(tcp, code, arg);
#endif
default:
break;
@ -264,51 +288,43 @@ ioctl_decode(struct tcb *tcp, unsigned int code, long arg)
return 0;
}
/*
* Registry of ioctl characters, culled from
* @(#)ioccom.h 1.7 89/06/16 SMI; from UCB ioctl.h 7.1 6/4/86
*
* char file where defined notes
* ---- ------------------ -----
* F sun/fbio.h
* G sun/gpio.h
* H vaxif/if_hy.h
* M sundev/mcpcmd.h *overlap*
* M sys/modem.h *overlap*
* S sys/stropts.h
* T sys/termio.h -no overlap-
* T sys/termios.h -no overlap-
* V sundev/mdreg.h
* a vaxuba/adreg.h
* d sun/dkio.h -no overlap with sys/des.h-
* d sys/des.h (possible overlap)
* d vax/dkio.h (possible overlap)
* d vaxuba/rxreg.h (possible overlap)
* f sys/filio.h
* g sunwindow/win_ioctl.h -no overlap-
* g sunwindowdev/winioctl.c !no manifest constant! -no overlap-
* h sundev/hrc_common.h
* i sys/sockio.h *overlap*
* i vaxuba/ikreg.h *overlap*
* k sundev/kbio.h
* m sundev/msio.h (possible overlap)
* m sundev/msreg.h (possible overlap)
* m sys/mtio.h (possible overlap)
* n sun/ndio.h
* p net/nit_buf.h (possible overlap)
* p net/nit_if.h (possible overlap)
* p net/nit_pf.h (possible overlap)
* p sundev/fpareg.h (possible overlap)
* p sys/sockio.h (possible overlap)
* p vaxuba/psreg.h (possible overlap)
* q sun/sqz.h
* r sys/sockio.h
* s sys/sockio.h
* t sys/ttold.h (possible overlap)
* t sys/ttycom.h (possible overlap)
* v sundev/vuid_event.h *overlap*
* v sys/vcmd.h *overlap*
* V linux/videodev2.h
*
* End of Registry
*/
SYS_FUNC(ioctl)
{
const struct_ioctlent *iop;
int ret;
if (entering(tcp)) {
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
ret = ioctl_decode_command_number(tcp);
if (!(ret & IOCTL_NUMBER_STOP_LOOKUP)) {
iop = ioctl_lookup(tcp->u_arg[1]);
if (iop) {
if (ret)
tprints(" or ");
tprints(iop->symbol);
while ((iop = ioctl_next_match(iop)))
tprintf(" or %s", iop->symbol);
} else if (!ret) {
ioctl_print_code(tcp->u_arg[1]);
}
}
ret = ioctl_decode(tcp);
} else {
ret = ioctl_decode(tcp) | RVAL_DECODED;
}
if (ret & RVAL_DECODED) {
ret &= ~RVAL_DECODED;
if (ret)
--ret;
else
tprintf(", %#lx", tcp->u_arg[2]);
ret |= RVAL_DECODED;
} else {
if (ret)
--ret;
}
return ret;
}

View File

@ -33,7 +33,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <asm/ioctl.h>
#include <linux/ioctl.h>
struct ioctlent {
const char *info;

9
ioperm.c Normal file
View File

@ -0,0 +1,9 @@
#include "defs.h"
SYS_FUNC(ioperm)
{
tprintf("%#lx, %#lx, %d",
tcp->u_arg[0], tcp->u_arg[1], (int) tcp->u_arg[2]);
return RVAL_DECODED;
}

8
iopl.c Normal file
View File

@ -0,0 +1,8 @@
#include "defs.h"
SYS_FUNC(iopl)
{
tprintf("%d", (int) tcp->u_arg[0]);
return RVAL_DECODED;
}

View File

@ -1,3 +1,30 @@
/*
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
enum {
@ -24,26 +51,25 @@ enum {
#define IOPRIO_PRIO_DATA(mask) ((mask) & IOPRIO_PRIO_MASK)
static const char *
sprint_ioprio(int ioprio)
sprint_ioprio(unsigned int ioprio)
{
static char outstr[256];
const char *str;
int class, data;
unsigned int class, data;
class = IOPRIO_PRIO_CLASS(ioprio);
data = IOPRIO_PRIO_DATA(ioprio);
str = xlookup(ioprio_class, class);
if (str)
sprintf(outstr, "IOPRIO_PRIO_VALUE(%s,%d)", str, data);
sprintf(outstr, "IOPRIO_PRIO_VALUE(%s, %d)", str, data);
else
sprintf(outstr, "IOPRIO_PRIO_VALUE(%#x /* %s */,%d)",
sprintf(outstr, "IOPRIO_PRIO_VALUE(%#x /* %s */, %d)",
class, "IOPRIO_CLASS_???", data);
return outstr;
}
int
sys_ioprio_get(struct tcb *tcp)
SYS_FUNC(ioprio_get)
{
if (entering(tcp)) {
/* int which */
@ -60,16 +86,14 @@ sys_ioprio_get(struct tcb *tcp)
}
}
int
sys_ioprio_set(struct tcb *tcp)
SYS_FUNC(ioprio_set)
{
if (entering(tcp)) {
/* int which */
printxval(ioprio_who, tcp->u_arg[0], "IOPRIO_WHO_???");
/* int who */
tprintf(", %d, ", (int) tcp->u_arg[1]);
/* int ioprio */
tprints(sprint_ioprio(tcp->u_arg[2]));
}
return 0;
/* int which */
printxval(ioprio_who, tcp->u_arg[0], "IOPRIO_WHO_???");
/* int who */
tprintf(", %d, ", (int) tcp->u_arg[1]);
/* int ioprio */
tprints(sprint_ioprio(tcp->u_arg[2]));
return RVAL_DECODED;
}

455
ipc.c
View File

@ -1,455 +0,0 @@
/*
* Copyright (c) 1993 Ulrich Pegelow <pegelow@moorea.uni-muenster.de>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#ifdef HAVE_MQUEUE_H
# include <mqueue.h>
#endif
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <sys/shm.h>
#ifndef MSG_STAT
#define MSG_STAT 11
#endif
#ifndef MSG_INFO
#define MSG_INFO 12
#endif
#ifndef SHM_STAT
#define SHM_STAT 13
#endif
#ifndef SHM_INFO
#define SHM_INFO 14
#endif
#ifndef SEM_STAT
#define SEM_STAT 18
#endif
#ifndef SEM_INFO
#define SEM_INFO 19
#endif
#if !defined IPC_64
# define IPC_64 0x100
#endif
extern void printsigevent(struct tcb *tcp, long arg);
#include "xlat/msgctl_flags.h"
#include "xlat/semctl_flags.h"
#include "xlat/shmctl_flags.h"
#include "xlat/resource_flags.h"
#include "xlat/shm_resource_flags.h"
#include "xlat/shm_flags.h"
#include "xlat/ipc_msg_flags.h"
#include "xlat/semop_flags.h"
int sys_msgget(struct tcb *tcp)
{
if (entering(tcp)) {
if (tcp->u_arg[0])
tprintf("%#lx, ", tcp->u_arg[0]);
else
tprints("IPC_PRIVATE, ");
if (printflags(resource_flags, tcp->u_arg[1] & ~0777, NULL) != 0)
tprints("|");
tprintf("%#lo", tcp->u_arg[1] & 0777);
}
return 0;
}
#ifdef IPC_64
# define PRINTCTL(flagset, arg, dflt) \
if ((arg) & IPC_64) tprints("IPC_64|"); \
printxval((flagset), (arg) &~ IPC_64, dflt)
#else
# define PRINTCTL printxval
#endif
static int
indirect_ipccall(struct tcb *tcp)
{
return tcp->s_ent->sys_flags & TRACE_INDIRECT_SUBCALL;
}
int sys_msgctl(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%lu, ", tcp->u_arg[0]);
PRINTCTL(msgctl_flags, tcp->u_arg[1], "MSG_???");
tprintf(", %#lx", tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2]);
}
return 0;
}
static void
tprint_msgsnd(struct tcb *tcp, long addr, unsigned long count,
unsigned long flags)
{
long mtype;
if (umove(tcp, addr, &mtype) < 0) {
tprintf("%#lx", addr);
} else {
tprintf("{%lu, ", mtype);
printstr(tcp, addr + sizeof(mtype), count);
tprints("}");
}
tprintf(", %lu, ", count);
printflags(ipc_msg_flags, flags, "MSG_???");
}
int sys_msgsnd(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%d, ", (int) tcp->u_arg[0]);
if (indirect_ipccall(tcp)) {
tprint_msgsnd(tcp, tcp->u_arg[3], tcp->u_arg[1],
tcp->u_arg[2]);
} else {
tprint_msgsnd(tcp, tcp->u_arg[1], tcp->u_arg[2],
tcp->u_arg[3]);
}
}
return 0;
}
static void
tprint_msgrcv(struct tcb *tcp, long addr, unsigned long count, long msgtyp)
{
long mtype;
if (syserror(tcp) || umove(tcp, addr, &mtype) < 0) {
tprintf("%#lx", addr);
} else {
tprintf("{%lu, ", mtype);
printstr(tcp, addr + sizeof(mtype), count);
tprints("}");
}
tprintf(", %lu, %ld, ", count, msgtyp);
}
int sys_msgrcv(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%d, ", (int) tcp->u_arg[0]);
} else {
if (indirect_ipccall(tcp)) {
struct ipc_wrapper {
struct msgbuf *msgp;
long msgtyp;
} tmp;
if (umove(tcp, tcp->u_arg[3], &tmp) < 0) {
tprintf("%#lx, %lu, ",
tcp->u_arg[3], tcp->u_arg[1]);
} else {
tprint_msgrcv(tcp, (long) tmp.msgp,
tcp->u_arg[1], tmp.msgtyp);
}
printflags(ipc_msg_flags, tcp->u_arg[2], "MSG_???");
} else {
tprint_msgrcv(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3]);
printflags(ipc_msg_flags, tcp->u_arg[4], "MSG_???");
}
}
return 0;
}
static void
tprint_sembuf(struct tcb *tcp, long addr, unsigned long count)
{
unsigned long i, max_count;
if (abbrev(tcp))
max_count = (max_strlen < count) ? max_strlen : count;
else
max_count = count;
if (!max_count) {
tprintf("%#lx, %lu", addr, count);
return;
}
for (i = 0; i < max_count; ++i) {
struct sembuf sb;
if (i)
tprints(", ");
if (umove(tcp, addr + i * sizeof(struct sembuf), &sb) < 0) {
if (i) {
tprints("{???}");
break;
} else {
tprintf("%#lx, %lu", addr, count);
return;
}
} else {
if (!i)
tprints("{");
tprintf("{%u, %d, ", sb.sem_num, sb.sem_op);
printflags(semop_flags, sb.sem_flg, "SEM_???");
tprints("}");
}
}
if (i < max_count || max_count < count)
tprints(", ...");
tprintf("}, %lu", count);
}
int sys_semop(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%lu, ", tcp->u_arg[0]);
if (indirect_ipccall(tcp)) {
tprint_sembuf(tcp, tcp->u_arg[3], tcp->u_arg[1]);
} else {
tprint_sembuf(tcp, tcp->u_arg[1], tcp->u_arg[2]);
}
}
return 0;
}
int sys_semtimedop(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%lu, ", tcp->u_arg[0]);
if (indirect_ipccall(tcp)) {
tprint_sembuf(tcp, tcp->u_arg[3], tcp->u_arg[1]);
tprints(", ");
#if defined(S390) || defined(S390X)
printtv(tcp, tcp->u_arg[2]);
#else
printtv(tcp, tcp->u_arg[4]);
#endif
} else {
tprint_sembuf(tcp, tcp->u_arg[1], tcp->u_arg[2]);
tprints(", ");
printtv(tcp, tcp->u_arg[3]);
}
}
return 0;
}
int sys_semget(struct tcb *tcp)
{
if (entering(tcp)) {
if (tcp->u_arg[0])
tprintf("%#lx", tcp->u_arg[0]);
else
tprints("IPC_PRIVATE");
tprintf(", %lu, ", tcp->u_arg[1]);
if (printflags(resource_flags, tcp->u_arg[2] & ~0777, NULL) != 0)
tprints("|");
tprintf("%#lo", tcp->u_arg[2] & 0777);
}
return 0;
}
int sys_semctl(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
PRINTCTL(semctl_flags, tcp->u_arg[2], "SEM_???");
tprintf(", %#lx", tcp->u_arg[3]);
}
return 0;
}
int sys_shmget(struct tcb *tcp)
{
if (entering(tcp)) {
if (tcp->u_arg[0])
tprintf("%#lx", tcp->u_arg[0]);
else
tprints("IPC_PRIVATE");
tprintf(", %lu, ", tcp->u_arg[1]);
if (printflags(shm_resource_flags, tcp->u_arg[2] & ~0777, NULL) != 0)
tprints("|");
tprintf("%#lo", tcp->u_arg[2] & 0777);
}
return 0;
}
int sys_shmctl(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%lu, ", tcp->u_arg[0]);
PRINTCTL(shmctl_flags, tcp->u_arg[1], "SHM_???");
if (indirect_ipccall(tcp)) {
tprintf(", %#lx", tcp->u_arg[3]);
} else {
tprintf(", %#lx", tcp->u_arg[2]);
}
}
return 0;
}
int sys_shmat(struct tcb *tcp)
{
if (exiting(tcp)) {
tprintf("%lu", tcp->u_arg[0]);
if (indirect_ipccall(tcp)) {
tprintf(", %#lx, ", tcp->u_arg[3]);
printflags(shm_flags, tcp->u_arg[1], "SHM_???");
} else {
tprintf(", %#lx, ", tcp->u_arg[1]);
printflags(shm_flags, tcp->u_arg[2], "SHM_???");
}
if (syserror(tcp))
return 0;
if (indirect_ipccall(tcp)) {
unsigned long raddr;
if (umove(tcp, tcp->u_arg[2], &raddr) < 0)
return RVAL_NONE;
tcp->u_rval = raddr;
}
return RVAL_HEX;
}
return 0;
}
int sys_shmdt(struct tcb *tcp)
{
if (entering(tcp)) {
if (indirect_ipccall(tcp)) {
tprintf("%#lx", tcp->u_arg[3]);
} else {
tprintf("%#lx", tcp->u_arg[0]);
}
}
return 0;
}
int
sys_mq_open(struct tcb *tcp)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
tprints(", ");
/* flags */
tprint_open_modes(tcp->u_arg[1]);
if (tcp->u_arg[1] & O_CREAT) {
# ifndef HAVE_MQUEUE_H
tprintf(", %lx", tcp->u_arg[2]);
# else
struct mq_attr attr;
/* mode */
tprintf(", %#lo, ", tcp->u_arg[2]);
if (umove(tcp, tcp->u_arg[3], &attr) < 0)
tprints("{???}");
else
tprintf("{mq_maxmsg=%ld, mq_msgsize=%ld}",
(long) attr.mq_maxmsg,
(long) attr.mq_msgsize);
# endif
}
}
return 0;
}
int
sys_mq_timedsend(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
tprintf(", %lu, %ld, ", tcp->u_arg[2], tcp->u_arg[3]);
printtv(tcp, tcp->u_arg[4]);
}
return 0;
}
int
sys_mq_timedreceive(struct tcb *tcp)
{
if (entering(tcp))
tprintf("%ld, ", tcp->u_arg[0]);
else {
printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
tprintf(", %lu, %ld, ", tcp->u_arg[2], tcp->u_arg[3]);
printtv(tcp, tcp->u_arg[4]);
}
return 0;
}
int
sys_mq_notify(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
printsigevent(tcp, tcp->u_arg[1]);
}
return 0;
}
static void
printmqattr(struct tcb *tcp, long addr)
{
if (addr == 0)
tprints("NULL");
else {
# ifndef HAVE_MQUEUE_H
tprintf("%#lx", addr);
# else
struct mq_attr attr;
if (umove(tcp, addr, &attr) < 0) {
tprints("{...}");
return;
}
tprints("{mq_flags=");
tprint_open_modes(attr.mq_flags);
tprintf(", mq_maxmsg=%ld, mq_msgsize=%ld, mq_curmsg=%ld}",
(long) attr.mq_maxmsg, (long) attr.mq_msgsize,
(long) attr.mq_curmsgs);
# endif
}
}
int
sys_mq_getsetattr(struct tcb *tcp)
{
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
printmqattr(tcp, tcp->u_arg[1]);
tprints(", ");
} else
printmqattr(tcp, tcp->u_arg[2]);
return 0;
}
int
sys_ipc(struct tcb *tcp)
{
return printargs(tcp);
}

42
ipc_defs.h Normal file
View File

@ -0,0 +1,42 @@
/*
* Copyright (c) 2003 Roland McGrath <roland@redhat.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_SYS_IPC_H
# include <sys/ipc.h>
#elif defined HAVE_LINUX_IPC_H
# include <linux/ipc.h>
/* While glibc uses __key, the kernel uses key. */
# define __key key
#endif
#if !defined IPC_64
# define IPC_64 0x100
#endif
#define PRINTCTL(flagset, arg, dflt) \
if ((arg) & IPC_64) tprints("IPC_64|"); \
printxval((flagset), (arg) &~ IPC_64, dflt)

123
ipc_msg.c Normal file
View File

@ -0,0 +1,123 @@
/*
* Copyright (c) 1993 Ulrich Pegelow <pegelow@moorea.uni-muenster.de>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2003-2006 Roland McGrath <roland@redhat.com>
* Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include "ipc_defs.h"
#ifdef HAVE_SYS_MSG_H
# include <sys/msg.h>
#elif defined HAVE_LINUX_MSG_H
# include <linux/msg.h>
#endif
#include "xlat/ipc_msg_flags.h"
#include "xlat/resource_flags.h"
SYS_FUNC(msgget)
{
if (tcp->u_arg[0])
tprintf("%#lx, ", tcp->u_arg[0]);
else
tprints("IPC_PRIVATE, ");
if (printflags(resource_flags, tcp->u_arg[1] & ~0777, NULL) != 0)
tprints("|");
tprintf("%#lo", tcp->u_arg[1] & 0777);
return RVAL_DECODED;
}
static void
tprint_msgsnd(struct tcb *tcp, const long addr, const unsigned long count,
const unsigned long flags)
{
tprint_msgbuf(tcp, addr, count);
printflags(ipc_msg_flags, flags, "MSG_???");
}
SYS_FUNC(msgsnd)
{
tprintf("%d, ", (int) tcp->u_arg[0]);
if (indirect_ipccall(tcp)) {
tprint_msgsnd(tcp, tcp->u_arg[3], tcp->u_arg[1],
tcp->u_arg[2]);
} else {
tprint_msgsnd(tcp, tcp->u_arg[1], tcp->u_arg[2],
tcp->u_arg[3]);
}
return RVAL_DECODED;
}
static void
tprint_msgrcv(struct tcb *tcp, const long addr, const unsigned long count,
const long msgtyp)
{
tprint_msgbuf(tcp, addr, count);
tprintf("%ld, ", msgtyp);
}
static int
fetch_msgrcv_args(struct tcb *tcp, const long addr, long *pair)
{
if (current_wordsize == sizeof(long)) {
if (umoven_or_printaddr(tcp, addr, 2 * sizeof(long), pair))
return -1;
} else {
unsigned int tmp[2];
if (umove_or_printaddr(tcp, addr, &tmp))
return -1;
pair[0] = tmp[0];
pair[1] = tmp[1];
}
return 0;
}
SYS_FUNC(msgrcv)
{
if (entering(tcp)) {
tprintf("%d, ", (int) tcp->u_arg[0]);
} else {
if (indirect_ipccall(tcp)) {
long pair[2];
if (fetch_msgrcv_args(tcp, tcp->u_arg[3], pair))
tprintf(", %lu, ", tcp->u_arg[1]);
else
tprint_msgrcv(tcp, pair[0], tcp->u_arg[1], pair[1]);
printflags(ipc_msg_flags, tcp->u_arg[2], "MSG_???");
} else {
tprint_msgrcv(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3]);
printflags(ipc_msg_flags, tcp->u_arg[4], "MSG_???");
}
}
return 0;
}

108
ipc_msgctl.c Normal file
View File

@ -0,0 +1,108 @@
/*
* Copyright (c) 1993 Ulrich Pegelow <pegelow@moorea.uni-muenster.de>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2003-2006 Roland McGrath <roland@redhat.com>
* Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include DEF_MPERS_TYPE(msqid_ds_t)
#include "ipc_defs.h"
#ifdef HAVE_SYS_MSG_H
/* The C library generally exports the struct the current kernel expects. */
# include <sys/msg.h>
typedef struct msqid_ds msqid_ds_t;
#elif defined HAVE_LINUX_MSG_H
/* The linux header might provide the right struct. */
# include <linux/msg.h>
typedef struct msqid64_ds msqid_ds_t;
#endif
#include MPERS_DEFS
#include "xlat/msgctl_flags.h"
static void
print_msqid_ds(struct tcb *tcp, const long addr, int cmd)
{
/* TODO: We don't properly decode old compat ipc calls. */
if (cmd & IPC_64)
cmd &= ~IPC_64;
msqid_ds_t msqid_ds;
switch (cmd) {
case IPC_SET:
case IPC_STAT:
if (umove_or_printaddr(tcp, addr, &msqid_ds))
return;
tprints("{msg_perm={");
printuid("uid=", msqid_ds.msg_perm.uid);
printuid(", gid=", msqid_ds.msg_perm.gid);
tprints(", mode=");
tprints(sprintmode(msqid_ds.msg_perm.mode));
if (cmd != IPC_STAT) {
tprints("}, ...}");
break;
}
tprintf(", key=%u", (unsigned) msqid_ds.msg_perm.__key);
printuid(", cuid=", msqid_ds.msg_perm.cuid);
printuid(", cgid=", msqid_ds.msg_perm.cgid);
tprints("}");
tprintf(", msg_stime=%u", (unsigned) msqid_ds.msg_stime);
tprintf(", msg_rtime=%u", (unsigned) msqid_ds.msg_rtime);
tprintf(", msg_ctime=%u", (unsigned) msqid_ds.msg_ctime);
tprintf(", msg_qnum=%u", (unsigned) msqid_ds.msg_qnum);
tprintf(", msg_qbytes=%u", (unsigned) msqid_ds.msg_qbytes);
tprintf(", msg_lspid=%u", (unsigned) msqid_ds.msg_lspid);
tprintf(", msg_lrpid=%u", (unsigned) msqid_ds.msg_lrpid);
tprints("}");
break;
default:
printaddr(addr);
break;
}
}
SYS_FUNC(msgctl)
{
if (entering(tcp)) {
tprintf("%lu, ", tcp->u_arg[0]);
PRINTCTL(msgctl_flags, tcp->u_arg[1], "MSG_???");
tprints(", ");
} else {
const long addr = tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2];
print_msqid_ds(tcp, addr, tcp->u_arg[1]);
}
return 0;
}

126
ipc_sem.c Normal file
View File

@ -0,0 +1,126 @@
/*
* Copyright (c) 1993 Ulrich Pegelow <pegelow@moorea.uni-muenster.de>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2003-2006 Roland McGrath <roland@redhat.com>
* Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include "ipc_defs.h"
#ifdef HAVE_SYS_SEM_H
# include <sys/sem.h>
#elif defined HAVE_LINUX_SEM_H
# include <linux/sem.h>
#endif
#include "xlat/semctl_flags.h"
#include "xlat/semop_flags.h"
#if defined HAVE_SYS_SEM_H || defined HAVE_LINUX_SEM_H
static bool
print_sembuf(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
{
const struct sembuf *sb = elem_buf;
tprintf("{%u, %d, ", sb->sem_num, sb->sem_op);
printflags(semop_flags, (unsigned short) sb->sem_flg, "SEM_???");
tprints("}");
return true;
}
#endif
static void
tprint_sembuf_array(struct tcb *tcp, const long addr, const unsigned long count)
{
#if defined HAVE_SYS_SEM_H || defined HAVE_LINUX_SEM_H
struct sembuf sb;
print_array(tcp, addr, count, &sb, sizeof(sb),
umoven_or_printaddr, print_sembuf, 0);
#else
printaddr(addr);
#endif
tprintf(", %lu", count);
}
SYS_FUNC(semop)
{
tprintf("%lu, ", tcp->u_arg[0]);
if (indirect_ipccall(tcp)) {
tprint_sembuf_array(tcp, tcp->u_arg[3], tcp->u_arg[1]);
} else {
tprint_sembuf_array(tcp, tcp->u_arg[1], tcp->u_arg[2]);
}
return RVAL_DECODED;
}
SYS_FUNC(semtimedop)
{
tprintf("%lu, ", tcp->u_arg[0]);
if (indirect_ipccall(tcp)) {
tprint_sembuf_array(tcp, tcp->u_arg[3], tcp->u_arg[1]);
tprints(", ");
#if defined(S390) || defined(S390X)
print_timespec(tcp, tcp->u_arg[2]);
#else
print_timespec(tcp, tcp->u_arg[4]);
#endif
} else {
tprint_sembuf_array(tcp, tcp->u_arg[1], tcp->u_arg[2]);
tprints(", ");
print_timespec(tcp, tcp->u_arg[3]);
}
return RVAL_DECODED;
}
SYS_FUNC(semget)
{
if (tcp->u_arg[0])
tprintf("%#lx", tcp->u_arg[0]);
else
tprints("IPC_PRIVATE");
tprintf(", %lu, ", tcp->u_arg[1]);
if (printflags(resource_flags, tcp->u_arg[2] & ~0777, NULL) != 0)
tprints("|");
tprintf("%#lo", tcp->u_arg[2] & 0777);
return RVAL_DECODED;
}
SYS_FUNC(semctl)
{
tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
PRINTCTL(semctl_flags, tcp->u_arg[2], "SEM_???");
tprints(", ");
if (indirect_ipccall(tcp)) {
printnum_ptr(tcp, tcp->u_arg[3]);
} else {
tprintf("%#lx", tcp->u_arg[3]);
}
return RVAL_DECODED;
}

88
ipc_shm.c Normal file
View File

@ -0,0 +1,88 @@
/*
* Copyright (c) 1993 Ulrich Pegelow <pegelow@moorea.uni-muenster.de>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2003-2006 Roland McGrath <roland@redhat.com>
* Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#ifdef HAVE_SYS_SHM_H
# include <sys/shm.h>
#elif defined HAVE_LINUX_SHM_H
# include <linux/shm.h>
#endif
#include "xlat/shm_resource_flags.h"
#include "xlat/shm_flags.h"
SYS_FUNC(shmget)
{
if (tcp->u_arg[0])
tprintf("%#lx", tcp->u_arg[0]);
else
tprints("IPC_PRIVATE");
tprintf(", %lu, ", tcp->u_arg[1]);
if (printflags(shm_resource_flags, tcp->u_arg[2] & ~0777, NULL) != 0)
tprints("|");
tprintf("%#lo", tcp->u_arg[2] & 0777);
return RVAL_DECODED;
}
SYS_FUNC(shmat)
{
if (entering(tcp)) {
tprintf("%lu, ", tcp->u_arg[0]);
if (indirect_ipccall(tcp)) {
printaddr(tcp->u_arg[3]);
tprints(", ");
printflags(shm_flags, tcp->u_arg[1], "SHM_???");
} else {
printaddr(tcp->u_arg[1]);
tprints(", ");
printflags(shm_flags, tcp->u_arg[2], "SHM_???");
}
return 0;
} else {
if (syserror(tcp))
return 0;
if (indirect_ipccall(tcp)) {
unsigned long raddr;
if (umove(tcp, tcp->u_arg[2], &raddr) < 0)
return RVAL_NONE;
tcp->u_rval = raddr;
}
return RVAL_HEX;
}
}
SYS_FUNC(shmdt)
{
printaddr(tcp->u_arg[indirect_ipccall(tcp) ? 3 : 0]);
return RVAL_DECODED;
}

108
ipc_shmctl.c Normal file
View File

@ -0,0 +1,108 @@
/*
* Copyright (c) 1993 Ulrich Pegelow <pegelow@moorea.uni-muenster.de>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2003-2006 Roland McGrath <roland@redhat.com>
* Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include DEF_MPERS_TYPE(shmid_ds_t)
#include "ipc_defs.h"
#ifdef HAVE_SYS_SHM_H
/* The C library generally exports the struct the current kernel expects. */
# include <sys/shm.h>
typedef struct shmid_ds shmid_ds_t;
#elif defined HAVE_LINUX_SHM_H
/* The linux header might provide the right struct. */
# include <linux/shm.h>
typedef struct shmid64_ds shmid_ds_t;
#endif
#include MPERS_DEFS
#include "xlat/shmctl_flags.h"
static void
print_shmid_ds(struct tcb *tcp, const long addr, int cmd)
{
/* TODO: We don't properly decode old compat ipc calls. */
if (cmd & IPC_64)
cmd &= ~IPC_64;
shmid_ds_t shmid_ds;
switch (cmd) {
case IPC_SET:
case IPC_STAT:
if (umove_or_printaddr(tcp, addr, &shmid_ds))
return;
tprints("{shm_perm={");
printuid("uid=", shmid_ds.shm_perm.uid);
printuid(", gid=", shmid_ds.shm_perm.gid);
tprints(", mode=");
tprints(sprintmode(shmid_ds.shm_perm.mode));
if (cmd != IPC_STAT) {
tprints("}, ...}");
break;
}
tprintf(", key=%u", (unsigned) shmid_ds.shm_perm.__key);
printuid(", cuid=", shmid_ds.shm_perm.cuid);
printuid(", cgid=", shmid_ds.shm_perm.cgid);
tprints("}");
tprintf(", shm_segsz=%u", (unsigned) shmid_ds.shm_segsz);
tprintf(", shm_cpid=%u", (unsigned) shmid_ds.shm_cpid);
tprintf(", shm_lpid=%u", (unsigned) shmid_ds.shm_lpid);
tprintf(", shm_nattch=%u", (unsigned) shmid_ds.shm_nattch);
tprintf(", shm_atime=%u", (unsigned) shmid_ds.shm_atime);
tprintf(", shm_dtime=%u", (unsigned) shmid_ds.shm_dtime);
tprintf(", shm_ctime=%u", (unsigned) shmid_ds.shm_ctime);
tprints("}");
break;
default:
printaddr(addr);
break;
}
}
SYS_FUNC(shmctl)
{
if (entering(tcp)) {
tprintf("%lu, ", tcp->u_arg[0]);
PRINTCTL(shmctl_flags, tcp->u_arg[1], "SHM_???");
tprints(", ");
} else {
const long addr = tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2];
print_shmid_ds(tcp, addr, tcp->u_arg[1]);
}
return 0;
}

58
kcmp.c Normal file
View File

@ -0,0 +1,58 @@
/*
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include "xlat/kcmp_types.h"
SYS_FUNC(kcmp)
{
pid_t pid1 = tcp->u_arg[0];
pid_t pid2 = tcp->u_arg[1];
int type = tcp->u_arg[2];
unsigned long idx1 = tcp->u_arg[3];
unsigned long idx2 = tcp->u_arg[4];
tprintf("%d, %d, ", pid1, pid2);
printxval(kcmp_types, type, "KCMP_???");
switch(type) {
case KCMP_FILE:
tprintf(", %u, %u", (unsigned) idx1, (unsigned) idx2);
break;
case KCMP_FILES:
case KCMP_FS:
case KCMP_IO:
case KCMP_SIGHAND:
case KCMP_SYSVSEM:
case KCMP_VM:
break;
default:
tprintf(", %#lx, %#lx", idx1, idx2);
}
return RVAL_DECODED;
}

58
kernel_types.h Normal file
View File

@ -0,0 +1,58 @@
/*
* Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef STRACE_KERNEL_TYPES_H
# define STRACE_KERNEL_TYPES_H
# if defined HAVE___KERNEL_LONG_T && defined HAVE___KERNEL_ULONG_T
# include <asm/posix_types.h>
typedef __kernel_long_t kernel_long_t;
typedef __kernel_ulong_t kernel_ulong_t;
# elif defined __x86_64__ && defined __ILP32__
typedef long long kernel_long_t;
typedef unsigned long long kernel_ulong_t;
# else
typedef long kernel_long_t;
typedef unsigned long kernel_ulong_t;
# endif
typedef struct {
kernel_ulong_t d_ino;
kernel_ulong_t d_off;
unsigned short d_reclen;
char d_name[1];
} kernel_dirent;
#endif

153
kexec.c
View File

@ -1,3 +1,30 @@
/*
* Copyright (c) 2014-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include "xlat/kexec_load_flags.h"
@ -10,92 +37,86 @@
# define KEXEC_SEGMENT_MAX 16
#endif
static void
print_kexec_segments(struct tcb *tcp, unsigned long addr, unsigned long len)
static bool
print_seg(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
{
#if SUPPORTED_PERSONALITIES > 1
union {
struct { u_int32_t buf, bufsz, mem, memsz; } seg32;
struct { u_int64_t buf, bufsz, mem, memsz; } seg64;
} seg;
# define sizeof_seg \
(current_wordsize == 4 ? sizeof(seg.seg32) : sizeof(seg.seg64))
# define seg_buf \
(current_wordsize == 4 ? (uint64_t) seg.seg32.buf : seg.seg64.buf)
# define seg_bufsz \
(current_wordsize == 4 ? (uint64_t) seg.seg32.bufsz : seg.seg64.bufsz)
# define seg_mem \
(current_wordsize == 4 ? (uint64_t) seg.seg32.mem : seg.seg64.mem)
# define seg_memsz \
(current_wordsize == 4 ? (uint64_t) seg.seg32.memsz : seg.seg64.memsz)
#else
struct {
void *buf;
size_t bufsz;
void *mem;
size_t memsz;
} seg;
# define sizeof_seg sizeof(seg)
# define seg_buf seg.buf
# define seg_bufsz seg.bufsz
# define seg_mem seg.mem
# define seg_memsz seg.memsz
#endif
unsigned int i, failed;
const unsigned long *seg;
unsigned long seg_buf[4];
if (!len) {
tprints("[]");
return;
if (elem_size < sizeof(seg_buf)) {
unsigned int i;
for (i = 0; i < ARRAY_SIZE(seg_buf); ++i)
seg_buf[i] = ((unsigned int *) elem_buf)[i];
seg = seg_buf;
} else {
seg = elem_buf;
}
if (len > KEXEC_SEGMENT_MAX) {
tprintf("%#lx", addr);
return;
}
tprints("{");
printaddr(seg[0]);
tprintf(", %lu, ", seg[1]);
printaddr(seg[2]);
tprintf(", %lu}", seg[3]);
failed = 0;
tprints("[");
for (i = 0; i < len; ++i) {
if (i)
tprints(", ");
if (umoven(tcp, addr + i * sizeof_seg, sizeof_seg,
(char *) &seg) < 0) {
tprints("?");
failed = 1;
break;
}
tprintf("{%#lx, %lu, %#lx, %lu}",
(long) seg_buf, (unsigned long) seg_bufsz,
(long) seg_mem, (unsigned long) seg_memsz);
}
tprints("]");
if (failed)
tprintf(" %#lx", addr);
return true;
}
int
sys_kexec_load(struct tcb *tcp)
static void
print_kexec_segments(struct tcb *tcp, const unsigned long addr,
const unsigned long len)
{
unsigned long n;
if (len > KEXEC_SEGMENT_MAX) {
printaddr(addr);
return;
}
if (exiting(tcp))
return 0;
unsigned long seg[4];
const size_t sizeof_seg = ARRAY_SIZE(seg) * current_wordsize;
print_array(tcp, addr, len, seg, sizeof_seg,
umoven_or_printaddr, print_seg, 0);
}
SYS_FUNC(kexec_load)
{
/* entry, nr_segments */
tprintf("%#lx, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
printaddr(tcp->u_arg[0]);
tprintf(", %lu, ", tcp->u_arg[1]);
/* segments */
print_kexec_segments(tcp, tcp->u_arg[2], tcp->u_arg[1]);
tprints(", ");
/* flags */
n = tcp->u_arg[3];
printxval(kexec_arch_values, n & KEXEC_ARCH_MASK, "KEXEC_ARCH_???");
unsigned long n = tcp->u_arg[3];
printxval_long(kexec_arch_values, n & KEXEC_ARCH_MASK, "KEXEC_ARCH_???");
n &= ~KEXEC_ARCH_MASK;
if (n) {
tprints("|");
printflags(kexec_load_flags, n, "KEXEC_???");
printflags_long(kexec_load_flags, n, "KEXEC_???");
}
return 0;
return RVAL_DECODED;
}
#include "xlat/kexec_file_load_flags.h"
SYS_FUNC(kexec_file_load)
{
/* kernel_fd */
printfd(tcp, tcp->u_arg[0]);
tprints(", ");
/* initrd_fd */
printfd(tcp, tcp->u_arg[1]);
tprints(", ");
/* cmdline_len */
tprintf("%lu, ", tcp->u_arg[2]);
/* cmdline */
printstr(tcp, tcp->u_arg[3], tcp->u_arg[2]);
tprints(", ");
/* flags */
printflags_long(kexec_file_load_flags, tcp->u_arg[4], "KEXEC_FILE_???");
return RVAL_DECODED;
}

398
keyctl.c
View File

@ -1,3 +1,30 @@
/*
* Copyright (c) 2014-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
typedef int32_t key_serial_t;
@ -7,7 +34,7 @@ typedef int32_t key_serial_t;
static void
print_keyring_serial_number(key_serial_t id)
{
const char *str = xlookup(key_spec, id);
const char *str = xlookup(key_spec, (unsigned int) id);
if (str)
tprints(str);
@ -15,111 +42,74 @@ print_keyring_serial_number(key_serial_t id)
tprintf("%d", id);
}
int
sys_add_key(struct tcb *tcp)
SYS_FUNC(add_key)
{
if (entering(tcp)) {
/* type */
printstr(tcp, tcp->u_arg[0], -1);
/* description */
tprints(", ");
printstr(tcp, tcp->u_arg[1], -1);
/* payload */
tprints(", ");
printstr(tcp, tcp->u_arg[2], tcp->u_arg[3]);
/* payload length */
tprintf(", %lu, ", tcp->u_arg[3]);
/* keyring serial number */
print_keyring_serial_number(tcp->u_arg[4]);
}
return 0;
/* type */
printstr(tcp, tcp->u_arg[0], -1);
/* description */
tprints(", ");
printstr(tcp, tcp->u_arg[1], -1);
/* payload */
tprints(", ");
printstr(tcp, tcp->u_arg[2], tcp->u_arg[3]);
/* payload length */
tprintf(", %lu, ", tcp->u_arg[3]);
/* keyring serial number */
print_keyring_serial_number(tcp->u_arg[4]);
return RVAL_DECODED;
}
int
sys_request_key(struct tcb *tcp)
SYS_FUNC(request_key)
{
if (entering(tcp)) {
/* type */
printstr(tcp, tcp->u_arg[0], -1);
/* description */
tprints(", ");
printstr(tcp, tcp->u_arg[1], -1);
/* callout_info */
tprints(", ");
printstr(tcp, tcp->u_arg[2], -1);
/* keyring serial number */
tprints(", ");
print_keyring_serial_number(tcp->u_arg[3]);
}
return 0;
/* type */
printstr(tcp, tcp->u_arg[0], -1);
/* description */
tprints(", ");
printstr(tcp, tcp->u_arg[1], -1);
/* callout_info */
tprints(", ");
printstr(tcp, tcp->u_arg[2], -1);
/* keyring serial number */
tprints(", ");
print_keyring_serial_number(tcp->u_arg[3]);
return RVAL_DECODED;
}
static int
static void
keyctl_get_keyring_id(struct tcb *tcp, key_serial_t id, int create)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id);
tprintf(", %d", create);
}
return 0;
print_keyring_serial_number(id);
tprintf(", %d", create);
}
static int
keyctl_join_session_keyring(struct tcb *tcp, long addr)
{
if (entering(tcp)) {
tprints(", ");
printstr(tcp, addr, -1);
}
return 0;
}
static int
static void
keyctl_update_key(struct tcb *tcp, key_serial_t id, long addr, long len)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id);
tprints(", ");
printstr(tcp, addr, len);
tprintf(", %lu", len);
}
return 0;
print_keyring_serial_number(id);
tprints(", ");
printstr(tcp, addr, len);
tprintf(", %lu", len);
}
static int
keyctl_handle_key(struct tcb *tcp, key_serial_t id)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id);
}
return 0;
}
static int
static void
keyctl_handle_key_key(struct tcb *tcp, key_serial_t id1, key_serial_t id2)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id1);
tprints(", ");
print_keyring_serial_number(id2);
}
return 0;
print_keyring_serial_number(id1);
tprints(", ");
print_keyring_serial_number(id2);
}
static int
static void
keyctl_read_key(struct tcb *tcp, key_serial_t id, long addr, long len)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id);
tprints(", ");
} else {
if (addr && syserror(tcp))
tprintf("%#lx", addr);
if (syserror(tcp))
printaddr(addr);
else {
long rval = tcp->u_rval > len ?
len : (tcp->u_rval ? -1 : 0);
@ -127,223 +117,193 @@ keyctl_read_key(struct tcb *tcp, key_serial_t id, long addr, long len)
}
tprintf(", %lu", len);
}
return 0;
}
static int
static void
keyctl_keyring_search(struct tcb *tcp, key_serial_t id1, long addr1,
long addr2, key_serial_t id2)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id1);
tprints(", ");
printstr(tcp, addr1, -1);
tprints(", ");
printstr(tcp, addr2, -1);
tprints(", ");
print_keyring_serial_number(id2);
}
return 0;
print_keyring_serial_number(id1);
tprints(", ");
printstr(tcp, addr1, -1);
tprints(", ");
printstr(tcp, addr2, -1);
tprints(", ");
print_keyring_serial_number(id2);
}
static int
static void
keyctl_chown_key(struct tcb *tcp, key_serial_t id, int user, int group)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id);
tprintf(", %d, %d", user, group);
}
return 0;
print_keyring_serial_number(id);
tprintf(", %d, %d", user, group);
}
static int
static void
keyctl_instantiate_key(struct tcb *tcp, key_serial_t id1, long addr,
long len, key_serial_t id2)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id1);
tprints(", ");
printstr(tcp, addr, len);
tprintf(", %lu, ", len);
print_keyring_serial_number(id2);
}
return 0;
print_keyring_serial_number(id1);
tprints(", ");
printstr(tcp, addr, len);
tprintf(", %lu, ", len);
print_keyring_serial_number(id2);
}
static int
static void
keyctl_instantiate_key_iov(struct tcb *tcp, key_serial_t id1,
long addr, long len, key_serial_t id2)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id1);
tprints(", ");
tprint_iov(tcp, len, addr, 1);
tprintf(", %lu, ", len);
print_keyring_serial_number(id2);
}
return 0;
print_keyring_serial_number(id1);
tprints(", ");
tprint_iov(tcp, len, addr, 1);
tprintf(", %lu, ", len);
print_keyring_serial_number(id2);
}
static int
static void
keyctl_negate_key(struct tcb *tcp, key_serial_t id1, unsigned timeout,
key_serial_t id2)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id1);
tprintf(", %u, ", timeout);
print_keyring_serial_number(id2);
}
return 0;
print_keyring_serial_number(id1);
tprintf(", %u, ", timeout);
print_keyring_serial_number(id2);
}
static int
static void
keyctl_reject_key(struct tcb *tcp, key_serial_t id1, unsigned timeout,
unsigned error, key_serial_t id2)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id1);
tprintf(", %u, %u, ", timeout, error);
print_keyring_serial_number(id2);
}
return 0;
print_keyring_serial_number(id1);
tprintf(", %u, %u, ", timeout, error);
print_keyring_serial_number(id2);
}
static int
static void
keyctl_set_timeout(struct tcb *tcp, key_serial_t id, unsigned timeout)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id);
tprintf(", %u", timeout);
}
return 0;
print_keyring_serial_number(id);
tprintf(", %u", timeout);
}
static int
static void
keyctl_get_persistent(struct tcb *tcp, int uid, key_serial_t id)
{
if (entering(tcp)) {
tprintf(", %d, ", uid);
print_keyring_serial_number(id);
}
return 0;
tprintf("%d, ", uid);
print_keyring_serial_number(id);
}
#include "xlat/key_perms.h"
static int
static void
keyctl_setperm_key(struct tcb *tcp, key_serial_t id, uint32_t perm)
{
if (entering(tcp)) {
tprints(", ");
print_keyring_serial_number(id);
tprints(", ");
printflags(key_perms, perm, "KEY_???");
}
return 0;
print_keyring_serial_number(id);
tprints(", ");
printflags(key_perms, perm, "KEY_???");
}
#include "xlat/key_reqkeys.h"
static int
keyctl_set_reqkey_keyring(struct tcb *tcp, int reqkey)
{
if (entering(tcp)) {
tprints(", ");
printxval(key_reqkeys, reqkey, "KEY_REQKEY_DEFL_???");
}
return 0;
}
#include "xlat/keyctl_commands.h"
int
sys_keyctl(struct tcb *tcp)
SYS_FUNC(keyctl)
{
int cmd = tcp->u_arg[0];
if (entering(tcp))
if (entering(tcp)) {
printxval(keyctl_commands, cmd, "KEYCTL_???");
tprints(", ");
}
switch (cmd) {
case KEYCTL_GET_KEYRING_ID:
return keyctl_get_keyring_id(tcp, tcp->u_arg[1], tcp->u_arg[2]);
keyctl_get_keyring_id(tcp, tcp->u_arg[1], tcp->u_arg[2]);
break;
case KEYCTL_JOIN_SESSION_KEYRING:
return keyctl_join_session_keyring(tcp, tcp->u_arg[1]);
printstr(tcp, tcp->u_arg[1], -1);
break;
case KEYCTL_UPDATE:
return keyctl_update_key(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3]);
keyctl_update_key(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3]);
break;
case KEYCTL_REVOKE:
case KEYCTL_CLEAR:
case KEYCTL_INVALIDATE:
case KEYCTL_ASSUME_AUTHORITY:
return keyctl_handle_key(tcp, tcp->u_arg[1]);
print_keyring_serial_number(tcp->u_arg[1]);
break;
case KEYCTL_LINK:
case KEYCTL_UNLINK:
return keyctl_handle_key_key(tcp, tcp->u_arg[1], tcp->u_arg[2]);
keyctl_handle_key_key(tcp, tcp->u_arg[1], tcp->u_arg[2]);
break;
case KEYCTL_DESCRIBE:
case KEYCTL_READ:
case KEYCTL_GET_SECURITY:
return keyctl_read_key(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3]);
case KEYCTL_SEARCH:
return keyctl_keyring_search(tcp, tcp->u_arg[1], tcp->u_arg[2],
tcp->u_arg[3], tcp->u_arg[4]);
case KEYCTL_CHOWN:
return keyctl_chown_key(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3]);
case KEYCTL_SETPERM:
return keyctl_setperm_key(tcp, tcp->u_arg[1], tcp->u_arg[2]);
case KEYCTL_INSTANTIATE:
return keyctl_instantiate_key(tcp, tcp->u_arg[1], tcp->u_arg[2],
tcp->u_arg[3], tcp->u_arg[4]);
case KEYCTL_NEGATE:
return keyctl_negate_key(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3]);
case KEYCTL_SET_REQKEY_KEYRING:
return keyctl_set_reqkey_keyring(tcp, tcp->u_arg[1]);
case KEYCTL_SET_TIMEOUT:
return keyctl_set_timeout(tcp, tcp->u_arg[1], tcp->u_arg[2]);
case KEYCTL_SESSION_TO_PARENT:
keyctl_read_key(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3]);
return 0;
case KEYCTL_SEARCH:
keyctl_keyring_search(tcp, tcp->u_arg[1], tcp->u_arg[2],
tcp->u_arg[3], tcp->u_arg[4]);
break;
case KEYCTL_CHOWN:
keyctl_chown_key(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3]);
break;
case KEYCTL_SETPERM:
keyctl_setperm_key(tcp, tcp->u_arg[1], tcp->u_arg[2]);
break;
case KEYCTL_INSTANTIATE:
keyctl_instantiate_key(tcp, tcp->u_arg[1], tcp->u_arg[2],
tcp->u_arg[3], tcp->u_arg[4]);
break;
case KEYCTL_NEGATE:
keyctl_negate_key(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3]);
break;
case KEYCTL_SET_REQKEY_KEYRING:
printxval(key_reqkeys, tcp->u_arg[1], "KEY_REQKEY_DEFL_???");
break;
case KEYCTL_SET_TIMEOUT:
keyctl_set_timeout(tcp, tcp->u_arg[1], tcp->u_arg[2]);
break;
case KEYCTL_SESSION_TO_PARENT:
break;
case KEYCTL_REJECT:
return keyctl_reject_key(tcp, tcp->u_arg[1], tcp->u_arg[2],
tcp->u_arg[3], tcp->u_arg[4]);
keyctl_reject_key(tcp, tcp->u_arg[1], tcp->u_arg[2],
tcp->u_arg[3], tcp->u_arg[4]);
break;
case KEYCTL_INSTANTIATE_IOV:
return keyctl_instantiate_key_iov(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3],
tcp->u_arg[4]);
keyctl_instantiate_key_iov(tcp, tcp->u_arg[1],
tcp->u_arg[2], tcp->u_arg[3],
tcp->u_arg[4]);
break;
case KEYCTL_GET_PERSISTENT:
return keyctl_get_persistent(tcp, tcp->u_arg[1], tcp->u_arg[2]);
keyctl_get_persistent(tcp, tcp->u_arg[1], tcp->u_arg[2]);
break;
default:
if (entering(tcp))
tprintf(", %#lx, %#lx, %#lx, %#lx",
tcp->u_arg[1], tcp->u_arg[2],
tcp->u_arg[3], tcp->u_arg[4]);
tprintf("%#lx, %#lx, %#lx, %#lx",
tcp->u_arg[1], tcp->u_arg[2],
tcp->u_arg[3], tcp->u_arg[4]);
break;
}
return 0;
return RVAL_DECODED;
}

97
ldt.c
View File

@ -1,3 +1,36 @@
/*
* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993-1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2002-2004 Roland McGrath <roland@redhat.com>
* Copyright (c) 2010 Andreas Schwab <schwab@linux-m68k.org>
* Copyright (c) 2014-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#if defined I386 || defined X86_64 || defined X32
@ -5,19 +38,12 @@
# include <asm/ldt.h>
void
print_user_desc(struct tcb *tcp, long addr)
print_user_desc(struct tcb *tcp, const long addr)
{
struct user_desc desc;
if (umove(tcp, addr, &desc) < 0) {
tprintf("%lx", addr);
if (umove_or_printaddr(tcp, addr, &desc))
return;
}
if (!verbose(tcp)) {
tprintf("{entry_number:%d, ...}", desc.entry_number);
return;
}
tprintf("{entry_number:%d, "
"base_addr:%#08x, "
@ -39,31 +65,27 @@ print_user_desc(struct tcb *tcp, long addr)
desc.useable);
}
int
sys_modify_ldt(struct tcb *tcp)
SYS_FUNC(modify_ldt)
{
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
if (tcp->u_arg[1] == 0
|| tcp->u_arg[2] != sizeof(struct user_desc)) {
tprintf("%lx", tcp->u_arg[1]);
} else {
print_user_desc(tcp, tcp->u_arg[1]);
}
tprintf(", %lu", tcp->u_arg[2]);
}
return 0;
tprintf("%ld, ", tcp->u_arg[0]);
if (tcp->u_arg[2] != sizeof(struct user_desc))
printaddr(tcp->u_arg[1]);
else
print_user_desc(tcp, tcp->u_arg[1]);
tprintf(", %lu", tcp->u_arg[2]);
return RVAL_DECODED;
}
int
sys_set_thread_area(struct tcb *tcp)
SYS_FUNC(set_thread_area)
{
if (entering(tcp)) {
print_user_desc(tcp, tcp->u_arg[0]);
} else {
struct user_desc desc;
if (syserror(tcp) || umove(tcp, tcp->u_arg[0], &desc) < 0) {
if (!verbose(tcp) || syserror(tcp) ||
umove(tcp, tcp->u_arg[0], &desc) < 0) {
/* returned entry_number is not available */
} else {
static char outstr[32];
@ -76,35 +98,28 @@ sys_set_thread_area(struct tcb *tcp)
return 0;
}
int
sys_get_thread_area(struct tcb *tcp)
SYS_FUNC(get_thread_area)
{
if (exiting(tcp)) {
if (syserror(tcp))
tprintf("%lx", tcp->u_arg[0]);
else
print_user_desc(tcp, tcp->u_arg[0]);
}
if (exiting(tcp))
print_user_desc(tcp, tcp->u_arg[0]);
return 0;
}
#endif /* I386 || X86_64 || X32 */
#if defined(M68K) || defined(MIPS)
int
sys_set_thread_area(struct tcb *tcp)
SYS_FUNC(set_thread_area)
{
if (entering(tcp))
tprintf("%#lx", tcp->u_arg[0]);
return 0;
printaddr(tcp->u_arg[0]);
return RVAL_DECODED;
}
#endif
#if defined(M68K)
int
sys_get_thread_area(struct tcb *tcp)
SYS_FUNC(get_thread_area)
{
return RVAL_HEX;
return RVAL_DECODED | RVAL_HEX;
}
#endif

117
link.c
View File

@ -1,71 +1,80 @@
/*
* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993-1996 Rick Sladkey <jrs@world.std.com>
* Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* Copyright (c) 2006 Ulrich Drepper <drepper@redhat.com>
* Copyright (c) 2006 Bernhard Kaindl <bk@suse.de>
* Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <fcntl.h>
#ifndef AT_SYMLINK_NOFOLLOW
# define AT_SYMLINK_NOFOLLOW 0x100
#endif
#ifndef AT_REMOVEDIR
# define AT_REMOVEDIR 0x200
#endif
#ifndef AT_SYMLINK_FOLLOW
# define AT_SYMLINK_FOLLOW 0x400
#endif
#ifndef AT_NO_AUTOMOUNT
# define AT_NO_AUTOMOUNT 0x800
#endif
#ifndef AT_EMPTY_PATH
# define AT_EMPTY_PATH 0x1000
#endif
#include "xlat/at_flags.h"
int
sys_link(struct tcb *tcp)
SYS_FUNC(link)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
tprints(", ");
printpath(tcp, tcp->u_arg[1]);
}
return 0;
printpath(tcp, tcp->u_arg[0]);
tprints(", ");
printpath(tcp, tcp->u_arg[1]);
return RVAL_DECODED;
}
int
sys_linkat(struct tcb *tcp)
SYS_FUNC(linkat)
{
if (entering(tcp)) {
print_dirfd(tcp, tcp->u_arg[0]);
printpath(tcp, tcp->u_arg[1]);
tprints(", ");
print_dirfd(tcp, tcp->u_arg[2]);
printpath(tcp, tcp->u_arg[3]);
tprints(", ");
printflags(at_flags, tcp->u_arg[4], "AT_???");
}
return 0;
print_dirfd(tcp, tcp->u_arg[0]);
printpath(tcp, tcp->u_arg[1]);
tprints(", ");
print_dirfd(tcp, tcp->u_arg[2]);
printpath(tcp, tcp->u_arg[3]);
tprints(", ");
printflags(at_flags, tcp->u_arg[4], "AT_???");
return RVAL_DECODED;
}
int
sys_unlinkat(struct tcb *tcp)
SYS_FUNC(unlinkat)
{
if (entering(tcp)) {
print_dirfd(tcp, tcp->u_arg[0]);
printpath(tcp, tcp->u_arg[1]);
tprints(", ");
printflags(at_flags, tcp->u_arg[2], "AT_???");
}
return 0;
print_dirfd(tcp, tcp->u_arg[0]);
printpath(tcp, tcp->u_arg[1]);
tprints(", ");
printflags(at_flags, tcp->u_arg[2], "AT_???");
return RVAL_DECODED;
}
int
sys_symlinkat(struct tcb *tcp)
SYS_FUNC(symlinkat)
{
if (entering(tcp)) {
printpath(tcp, tcp->u_arg[0]);
tprints(", ");
print_dirfd(tcp, tcp->u_arg[1]);
printpath(tcp, tcp->u_arg[2]);
}
return 0;
printpath(tcp, tcp->u_arg[0]);
tprints(", ");
print_dirfd(tcp, tcp->u_arg[1]);
printpath(tcp, tcp->u_arg[2]);
return RVAL_DECODED;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,277 +1,283 @@
#ifndef ARCH_sys_mmap
# define ARCH_sys_mmap sys_mmap
#ifndef sys_ARCH_mmap
# define sys_ARCH_mmap sys_mmap
#endif
[ 0] = { 2, 0, sys_io_setup, "io_setup" },
[ 1] = { 1, 0, sys_io_destroy, "io_destroy" },
[ 2] = { 3, 0, sys_io_submit, "io_submit" },
[ 3] = { 3, 0, sys_io_cancel, "io_cancel" },
[ 4] = { 5, 0, sys_io_getevents, "io_getevents" },
[ 5] = { 5, TF, sys_setxattr, "setxattr" },
[ 6] = { 5, TF, sys_setxattr, "lsetxattr" },
[ 7] = { 5, TD, sys_fsetxattr, "fsetxattr" },
[ 8] = { 4, TF, sys_getxattr, "getxattr" },
[ 9] = { 4, TF, sys_getxattr, "lgetxattr" },
[ 10] = { 4, TD, sys_fgetxattr, "fgetxattr" },
[ 11] = { 3, TF, sys_listxattr, "listxattr" },
[ 12] = { 3, TF, sys_listxattr, "llistxattr" },
[ 13] = { 3, TD, sys_flistxattr, "flistxattr" },
[ 14] = { 2, TF, sys_removexattr, "removexattr" },
[ 15] = { 2, TF, sys_removexattr, "lremovexattr" },
[ 16] = { 2, TD, sys_fremovexattr, "fremovexattr" },
[ 17] = { 2, TF, sys_getcwd, "getcwd" },
[ 18] = { 4, 0, sys_lookup_dcookie, "lookup_dcookie" },
[ 19] = { 2, TD, sys_eventfd2, "eventfd2" },
[ 20] = { 1, TD, sys_epoll_create1, "epoll_create1" },
[ 21] = { 4, TD, sys_epoll_ctl, "epoll_ctl" },
[ 22] = { 6, TD, sys_epoll_pwait, "epoll_pwait" },
[ 23] = { 1, TD, sys_dup, "dup" },
[ 24] = { 3, TD, sys_dup3, "dup3" },
[ 25] = { 3, TD, sys_fcntl, "fcntl64" },
[ 26] = { 1, TD, sys_inotify_init1, "inotify_init1" },
[ 27] = { 3, TD, sys_inotify_add_watch, "inotify_add_watch" },
[ 28] = { 2, TD, sys_inotify_rm_watch, "inotify_rm_watch" },
[ 29] = { 3, TD, sys_ioctl, "ioctl" },
[ 30] = { 3, 0, sys_ioprio_set, "ioprio_set" },
[ 31] = { 2, 0, sys_ioprio_get, "ioprio_get" },
[ 32] = { 2, TD, sys_flock, "flock" },
[ 33] = { 4, TD|TF, sys_mknodat, "mknodat" },
[ 34] = { 3, TD|TF, sys_mkdirat, "mkdirat" },
[ 35] = { 3, TD|TF, sys_unlinkat, "unlinkat" },
[ 36] = { 3, TD|TF, sys_symlinkat, "symlinkat" },
[ 37] = { 5, TD|TF, sys_linkat, "linkat" },
[ 38] = { 4, TD|TF, sys_renameat, "renameat" },
[ 39] = { 2, TF, sys_umount2, "umount2" },
[ 40] = { 5, TF, sys_mount, "mount" },
[ 41] = { 2, TF, sys_pivotroot, "pivot_root" },
[ 42] = { 3, 0, sys_nfsservctl, "nfsservctl" },
[ 43] = { 3, TF, sys_statfs64, "statfs64" },
[ 44] = { 3, TD, sys_fstatfs64, "fstatfs64" },
[ 45] = { 3, TF, sys_truncate64, "truncate64" },
[ 46] = { 3, TD, sys_ftruncate64, "ftruncate64" },
[ 47] = { 6, TD, sys_fallocate, "fallocate" },
[ 48] = { 3, TD|TF, sys_faccessat, "faccessat" },
[ 49] = { 1, TF, sys_chdir, "chdir" },
[ 50] = { 1, TD, sys_fchdir, "fchdir" },
[ 51] = { 1, TF, sys_chroot, "chroot" },
[ 52] = { 2, TD, sys_fchmod, "fchmod" },
[ 53] = { 3, TD|TF, sys_fchmodat, "fchmodat" },
[ 54] = { 5, TD|TF, sys_fchownat, "fchownat" },
[ 55] = { 3, TD, sys_fchown, "fchown" },
[ 56] = { 4, TD|TF, sys_openat, "openat" },
[ 57] = { 1, TD, sys_close, "close" },
[ 58] = { 0, 0, sys_vhangup, "vhangup" },
[ 59] = { 2, TD, sys_pipe2, "pipe2" },
[ 60] = { 4, TF, sys_quotactl, "quotactl" },
[ 61] = { 3, TD, sys_getdents64, "getdents64" },
[ 62] = { 5, TD, sys_llseek, "_llseek" },
[ 63] = { 3, TD, sys_read, "read" },
[ 64] = { 3, TD, sys_write, "write" },
[ 65] = { 3, TD, sys_readv, "readv" },
[ 66] = { 3, TD, sys_writev, "writev" },
[ 67] = { 5, TD, sys_pread, "pread64" },
[ 68] = { 5, TD, sys_pwrite, "pwrite64" },
[ 69] = { 5, TD, sys_preadv, "preadv" },
[ 70] = { 5, TD, sys_pwritev, "pwritev" },
[ 71] = { 4, TD|TN, sys_sendfile64, "sendfile64" },
[ 72] = { 6, TD, sys_pselect6, "pselect6" },
[ 73] = { 5, TD, sys_ppoll, "ppoll" },
[ 74] = { 4, TD|TS, sys_signalfd4, "signalfd4" },
[ 75] = { 4, TD, sys_vmsplice, "vmsplice" },
[ 76] = { 6, TD, sys_splice, "splice" },
[ 77] = { 4, TD, sys_tee, "tee" },
[ 78] = { 4, TD|TF, sys_readlinkat, "readlinkat" },
[ 79] = { 4, TD|TF, sys_newfstatat, "fstatat64" },
[ 80] = { 2, TD, sys_fstat64, "fstat64" },
[ 81] = { 0, 0, sys_sync, "sync" },
[ 82] = { 1, TD, sys_fsync, "fsync" },
[ 83] = { 1, TD, sys_fdatasync, "fdatasync" },
[ 0] = { 2, 0, SEN(io_setup), "io_setup" },
[ 1] = { 1, 0, SEN(io_destroy), "io_destroy" },
[ 2] = { 3, 0, SEN(io_submit), "io_submit" },
[ 3] = { 3, 0, SEN(io_cancel), "io_cancel" },
[ 4] = { 5, 0, SEN(io_getevents), "io_getevents" },
[ 5] = { 5, TF, SEN(setxattr), "setxattr" },
[ 6] = { 5, TF, SEN(setxattr), "lsetxattr" },
[ 7] = { 5, TD, SEN(fsetxattr), "fsetxattr" },
[ 8] = { 4, TF, SEN(getxattr), "getxattr" },
[ 9] = { 4, TF, SEN(getxattr), "lgetxattr" },
[ 10] = { 4, TD, SEN(fgetxattr), "fgetxattr" },
[ 11] = { 3, TF, SEN(listxattr), "listxattr" },
[ 12] = { 3, TF, SEN(listxattr), "llistxattr" },
[ 13] = { 3, TD, SEN(flistxattr), "flistxattr" },
[ 14] = { 2, TF, SEN(removexattr), "removexattr" },
[ 15] = { 2, TF, SEN(removexattr), "lremovexattr" },
[ 16] = { 2, TD, SEN(fremovexattr), "fremovexattr" },
[ 17] = { 2, TF, SEN(getcwd), "getcwd" },
[ 18] = { 4, 0, SEN(lookup_dcookie), "lookup_dcookie" },
[ 19] = { 2, TD, SEN(eventfd2), "eventfd2" },
[ 20] = { 1, TD, SEN(epoll_create1), "epoll_create1" },
[ 21] = { 4, TD, SEN(epoll_ctl), "epoll_ctl" },
[ 22] = { 6, TD, SEN(epoll_pwait), "epoll_pwait" },
[ 23] = { 1, TD, SEN(dup), "dup" },
[ 24] = { 3, TD, SEN(dup3), "dup3" },
[ 25] = { 3, TD, SEN(fcntl64), "fcntl64" },
[ 26] = { 1, TD, SEN(inotify_init1), "inotify_init1" },
[ 27] = { 3, TD, SEN(inotify_add_watch), "inotify_add_watch" },
[ 28] = { 2, TD, SEN(inotify_rm_watch), "inotify_rm_watch" },
[ 29] = { 3, TD, SEN(ioctl), "ioctl" },
[ 30] = { 3, 0, SEN(ioprio_set), "ioprio_set" },
[ 31] = { 2, 0, SEN(ioprio_get), "ioprio_get" },
[ 32] = { 2, TD, SEN(flock), "flock" },
[ 33] = { 4, TD|TF, SEN(mknodat), "mknodat" },
[ 34] = { 3, TD|TF, SEN(mkdirat), "mkdirat" },
[ 35] = { 3, TD|TF, SEN(unlinkat), "unlinkat" },
[ 36] = { 3, TD|TF, SEN(symlinkat), "symlinkat" },
[ 37] = { 5, TD|TF, SEN(linkat), "linkat" },
[ 38] = { 4, TD|TF, SEN(renameat), "renameat" },
[ 39] = { 2, TF, SEN(umount2), "umount2" },
[ 40] = { 5, TF, SEN(mount), "mount" },
[ 41] = { 2, TF, SEN(pivotroot), "pivot_root" },
[ 42] = { 3, 0, SEN(nfsservctl), "nfsservctl" },
[ 43] = { 3, TF, SEN(statfs64), "statfs64" },
[ 44] = { 3, TD, SEN(fstatfs64), "fstatfs64" },
[ 45] = { 3, TF, SEN(truncate64), "truncate64" },
[ 46] = { 3, TD, SEN(ftruncate64), "ftruncate64" },
[ 47] = { 6, TD, SEN(fallocate), "fallocate" },
[ 48] = { 3, TD|TF, SEN(faccessat), "faccessat" },
[ 49] = { 1, TF, SEN(chdir), "chdir" },
[ 50] = { 1, TD, SEN(fchdir), "fchdir" },
[ 51] = { 1, TF, SEN(chroot), "chroot" },
[ 52] = { 2, TD, SEN(fchmod), "fchmod" },
[ 53] = { 3, TD|TF, SEN(fchmodat), "fchmodat" },
[ 54] = { 5, TD|TF, SEN(fchownat), "fchownat" },
[ 55] = { 3, TD, SEN(fchown), "fchown" },
[ 56] = { 4, TD|TF, SEN(openat), "openat" },
[ 57] = { 1, TD, SEN(close), "close" },
[ 58] = { 0, 0, SEN(vhangup), "vhangup" },
[ 59] = { 2, TD, SEN(pipe2), "pipe2" },
[ 60] = { 4, TF, SEN(quotactl), "quotactl" },
[ 61] = { 3, TD, SEN(getdents64), "getdents64" },
[ 62] = { 5, TD, SEN(llseek), "_llseek" },
[ 63] = { 3, TD, SEN(read), "read" },
[ 64] = { 3, TD, SEN(write), "write" },
[ 65] = { 3, TD, SEN(readv), "readv" },
[ 66] = { 3, TD, SEN(writev), "writev" },
[ 67] = { 5, TD, SEN(pread), "pread64" },
[ 68] = { 5, TD, SEN(pwrite), "pwrite64" },
[ 69] = { 5, TD, SEN(preadv), "preadv" },
[ 70] = { 5, TD, SEN(pwritev), "pwritev" },
[ 71] = { 4, TD|TN, SEN(sendfile64), "sendfile64" },
[ 72] = { 6, TD, SEN(pselect6), "pselect6" },
[ 73] = { 5, TD, SEN(ppoll), "ppoll" },
[ 74] = { 4, TD|TS, SEN(signalfd4), "signalfd4" },
[ 75] = { 4, TD, SEN(vmsplice), "vmsplice" },
[ 76] = { 6, TD, SEN(splice), "splice" },
[ 77] = { 4, TD, SEN(tee), "tee" },
[ 78] = { 4, TD|TF, SEN(readlinkat), "readlinkat" },
[ 79] = { 4, TD|TF, SEN(newfstatat), "fstatat64" },
[ 80] = { 2, TD, SEN(fstat64), "fstat64" },
[ 81] = { 0, 0, SEN(sync), "sync" },
[ 82] = { 1, TD, SEN(fsync), "fsync" },
[ 83] = { 1, TD, SEN(fdatasync), "fdatasync" },
#ifdef ARCH_WANT_SYNC_FILE_RANGE2
[ 84] = { 6, TD, sys_sync_file_range2, "sync_file_range2" },
[ 84] = { 6, TD, SEN(sync_file_range2), "sync_file_range2" },
#else
[ 84] = { 6, TD, sys_sync_file_range, "sync_file_range" },
[ 84] = { 6, TD, SEN(sync_file_range), "sync_file_range" },
#endif
[ 85] = { 2, TD, sys_timerfd_create, "timerfd_create" },
[ 86] = { 4, TD, sys_timerfd_settime, "timerfd_settime" },
[ 87] = { 2, TD, sys_timerfd_gettime, "timerfd_gettime" },
[ 88] = { 4, TD|TF, sys_utimensat, "utimensat" },
[ 89] = { 1, TF, sys_acct, "acct" },
[ 90] = { 2, 0, sys_capget, "capget" },
[ 91] = { 2, 0, sys_capset, "capset" },
[ 92] = { 1, 0, sys_personality, "personality" },
[ 93] = { 1, TP|SE, sys_exit, "exit" },
[ 94] = { 1, TP|SE, sys_exit, "exit_group" },
[ 95] = { 5, TP, sys_waitid, "waitid" },
[ 96] = { 1, 0, sys_set_tid_address, "set_tid_address" },
[ 97] = { 1, TP, sys_unshare, "unshare" },
[ 98] = { 6, 0, sys_futex, "futex" },
[ 99] = { 2, 0, sys_set_robust_list, "set_robust_list" },
[100] = { 3, 0, sys_get_robust_list, "get_robust_list" },
[101] = { 2, 0, sys_nanosleep, "nanosleep" },
[102] = { 2, 0, sys_getitimer, "getitimer" },
[103] = { 3, 0, sys_setitimer, "setitimer" },
[104] = { 4, 0, sys_kexec_load, "kexec_load" },
[105] = { 3, 0, sys_init_module, "init_module" },
[106] = { 2, 0, sys_delete_module, "delete_module" },
[107] = { 3, 0, sys_timer_create, "timer_create" },
[108] = { 2, 0, sys_timer_gettime, "timer_gettime" },
[109] = { 1, 0, sys_timer_getoverrun, "timer_getoverrun" },
[110] = { 4, 0, sys_timer_settime, "timer_settime" },
[111] = { 1, 0, sys_timer_delete, "timer_delete" },
[112] = { 2, 0, sys_clock_settime, "clock_settime" },
[113] = { 2, 0, sys_clock_gettime, "clock_gettime" },
[114] = { 2, 0, sys_clock_getres, "clock_getres" },
[115] = { 4, 0, sys_clock_nanosleep, "clock_nanosleep" },
[116] = { 3, 0, sys_syslog, "syslog" },
[117] = { 4, 0, sys_ptrace, "ptrace" },
[118] = { 2, 0, sys_sched_setparam, "sched_setparam" },
[119] = { 3, 0, sys_sched_setscheduler, "sched_setscheduler" },
[120] = { 1, 0, sys_sched_getscheduler, "sched_getscheduler" },
[121] = { 2, 0, sys_sched_getparam, "sched_getparam" },
[122] = { 3, 0, sys_sched_setaffinity, "sched_setaffinity" },
[123] = { 3, 0, sys_sched_getaffinity, "sched_getaffinity" },
[124] = { 0, 0, sys_sched_yield, "sched_yield" },
[125] = { 1, 0, sys_sched_get_priority_max, "sched_get_priority_max"},
[126] = { 1, 0, sys_sched_get_priority_min, "sched_get_priority_min"},
[127] = { 2, 0, sys_sched_rr_get_interval, "sched_rr_get_interval" },
[128] = { 0, 0, sys_restart_syscall, "restart_syscall" },
[129] = { 2, TS, sys_kill, "kill" },
[130] = { 2, TS, sys_kill, "tkill" },
[131] = { 3, TS, sys_tgkill, "tgkill" },
[132] = { 2, TS, sys_sigaltstack, "sigaltstack" },
[133] = { 2, TS, sys_rt_sigsuspend, "rt_sigsuspend" },
[134] = { 4, TS, sys_rt_sigaction, "rt_sigaction" },
[135] = { 4, TS, sys_rt_sigprocmask, "rt_sigprocmask" },
[136] = { 2, TS, sys_rt_sigpending, "rt_sigpending" },
[137] = { 4, TS, sys_rt_sigtimedwait, "rt_sigtimedwait" },
[138] = { 3, TS, sys_rt_sigqueueinfo, "rt_sigqueueinfo" },
[139] = { 0, TS, sys_rt_sigreturn, "rt_sigreturn" },
[140] = { 3, 0, sys_setpriority, "setpriority" },
[141] = { 2, 0, sys_getpriority, "getpriority" },
[142] = { 4, 0, sys_reboot, "reboot" },
[143] = { 2, 0, sys_setregid, "setregid" },
[144] = { 1, 0, sys_setgid, "setgid" },
[145] = { 2, 0, sys_setreuid, "setreuid" },
[146] = { 1, 0, sys_setuid, "setuid" },
[147] = { 3, 0, sys_setresuid, "setresuid" },
[148] = { 3, 0, sys_getresuid, "getresuid" },
[149] = { 3, 0, sys_setresgid, "setresgid" },
[150] = { 3, 0, sys_getresgid, "getresgid" },
[151] = { 1, NF, sys_setfsuid, "setfsuid" },
[152] = { 1, NF, sys_setfsgid, "setfsgid" },
[153] = { 1, 0, sys_times, "times" },
[154] = { 2, 0, sys_setpgid, "setpgid" },
[155] = { 1, 0, sys_getpgid, "getpgid" },
[156] = { 1, 0, sys_getsid, "getsid" },
[157] = { 0, 0, sys_setsid, "setsid" },
[158] = { 2, 0, sys_getgroups, "getgroups" },
[159] = { 2, 0, sys_setgroups, "setgroups" },
[160] = { 1, 0, sys_uname, "uname" },
[161] = { 2, 0, sys_sethostname, "sethostname" },
[162] = { 2, 0, sys_setdomainname, "setdomainname" },
[163] = { 2, 0, sys_getrlimit, "getrlimit" },
[164] = { 2, 0, sys_setrlimit, "setrlimit" },
[165] = { 2, 0, sys_getrusage, "getrusage" },
[166] = { 1, 0, sys_umask, "umask" },
[167] = { 5, 0, sys_prctl, "prctl" },
[168] = { 3, 0, sys_getcpu, "getcpu" },
[169] = { 2, 0, sys_gettimeofday, "gettimeofday" },
[170] = { 2, 0, sys_settimeofday, "settimeofday" },
[171] = { 1, 0, sys_adjtimex, "adjtimex" },
[172] = { 0, 0, sys_getpid, "getpid" },
[173] = { 0, 0, sys_getppid, "getppid" },
[174] = { 0, NF, sys_getuid, "getuid" },
[175] = { 0, NF, sys_geteuid, "geteuid" },
[176] = { 0, NF, sys_getgid, "getgid" },
[177] = { 0, NF, sys_getegid, "getegid" },
[178] = { 0, 0, sys_gettid, "gettid" },
[179] = { 1, 0, sys_sysinfo, "sysinfo" },
[180] = { 4, 0, sys_mq_open, "mq_open" },
[181] = { 1, 0, sys_mq_unlink, "mq_unlink" },
[182] = { 5, 0, sys_mq_timedsend, "mq_timedsend" },
[183] = { 5, 0, sys_mq_timedreceive, "mq_timedreceive" },
[184] = { 2, 0, sys_mq_notify, "mq_notify" },
[185] = { 3, 0, sys_mq_getsetattr, "mq_getsetattr" },
[186] = { 2, TI, sys_msgget, "msgget" },
[187] = { 3, TI, sys_msgctl, "msgctl" },
[188] = { 5, TI, sys_msgrcv, "msgrcv" },
[189] = { 4, TI, sys_msgsnd, "msgsnd" },
[190] = { 3, TI, sys_semget, "semget" },
[191] = { 4, TI, sys_semctl, "semctl" },
[192] = { 4, TI, sys_semtimedop, "semtimedop" },
[193] = { 3, TI, sys_semop, "semop" },
[194] = { 3, TI, sys_shmget, "shmget" },
[195] = { 3, TI, sys_shmctl, "shmctl" },
[196] = { 3, TI|TM|SI, sys_shmat, "shmat" },
[197] = { 1, TI|TM|SI, sys_shmdt, "shmdt" },
[198] = { 3, TN, sys_socket, "socket" },
[199] = { 4, TN, sys_socketpair, "socketpair" },
[200] = { 3, TN, sys_bind, "bind" },
[201] = { 2, TN, sys_listen, "listen" },
[202] = { 3, TN, sys_accept, "accept" },
[203] = { 3, TN, sys_connect, "connect" },
[204] = { 3, TN, sys_getsockname, "getsockname" },
[205] = { 3, TN, sys_getpeername, "getpeername" },
[206] = { 6, TN, sys_sendto, "sendto" },
[207] = { 6, TN, sys_recvfrom, "recvfrom" },
[208] = { 5, TN, sys_setsockopt, "setsockopt" },
[209] = { 5, TN, sys_getsockopt, "getsockopt" },
[210] = { 2, TN, sys_shutdown, "shutdown" },
[211] = { 3, TN, sys_sendmsg, "sendmsg" },
[212] = { 3, TN, sys_recvmsg, "recvmsg" },
[213] = { 4, TD, sys_readahead, "readahead" },
[214] = { 1, TM|SI, sys_brk, "brk" },
[215] = { 2, TM|SI, sys_munmap, "munmap" },
[216] = { 5, TM|SI, sys_mremap, "mremap" },
[217] = { 5, 0, sys_add_key, "add_key" },
[218] = { 4, 0, sys_request_key, "request_key" },
[219] = { 5, 0, sys_keyctl, "keyctl" },
[220] = { 5, TP, sys_clone, "clone" },
[221] = { 3, TF|TP|SE|SI, sys_execve, "execve" },
[222] = { 6, TD|TM|SI, ARCH_sys_mmap, "mmap2" },
[223] = { 6, TD, sys_fadvise64_64, "fadvise64_64" },
[224] = { 2, TF, sys_swapon, "swapon" },
[225] = { 1, TF, sys_swapoff, "swapoff" },
[226] = { 3, TM|SI, sys_mprotect, "mprotect" },
[227] = { 3, TM, sys_msync, "msync" },
[228] = { 2, TM, sys_mlock, "mlock" },
[229] = { 2, TM, sys_munlock, "munlock" },
[230] = { 1, TM, sys_mlockall, "mlockall" },
[231] = { 0, TM, sys_munlockall, "munlockall" },
[232] = { 3, TM, sys_mincore, "mincore" },
[233] = { 3, TM, sys_madvise, "madvise" },
[234] = { 5, TM|SI, sys_remap_file_pages, "remap_file_pages" },
[235] = { 6, TM, sys_mbind, "mbind" },
[236] = { 5, TM, sys_get_mempolicy, "get_mempolicy" },
[237] = { 3, TM, sys_set_mempolicy, "set_mempolicy" },
[238] = { 4, TM, sys_migrate_pages, "migrate_pages" },
[239] = { 6, TM, sys_move_pages, "move_pages" },
[240] = { 4, TP|TS, sys_rt_tgsigqueueinfo, "rt_tgsigqueueinfo" },
[241] = { 5, TD, sys_perf_event_open, "perf_event_open" },
[242] = { 4, TN, sys_accept4, "accept4" },
[243] = { 5, TN, sys_recvmmsg, "recvmmsg" },
[ 85] = { 2, TD, SEN(timerfd_create), "timerfd_create" },
[ 86] = { 4, TD, SEN(timerfd_settime), "timerfd_settime" },
[ 87] = { 2, TD, SEN(timerfd_gettime), "timerfd_gettime" },
[ 88] = { 4, TD|TF, SEN(utimensat), "utimensat" },
[ 89] = { 1, TF, SEN(acct), "acct" },
[ 90] = { 2, 0, SEN(capget), "capget" },
[ 91] = { 2, 0, SEN(capset), "capset" },
[ 92] = { 1, NF, SEN(personality), "personality" },
[ 93] = { 1, TP|SE, SEN(exit), "exit" },
[ 94] = { 1, TP|SE, SEN(exit), "exit_group" },
[ 95] = { 5, TP, SEN(waitid), "waitid" },
[ 96] = { 1, 0, SEN(set_tid_address), "set_tid_address" },
[ 97] = { 1, TP, SEN(unshare), "unshare" },
[ 98] = { 6, 0, SEN(futex), "futex" },
[ 99] = { 2, 0, SEN(set_robust_list), "set_robust_list" },
[100] = { 3, 0, SEN(get_robust_list), "get_robust_list" },
[101] = { 2, 0, SEN(nanosleep), "nanosleep" },
[102] = { 2, 0, SEN(getitimer), "getitimer" },
[103] = { 3, 0, SEN(setitimer), "setitimer" },
[104] = { 4, 0, SEN(kexec_load), "kexec_load" },
[105] = { 3, 0, SEN(init_module), "init_module" },
[106] = { 2, 0, SEN(delete_module), "delete_module" },
[107] = { 3, 0, SEN(timer_create), "timer_create" },
[108] = { 2, 0, SEN(timer_gettime), "timer_gettime" },
[109] = { 1, 0, SEN(timer_getoverrun), "timer_getoverrun" },
[110] = { 4, 0, SEN(timer_settime), "timer_settime" },
[111] = { 1, 0, SEN(timer_delete), "timer_delete" },
[112] = { 2, 0, SEN(clock_settime), "clock_settime" },
[113] = { 2, 0, SEN(clock_gettime), "clock_gettime" },
[114] = { 2, 0, SEN(clock_getres), "clock_getres" },
[115] = { 4, 0, SEN(clock_nanosleep), "clock_nanosleep" },
[116] = { 3, 0, SEN(syslog), "syslog" },
[117] = { 4, 0, SEN(ptrace), "ptrace" },
[118] = { 2, 0, SEN(sched_setparam), "sched_setparam" },
[119] = { 3, 0, SEN(sched_setscheduler), "sched_setscheduler" },
[120] = { 1, 0, SEN(sched_getscheduler), "sched_getscheduler" },
[121] = { 2, 0, SEN(sched_getparam), "sched_getparam" },
[122] = { 3, 0, SEN(sched_setaffinity), "sched_setaffinity" },
[123] = { 3, 0, SEN(sched_getaffinity), "sched_getaffinity" },
[124] = { 0, 0, SEN(sched_yield), "sched_yield" },
[125] = { 1, 0, SEN(sched_get_priority_max), "sched_get_priority_max"},
[126] = { 1, 0, SEN(sched_get_priority_min), "sched_get_priority_min"},
[127] = { 2, 0, SEN(sched_rr_get_interval), "sched_rr_get_interval" },
[128] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
[129] = { 2, TS, SEN(kill), "kill" },
[130] = { 2, TS, SEN(kill), "tkill" },
[131] = { 3, TS, SEN(tgkill), "tgkill" },
[132] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[133] = { 2, TS, SEN(rt_sigsuspend), "rt_sigsuspend" },
[134] = { 4, TS, SEN(rt_sigaction), "rt_sigaction" },
[135] = { 4, TS, SEN(rt_sigprocmask), "rt_sigprocmask" },
[136] = { 2, TS, SEN(rt_sigpending), "rt_sigpending" },
[137] = { 4, TS, SEN(rt_sigtimedwait), "rt_sigtimedwait" },
[138] = { 3, TS, SEN(rt_sigqueueinfo), "rt_sigqueueinfo" },
[139] = { 0, TS, SEN(rt_sigreturn), "rt_sigreturn" },
[140] = { 3, 0, SEN(setpriority), "setpriority" },
[141] = { 2, 0, SEN(getpriority), "getpriority" },
[142] = { 4, 0, SEN(reboot), "reboot" },
[143] = { 2, 0, SEN(setregid), "setregid" },
[144] = { 1, 0, SEN(setgid), "setgid" },
[145] = { 2, 0, SEN(setreuid), "setreuid" },
[146] = { 1, 0, SEN(setuid), "setuid" },
[147] = { 3, 0, SEN(setresuid), "setresuid" },
[148] = { 3, 0, SEN(getresuid), "getresuid" },
[149] = { 3, 0, SEN(setresgid), "setresgid" },
[150] = { 3, 0, SEN(getresgid), "getresgid" },
[151] = { 1, NF, SEN(setfsuid), "setfsuid" },
[152] = { 1, NF, SEN(setfsgid), "setfsgid" },
[153] = { 1, 0, SEN(times), "times" },
[154] = { 2, 0, SEN(setpgid), "setpgid" },
[155] = { 1, 0, SEN(getpgid), "getpgid" },
[156] = { 1, 0, SEN(getsid), "getsid" },
[157] = { 0, 0, SEN(setsid), "setsid" },
[158] = { 2, 0, SEN(getgroups), "getgroups" },
[159] = { 2, 0, SEN(setgroups), "setgroups" },
[160] = { 1, 0, SEN(uname), "uname" },
[161] = { 2, 0, SEN(sethostname), "sethostname" },
[162] = { 2, 0, SEN(setdomainname), "setdomainname" },
[163] = { 2, 0, SEN(getrlimit), "getrlimit" },
[164] = { 2, 0, SEN(setrlimit), "setrlimit" },
[165] = { 2, 0, SEN(getrusage), "getrusage" },
[166] = { 1, NF, SEN(umask), "umask" },
[167] = { 5, 0, SEN(prctl), "prctl" },
[168] = { 3, 0, SEN(getcpu), "getcpu" },
[169] = { 2, 0, SEN(gettimeofday), "gettimeofday" },
[170] = { 2, 0, SEN(settimeofday), "settimeofday" },
[171] = { 1, 0, SEN(adjtimex), "adjtimex" },
[172] = { 0, NF, SEN(getpid), "getpid" },
[173] = { 0, NF, SEN(getppid), "getppid" },
[174] = { 0, NF, SEN(getuid), "getuid" },
[175] = { 0, NF, SEN(geteuid), "geteuid" },
[176] = { 0, NF, SEN(getgid), "getgid" },
[177] = { 0, NF, SEN(getegid), "getegid" },
[178] = { 0, NF, SEN(gettid), "gettid" },
[179] = { 1, 0, SEN(sysinfo), "sysinfo" },
[180] = { 4, 0, SEN(mq_open), "mq_open" },
[181] = { 1, 0, SEN(mq_unlink), "mq_unlink" },
[182] = { 5, 0, SEN(mq_timedsend), "mq_timedsend" },
[183] = { 5, 0, SEN(mq_timedreceive), "mq_timedreceive" },
[184] = { 2, 0, SEN(mq_notify), "mq_notify" },
[185] = { 3, 0, SEN(mq_getsetattr), "mq_getsetattr" },
[186] = { 2, TI, SEN(msgget), "msgget" },
[187] = { 3, TI, SEN(msgctl), "msgctl" },
[188] = { 5, TI, SEN(msgrcv), "msgrcv" },
[189] = { 4, TI, SEN(msgsnd), "msgsnd" },
[190] = { 3, TI, SEN(semget), "semget" },
[191] = { 4, TI, SEN(semctl), "semctl" },
[192] = { 4, TI, SEN(semtimedop), "semtimedop" },
[193] = { 3, TI, SEN(semop), "semop" },
[194] = { 3, TI, SEN(shmget), "shmget" },
[195] = { 3, TI, SEN(shmctl), "shmctl" },
[196] = { 3, TI|TM|SI, SEN(shmat), "shmat" },
[197] = { 1, TI|TM|SI, SEN(shmdt), "shmdt" },
[198] = { 3, TN, SEN(socket), "socket" },
[199] = { 4, TN, SEN(socketpair), "socketpair" },
[200] = { 3, TN, SEN(bind), "bind" },
[201] = { 2, TN, SEN(listen), "listen" },
[202] = { 3, TN, SEN(accept), "accept" },
[203] = { 3, TN, SEN(connect), "connect" },
[204] = { 3, TN, SEN(getsockname), "getsockname" },
[205] = { 3, TN, SEN(getpeername), "getpeername" },
[206] = { 6, TN, SEN(sendto), "sendto" },
[207] = { 6, TN, SEN(recvfrom), "recvfrom" },
[208] = { 5, TN, SEN(setsockopt), "setsockopt" },
[209] = { 5, TN, SEN(getsockopt), "getsockopt" },
[210] = { 2, TN, SEN(shutdown), "shutdown" },
[211] = { 3, TN, SEN(sendmsg), "sendmsg" },
[212] = { 3, TN, SEN(recvmsg), "recvmsg" },
[213] = { 4, TD, SEN(readahead), "readahead" },
[214] = { 1, TM|SI, SEN(brk), "brk" },
[215] = { 2, TM|SI, SEN(munmap), "munmap" },
[216] = { 5, TM|SI, SEN(mremap), "mremap" },
[217] = { 5, 0, SEN(add_key), "add_key" },
[218] = { 4, 0, SEN(request_key), "request_key" },
[219] = { 5, 0, SEN(keyctl), "keyctl" },
[220] = { 5, TP, SEN(clone), "clone" },
[221] = { 3, TF|TP|SE|SI, SEN(execve), "execve" },
[222] = { 6, TD|TM|SI, SEN(ARCH_mmap), "mmap2" },
[223] = { 6, TD, SEN(fadvise64_64), "fadvise64_64" },
[224] = { 2, TF, SEN(swapon), "swapon" },
[225] = { 1, TF, SEN(swapoff), "swapoff" },
[226] = { 3, TM|SI, SEN(mprotect), "mprotect" },
[227] = { 3, TM, SEN(msync), "msync" },
[228] = { 2, TM, SEN(mlock), "mlock" },
[229] = { 2, TM, SEN(munlock), "munlock" },
[230] = { 1, TM, SEN(mlockall), "mlockall" },
[231] = { 0, TM, SEN(munlockall), "munlockall" },
[232] = { 3, TM, SEN(mincore), "mincore" },
[233] = { 3, TM, SEN(madvise), "madvise" },
[234] = { 5, TM|SI, SEN(remap_file_pages), "remap_file_pages" },
[235] = { 6, TM, SEN(mbind), "mbind" },
[236] = { 5, TM, SEN(get_mempolicy), "get_mempolicy" },
[237] = { 3, TM, SEN(set_mempolicy), "set_mempolicy" },
[238] = { 4, TM, SEN(migrate_pages), "migrate_pages" },
[239] = { 6, TM, SEN(move_pages), "move_pages" },
[240] = { 4, TP|TS, SEN(rt_tgsigqueueinfo), "rt_tgsigqueueinfo" },
[241] = { 5, TD, SEN(perf_event_open), "perf_event_open" },
[242] = { 4, TN, SEN(accept4), "accept4" },
[243] = { 5, TN, SEN(recvmmsg), "recvmmsg" },
/* [244 ... 259] are arch specific */
[260] = { 4, TP, sys_wait4, "wait4" },
[261] = { 4, 0, sys_prlimit64, "prlimit64" },
[262] = { 2, TD, sys_fanotify_init, "fanotify_init" },
[263] = { 6, TD|TF, sys_fanotify_mark, "fanotify_mark" },
[264] = { 5, TD|TF, sys_name_to_handle_at, "name_to_handle_at" },
[265] = { 3, TD, sys_open_by_handle_at, "open_by_handle_at" },
[266] = { 2, 0, sys_clock_adjtime, "clock_adjtime" },
[267] = { 1, TD, sys_syncfs, "syncfs" },
[268] = { 2, TD, sys_setns, "setns" },
[269] = { 4, TN, sys_sendmmsg, "sendmmsg" },
[270] = { 6, 0, sys_process_vm_readv, "process_vm_readv" },
[271] = { 6, 0, sys_process_vm_writev, "process_vm_writev" },
[272] = { 5, 0, sys_kcmp, "kcmp" },
[273] = { 3, TD, sys_finit_module, "finit_module" },
[274] = { 3, 0, sys_sched_setattr, "sched_setattr" },
[275] = { 4, 0, sys_sched_getattr, "sched_getattr" },
[276] = { 5, TD|TF, sys_renameat2, "renameat2" },
[277] = { 3, 0, sys_seccomp, "seccomp", },
[278] = { 3, 0, sys_getrandom, "getrandom", },
[279] = { 2, TD, sys_memfd_create, "memfd_create", },
[280] = { 3, TD, sys_bpf, "bpf", },
[281] = { 5, TD|TF|TP|SE|SI, sys_execveat, "execveat", },
[260] = { 4, TP, SEN(wait4), "wait4" },
[261] = { 4, 0, SEN(prlimit64), "prlimit64" },
[262] = { 2, TD, SEN(fanotify_init), "fanotify_init" },
[263] = { 6, TD|TF, SEN(fanotify_mark), "fanotify_mark" },
[264] = { 5, TD|TF, SEN(name_to_handle_at), "name_to_handle_at" },
[265] = { 3, TD, SEN(open_by_handle_at), "open_by_handle_at" },
[266] = { 2, 0, SEN(clock_adjtime), "clock_adjtime" },
[267] = { 1, TD, SEN(syncfs), "syncfs" },
[268] = { 2, TD, SEN(setns), "setns" },
[269] = { 4, TN, SEN(sendmmsg), "sendmmsg" },
[270] = { 6, 0, SEN(process_vm_readv), "process_vm_readv" },
[271] = { 6, 0, SEN(process_vm_writev), "process_vm_writev" },
[272] = { 5, 0, SEN(kcmp), "kcmp" },
[273] = { 3, TD, SEN(finit_module), "finit_module" },
[274] = { 3, 0, SEN(sched_setattr), "sched_setattr" },
[275] = { 4, 0, SEN(sched_getattr), "sched_getattr" },
[276] = { 5, TD|TF, SEN(renameat2), "renameat2" },
[277] = { 3, 0, SEN(seccomp), "seccomp", },
[278] = { 3, 0, SEN(getrandom), "getrandom", },
[279] = { 2, TD, SEN(memfd_create), "memfd_create", },
[280] = { 3, TD, SEN(bpf), "bpf", },
[281] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
[282] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
[283] = { 2, 0, SEN(membarrier), "membarrier", },
[284] = { 3, TM, SEN(mlock2), "mlock2" },
[285] = { 6, TD, SEN(copy_file_range), "copy_file_range" },
[286] = { 6, TD, SEN(preadv2), "preadv2" },
[287] = { 6, TD, SEN(pwritev2), "pwritev2" },
#undef ARCH_sys_mmap
#undef sys_ARCH_mmap
#undef ARCH_WANT_SYNC_FILE_RANGE2

View File

@ -81,6 +81,18 @@
{ "asm-generic/sockios.h", "SIOCGSTAMP", 0, 0x8906, 0 },
{ "asm-generic/sockios.h", "SIOCGSTAMPNS", 0, 0x8907, 0 },
{ "asm-generic/sockios.h", "SIOCSPGRP", 0, 0x8902, 0 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_BO_LIST", _IOC_READ|_IOC_WRITE, 0x6443, 0x18 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_CS", _IOC_READ|_IOC_WRITE, 0x6444, 0x18 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_CTX", _IOC_READ|_IOC_WRITE, 0x6442, 0x10 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_GEM_CREATE", _IOC_READ|_IOC_WRITE, 0x6440, 0x20 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_GEM_METADATA", _IOC_READ|_IOC_WRITE, 0x6446, 0x120 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_GEM_MMAP", _IOC_READ|_IOC_WRITE, 0x6441, 0x08 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_GEM_OP", _IOC_READ|_IOC_WRITE, 0x6450, 0x10 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_GEM_USERPTR", _IOC_READ|_IOC_WRITE, 0x6451, 0x18 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_GEM_VA", _IOC_WRITE, 0x6448, 0x28 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_GEM_WAIT_IDLE", _IOC_READ|_IOC_WRITE, 0x6447, 0x10 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_INFO", _IOC_WRITE, 0x6445, 0x20 },
{ "drm/amdgpu_drm.h", "DRM_IOCTL_AMDGPU_WAIT_CS", _IOC_READ|_IOC_WRITE, 0x6449, 0x20 },
{ "drm/drm.h", "DRM_IOCTL_ADD_BUFS", _IOC_READ|_IOC_WRITE, 0x6416, 0x20 },
{ "drm/drm.h", "DRM_IOCTL_ADD_CTX", _IOC_READ|_IOC_WRITE, 0x6420, 0x08 },
{ "drm/drm.h", "DRM_IOCTL_ADD_DRAW", _IOC_READ|_IOC_WRITE, 0x6427, 0x04 },
@ -118,11 +130,14 @@
{ "drm/drm.h", "DRM_IOCTL_MARK_BUFS", _IOC_WRITE, 0x6417, 0x20 },
{ "drm/drm.h", "DRM_IOCTL_MODESET_CTL", _IOC_WRITE, 0x6408, 0x08 },
{ "drm/drm.h", "DRM_IOCTL_MODE_ADDFB", _IOC_READ|_IOC_WRITE, 0x64ae, 0x1c },
{ "drm/drm.h", "DRM_IOCTL_MODE_ADDFB2", _IOC_READ|_IOC_WRITE, 0x64b8, 0x44 },
{ "drm/drm.h", "DRM_IOCTL_MODE_ADDFB2", _IOC_READ|_IOC_WRITE, 0x64b8, 0x68 },
{ "drm/drm.h", "DRM_IOCTL_MODE_ATOMIC", _IOC_READ|_IOC_WRITE, 0x64bc, 0x38 },
{ "drm/drm.h", "DRM_IOCTL_MODE_ATTACHMODE", _IOC_READ|_IOC_WRITE, 0x64a8, 0x48 },
{ "drm/drm.h", "DRM_IOCTL_MODE_CREATEPROPBLOB", _IOC_READ|_IOC_WRITE, 0x64bd, 0x10 },
{ "drm/drm.h", "DRM_IOCTL_MODE_CREATE_DUMB", _IOC_READ|_IOC_WRITE, 0x64b2, 0x20 },
{ "drm/drm.h", "DRM_IOCTL_MODE_CURSOR", _IOC_READ|_IOC_WRITE, 0x64a3, 0x1c },
{ "drm/drm.h", "DRM_IOCTL_MODE_CURSOR2", _IOC_READ|_IOC_WRITE, 0x64bb, 0x24 },
{ "drm/drm.h", "DRM_IOCTL_MODE_DESTROYPROPBLOB", _IOC_READ|_IOC_WRITE, 0x64be, 0x04 },
{ "drm/drm.h", "DRM_IOCTL_MODE_DESTROY_DUMB", _IOC_READ|_IOC_WRITE, 0x64b4, 0x04 },
{ "drm/drm.h", "DRM_IOCTL_MODE_DETACHMODE", _IOC_READ|_IOC_WRITE, 0x64a9, 0x48 },
{ "drm/drm.h", "DRM_IOCTL_MODE_DIRTYFB", _IOC_READ|_IOC_WRITE, 0x64b1, 0x18 },
@ -166,11 +181,21 @@
{ "drm/drm.h", "DRM_IOCTL_UPDATE_DRAW", _IOC_WRITE, 0x643f, 0x18 },
{ "drm/drm.h", "DRM_IOCTL_VERSION", _IOC_READ|_IOC_WRITE, 0x6400, 0x40 },
{ "drm/drm.h", "DRM_IOCTL_WAIT_VBLANK", _IOC_READ|_IOC_WRITE, 0x643a, 0x18 },
{ "drm/etnaviv_drm.h", "DRM_IOCTL_ETNAVIV_GEM_CPU_FINI", _IOC_WRITE, 0x6445, 0x08 },
{ "drm/etnaviv_drm.h", "DRM_IOCTL_ETNAVIV_GEM_CPU_PREP", _IOC_WRITE, 0x6444, 0x18 },
{ "drm/etnaviv_drm.h", "DRM_IOCTL_ETNAVIV_GEM_INFO", _IOC_READ|_IOC_WRITE, 0x6443, 0x10 },
{ "drm/etnaviv_drm.h", "DRM_IOCTL_ETNAVIV_GEM_NEW", _IOC_READ|_IOC_WRITE, 0x6442, 0x10 },
{ "drm/etnaviv_drm.h", "DRM_IOCTL_ETNAVIV_GEM_SUBMIT", _IOC_READ|_IOC_WRITE, 0x6446, 0x30 },
{ "drm/etnaviv_drm.h", "DRM_IOCTL_ETNAVIV_GEM_USERPTR", _IOC_READ|_IOC_WRITE, 0x6448, 0x18 },
{ "drm/etnaviv_drm.h", "DRM_IOCTL_ETNAVIV_GEM_WAIT", _IOC_WRITE, 0x6449, 0x20 },
{ "drm/etnaviv_drm.h", "DRM_IOCTL_ETNAVIV_GET_PARAM", _IOC_READ|_IOC_WRITE, 0x6440, 0x10 },
{ "drm/etnaviv_drm.h", "DRM_IOCTL_ETNAVIV_WAIT_FENCE", _IOC_WRITE, 0x6447, 0x20 },
{ "drm/exynos_drm.h", "DRM_IOCTL_EXYNOS_G2D_EXEC", _IOC_READ|_IOC_WRITE, 0x6462, 0x08 },
{ "drm/exynos_drm.h", "DRM_IOCTL_EXYNOS_G2D_GET_VER", _IOC_READ|_IOC_WRITE, 0x6460, 0x08 },
{ "drm/exynos_drm.h", "DRM_IOCTL_EXYNOS_G2D_SET_CMDLIST", _IOC_READ|_IOC_WRITE, 0x6461, 0x28 },
{ "drm/exynos_drm.h", "DRM_IOCTL_EXYNOS_GEM_CREATE", _IOC_READ|_IOC_WRITE, 0x6440, 0x10 },
{ "drm/exynos_drm.h", "DRM_IOCTL_EXYNOS_GEM_GET", _IOC_READ|_IOC_WRITE, 0x6444, 0x10 },
{ "drm/exynos_drm.h", "DRM_IOCTL_EXYNOS_GEM_MAP", _IOC_READ|_IOC_WRITE, 0x6441, 0x10 },
{ "drm/exynos_drm.h", "DRM_IOCTL_EXYNOS_IPP_CMD_CTRL", _IOC_READ|_IOC_WRITE, 0x6473, 0x08 },
{ "drm/exynos_drm.h", "DRM_IOCTL_EXYNOS_IPP_GET_PROPERTY", _IOC_READ|_IOC_WRITE, 0x6470, 0x50 },
{ "drm/exynos_drm.h", "DRM_IOCTL_EXYNOS_IPP_QUEUE_BUF", _IOC_READ|_IOC_WRITE, 0x6472, 0x28 },
@ -201,6 +226,8 @@
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_BUSY", _IOC_READ|_IOC_WRITE, 0x6457, 0x08 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_CONTEXT_CREATE", _IOC_READ|_IOC_WRITE, 0x646d, 0x08 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_CONTEXT_DESTROY", _IOC_WRITE, 0x646e, 0x08 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM", _IOC_READ|_IOC_WRITE, 0x6474, 0x18 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM", _IOC_READ|_IOC_WRITE, 0x6475, 0x18 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_CREATE", _IOC_READ|_IOC_WRITE, 0x645b, 0x10 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_ENTERVT", _IOC_NONE, 0x6459, 0x00 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_EXECBUFFER", _IOC_WRITE, 0x6454, 0x28 },
@ -211,7 +238,7 @@
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_INIT", _IOC_WRITE, 0x6453, 0x10 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_LEAVEVT", _IOC_NONE, 0x645a, 0x00 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_MADVISE", _IOC_READ|_IOC_WRITE, 0x6466, 0x0c },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_MMAP", _IOC_READ|_IOC_WRITE, 0x645e, 0x20 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_MMAP", _IOC_READ|_IOC_WRITE, 0x645e, 0x28 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_MMAP_GTT", _IOC_READ|_IOC_WRITE, 0x6464, 0x10 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_PIN", _IOC_READ|_IOC_WRITE, 0x6455, 0x18 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GEM_PREAD", _IOC_WRITE, 0x645c, 0x20 },
@ -227,7 +254,7 @@
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GETPARAM", _IOC_READ|_IOC_WRITE, 0x6446, 0x10 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID", _IOC_READ|_IOC_WRITE, 0x6465, 0x08 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GET_RESET_STATS", _IOC_READ|_IOC_WRITE, 0x6472, 0x18 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GET_SPRITE_COLORKEY", _IOC_READ|_IOC_WRITE, 0x646b, 0x14 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GET_SPRITE_COLORKEY", _IOC_READ|_IOC_WRITE, 0x646a, 0x14 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_GET_VBLANK_PIPE", _IOC_READ, 0x644e, 0x04 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_HWS_ADDR", _IOC_WRITE, 0x6451, 0x10 },
{ "drm/i915_drm.h", "DRM_IOCTL_I915_INIT", _IOC_WRITE, 0x6440, 0x44 },
@ -352,7 +379,7 @@
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_GEM_CREATE", _IOC_READ|_IOC_WRITE, 0x6440, 0x10 },
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_GEM_GET_FLAGS", _IOC_READ|_IOC_WRITE, 0x644d, 0x08 },
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_GEM_GET_TILING", _IOC_READ|_IOC_WRITE, 0x644b, 0x10 },
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_GEM_MMAP", _IOC_READ|_IOC_WRITE, 0x6441, 0x08 },
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_GEM_MMAP", _IOC_READ|_IOC_WRITE, 0x6441, 0x10 },
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_GEM_SET_FLAGS", _IOC_READ|_IOC_WRITE, 0x644c, 0x08 },
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_GEM_SET_TILING", _IOC_READ|_IOC_WRITE, 0x644a, 0x10 },
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_GET_SYNCPT", _IOC_READ|_IOC_WRITE, 0x6447, 0x10 },
@ -362,6 +389,13 @@
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_SYNCPT_INCR", _IOC_READ|_IOC_WRITE, 0x6443, 0x08 },
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_SYNCPT_READ", _IOC_READ|_IOC_WRITE, 0x6442, 0x08 },
{ "drm/tegra_drm.h", "DRM_IOCTL_TEGRA_SYNCPT_WAIT", _IOC_READ|_IOC_WRITE, 0x6444, 0x10 },
{ "drm/vc4_drm.h", "DRM_IOCTL_VC4_CREATE_BO", _IOC_READ|_IOC_WRITE, 0x6443, 0x10 },
{ "drm/vc4_drm.h", "DRM_IOCTL_VC4_CREATE_SHADER_BO", _IOC_READ|_IOC_WRITE, 0x6445, 0x18 },
{ "drm/vc4_drm.h", "DRM_IOCTL_VC4_GET_HANG_STATE", _IOC_READ|_IOC_WRITE, 0x6446, 0xa0 },
{ "drm/vc4_drm.h", "DRM_IOCTL_VC4_MMAP_BO", _IOC_READ|_IOC_WRITE, 0x6444, 0x10 },
{ "drm/vc4_drm.h", "DRM_IOCTL_VC4_SUBMIT_CL", _IOC_READ|_IOC_WRITE, 0x6440, 0xa0 },
{ "drm/vc4_drm.h", "DRM_IOCTL_VC4_WAIT_BO", _IOC_READ|_IOC_WRITE, 0x6442, 0x10 },
{ "drm/vc4_drm.h", "DRM_IOCTL_VC4_WAIT_SEQNO", _IOC_READ|_IOC_WRITE, 0x6441, 0x10 },
{ "drm/via_drm.h", "DRM_IOCTL_VIA_AGP_INIT", _IOC_READ|_IOC_WRITE, 0x6442, 0x08 },
{ "drm/via_drm.h", "DRM_IOCTL_VIA_ALLOCMEM", _IOC_READ|_IOC_WRITE, 0x6440, 0x20 },
{ "drm/via_drm.h", "DRM_IOCTL_VIA_BLIT_SYNC", _IOC_WRITE, 0x644f, 0x08 },
@ -376,6 +410,15 @@
{ "drm/via_drm.h", "DRM_IOCTL_VIA_MAP_INIT", _IOC_READ|_IOC_WRITE, 0x6444, 0x28 },
{ "drm/via_drm.h", "DRM_IOCTL_VIA_PCICMD", _IOC_WRITE, 0x644a, 0x10 },
{ "drm/via_drm.h", "DRM_IOCTL_VIA_WAIT_IRQ", _IOC_READ|_IOC_WRITE, 0x644d, 0x18 },
{ "drm/virtgpu_drm.h", "DRM_IOCTL_VIRTGPU_EXECBUFFER", _IOC_WRITE, 0x6442, 0x20 },
{ "drm/virtgpu_drm.h", "DRM_IOCTL_VIRTGPU_GETPARAM", _IOC_READ|_IOC_WRITE, 0x6443, 0x10 },
{ "drm/virtgpu_drm.h", "DRM_IOCTL_VIRTGPU_GET_CAPS", _IOC_READ|_IOC_WRITE, 0x6449, 0x18 },
{ "drm/virtgpu_drm.h", "DRM_IOCTL_VIRTGPU_MAP", _IOC_READ|_IOC_WRITE, 0x6441, 0x10 },
{ "drm/virtgpu_drm.h", "DRM_IOCTL_VIRTGPU_RESOURCE_CREATE", _IOC_READ|_IOC_WRITE, 0x6444, 0x38 },
{ "drm/virtgpu_drm.h", "DRM_IOCTL_VIRTGPU_RESOURCE_INFO", _IOC_READ|_IOC_WRITE, 0x6445, 0x10 },
{ "drm/virtgpu_drm.h", "DRM_IOCTL_VIRTGPU_TRANSFER_FROM_HOST", _IOC_READ|_IOC_WRITE, 0x6446, 0x24 },
{ "drm/virtgpu_drm.h", "DRM_IOCTL_VIRTGPU_TRANSFER_TO_HOST", _IOC_READ|_IOC_WRITE, 0x6447, 0x24 },
{ "drm/virtgpu_drm.h", "DRM_IOCTL_VIRTGPU_WAIT", _IOC_READ|_IOC_WRITE, 0x6448, 0x08 },
{ "linux/agpgart.h", "AGPIOC_ACQUIRE", _IOC_NONE, 0x4101, 0x00 },
{ "linux/agpgart.h", "AGPIOC_ALLOCATE", _IOC_READ|_IOC_WRITE, 0x4106, 0x08 },
{ "linux/agpgart.h", "AGPIOC_BIND", _IOC_WRITE, 0x4108, 0x08 },
@ -387,6 +430,7 @@
{ "linux/agpgart.h", "AGPIOC_RESERVE", _IOC_WRITE, 0x4104, 0x08 },
{ "linux/agpgart.h", "AGPIOC_SETUP", _IOC_WRITE, 0x4103, 0x08 },
{ "linux/agpgart.h", "AGPIOC_UNBIND", _IOC_WRITE, 0x4109, 0x08 },
{ "linux/am437x-vpfe.h", "VIDIOC_AM437X_CCDC_CFG", _IOC_WRITE, 0x56c1, 0x08 },
{ "linux/android/binder.h", "BC_ACQUIRE", _IOC_WRITE, 0x6305, 0x04 },
{ "linux/android/binder.h", "BC_ACQUIRE_DONE", _IOC_WRITE, 0x6309, 0x10 },
{ "linux/android/binder.h", "BC_ACQUIRE_RESULT", _IOC_WRITE, 0x6302, 0x04 },
@ -672,6 +716,7 @@
{ "linux/dm-ioctl.h", "DM_TABLE_STATUS", _IOC_READ|_IOC_WRITE, 0xfd0c, 0x138 },
{ "linux/dm-ioctl.h", "DM_TARGET_MSG", _IOC_READ|_IOC_WRITE, 0xfd0e, 0x138 },
{ "linux/dm-ioctl.h", "DM_VERSION", _IOC_READ|_IOC_WRITE, 0xfd00, 0x138 },
{ "linux/dma-buf.h", "DMA_BUF_IOCTL_SYNC", _IOC_WRITE, 0x6200, 0x08 },
{ "linux/dn.h", "OSIOCGNETADDR", _IOC_READ, 0x89e1, 0x04 },
{ "linux/dn.h", "OSIOCSNETADDR", _IOC_WRITE, 0x89e0, 0x04 },
{ "linux/dn.h", "SIOCGNETADDR", _IOC_READ, 0x89e1, 0x04 },
@ -840,6 +885,7 @@
{ "linux/fs.h", "BLKALIGNOFF", _IOC_NONE, 0x127a, 0x00 },
{ "linux/fs.h", "BLKBSZGET", _IOC_READ, 0x1270, 0x08 },
{ "linux/fs.h", "BLKBSZSET", _IOC_WRITE, 0x1271, 0x08 },
{ "linux/fs.h", "BLKDAXGET", _IOC_NONE, 0x1281, 0x00 },
{ "linux/fs.h", "BLKDISCARD", _IOC_NONE, 0x1277, 0x00 },
{ "linux/fs.h", "BLKDISCARDZEROES", _IOC_NONE, 0x127c, 0x00 },
{ "linux/fs.h", "BLKFLSBUF", _IOC_NONE, 0x1261, 0x00 },
@ -866,6 +912,9 @@
{ "linux/fs.h", "BLKTRACETEARDOWN", _IOC_NONE, 0x1276, 0x00 },
{ "linux/fs.h", "BLKZEROOUT", _IOC_NONE, 0x127f, 0x00 },
{ "linux/fs.h", "FIBMAP", _IOC_NONE, 0x0001, 0x00 },
{ "linux/fs.h", "FICLONE", _IOC_WRITE, 0x9409, 0x04 },
{ "linux/fs.h", "FICLONERANGE", _IOC_WRITE, 0x940d, 0x20 },
{ "linux/fs.h", "FIDEDUPERANGE", _IOC_READ|_IOC_WRITE, 0x9436, 0x18 },
{ "linux/fs.h", "FIFREEZE", _IOC_READ|_IOC_WRITE, 0x5877, 0x04 },
{ "linux/fs.h", "FIGETBSZ", _IOC_NONE, 0x0002, 0x00 },
{ "linux/fs.h", "FITHAW", _IOC_READ|_IOC_WRITE, 0x5878, 0x04 },
@ -875,10 +924,15 @@
{ "linux/fs.h", "FS_IOC32_SETFLAGS", _IOC_WRITE, 0x6602, 0x04 },
{ "linux/fs.h", "FS_IOC32_SETVERSION", _IOC_WRITE, 0x7602, 0x04 },
{ "linux/fs.h", "FS_IOC_FIEMAP", _IOC_READ|_IOC_WRITE, 0x660b, 0x20 },
{ "linux/fs.h", "FS_IOC_FSGETXATTR", _IOC_READ, 0x581f, 0x1c },
{ "linux/fs.h", "FS_IOC_FSSETXATTR", _IOC_WRITE, 0x5820, 0x1c },
{ "linux/fs.h", "FS_IOC_GETFLAGS", _IOC_READ, 0x6601, 0x08 },
{ "linux/fs.h", "FS_IOC_GETVERSION", _IOC_READ, 0x7601, 0x08 },
{ "linux/fs.h", "FS_IOC_GET_ENCRYPTION_POLICY", _IOC_WRITE, 0x6615, 0x0c },
{ "linux/fs.h", "FS_IOC_GET_ENCRYPTION_PWSALT", _IOC_WRITE, 0x6614, 0x10 },
{ "linux/fs.h", "FS_IOC_SETFLAGS", _IOC_WRITE, 0x6602, 0x08 },
{ "linux/fs.h", "FS_IOC_SETVERSION", _IOC_WRITE, 0x7602, 0x08 },
{ "linux/fs.h", "FS_IOC_SET_ENCRYPTION_POLICY", _IOC_READ, 0x6613, 0x0c },
{ "linux/fsl-diu-fb.h", "MFB_GET_ALPHA", _IOC_READ, 0x4d00, 0x01 },
{ "linux/fsl-diu-fb.h", "MFB_GET_AOID", _IOC_READ, 0x4d04, 0x08 },
{ "linux/fsl-diu-fb.h", "MFB_GET_GAMMA", _IOC_READ, 0x4d01, 0x01 },
@ -897,6 +951,7 @@
{ "linux/fsl_hypervisor.h", "FSL_HV_IOCTL_PARTITION_START", _IOC_READ|_IOC_WRITE, 0xaf03, 0x10 },
{ "linux/fsl_hypervisor.h", "FSL_HV_IOCTL_PARTITION_STOP", _IOC_READ|_IOC_WRITE, 0xaf04, 0x08 },
{ "linux/fsl_hypervisor.h", "FSL_HV_IOCTL_SETPROP", _IOC_READ|_IOC_WRITE, 0xaf08, 0x28 },
{ "linux/fuse.h", "FUSE_DEV_IOC_CLONE", _IOC_READ, 0xe500, 0x04 },
{ "linux/genwqe/genwqe_card.h", "GENWQE_EXECUTE_DDCB", _IOC_READ|_IOC_WRITE, 0xa532, 0xe8 },
{ "linux/genwqe/genwqe_card.h", "GENWQE_EXECUTE_RAW_DDCB", _IOC_READ|_IOC_WRITE, 0xa533, 0xe8 },
{ "linux/genwqe/genwqe_card.h", "GENWQE_GET_CARD_STATE", _IOC_READ, 0xa524, 0x04 },
@ -914,6 +969,8 @@
{ "linux/gigaset_dev.h", "GIGASET_CONFIG", _IOC_READ|_IOC_WRITE, 0x4701, 0x04 },
{ "linux/gigaset_dev.h", "GIGASET_REDIR", _IOC_READ|_IOC_WRITE, 0x4700, 0x04 },
{ "linux/gigaset_dev.h", "GIGASET_VERSION", _IOC_READ|_IOC_WRITE, 0x4703, 0x10 },
{ "linux/gpio.h", "GPIO_GET_CHIPINFO_IOCTL", _IOC_READ, 0xb401, 0x44 },
{ "linux/gpio.h", "GPIO_GET_LINEINFO_IOCTL", _IOC_READ|_IOC_WRITE, 0xb402, 0x48 },
{ "linux/gsmmux.h", "GSMIOC_DISABLE_NET", _IOC_NONE, 0x4703, 0x00 },
{ "linux/gsmmux.h", "GSMIOC_ENABLE_NET", _IOC_WRITE, 0x4702, 0x34 },
{ "linux/gsmmux.h", "GSMIOC_GETCONF", _IOC_READ, 0x4700, 0x4c },
@ -982,6 +1039,10 @@
{ "linux/hpet.h", "HPET_IE_ON", _IOC_NONE, 0x6801, 0x00 },
{ "linux/hpet.h", "HPET_INFO", _IOC_READ, 0x6803, 0x18 },
{ "linux/hpet.h", "HPET_IRQFREQ", _IOC_WRITE, 0x6806, 0x08 },
{ "linux/hsi/cs-protocol.h", "CS_CONFIG_BUFS", _IOC_WRITE, 0x431f, 0x20 },
{ "linux/hsi/cs-protocol.h", "CS_GET_IF_VERSION", _IOC_READ, 0x431e, 0x04 },
{ "linux/hsi/cs-protocol.h", "CS_GET_STATE", _IOC_READ, 0x4315, 0x04 },
{ "linux/hsi/cs-protocol.h", "CS_SET_WAKELINE", _IOC_WRITE, 0x4317, 0x04 },
{ "linux/hsi/hsi_char.h", "HSC_GET_RX", _IOC_WRITE, 0x6b14, 0x0c },
{ "linux/hsi/hsi_char.h", "HSC_GET_TX", _IOC_WRITE, 0x6b16, 0x10 },
{ "linux/hsi/hsi_char.h", "HSC_RESET", _IOC_NONE, 0x6b10, 0x00 },
@ -1003,10 +1064,6 @@
{ "linux/i2o-dev.h", "I2OSWDL", _IOC_READ|_IOC_WRITE, 0x6905, 0x30 },
{ "linux/i2o-dev.h", "I2OSWUL", _IOC_READ|_IOC_WRITE, 0x6906, 0x30 },
{ "linux/i2o-dev.h", "I2OVALIDATE", _IOC_READ, 0x6908, 0x04 },
{ "linux/i2o.h", "BLKI2OGRSTRAT", _IOC_READ, 0x3201, 0x04 },
{ "linux/i2o.h", "BLKI2OGWSTRAT", _IOC_READ, 0x3202, 0x04 },
{ "linux/i2o.h", "BLKI2OSRSTRAT", _IOC_WRITE, 0x3203, 0x04 },
{ "linux/i2o.h", "BLKI2OSWSTRAT", _IOC_WRITE, 0x3204, 0x04 },
{ "linux/i8k.h", "I8K_BIOS_VERSION", _IOC_READ, 0x6980, 0x04 },
{ "linux/i8k.h", "I8K_FN_STATUS", _IOC_READ, 0x6983, 0x08 },
{ "linux/i8k.h", "I8K_GET_FAN", _IOC_READ|_IOC_WRITE, 0x6986, 0x08 },
@ -1023,6 +1080,7 @@
{ "linux/if_tun.h", "TUNGETFILTER", _IOC_READ, 0x54db, 0x10 },
{ "linux/if_tun.h", "TUNGETIFF", _IOC_READ, 0x54d2, 0x04 },
{ "linux/if_tun.h", "TUNGETSNDBUF", _IOC_READ, 0x54d3, 0x04 },
{ "linux/if_tun.h", "TUNGETVNETBE", _IOC_READ, 0x54df, 0x04 },
{ "linux/if_tun.h", "TUNGETVNETHDRSZ", _IOC_READ, 0x54d7, 0x04 },
{ "linux/if_tun.h", "TUNGETVNETLE", _IOC_READ, 0x54dd, 0x04 },
{ "linux/if_tun.h", "TUNSETDEBUG", _IOC_WRITE, 0x54c9, 0x04 },
@ -1037,6 +1095,7 @@
{ "linux/if_tun.h", "TUNSETQUEUE", _IOC_WRITE, 0x54d9, 0x04 },
{ "linux/if_tun.h", "TUNSETSNDBUF", _IOC_WRITE, 0x54d4, 0x04 },
{ "linux/if_tun.h", "TUNSETTXFILTER", _IOC_WRITE, 0x54d1, 0x04 },
{ "linux/if_tun.h", "TUNSETVNETBE", _IOC_WRITE, 0x54de, 0x04 },
{ "linux/if_tun.h", "TUNSETVNETHDRSZ", _IOC_WRITE, 0x54d8, 0x04 },
{ "linux/if_tun.h", "TUNSETVNETLE", _IOC_WRITE, 0x54dc, 0x04 },
{ "linux/iio/events.h", "IIO_GET_EVENT_FD_IOCTL", _IOC_READ, 0x6990, 0x04 },
@ -1044,6 +1103,7 @@
{ "linux/input.h", "EVIOCGID", _IOC_READ, 0x4502, 0x08 },
{ "linux/input.h", "EVIOCGKEYCODE", _IOC_READ, 0x4504, 0x08 },
{ "linux/input.h", "EVIOCGKEYCODE_V2", _IOC_READ, 0x4504, 0x28 },
{ "linux/input.h", "EVIOCGMASK", _IOC_READ, 0x4592, 0x10 },
{ "linux/input.h", "EVIOCGRAB", _IOC_WRITE, 0x4590, 0x04 },
{ "linux/input.h", "EVIOCGREP", _IOC_READ, 0x4503, 0x08 },
{ "linux/input.h", "EVIOCGVERSION", _IOC_READ, 0x4501, 0x04 },
@ -1053,6 +1113,7 @@
{ "linux/input.h", "EVIOCSFF", _IOC_WRITE, 0x4580, 0x30 },
{ "linux/input.h", "EVIOCSKEYCODE", _IOC_WRITE, 0x4504, 0x08 },
{ "linux/input.h", "EVIOCSKEYCODE_V2", _IOC_WRITE, 0x4504, 0x28 },
{ "linux/input.h", "EVIOCSMASK", _IOC_WRITE, 0x4593, 0x10 },
{ "linux/input.h", "EVIOCSREP", _IOC_WRITE, 0x4503, 0x08 },
{ "linux/ipmi.h", "IPMICTL_GET_MAINTENANCE_MODE_CMD", _IOC_READ, 0x691e, 0x04 },
{ "linux/ipmi.h", "IPMICTL_GET_MY_ADDRESS_CMD", _IOC_READ, 0x6912, 0x04 },
@ -1167,6 +1228,9 @@
{ "linux/joystick.h", "JSIOCSAXMAP", _IOC_WRITE, 0x6a31, 0x40 },
{ "linux/joystick.h", "JSIOCSBTNMAP", _IOC_WRITE, 0x6a33, 0x400 },
{ "linux/joystick.h", "JSIOCSCORR", _IOC_WRITE, 0x6a21, 0x24 },
{ "linux/kcov.h", "KCOV_DISABLE", _IOC_NONE, 0x6365, 0x00 },
{ "linux/kcov.h", "KCOV_ENABLE", _IOC_NONE, 0x6364, 0x00 },
{ "linux/kcov.h", "KCOV_INIT_TRACE", _IOC_READ, 0x6301, 0x08 },
{ "linux/kd.h", "GIO_CMAP", 0, 0x4B70, 0 },
{ "linux/kd.h", "GIO_FONT", 0, 0x4B60, 0 },
{ "linux/kd.h", "GIO_FONTX", 0, 0x4B6B, 0 },
@ -1213,13 +1277,22 @@
{ "linux/kd.h", "PIO_UNIMAP", 0, 0x4B67, 0 },
{ "linux/kd.h", "PIO_UNIMAPCLR", 0, 0x4B68, 0 },
{ "linux/kd.h", "PIO_UNISCRNMAP", 0, 0x4B6A, 0 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_CREATE_EVENT", _IOC_READ|_IOC_WRITE, 0x4b08, 0x20 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_CREATE_QUEUE", _IOC_READ|_IOC_WRITE, 0x4b02, 0x58 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_DBG_ADDRESS_WATCH", _IOC_WRITE, 0x4b0f, 0x10 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_DBG_REGISTER", _IOC_WRITE, 0x4b0d, 0x08 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_DBG_UNREGISTER", _IOC_WRITE, 0x4b0e, 0x08 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_DBG_WAVE_CONTROL", _IOC_WRITE, 0x4b10, 0x10 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_DESTROY_EVENT", _IOC_WRITE, 0x4b09, 0x08 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_DESTROY_QUEUE", _IOC_READ|_IOC_WRITE, 0x4b03, 0x08 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_GET_CLOCK_COUNTERS", _IOC_READ|_IOC_WRITE, 0x4b05, 0x28 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_GET_PROCESS_APERTURES", _IOC_READ, 0x4b06, 0x190 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_GET_VERSION", _IOC_READ, 0x4b01, 0x08 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_RESET_EVENT", _IOC_WRITE, 0x4b0b, 0x08 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_SET_EVENT", _IOC_WRITE, 0x4b0a, 0x08 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_SET_MEMORY_POLICY", _IOC_WRITE, 0x4b04, 0x20 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_UPDATE_QUEUE", _IOC_WRITE, 0x4b07, 0x18 },
{ "linux/kfd_ioctl.h", "AMDKFD_IOC_WAIT_EVENTS", _IOC_READ|_IOC_WRITE, 0x4b0c, 0x18 },
{ "linux/kvm.h", "KVM_ALLOCATE_RMA", _IOC_READ, 0xaea9, 0x08 },
{ "linux/kvm.h", "KVM_ARM_PREFERRED_TARGET", _IOC_READ, 0xaeaf, 0x20 },
{ "linux/kvm.h", "KVM_ARM_SET_DEVICE_ADDR", _IOC_WRITE, 0xaeab, 0x10 },
@ -1235,6 +1308,7 @@
{ "linux/kvm.h", "KVM_CREATE_PIT", _IOC_NONE, 0xae64, 0x00 },
{ "linux/kvm.h", "KVM_CREATE_PIT2", _IOC_WRITE, 0xae77, 0x40 },
{ "linux/kvm.h", "KVM_CREATE_SPAPR_TCE", _IOC_WRITE, 0xaea8, 0x0c },
{ "linux/kvm.h", "KVM_CREATE_SPAPR_TCE_64", _IOC_WRITE, 0xaea8, 0x20 },
{ "linux/kvm.h", "KVM_CREATE_VCPU", _IOC_NONE, 0xae41, 0x00 },
{ "linux/kvm.h", "KVM_CREATE_VM", _IOC_NONE, 0xae01, 0x00 },
{ "linux/kvm.h", "KVM_DEASSIGN_DEV_IRQ", _IOC_WRITE, 0xae75, 0x40 },
@ -1284,9 +1358,15 @@
{ "linux/kvm.h", "KVM_REINJECT_CONTROL", _IOC_NONE, 0xae71, 0x00 },
{ "linux/kvm.h", "KVM_RUN", _IOC_NONE, 0xae80, 0x00 },
{ "linux/kvm.h", "KVM_S390_ENABLE_SIE", _IOC_NONE, 0xae06, 0x00 },
{ "linux/kvm.h", "KVM_S390_GET_IRQ_STATE", _IOC_WRITE, 0xaeb6, 0x20 },
{ "linux/kvm.h", "KVM_S390_GET_SKEYS", _IOC_WRITE, 0xaeb2, 0x40 },
{ "linux/kvm.h", "KVM_S390_INITIAL_RESET", _IOC_NONE, 0xae97, 0x00 },
{ "linux/kvm.h", "KVM_S390_INTERRUPT", _IOC_WRITE, 0xae94, 0x10 },
{ "linux/kvm.h", "KVM_S390_IRQ", _IOC_WRITE, 0xaeb4, 0x48 },
{ "linux/kvm.h", "KVM_S390_MEM_OP", _IOC_WRITE, 0xaeb1, 0x40 },
{ "linux/kvm.h", "KVM_S390_SET_INITIAL_PSW", _IOC_WRITE, 0xae96, 0x10 },
{ "linux/kvm.h", "KVM_S390_SET_IRQ_STATE", _IOC_WRITE, 0xaeb5, 0x20 },
{ "linux/kvm.h", "KVM_S390_SET_SKEYS", _IOC_WRITE, 0xaeb3, 0x40 },
{ "linux/kvm.h", "KVM_S390_STORE_STATUS", _IOC_WRITE, 0xae95, 0x08 },
{ "linux/kvm.h", "KVM_S390_UCAS_MAP", _IOC_WRITE, 0xae50, 0x18 },
{ "linux/kvm.h", "KVM_S390_UCAS_UNMAP", _IOC_WRITE, 0xae51, 0x18 },
@ -1322,6 +1402,7 @@
{ "linux/kvm.h", "KVM_SET_XCRS", _IOC_WRITE, 0xaea7, 0x188 },
{ "linux/kvm.h", "KVM_SET_XSAVE", _IOC_WRITE, 0xaea5, 0x1000 },
{ "linux/kvm.h", "KVM_SIGNAL_MSI", _IOC_WRITE, 0xaea5, 0x20 },
{ "linux/kvm.h", "KVM_SMI", _IOC_NONE, 0xaeb7, 0x00 },
{ "linux/kvm.h", "KVM_TPR_ACCESS_REPORTING", _IOC_READ|_IOC_WRITE, 0xae92, 0x28 },
{ "linux/kvm.h", "KVM_TRANSLATE", _IOC_READ|_IOC_WRITE, 0xae85, 0x18 },
{ "linux/kvm.h", "KVM_UNREGISTER_COALESCED_MMIO", _IOC_WRITE, 0xae68, 0x10 },
@ -1329,6 +1410,46 @@
{ "linux/kvm.h", "KVM_X86_SETUP_MCE", _IOC_WRITE, 0xae9c, 0x08 },
{ "linux/kvm.h", "KVM_X86_SET_MCE", _IOC_WRITE, 0xae9e, 0x40 },
{ "linux/kvm.h", "KVM_XEN_HVM_CONFIG", _IOC_WRITE, 0xae7a, 0x38 },
{ "linux/lightnvm.h", "NVM_DEV_CREATE", _IOC_WRITE, 0x4c22, 0x80 },
{ "linux/lightnvm.h", "NVM_DEV_FACTORY", _IOC_WRITE, 0x4c25, 0x24 },
{ "linux/lightnvm.h", "NVM_DEV_INIT", _IOC_WRITE, 0x4c24, 0x2c },
{ "linux/lightnvm.h", "NVM_DEV_REMOVE", _IOC_WRITE, 0x4c23, 0x24 },
{ "linux/lightnvm.h", "NVM_GET_DEVICES", _IOC_READ, 0x4c21, 0x1000 },
{ "linux/lightnvm.h", "NVM_INFO", _IOC_READ|_IOC_WRITE, 0x4c20, 0x1000 },
{ "linux/lirc.h", "LIRC_GET_FEATURES", _IOC_READ, 0x6900, 0x04 },
{ "linux/lirc.h", "LIRC_GET_LENGTH", _IOC_READ, 0x690f, 0x04 },
{ "linux/lirc.h", "LIRC_GET_MAX_FILTER_PULSE", _IOC_READ, 0x690b, 0x04 },
{ "linux/lirc.h", "LIRC_GET_MAX_FILTER_SPACE", _IOC_READ, 0x690d, 0x04 },
{ "linux/lirc.h", "LIRC_GET_MAX_TIMEOUT", _IOC_READ, 0x6909, 0x04 },
{ "linux/lirc.h", "LIRC_GET_MIN_FILTER_PULSE", _IOC_READ, 0x690a, 0x04 },
{ "linux/lirc.h", "LIRC_GET_MIN_FILTER_SPACE", _IOC_READ, 0x690c, 0x04 },
{ "linux/lirc.h", "LIRC_GET_MIN_TIMEOUT", _IOC_READ, 0x6908, 0x04 },
{ "linux/lirc.h", "LIRC_GET_REC_CARRIER", _IOC_READ, 0x6904, 0x04 },
{ "linux/lirc.h", "LIRC_GET_REC_DUTY_CYCLE", _IOC_READ, 0x6906, 0x04 },
{ "linux/lirc.h", "LIRC_GET_REC_MODE", _IOC_READ, 0x6902, 0x04 },
{ "linux/lirc.h", "LIRC_GET_REC_RESOLUTION", _IOC_READ, 0x6907, 0x04 },
{ "linux/lirc.h", "LIRC_GET_SEND_CARRIER", _IOC_READ, 0x6903, 0x04 },
{ "linux/lirc.h", "LIRC_GET_SEND_DUTY_CYCLE", _IOC_READ, 0x6905, 0x04 },
{ "linux/lirc.h", "LIRC_GET_SEND_MODE", _IOC_READ, 0x6901, 0x04 },
{ "linux/lirc.h", "LIRC_NOTIFY_DECODE", _IOC_NONE, 0x6920, 0x00 },
{ "linux/lirc.h", "LIRC_SETUP_END", _IOC_NONE, 0x6922, 0x00 },
{ "linux/lirc.h", "LIRC_SETUP_START", _IOC_NONE, 0x6921, 0x00 },
{ "linux/lirc.h", "LIRC_SET_MEASURE_CARRIER_MODE", _IOC_WRITE, 0x691d, 0x04 },
{ "linux/lirc.h", "LIRC_SET_REC_CARRIER", _IOC_WRITE, 0x6914, 0x04 },
{ "linux/lirc.h", "LIRC_SET_REC_CARRIER_RANGE", _IOC_WRITE, 0x691f, 0x04 },
{ "linux/lirc.h", "LIRC_SET_REC_DUTY_CYCLE", _IOC_WRITE, 0x6916, 0x04 },
{ "linux/lirc.h", "LIRC_SET_REC_DUTY_CYCLE_RANGE", _IOC_WRITE, 0x691e, 0x04 },
{ "linux/lirc.h", "LIRC_SET_REC_FILTER", _IOC_WRITE, 0x691c, 0x04 },
{ "linux/lirc.h", "LIRC_SET_REC_FILTER_PULSE", _IOC_WRITE, 0x691a, 0x04 },
{ "linux/lirc.h", "LIRC_SET_REC_FILTER_SPACE", _IOC_WRITE, 0x691b, 0x04 },
{ "linux/lirc.h", "LIRC_SET_REC_MODE", _IOC_WRITE, 0x6912, 0x04 },
{ "linux/lirc.h", "LIRC_SET_REC_TIMEOUT", _IOC_WRITE, 0x6918, 0x04 },
{ "linux/lirc.h", "LIRC_SET_REC_TIMEOUT_REPORTS", _IOC_WRITE, 0x6919, 0x04 },
{ "linux/lirc.h", "LIRC_SET_SEND_CARRIER", _IOC_WRITE, 0x6913, 0x04 },
{ "linux/lirc.h", "LIRC_SET_SEND_DUTY_CYCLE", _IOC_WRITE, 0x6915, 0x04 },
{ "linux/lirc.h", "LIRC_SET_SEND_MODE", _IOC_WRITE, 0x6911, 0x04 },
{ "linux/lirc.h", "LIRC_SET_TRANSMITTER_MASK", _IOC_WRITE, 0x6917, 0x04 },
{ "linux/lirc.h", "LIRC_SET_WIDEBAND_RECEIVER", _IOC_WRITE, 0x6923, 0x04 },
{ "linux/loop.h", "LOOP_CHANGE_FD", 0, 0x4C06, 0 },
{ "linux/loop.h", "LOOP_CLR_FD", 0, 0x4C01, 0 },
{ "linux/loop.h", "LOOP_CTL_ADD", 0, 0x4C80, 0 },
@ -1337,6 +1458,7 @@
{ "linux/loop.h", "LOOP_GET_STATUS", 0, 0x4C03, 0 },
{ "linux/loop.h", "LOOP_GET_STATUS64", 0, 0x4C05, 0 },
{ "linux/loop.h", "LOOP_SET_CAPACITY", 0, 0x4C07, 0 },
{ "linux/loop.h", "LOOP_SET_DIRECT_IO", 0, 0x4C08, 0 },
{ "linux/loop.h", "LOOP_SET_FD", 0, 0x4C00, 0 },
{ "linux/loop.h", "LOOP_SET_STATUS", 0, 0x4C02, 0 },
{ "linux/loop.h", "LOOP_SET_STATUS64", 0, 0x4C04, 0 },
@ -1358,8 +1480,11 @@
{ "linux/media.h", "MEDIA_IOC_DEVICE_INFO", _IOC_READ|_IOC_WRITE, 0x7c00, 0x100 },
{ "linux/media.h", "MEDIA_IOC_ENUM_ENTITIES", _IOC_READ|_IOC_WRITE, 0x7c01, 0x100 },
{ "linux/media.h", "MEDIA_IOC_ENUM_LINKS", _IOC_READ|_IOC_WRITE, 0x7c02, 0x28 },
{ "linux/media.h", "MEDIA_IOC_G_TOPOLOGY", _IOC_READ|_IOC_WRITE, 0x7c04, 0x48 },
{ "linux/media.h", "MEDIA_IOC_SETUP_LINK", _IOC_READ|_IOC_WRITE, 0x7c03, 0x34 },
{ "linux/mei.h", "IOCTL_MEI_CONNECT_CLIENT", _IOC_READ|_IOC_WRITE, 0x4801, 0x10 },
{ "linux/mei.h", "IOCTL_MEI_NOTIFY_GET", _IOC_READ, 0x4803, 0x04 },
{ "linux/mei.h", "IOCTL_MEI_NOTIFY_SET", _IOC_WRITE, 0x4802, 0x04 },
{ "linux/meye.h", "MEYEIOC_G_PARAMS", _IOC_READ, 0x76c0, 0x06 },
{ "linux/meye.h", "MEYEIOC_QBUF_CAPT", _IOC_WRITE, 0x76c2, 0x04 },
{ "linux/meye.h", "MEYEIOC_STILLCAPT", _IOC_NONE, 0x76c4, 0x00 },
@ -1370,6 +1495,7 @@
{ "linux/mic_ioctl.h", "MIC_VIRTIO_CONFIG_CHANGE", _IOC_READ|_IOC_WRITE, 0x7305, 0x08 },
{ "linux/mic_ioctl.h", "MIC_VIRTIO_COPY_DESC", _IOC_READ|_IOC_WRITE, 0x7302, 0x08 },
{ "linux/mmc/ioctl.h", "MMC_IOC_CMD", _IOC_READ|_IOC_WRITE, 0xb300, 0x48 },
{ "linux/mmc/ioctl.h", "MMC_IOC_MULTI_CMD", _IOC_READ|_IOC_WRITE, 0xb301, 0x08 },
{ "linux/mmtimer.h", "MMTIMER_GETBITS", _IOC_NONE, 0x6d04, 0x00 },
{ "linux/mmtimer.h", "MMTIMER_GETCOUNTER", _IOC_READ, 0x6d09, 0x08 },
{ "linux/mmtimer.h", "MMTIMER_GETFREQ", _IOC_READ, 0x6d02, 0x08 },
@ -1381,8 +1507,6 @@
{ "linux/msdos_fs.h", "FAT_IOCTL_SET_ATTRIBUTES", _IOC_WRITE, 0x7211, 0x04 },
{ "linux/msdos_fs.h", "VFAT_IOCTL_READDIR_BOTH", _IOC_READ, 0x7201, 0x230 },
{ "linux/msdos_fs.h", "VFAT_IOCTL_READDIR_SHORT", _IOC_READ, 0x7202, 0x230 },
{ "linux/msm_mdp.h", "MSMFB_BLIT", _IOC_WRITE, 0x6d02, 0x04 },
{ "linux/msm_mdp.h", "MSMFB_GRP_DISP", _IOC_WRITE, 0x6d01, 0x04 },
{ "linux/mtio.h", "MTIOCGET", _IOC_READ, 0x6d02, 0x30 },
{ "linux/mtio.h", "MTIOCPOS", _IOC_READ, 0x6d03, 0x08 },
{ "linux/mtio.h", "MTIOCTOP", _IOC_WRITE, 0x6d01, 0x08 },
@ -1417,6 +1541,17 @@
{ "linux/ncp_fs.h", "NCP_IOC_SET_SIGN_WANTED", _IOC_WRITE, 0x6e06, 0x04 },
{ "linux/ncp_fs.h", "NCP_IOC_SIGN_INIT", _IOC_READ, 0x6e05, 0x18 },
{ "linux/ncp_fs.h", "NCP_IOC_SIGN_WANTED", _IOC_READ, 0x6e06, 0x04 },
{ "linux/ndctl.h", "ND_IOCTL_ARS_CAP", _IOC_READ|_IOC_WRITE, 0x4e01, 0x20 },
{ "linux/ndctl.h", "ND_IOCTL_ARS_START", _IOC_READ|_IOC_WRITE, 0x4e02, 0x20 },
{ "linux/ndctl.h", "ND_IOCTL_ARS_STATUS", _IOC_READ|_IOC_WRITE, 0x4e03, 0x30 },
{ "linux/ndctl.h", "ND_IOCTL_CLEAR_ERROR", _IOC_READ|_IOC_WRITE, 0x4e04, 0x20 },
{ "linux/ndctl.h", "ND_IOCTL_DIMM_FLAGS", _IOC_READ|_IOC_WRITE, 0x4e03, 0x08 },
{ "linux/ndctl.h", "ND_IOCTL_GET_CONFIG_DATA", _IOC_READ|_IOC_WRITE, 0x4e05, 0x0c },
{ "linux/ndctl.h", "ND_IOCTL_GET_CONFIG_SIZE", _IOC_READ|_IOC_WRITE, 0x4e04, 0x0c },
{ "linux/ndctl.h", "ND_IOCTL_SET_CONFIG_DATA", _IOC_READ|_IOC_WRITE, 0x4e06, 0x08 },
{ "linux/ndctl.h", "ND_IOCTL_SMART", _IOC_READ|_IOC_WRITE, 0x4e01, 0x84 },
{ "linux/ndctl.h", "ND_IOCTL_SMART_THRESHOLD", _IOC_READ|_IOC_WRITE, 0x4e02, 0x0c },
{ "linux/ndctl.h", "ND_IOCTL_VENDOR", _IOC_READ|_IOC_WRITE, 0x4e09, 0x08 },
{ "linux/nilfs2_fs.h", "NILFS_IOCTL_CHANGE_CPMODE", _IOC_WRITE, 0x6e80, 0x10 },
{ "linux/nilfs2_fs.h", "NILFS_IOCTL_CLEAN_SEGMENTS", _IOC_WRITE, 0x6e88, 0x78 },
{ "linux/nilfs2_fs.h", "NILFS_IOCTL_DELETE_CHECKPOINT", _IOC_WRITE, 0x6e81, 0x08 },
@ -1430,10 +1565,12 @@
{ "linux/nilfs2_fs.h", "NILFS_IOCTL_SET_ALLOC_RANGE", _IOC_WRITE, 0x6e8c, 0x10 },
{ "linux/nilfs2_fs.h", "NILFS_IOCTL_SET_SUINFO", _IOC_WRITE, 0x6e8d, 0x18 },
{ "linux/nilfs2_fs.h", "NILFS_IOCTL_SYNC", _IOC_READ, 0x6e8a, 0x08 },
{ "linux/nvme.h", "NVME_IOCTL_ADMIN_CMD", _IOC_READ|_IOC_WRITE, 0x4e41, 0x48 },
{ "linux/nvme.h", "NVME_IOCTL_ID", _IOC_NONE, 0x4e40, 0x00 },
{ "linux/nvme.h", "NVME_IOCTL_IO_CMD", _IOC_READ|_IOC_WRITE, 0x4e43, 0x48 },
{ "linux/nvme.h", "NVME_IOCTL_SUBMIT_IO", _IOC_WRITE, 0x4e42, 0x30 },
{ "linux/nvme_ioctl.h", "NVME_IOCTL_ADMIN_CMD", _IOC_READ|_IOC_WRITE, 0x4e41, 0x48 },
{ "linux/nvme_ioctl.h", "NVME_IOCTL_ID", _IOC_NONE, 0x4e40, 0x00 },
{ "linux/nvme_ioctl.h", "NVME_IOCTL_IO_CMD", _IOC_READ|_IOC_WRITE, 0x4e43, 0x48 },
{ "linux/nvme_ioctl.h", "NVME_IOCTL_RESET", _IOC_NONE, 0x4e44, 0x00 },
{ "linux/nvme_ioctl.h", "NVME_IOCTL_SUBMIT_IO", _IOC_WRITE, 0x4e42, 0x30 },
{ "linux/nvme_ioctl.h", "NVME_IOCTL_SUBSYS_RESET", _IOC_NONE, 0x4e45, 0x00 },
{ "linux/nvram.h", "NVRAM_INIT", _IOC_NONE, 0x7040, 0x00 },
{ "linux/nvram.h", "NVRAM_SETCKS", _IOC_NONE, 0x7041, 0x00 },
{ "linux/omap3isp.h", "VIDIOC_OMAP3ISP_AEWB_CFG", _IOC_READ|_IOC_WRITE, 0x56c3, 0x20 },
@ -1472,6 +1609,7 @@
{ "linux/perf_event.h", "PERF_EVENT_IOC_PERIOD", _IOC_WRITE, 0x2404, 0x08 },
{ "linux/perf_event.h", "PERF_EVENT_IOC_REFRESH", _IOC_NONE, 0x2402, 0x00 },
{ "linux/perf_event.h", "PERF_EVENT_IOC_RESET", _IOC_NONE, 0x2403, 0x00 },
{ "linux/perf_event.h", "PERF_EVENT_IOC_SET_BPF", _IOC_WRITE, 0x2408, 0x04 },
{ "linux/perf_event.h", "PERF_EVENT_IOC_SET_FILTER", _IOC_WRITE, 0x2406, 0x08 },
{ "linux/perf_event.h", "PERF_EVENT_IOC_SET_OUTPUT", _IOC_NONE, 0x2405, 0x00 },
{ "linux/phantom.h", "PHN_GETREG", _IOC_READ|_IOC_WRITE, 0x7005, 0x08 },
@ -1484,6 +1622,7 @@
{ "linux/phantom.h", "PHN_SET_REG", _IOC_WRITE, 0x7001, 0x08 },
{ "linux/phantom.h", "PHN_SET_REGS", _IOC_WRITE, 0x7003, 0x08 },
{ "linux/pktcdvd.h", "PACKET_CTRL_CMD", _IOC_READ|_IOC_WRITE, 0x5801, 0x18 },
{ "linux/platform_data/media/si4713.h", "SI4713_IOC_MEASURE_RNL", _IOC_READ|_IOC_WRITE, 0x56c0, 0x1c },
{ "linux/pmu.h", "PMU_IOC_CAN_SLEEP", _IOC_READ, 0x4205, 0x08 },
{ "linux/pmu.h", "PMU_IOC_GET_BACKLIGHT", _IOC_READ, 0x4201, 0x08 },
{ "linux/pmu.h", "PMU_IOC_GET_MODEL", _IOC_READ, 0x4203, 0x08 },
@ -1549,6 +1688,12 @@
{ "linux/pps.h", "PPS_GETPARAMS", _IOC_READ, 0x70a1, 0x08 },
{ "linux/pps.h", "PPS_KC_BIND", _IOC_WRITE, 0x70a5, 0x08 },
{ "linux/pps.h", "PPS_SETPARAMS", _IOC_WRITE, 0x70a2, 0x08 },
{ "linux/pr.h", "IOC_PR_CLEAR", _IOC_WRITE, 0x70cd, 0x10 },
{ "linux/pr.h", "IOC_PR_PREEMPT", _IOC_WRITE, 0x70cb, 0x18 },
{ "linux/pr.h", "IOC_PR_PREEMPT_ABORT", _IOC_WRITE, 0x70cc, 0x18 },
{ "linux/pr.h", "IOC_PR_REGISTER", _IOC_WRITE, 0x70c8, 0x18 },
{ "linux/pr.h", "IOC_PR_RELEASE", _IOC_WRITE, 0x70ca, 0x10 },
{ "linux/pr.h", "IOC_PR_RESERVE", _IOC_WRITE, 0x70c9, 0x10 },
{ "linux/ptp_clock.h", "PTP_CLOCK_GETCAPS", _IOC_READ, 0x3d01, 0x50 },
{ "linux/ptp_clock.h", "PTP_ENABLE_PPS", _IOC_WRITE, 0x3d04, 0x04 },
{ "linux/ptp_clock.h", "PTP_EXTTS_REQUEST", _IOC_WRITE, 0x3d02, 0x10 },
@ -1556,10 +1701,12 @@
{ "linux/ptp_clock.h", "PTP_PIN_GETFUNC", _IOC_READ|_IOC_WRITE, 0x3d06, 0x60 },
{ "linux/ptp_clock.h", "PTP_PIN_SETFUNC", _IOC_WRITE, 0x3d07, 0x60 },
{ "linux/ptp_clock.h", "PTP_SYS_OFFSET", _IOC_WRITE, 0x3d05, 0x340 },
{ "linux/ptp_clock.h", "PTP_SYS_OFFSET_PRECISE", _IOC_READ|_IOC_WRITE, 0x3d08, 0x40 },
{ "linux/radeonfb.h", "FBIO_RADEON_GET_MIRROR", _IOC_READ, 0x4003, 0x08 },
{ "linux/radeonfb.h", "FBIO_RADEON_SET_MIRROR", _IOC_WRITE, 0x4004, 0x08 },
{ "linux/raid/md_u.h", "ADD_NEW_DISK", _IOC_WRITE, 0x0921, 0x14 },
{ "linux/raid/md_u.h", "CLEAR_ARRAY", _IOC_NONE, 0x0920, 0x00 },
{ "linux/raid/md_u.h", "CLUSTERED_DISK_NACK", _IOC_NONE, 0x0935, 0x00 },
{ "linux/raid/md_u.h", "GET_ARRAY_INFO", _IOC_READ, 0x0911, 0x48 },
{ "linux/raid/md_u.h", "GET_BITMAP_FILE", _IOC_READ, 0x0915, 0x1000 },
{ "linux/raid/md_u.h", "GET_DISK_INFO", _IOC_READ, 0x0912, 0x14 },
@ -1589,6 +1736,30 @@
{ "linux/raw.h", "RAW_SETBIND", _IOC_NONE, 0xac00, 0x00 },
{ "linux/reiserfs_fs.h", "REISERFS_IOC_UNPACK", _IOC_WRITE, 0xcd01, 0x08 },
{ "linux/rfkill.h", "RFKILL_IOCTL_NOINPUT", _IOC_NONE, 0x5201, 0x00 },
{ "linux/rio_mport_cdev.h", "RIO_ALLOC_DMA", _IOC_READ|_IOC_WRITE, 0x6d13, 0x18 },
{ "linux/rio_mport_cdev.h", "RIO_DEV_ADD", _IOC_WRITE, 0x6d17, 0x20 },
{ "linux/rio_mport_cdev.h", "RIO_DEV_DEL", _IOC_WRITE, 0x6d18, 0x20 },
{ "linux/rio_mport_cdev.h", "RIO_DISABLE_DOORBELL_RANGE", _IOC_WRITE, 0x6d0a, 0x08 },
{ "linux/rio_mport_cdev.h", "RIO_DISABLE_PORTWRITE_RANGE", _IOC_WRITE, 0x6d0c, 0x10 },
{ "linux/rio_mport_cdev.h", "RIO_ENABLE_DOORBELL_RANGE", _IOC_WRITE, 0x6d09, 0x08 },
{ "linux/rio_mport_cdev.h", "RIO_ENABLE_PORTWRITE_RANGE", _IOC_WRITE, 0x6d0b, 0x10 },
{ "linux/rio_mport_cdev.h", "RIO_FREE_DMA", _IOC_WRITE, 0x6d14, 0x08 },
{ "linux/rio_mport_cdev.h", "RIO_GET_EVENT_MASK", _IOC_READ, 0x6d0e, 0x04 },
{ "linux/rio_mport_cdev.h", "RIO_MAP_INBOUND", _IOC_READ|_IOC_WRITE, 0x6d11, 0x28 },
{ "linux/rio_mport_cdev.h", "RIO_MAP_OUTBOUND", _IOC_READ|_IOC_WRITE, 0x6d0f, 0x28 },
{ "linux/rio_mport_cdev.h", "RIO_MPORT_GET_PROPERTIES", _IOC_READ, 0x6d04, 0x30 },
{ "linux/rio_mport_cdev.h", "RIO_MPORT_MAINT_COMPTAG_SET", _IOC_WRITE, 0x6d02, 0x04 },
{ "linux/rio_mport_cdev.h", "RIO_MPORT_MAINT_HDID_SET", _IOC_WRITE, 0x6d01, 0x02 },
{ "linux/rio_mport_cdev.h", "RIO_MPORT_MAINT_PORT_IDX_GET", _IOC_READ, 0x6d03, 0x04 },
{ "linux/rio_mport_cdev.h", "RIO_MPORT_MAINT_READ_LOCAL", _IOC_READ, 0x6d05, 0x18 },
{ "linux/rio_mport_cdev.h", "RIO_MPORT_MAINT_READ_REMOTE", _IOC_READ, 0x6d07, 0x18 },
{ "linux/rio_mport_cdev.h", "RIO_MPORT_MAINT_WRITE_LOCAL", _IOC_WRITE, 0x6d06, 0x18 },
{ "linux/rio_mport_cdev.h", "RIO_MPORT_MAINT_WRITE_REMOTE", _IOC_WRITE, 0x6d08, 0x18 },
{ "linux/rio_mport_cdev.h", "RIO_SET_EVENT_MASK", _IOC_WRITE, 0x6d0d, 0x04 },
{ "linux/rio_mport_cdev.h", "RIO_TRANSFER", _IOC_READ|_IOC_WRITE, 0x6d15, 0x18 },
{ "linux/rio_mport_cdev.h", "RIO_UNMAP_INBOUND", _IOC_WRITE, 0x6d12, 0x08 },
{ "linux/rio_mport_cdev.h", "RIO_UNMAP_OUTBOUND", _IOC_WRITE, 0x6d10, 0x28 },
{ "linux/rio_mport_cdev.h", "RIO_WAIT_FOR_ASYNC", _IOC_WRITE, 0x6d16, 0x08 },
{ "linux/rtc.h", "RTC_AIE_OFF", _IOC_NONE, 0x7002, 0x00 },
{ "linux/rtc.h", "RTC_AIE_ON", _IOC_NONE, 0x7001, 0x00 },
{ "linux/rtc.h", "RTC_ALM_READ", _IOC_READ, 0x7008, 0x24 },
@ -1611,6 +1782,23 @@
{ "linux/rtc.h", "RTC_WIE_ON", _IOC_NONE, 0x700f, 0x00 },
{ "linux/rtc.h", "RTC_WKALM_RD", _IOC_READ, 0x7010, 0x28 },
{ "linux/rtc.h", "RTC_WKALM_SET", _IOC_WRITE, 0x700f, 0x28 },
{ "linux/scif_ioctl.h", "SCIF_ACCEPTREG", _IOC_READ|_IOC_WRITE, 0x7305, 0x08 },
{ "linux/scif_ioctl.h", "SCIF_ACCEPTREQ", _IOC_READ|_IOC_WRITE, 0x7304, 0x10 },
{ "linux/scif_ioctl.h", "SCIF_BIND", _IOC_READ|_IOC_WRITE, 0x7301, 0x08 },
{ "linux/scif_ioctl.h", "SCIF_CONNECT", _IOC_READ|_IOC_WRITE, 0x7303, 0x08 },
{ "linux/scif_ioctl.h", "SCIF_FENCE_MARK", _IOC_READ|_IOC_WRITE, 0x730f, 0x10 },
{ "linux/scif_ioctl.h", "SCIF_FENCE_SIGNAL", _IOC_READ|_IOC_WRITE, 0x7311, 0x28 },
{ "linux/scif_ioctl.h", "SCIF_FENCE_WAIT", _IOC_READ|_IOC_WRITE, 0x7310, 0x04 },
{ "linux/scif_ioctl.h", "SCIF_GET_NODEIDS", _IOC_READ|_IOC_WRITE, 0x730e, 0x18 },
{ "linux/scif_ioctl.h", "SCIF_LISTEN", _IOC_WRITE, 0x7302, 0x04 },
{ "linux/scif_ioctl.h", "SCIF_READFROM", _IOC_READ|_IOC_WRITE, 0x730a, 0x28 },
{ "linux/scif_ioctl.h", "SCIF_RECV", _IOC_READ|_IOC_WRITE, 0x7307, 0x18 },
{ "linux/scif_ioctl.h", "SCIF_REG", _IOC_READ|_IOC_WRITE, 0x7308, 0x28 },
{ "linux/scif_ioctl.h", "SCIF_SEND", _IOC_READ|_IOC_WRITE, 0x7306, 0x18 },
{ "linux/scif_ioctl.h", "SCIF_UNREG", _IOC_READ|_IOC_WRITE, 0x7309, 0x10 },
{ "linux/scif_ioctl.h", "SCIF_VREADFROM", _IOC_READ|_IOC_WRITE, 0x730c, 0x28 },
{ "linux/scif_ioctl.h", "SCIF_VWRITETO", _IOC_READ|_IOC_WRITE, 0x730d, 0x28 },
{ "linux/scif_ioctl.h", "SCIF_WRITETO", _IOC_READ|_IOC_WRITE, 0x730b, 0x28 },
{ "linux/serio.h", "SPIOCSTYPE", _IOC_WRITE, 0x7101, 0x08 },
{ "linux/sockios.h", "SIOCADDDLCI", 0, 0x8980, 0 },
{ "linux/sockios.h", "SIOCADDMULTI", 0, 0x8931, 0 },
@ -1805,6 +1993,9 @@
{ "linux/spi/spidev.h", "SPI_IOC_WR_MAX_SPEED_HZ", _IOC_WRITE, 0x6b04, 0x04 },
{ "linux/spi/spidev.h", "SPI_IOC_WR_MODE", _IOC_WRITE, 0x6b01, 0x01 },
{ "linux/spi/spidev.h", "SPI_IOC_WR_MODE32", _IOC_WRITE, 0x6b05, 0x04 },
{ "linux/stm.h", "STP_POLICY_ID_GET", _IOC_READ, 0x2501, 0x10 },
{ "linux/stm.h", "STP_POLICY_ID_SET", _IOC_READ|_IOC_WRITE, 0x2500, 0x10 },
{ "linux/stm.h", "STP_SET_OPTIONS", _IOC_WRITE, 0x2502, 0x08 },
{ "linux/suspend_ioctls.h", "SNAPSHOT_ALLOC_SWAP_PAGE", _IOC_READ, 0x3314, 0x08 },
{ "linux/suspend_ioctls.h", "SNAPSHOT_ATOMIC_RESTORE", _IOC_NONE, 0x3304, 0x00 },
{ "linux/suspend_ioctls.h", "SNAPSHOT_AVAIL_SWAP_SIZE", _IOC_READ, 0x3313, 0x08 },
@ -1887,15 +2078,18 @@
{ "linux/telephony.h", "PHONE_WINK", _IOC_WRITE, 0x71aa, 0x04 },
{ "linux/telephony.h", "PHONE_WINK_DURATION", _IOC_WRITE, 0x71a6, 0x04 },
{ "linux/timerfd.h", "TFD_IOC_SET_TICKS", _IOC_WRITE, 0x5400, 0x08 },
{ "linux/toshiba.h", "TOSH_SMM", _IOC_READ|_IOC_WRITE, 0x7490, 0x04 },
{ "linux/toshiba.h", "TOSHIBA_ACPI_SCI", _IOC_READ|_IOC_WRITE, 0x7491, 0x18 },
{ "linux/toshiba.h", "TOSH_SMM", _IOC_READ|_IOC_WRITE, 0x7490, 0x18 },
{ "linux/udf_fs_i.h", "UDF_GETEABLOCK", _IOC_READ, 0x6c41, 0x08 },
{ "linux/udf_fs_i.h", "UDF_GETEASIZE", _IOC_READ, 0x6c40, 0x04 },
{ "linux/udf_fs_i.h", "UDF_GETVOLIDENT", _IOC_READ, 0x6c42, 0x08 },
{ "linux/udf_fs_i.h", "UDF_RELOCATE_BLOCKS", _IOC_READ|_IOC_WRITE, 0x6c43, 0x08 },
{ "linux/uinput.h", "UI_ABS_SETUP", _IOC_WRITE, 0x5504, 0x1c },
{ "linux/uinput.h", "UI_BEGIN_FF_ERASE", _IOC_READ|_IOC_WRITE, 0x55ca, 0x0c },
{ "linux/uinput.h", "UI_BEGIN_FF_UPLOAD", _IOC_READ|_IOC_WRITE, 0x55c8, 0x68 },
{ "linux/uinput.h", "UI_DEV_CREATE", _IOC_NONE, 0x5501, 0x00 },
{ "linux/uinput.h", "UI_DEV_DESTROY", _IOC_NONE, 0x5502, 0x00 },
{ "linux/uinput.h", "UI_DEV_SETUP", _IOC_WRITE, 0x5503, 0x5c },
{ "linux/uinput.h", "UI_END_FF_ERASE", _IOC_WRITE, 0x55cb, 0x0c },
{ "linux/uinput.h", "UI_END_FF_UPLOAD", _IOC_WRITE, 0x55c9, 0x68 },
{ "linux/uinput.h", "UI_GET_VERSION", _IOC_READ, 0x552d, 0x04 },
@ -1925,6 +2119,11 @@
{ "linux/usb/iowarrior.h", "IOW_GETINFO", _IOC_READ, 0xc003, 0x28 },
{ "linux/usb/iowarrior.h", "IOW_READ", _IOC_WRITE, 0xc002, 0x08 },
{ "linux/usb/iowarrior.h", "IOW_WRITE", _IOC_WRITE, 0xc001, 0x08 },
{ "linux/usb/tmc.h", "USBTMC488_IOCTL_GET_CAPS", _IOC_READ, 0x5b11, 0x01 },
{ "linux/usb/tmc.h", "USBTMC488_IOCTL_GOTO_LOCAL", _IOC_NONE, 0x5b14, 0x00 },
{ "linux/usb/tmc.h", "USBTMC488_IOCTL_LOCAL_LOCKOUT", _IOC_NONE, 0x5b15, 0x00 },
{ "linux/usb/tmc.h", "USBTMC488_IOCTL_READ_STB", _IOC_READ, 0x5b12, 0x01 },
{ "linux/usb/tmc.h", "USBTMC488_IOCTL_REN_CONTROL", _IOC_WRITE, 0x5b13, 0x01 },
{ "linux/usb/tmc.h", "USBTMC_IOCTL_ABORT_BULK_IN", _IOC_NONE, 0x5b04, 0x00 },
{ "linux/usb/tmc.h", "USBTMC_IOCTL_ABORT_BULK_OUT", _IOC_NONE, 0x5b03, 0x00 },
{ "linux/usb/tmc.h", "USBTMC_IOCTL_CLEAR", _IOC_NONE, 0x5b02, 0x00 },
@ -1946,6 +2145,7 @@
{ "linux/usbdevice_fs.h", "USBDEVFS_DISCONNECT_CLAIM", _IOC_READ, 0x551b, 0x108 },
{ "linux/usbdevice_fs.h", "USBDEVFS_DISCSIGNAL", _IOC_READ, 0x550e, 0x10 },
{ "linux/usbdevice_fs.h", "USBDEVFS_DISCSIGNAL32", _IOC_READ, 0x550e, 0x08 },
{ "linux/usbdevice_fs.h", "USBDEVFS_DROP_PRIVILEGES", _IOC_WRITE, 0x551e, 0x04 },
{ "linux/usbdevice_fs.h", "USBDEVFS_FREE_STREAMS", _IOC_READ, 0x551d, 0x08 },
{ "linux/usbdevice_fs.h", "USBDEVFS_GETDRIVER", _IOC_WRITE, 0x5508, 0x104 },
{ "linux/usbdevice_fs.h", "USBDEVFS_GET_CAPABILITIES", _IOC_READ, 0x551a, 0x04 },
@ -1964,6 +2164,12 @@
{ "linux/usbdevice_fs.h", "USBDEVFS_SETINTERFACE", _IOC_READ, 0x5504, 0x08 },
{ "linux/usbdevice_fs.h", "USBDEVFS_SUBMITURB", _IOC_READ, 0x550a, 0x38 },
{ "linux/usbdevice_fs.h", "USBDEVFS_SUBMITURB32", _IOC_READ, 0x550a, 0x2a },
{ "linux/userfaultfd.h", "UFFDIO_API", _IOC_READ|_IOC_WRITE, 0xaa3f, 0x18 },
{ "linux/userfaultfd.h", "UFFDIO_COPY", _IOC_READ|_IOC_WRITE, 0xaa03, 0x28 },
{ "linux/userfaultfd.h", "UFFDIO_REGISTER", _IOC_READ|_IOC_WRITE, 0xaa00, 0x20 },
{ "linux/userfaultfd.h", "UFFDIO_UNREGISTER", _IOC_READ, 0xaa01, 0x10 },
{ "linux/userfaultfd.h", "UFFDIO_WAKE", _IOC_READ, 0xaa02, 0x10 },
{ "linux/userfaultfd.h", "UFFDIO_ZEROPAGE", _IOC_READ|_IOC_WRITE, 0xaa04, 0x20 },
{ "linux/uvcvideo.h", "UVCIOC_CTRL_MAP", _IOC_READ|_IOC_WRITE, 0x7520, 0x60 },
{ "linux/uvcvideo.h", "UVCIOC_CTRL_QUERY", _IOC_READ|_IOC_WRITE, 0x7521, 0x10 },
{ "linux/v4l2-subdev.h", "VIDIOC_SUBDEV_DV_TIMINGS_CAP", _IOC_READ|_IOC_WRITE, 0x5664, 0x90 },
@ -2002,11 +2208,17 @@
{ "linux/vfio.h", "VFIO_IOMMU_ENABLE", _IOC_NONE, 0x3b73, 0x00 },
{ "linux/vfio.h", "VFIO_IOMMU_GET_INFO", _IOC_NONE, 0x3b70, 0x00 },
{ "linux/vfio.h", "VFIO_IOMMU_MAP_DMA", _IOC_NONE, 0x3b71, 0x00 },
{ "linux/vfio.h", "VFIO_IOMMU_SPAPR_REGISTER_MEMORY", _IOC_NONE, 0x3b75, 0x00 },
{ "linux/vfio.h", "VFIO_IOMMU_SPAPR_TCE_CREATE", _IOC_NONE, 0x3b77, 0x00 },
{ "linux/vfio.h", "VFIO_IOMMU_SPAPR_TCE_GET_INFO", _IOC_NONE, 0x3b70, 0x00 },
{ "linux/vfio.h", "VFIO_IOMMU_SPAPR_TCE_REMOVE", _IOC_NONE, 0x3b78, 0x00 },
{ "linux/vfio.h", "VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY", _IOC_NONE, 0x3b76, 0x00 },
{ "linux/vfio.h", "VFIO_IOMMU_UNMAP_DMA", _IOC_NONE, 0x3b72, 0x00 },
{ "linux/vfio.h", "VFIO_SET_IOMMU", _IOC_NONE, 0x3b66, 0x00 },
{ "linux/vhost.h", "VHOST_GET_FEATURES", _IOC_READ, 0xaf00, 0x08 },
{ "linux/vhost.h", "VHOST_GET_VRING_BASE", _IOC_READ|_IOC_WRITE, 0xaf12, 0x08 },
{ "linux/vhost.h", "VHOST_GET_VRING_BUSYLOOP_TIMEOUT", _IOC_WRITE, 0xaf24, 0x08 },
{ "linux/vhost.h", "VHOST_GET_VRING_ENDIAN", _IOC_WRITE, 0xaf14, 0x08 },
{ "linux/vhost.h", "VHOST_NET_SET_BACKEND", _IOC_WRITE, 0xaf30, 0x08 },
{ "linux/vhost.h", "VHOST_RESET_OWNER", _IOC_NONE, 0xaf02, 0x00 },
{ "linux/vhost.h", "VHOST_SCSI_CLEAR_ENDPOINT", _IOC_WRITE, 0xaf41, 0xe8 },
@ -2021,7 +2233,9 @@
{ "linux/vhost.h", "VHOST_SET_OWNER", _IOC_NONE, 0xaf01, 0x00 },
{ "linux/vhost.h", "VHOST_SET_VRING_ADDR", _IOC_WRITE, 0xaf11, 0x28 },
{ "linux/vhost.h", "VHOST_SET_VRING_BASE", _IOC_WRITE, 0xaf12, 0x08 },
{ "linux/vhost.h", "VHOST_SET_VRING_BUSYLOOP_TIMEOUT", _IOC_WRITE, 0xaf23, 0x08 },
{ "linux/vhost.h", "VHOST_SET_VRING_CALL", _IOC_WRITE, 0xaf21, 0x08 },
{ "linux/vhost.h", "VHOST_SET_VRING_ENDIAN", _IOC_WRITE, 0xaf13, 0x08 },
{ "linux/vhost.h", "VHOST_SET_VRING_ERR", _IOC_WRITE, 0xaf22, 0x08 },
{ "linux/vhost.h", "VHOST_SET_VRING_KICK", _IOC_WRITE, 0xaf20, 0x08 },
{ "linux/vhost.h", "VHOST_SET_VRING_NUM", _IOC_WRITE, 0xaf10, 0x08 },
@ -2211,55 +2425,24 @@
{ "linux/wireless.h", "SIOCSIWSTATS", 0, 0x8B0E, 0 },
{ "linux/wireless.h", "SIOCSIWTHRSPY", 0, 0x8B12, 0 },
{ "linux/wireless.h", "SIOCSIWTXPOW", 0, 0x8B26, 0 },
{ "media/adv7842.h", "ADV7842_CMD_RAM_TEST", _IOC_NONE, 0x56c0, 0x00 },
{ "media/bt819.h", "BT819_FIFO_RESET_HIGH", _IOC_NONE, 0x6201, 0x00 },
{ "media/bt819.h", "BT819_FIFO_RESET_LOW", _IOC_NONE, 0x6200, 0x00 },
{ "media/davinci/vpfe_capture.h", "VPFE_CMD_S_CCDC_RAW_PARAMS", _IOC_WRITE, 0x56c1, 0x08 },
{ "media/exynos-fimc.h", "S5P_FIMC_TX_END_NOTIFY", _IOC_NONE, 0x6500, 0x00 },
{ "media/lirc.h", "LIRC_GET_FEATURES", _IOC_READ, 0x6900, 0x04 },
{ "media/lirc.h", "LIRC_GET_LENGTH", _IOC_READ, 0x690f, 0x04 },
{ "media/lirc.h", "LIRC_GET_MAX_FILTER_PULSE", _IOC_READ, 0x690b, 0x04 },
{ "media/lirc.h", "LIRC_GET_MAX_FILTER_SPACE", _IOC_READ, 0x690d, 0x04 },
{ "media/lirc.h", "LIRC_GET_MAX_TIMEOUT", _IOC_READ, 0x6909, 0x04 },
{ "media/lirc.h", "LIRC_GET_MIN_FILTER_PULSE", _IOC_READ, 0x690a, 0x04 },
{ "media/lirc.h", "LIRC_GET_MIN_FILTER_SPACE", _IOC_READ, 0x690c, 0x04 },
{ "media/lirc.h", "LIRC_GET_MIN_TIMEOUT", _IOC_READ, 0x6908, 0x04 },
{ "media/lirc.h", "LIRC_GET_REC_CARRIER", _IOC_READ, 0x6904, 0x04 },
{ "media/lirc.h", "LIRC_GET_REC_DUTY_CYCLE", _IOC_READ, 0x6906, 0x04 },
{ "media/lirc.h", "LIRC_GET_REC_MODE", _IOC_READ, 0x6902, 0x04 },
{ "media/lirc.h", "LIRC_GET_REC_RESOLUTION", _IOC_READ, 0x6907, 0x04 },
{ "media/lirc.h", "LIRC_GET_SEND_CARRIER", _IOC_READ, 0x6903, 0x04 },
{ "media/lirc.h", "LIRC_GET_SEND_DUTY_CYCLE", _IOC_READ, 0x6905, 0x04 },
{ "media/lirc.h", "LIRC_GET_SEND_MODE", _IOC_READ, 0x6901, 0x04 },
{ "media/lirc.h", "LIRC_NOTIFY_DECODE", _IOC_NONE, 0x6920, 0x00 },
{ "media/lirc.h", "LIRC_SETUP_END", _IOC_NONE, 0x6922, 0x00 },
{ "media/lirc.h", "LIRC_SETUP_START", _IOC_NONE, 0x6921, 0x00 },
{ "media/lirc.h", "LIRC_SET_MEASURE_CARRIER_MODE", _IOC_WRITE, 0x691d, 0x04 },
{ "media/lirc.h", "LIRC_SET_REC_CARRIER", _IOC_WRITE, 0x6914, 0x04 },
{ "media/lirc.h", "LIRC_SET_REC_CARRIER_RANGE", _IOC_WRITE, 0x691f, 0x04 },
{ "media/lirc.h", "LIRC_SET_REC_DUTY_CYCLE", _IOC_WRITE, 0x6916, 0x04 },
{ "media/lirc.h", "LIRC_SET_REC_DUTY_CYCLE_RANGE", _IOC_WRITE, 0x691e, 0x04 },
{ "media/lirc.h", "LIRC_SET_REC_FILTER", _IOC_WRITE, 0x691c, 0x04 },
{ "media/lirc.h", "LIRC_SET_REC_FILTER_PULSE", _IOC_WRITE, 0x691a, 0x04 },
{ "media/lirc.h", "LIRC_SET_REC_FILTER_SPACE", _IOC_WRITE, 0x691b, 0x04 },
{ "media/lirc.h", "LIRC_SET_REC_MODE", _IOC_WRITE, 0x6912, 0x04 },
{ "media/lirc.h", "LIRC_SET_REC_TIMEOUT", _IOC_WRITE, 0x6918, 0x04 },
{ "media/lirc.h", "LIRC_SET_REC_TIMEOUT_REPORTS", _IOC_WRITE, 0x6919, 0x04 },
{ "media/lirc.h", "LIRC_SET_SEND_CARRIER", _IOC_WRITE, 0x6913, 0x04 },
{ "media/lirc.h", "LIRC_SET_SEND_DUTY_CYCLE", _IOC_WRITE, 0x6915, 0x04 },
{ "media/lirc.h", "LIRC_SET_SEND_MODE", _IOC_WRITE, 0x6911, 0x04 },
{ "media/lirc.h", "LIRC_SET_TRANSMITTER_MASK", _IOC_WRITE, 0x6917, 0x04 },
{ "media/lirc.h", "LIRC_SET_WIDEBAND_RECEIVER", _IOC_WRITE, 0x6923, 0x04 },
{ "media/saa6588.h", "SAA6588_CMD_CLOSE", _IOC_WRITE, 0x5202, 0x04 },
{ "media/saa6588.h", "SAA6588_CMD_POLL", _IOC_READ, 0x5204, 0x04 },
{ "media/saa6588.h", "SAA6588_CMD_READ", _IOC_READ, 0x5203, 0x04 },
{ "media/si4713.h", "SI4713_IOC_MEASURE_RNL", _IOC_READ|_IOC_WRITE, 0x56c0, 0x1c },
{ "media/drv-intf/exynos-fimc.h", "S5P_FIMC_TX_END_NOTIFY", _IOC_NONE, 0x6500, 0x00 },
{ "media/i2c/adv7842.h", "ADV7842_CMD_RAM_TEST", _IOC_NONE, 0x56c0, 0x00 },
{ "media/i2c/bt819.h", "BT819_FIFO_RESET_HIGH", _IOC_NONE, 0x6201, 0x00 },
{ "media/i2c/bt819.h", "BT819_FIFO_RESET_LOW", _IOC_NONE, 0x6200, 0x00 },
{ "media/i2c/saa6588.h", "SAA6588_CMD_CLOSE", _IOC_WRITE, 0x5202, 0x04 },
{ "media/i2c/saa6588.h", "SAA6588_CMD_POLL", _IOC_READ, 0x5204, 0x04 },
{ "media/i2c/saa6588.h", "SAA6588_CMD_READ", _IOC_READ, 0x5203, 0x04 },
{ "media/v4l2-common.h", "TUNER_SET_CONFIG", _IOC_WRITE, 0x645c, 0x10 },
{ "media/v4l2-common.h", "VIDIOC_INT_RESET", _IOC_WRITE, 0x6466, 0x04 },
{ "media/v4l2-subdev.h", "V4L2_DEVICE_NOTIFY_EVENT", _IOC_WRITE, 0x7602, 0x88 },
{ "media/v4l2-subdev.h", "V4L2_SUBDEV_IR_RX_NOTIFY", _IOC_WRITE, 0x7600, 0x04 },
{ "media/v4l2-subdev.h", "V4L2_SUBDEV_IR_TX_NOTIFY", _IOC_WRITE, 0x7601, 0x04 },
{ "misc/cxl.h", "CXL_IOCTL_DOWNLOAD_IMAGE", _IOC_WRITE, 0xca0a, 0x40 },
{ "misc/cxl.h", "CXL_IOCTL_GET_AFU_ID", _IOC_READ, 0xca02, 0x40 },
{ "misc/cxl.h", "CXL_IOCTL_GET_PROCESS_ELEMENT", _IOC_READ, 0xca01, 0x04 },
{ "misc/cxl.h", "CXL_IOCTL_START_WORK", _IOC_WRITE, 0xca00, 0x40 },
{ "misc/cxl.h", "CXL_IOCTL_VALIDATE_IMAGE", _IOC_WRITE, 0xca0b, 0x40 },
{ "mtd/mtd-abi.h", "ECCGETLAYOUT", _IOC_READ, 0x4d11, 0x148 },
{ "mtd/mtd-abi.h", "ECCGETSTATS", _IOC_READ, 0x4d12, 0x10 },
{ "mtd/mtd-abi.h", "MEMERASE", _IOC_WRITE, 0x4d02, 0x08 },
@ -2324,10 +2507,21 @@
{ "net/bluetooth/rfcomm.h", "RFCOMMGETDEVLIST", _IOC_READ, 0x52d2, 0x04 },
{ "net/bluetooth/rfcomm.h", "RFCOMMRELEASEDEV", _IOC_WRITE, 0x52c9, 0x04 },
{ "net/bluetooth/rfcomm.h", "RFCOMMSTEALDLC", _IOC_WRITE, 0x52dc, 0x04 },
{ "net/nfc/nci_core.h", "NCIUARTSETDRIVER", _IOC_WRITE, 0x5500, 0x08 },
{ "rdma/ib_user_mad.h", "IB_USER_MAD_ENABLE_PKEY", _IOC_NONE, 0x1b03, 0x00 },
{ "rdma/ib_user_mad.h", "IB_USER_MAD_REGISTER_AGENT", _IOC_READ|_IOC_WRITE, 0x1b01, 0x1c },
{ "rdma/ib_user_mad.h", "IB_USER_MAD_REGISTER_AGENT2", _IOC_READ|_IOC_WRITE, 0x1b04, 0x28 },
{ "rdma/ib_user_mad.h", "IB_USER_MAD_UNREGISTER_AGENT", _IOC_WRITE, 0x1b02, 0x04 },
{ "scsi/cxlflash_ioctl.h", "DK_CXLFLASH_ATTACH", _IOC_READ|_IOC_WRITE, 0xca80, 0x90 },
{ "scsi/cxlflash_ioctl.h", "DK_CXLFLASH_DETACH", _IOC_READ|_IOC_WRITE, 0xca83, 0x60 },
{ "scsi/cxlflash_ioctl.h", "DK_CXLFLASH_MANAGE_LUN", _IOC_READ|_IOC_WRITE, 0xca86, 0x68 },
{ "scsi/cxlflash_ioctl.h", "DK_CXLFLASH_RECOVER_AFU", _IOC_READ|_IOC_WRITE, 0xca85, 0x78 },
{ "scsi/cxlflash_ioctl.h", "DK_CXLFLASH_RELEASE", _IOC_READ|_IOC_WRITE, 0xca82, 0x68 },
{ "scsi/cxlflash_ioctl.h", "DK_CXLFLASH_USER_DIRECT", _IOC_READ|_IOC_WRITE, 0xca81, 0x70 },
{ "scsi/cxlflash_ioctl.h", "DK_CXLFLASH_USER_VIRTUAL", _IOC_READ|_IOC_WRITE, 0xca87, 0x78 },
{ "scsi/cxlflash_ioctl.h", "DK_CXLFLASH_VERIFY", _IOC_READ|_IOC_WRITE, 0xca84, 0x90 },
{ "scsi/cxlflash_ioctl.h", "DK_CXLFLASH_VLUN_CLONE", _IOC_READ|_IOC_WRITE, 0xca89, 0x70 },
{ "scsi/cxlflash_ioctl.h", "DK_CXLFLASH_VLUN_RESIZE", _IOC_READ|_IOC_WRITE, 0xca88, 0x78 },
{ "scsi/scsi.h", "SCSI_IOCTL_GET_BUS_NUMBER", 0, 0x5386, 0 },
{ "scsi/scsi.h", "SCSI_IOCTL_GET_IDLUN", 0, 0x5382, 0 },
{ "scsi/scsi.h", "SCSI_IOCTL_GET_PCI", 0, 0x5387, 0 },
@ -2370,7 +2564,6 @@
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_GET_PORT_INFO", _IOC_READ|_IOC_WRITE, 0x5322, 0xa8 },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT", _IOC_READ|_IOC_WRITE, 0x5349, 0x4c },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_GET_QUEUE_INFO", _IOC_READ|_IOC_WRITE, 0x5334, 0x8c },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_GET_QUEUE_OWNER", _IOC_READ|_IOC_WRITE, 0x5343, 0x00 },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS", _IOC_READ|_IOC_WRITE, 0x5340, 0x5c },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO", _IOC_READ|_IOC_WRITE, 0x5341, 0x2c },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER", _IOC_READ|_IOC_WRITE, 0x5345, 0x60 },
@ -2386,7 +2579,6 @@
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_SET_PORT_INFO", _IOC_WRITE, 0x5323, 0xa8 },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT", _IOC_WRITE, 0x534a, 0x4c },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_SET_QUEUE_INFO", _IOC_READ|_IOC_WRITE, 0x5335, 0x8c },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_SET_QUEUE_OWNER", _IOC_WRITE, 0x5344, 0x00 },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO", _IOC_WRITE, 0x5342, 0x2c },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER", _IOC_WRITE, 0x5346, 0x60 },
{ "sound/asequencer.h", "SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT", _IOC_WRITE, 0x5330, 0x50 },
@ -2442,6 +2634,7 @@
{ "sound/asound.h", "SNDRV_PCM_IOCTL_REWIND", _IOC_WRITE, 0x4146, 0x08 },
{ "sound/asound.h", "SNDRV_PCM_IOCTL_START", _IOC_NONE, 0x4142, 0x00 },
{ "sound/asound.h", "SNDRV_PCM_IOCTL_STATUS", _IOC_READ, 0x4120, 0x98 },
{ "sound/asound.h", "SNDRV_PCM_IOCTL_STATUS_EXT", _IOC_READ|_IOC_WRITE, 0x4124, 0x98 },
{ "sound/asound.h", "SNDRV_PCM_IOCTL_SW_PARAMS", _IOC_READ|_IOC_WRITE, 0x4113, 0x88 },
{ "sound/asound.h", "SNDRV_PCM_IOCTL_SYNC_PTR", _IOC_READ|_IOC_WRITE, 0x4123, 0x88 },
{ "sound/asound.h", "SNDRV_PCM_IOCTL_TSTAMP", _IOC_WRITE, 0x4102, 0x04 },
@ -2539,8 +2732,7 @@
{ "sound/sfnt_info.h", "SNDRV_EMUX_IOCTL_REMOVE_LAST_SAMPLES", _IOC_NONE, 0x4883, 0x00 },
{ "sound/sfnt_info.h", "SNDRV_EMUX_IOCTL_RESET_SAMPLES", _IOC_NONE, 0x4882, 0x00 },
{ "sound/sfnt_info.h", "SNDRV_EMUX_IOCTL_VERSION", _IOC_READ, 0x4880, 0x04 },
{ "staging/android/android_alarm.h", "ANDROID_ALARM_SET_RTC", _IOC_WRITE, 0x6105, 0x10 },
{ "staging/android/android_alarm.h", "ANDROID_ALARM_WAIT", _IOC_NONE, 0x6101, 0x00 },
{ "sound/usb_stream.h", "SNDRV_USB_STREAM_IOCTL_SET_PARAMS", _IOC_WRITE, 0x4890, 0x10 },
{ "staging/android/ashmem.h", "ASHMEM_GET_NAME", _IOC_READ, 0x7702, 0x100 },
{ "staging/android/ashmem.h", "ASHMEM_GET_PIN_STATUS", _IOC_NONE, 0x7709, 0x00 },
{ "staging/android/ashmem.h", "ASHMEM_GET_PROT_MASK", _IOC_NONE, 0x7706, 0x00 },
@ -2561,17 +2753,10 @@
{ "staging/android/ion_test.h", "ION_IOC_TEST_DMA_MAPPING", _IOC_WRITE, 0x49f1, 0x20 },
{ "staging/android/ion_test.h", "ION_IOC_TEST_KERNEL_MAPPING", _IOC_WRITE, 0x49f2, 0x20 },
{ "staging/android/ion_test.h", "ION_IOC_TEST_SET_FD", _IOC_NONE, 0x49f0, 0x00 },
{ "staging/android/logger.h", "LOGGER_FLUSH_LOG", _IOC_NONE, 0xae04, 0x00 },
{ "staging/android/logger.h", "LOGGER_GET_LOG_BUF_SIZE", _IOC_NONE, 0xae01, 0x00 },
{ "staging/android/logger.h", "LOGGER_GET_LOG_LEN", _IOC_NONE, 0xae02, 0x00 },
{ "staging/android/logger.h", "LOGGER_GET_NEXT_ENTRY_LEN", _IOC_NONE, 0xae03, 0x00 },
{ "staging/android/logger.h", "LOGGER_GET_VERSION", _IOC_NONE, 0xae05, 0x00 },
{ "staging/android/logger.h", "LOGGER_SET_VERSION", _IOC_NONE, 0xae06, 0x00 },
{ "staging/android/sw_sync.h", "SW_SYNC_IOC_CREATE_FENCE", _IOC_READ|_IOC_WRITE, 0x5700, 0x28 },
{ "staging/android/sw_sync.h", "SW_SYNC_IOC_INC", _IOC_WRITE, 0x5701, 0x04 },
{ "staging/android/sync.h", "SYNC_IOC_FENCE_INFO", _IOC_READ|_IOC_WRITE, 0x3e02, 0x28 },
{ "staging/android/sync.h", "SYNC_IOC_MERGE", _IOC_READ|_IOC_WRITE, 0x3e01, 0x28 },
{ "staging/android/sync.h", "SYNC_IOC_WAIT", _IOC_WRITE, 0x3e00, 0x04 },
{ "video/da8xx-fb.h", "FBIGET_BRIGHTNESS", _IOC_READ, 0x4603, 0x04 },
{ "video/da8xx-fb.h", "FBIGET_COLOR", _IOC_READ, 0x4605, 0x04 },
{ "video/da8xx-fb.h", "FBIOGET_CONTRAST", _IOC_READ, 0x4601, 0x04 },
@ -2613,5 +2798,11 @@
{ "xen/evtchn.h", "IOCTL_EVTCHN_NOTIFY", _IOC_NONE, 0x4504, 0x04 },
{ "xen/evtchn.h", "IOCTL_EVTCHN_RESET", _IOC_NONE, 0x4505, 0x00 },
{ "xen/evtchn.h", "IOCTL_EVTCHN_UNBIND", _IOC_NONE, 0x4503, 0x04 },
{ "xen/gntdev.h", "IOCTL_GNTDEV_GET_OFFSET_FOR_VADDR", _IOC_NONE, 0x4702, 0x18 },
{ "xen/gntdev.h", "IOCTL_GNTDEV_GRANT_COPY", _IOC_NONE, 0x4708, 0x10 },
{ "xen/gntdev.h", "IOCTL_GNTDEV_MAP_GRANT_REF", _IOC_NONE, 0x4700, 0x18 },
{ "xen/gntdev.h", "IOCTL_GNTDEV_SET_MAX_GRANTS", _IOC_NONE, 0x4703, 0x04 },
{ "xen/gntdev.h", "IOCTL_GNTDEV_SET_UNMAP_NOTIFY", _IOC_NONE, 0x4707, 0x10 },
{ "xen/gntdev.h", "IOCTL_GNTDEV_UNMAP_GRANT_REF", _IOC_NONE, 0x4701, 0x10 },
{ "xen/xenbus_dev.h", "IOCTL_XENBUS_BACKEND_EVTCHN", _IOC_NONE, 0x4200, 0x00 },
{ "xen/xenbus_dev.h", "IOCTL_XENBUS_BACKEND_SETUP", _IOC_NONE, 0x4201, 0x00 },

View File

@ -1,267 +1,273 @@
[ 0] = { 2, 0, sys_io_setup, "io_setup" },
[ 1] = { 1, 0, sys_io_destroy, "io_destroy" },
[ 2] = { 3, 0, sys_io_submit, "io_submit" },
[ 3] = { 3, 0, sys_io_cancel, "io_cancel" },
[ 4] = { 5, 0, sys_io_getevents, "io_getevents" },
[ 5] = { 5, TF, sys_setxattr, "setxattr" },
[ 6] = { 5, TF, sys_setxattr, "lsetxattr" },
[ 7] = { 5, TD, sys_fsetxattr, "fsetxattr" },
[ 8] = { 4, TF, sys_getxattr, "getxattr" },
[ 9] = { 4, TF, sys_getxattr, "lgetxattr" },
[ 10] = { 4, TD, sys_fgetxattr, "fgetxattr" },
[ 11] = { 3, TF, sys_listxattr, "listxattr" },
[ 12] = { 3, TF, sys_listxattr, "llistxattr" },
[ 13] = { 3, TD, sys_flistxattr, "flistxattr" },
[ 14] = { 2, TF, sys_removexattr, "removexattr" },
[ 15] = { 2, TF, sys_removexattr, "lremovexattr" },
[ 16] = { 2, TD, sys_fremovexattr, "fremovexattr" },
[ 17] = { 2, TF, sys_getcwd, "getcwd" },
[ 18] = { 3, 0, sys_lookup_dcookie, "lookup_dcookie" },
[ 19] = { 2, TD, sys_eventfd2, "eventfd2" },
[ 20] = { 1, TD, sys_epoll_create1, "epoll_create1" },
[ 21] = { 4, TD, sys_epoll_ctl, "epoll_ctl" },
[ 22] = { 6, TD, sys_epoll_pwait, "epoll_pwait" },
[ 23] = { 1, TD, sys_dup, "dup" },
[ 24] = { 3, TD, sys_dup3, "dup3" },
[ 25] = { 3, TD, sys_fcntl, "fcntl" },
[ 26] = { 1, TD, sys_inotify_init1, "inotify_init1" },
[ 27] = { 3, TD, sys_inotify_add_watch, "inotify_add_watch" },
[ 28] = { 2, TD, sys_inotify_rm_watch, "inotify_rm_watch" },
[ 29] = { 3, TD, sys_ioctl, "ioctl" },
[ 30] = { 3, 0, sys_ioprio_set, "ioprio_set" },
[ 31] = { 2, 0, sys_ioprio_get, "ioprio_get" },
[ 32] = { 2, TD, sys_flock, "flock" },
[ 33] = { 4, TD|TF, sys_mknodat, "mknodat" },
[ 34] = { 3, TD|TF, sys_mkdirat, "mkdirat" },
[ 35] = { 3, TD|TF, sys_unlinkat, "unlinkat" },
[ 36] = { 3, TD|TF, sys_symlinkat, "symlinkat" },
[ 37] = { 5, TD|TF, sys_linkat, "linkat" },
[ 38] = { 4, TD|TF, sys_renameat, "renameat" },
[ 39] = { 2, TF, sys_umount2, "umount2" },
[ 40] = { 5, TF, sys_mount, "mount" },
[ 41] = { 2, TF, sys_pivotroot, "pivot_root" },
[ 42] = { 3, 0, sys_nfsservctl, "nfsservctl" },
[ 43] = { 2, TF, sys_statfs, "statfs" },
[ 44] = { 2, TD, sys_fstatfs, "fstatfs" },
[ 45] = { 2, TF, sys_truncate, "truncate" },
[ 46] = { 2, TD, sys_ftruncate, "ftruncate" },
[ 47] = { 4, TD, sys_fallocate, "fallocate" },
[ 48] = { 3, TD|TF, sys_faccessat, "faccessat" },
[ 49] = { 1, TF, sys_chdir, "chdir" },
[ 50] = { 1, TD, sys_fchdir, "fchdir" },
[ 51] = { 1, TF, sys_chroot, "chroot" },
[ 52] = { 2, TD, sys_fchmod, "fchmod" },
[ 53] = { 3, TD|TF, sys_fchmodat, "fchmodat" },
[ 54] = { 5, TD|TF, sys_fchownat, "fchownat" },
[ 55] = { 3, TD, sys_fchown, "fchown" },
[ 56] = { 4, TD|TF, sys_openat, "openat" },
[ 57] = { 1, TD, sys_close, "close" },
[ 58] = { 0, 0, sys_vhangup, "vhangup" },
[ 59] = { 2, TD, sys_pipe2, "pipe2" },
[ 60] = { 4, TF, sys_quotactl, "quotactl" },
[ 61] = { 3, TD, sys_getdents64, "getdents64" },
[ 62] = { 3, TD, sys_lseek, "lseek" },
[ 63] = { 3, TD, sys_read, "read" },
[ 64] = { 3, TD, sys_write, "write" },
[ 65] = { 3, TD, sys_readv, "readv" },
[ 66] = { 3, TD, sys_writev, "writev" },
[ 67] = { 4, TD, sys_pread, "pread64" },
[ 68] = { 4, TD, sys_pwrite, "pwrite64" },
[ 69] = { 4, TD, sys_preadv, "preadv" },
[ 70] = { 4, TD, sys_pwritev, "pwritev" },
[ 71] = { 4, TD|TN, sys_sendfile64, "sendfile" },
[ 72] = { 6, TD, sys_pselect6, "pselect6" },
[ 73] = { 5, TD, sys_ppoll, "ppoll" },
[ 74] = { 4, TD|TS, sys_signalfd4, "signalfd4" },
[ 75] = { 4, TD, sys_vmsplice, "vmsplice" },
[ 76] = { 6, TD, sys_splice, "splice" },
[ 77] = { 4, TD, sys_tee, "tee" },
[ 78] = { 4, TD|TF, sys_readlinkat, "readlinkat" },
[ 79] = { 4, TD|TF, sys_newfstatat, "newfstatat" },
[ 80] = { 2, TD, sys_fstat, "fstat" },
[ 81] = { 0, 0, sys_sync, "sync" },
[ 82] = { 1, TD, sys_fsync, "fsync" },
[ 83] = { 1, TD, sys_fdatasync, "fdatasync" },
[ 84] = { 4, TD, sys_sync_file_range, "sync_file_range" },
[ 85] = { 2, TD, sys_timerfd_create, "timerfd_create" },
[ 86] = { 4, TD, sys_timerfd_settime, "timerfd_settime" },
[ 87] = { 2, TD, sys_timerfd_gettime, "timerfd_gettime" },
[ 88] = { 4, TD|TF, sys_utimensat, "utimensat" },
[ 89] = { 1, TF, sys_acct, "acct" },
[ 90] = { 2, 0, sys_capget, "capget" },
[ 91] = { 2, 0, sys_capset, "capset" },
[ 92] = { 1, 0, sys_personality, "personality" },
[ 93] = { 1, TP|SE, sys_exit, "exit" },
[ 94] = { 1, TP|SE, sys_exit, "exit_group" },
[ 95] = { 5, TP, sys_waitid, "waitid" },
[ 96] = { 1, 0, sys_set_tid_address, "set_tid_address" },
[ 97] = { 1, TP, sys_unshare, "unshare" },
[ 98] = { 6, 0, sys_futex, "futex" },
[ 99] = { 2, 0, sys_set_robust_list, "set_robust_list" },
[100] = { 3, 0, sys_get_robust_list, "get_robust_list" },
[101] = { 2, 0, sys_nanosleep, "nanosleep" },
[102] = { 2, 0, sys_getitimer, "getitimer" },
[103] = { 3, 0, sys_setitimer, "setitimer" },
[104] = { 4, 0, sys_kexec_load, "kexec_load" },
[105] = { 3, 0, sys_init_module, "init_module" },
[106] = { 2, 0, sys_delete_module, "delete_module" },
[107] = { 3, 0, sys_timer_create, "timer_create" },
[108] = { 2, 0, sys_timer_gettime, "timer_gettime" },
[109] = { 1, 0, sys_timer_getoverrun, "timer_getoverrun" },
[110] = { 4, 0, sys_timer_settime, "timer_settime" },
[111] = { 1, 0, sys_timer_delete, "timer_delete" },
[112] = { 2, 0, sys_clock_settime, "clock_settime" },
[113] = { 2, 0, sys_clock_gettime, "clock_gettime" },
[114] = { 2, 0, sys_clock_getres, "clock_getres" },
[115] = { 4, 0, sys_clock_nanosleep, "clock_nanosleep" },
[116] = { 3, 0, sys_syslog, "syslog" },
[117] = { 4, 0, sys_ptrace, "ptrace" },
[118] = { 2, 0, sys_sched_setparam, "sched_setparam" },
[119] = { 3, 0, sys_sched_setscheduler, "sched_setscheduler" },
[120] = { 1, 0, sys_sched_getscheduler, "sched_getscheduler" },
[121] = { 2, 0, sys_sched_getparam, "sched_getparam" },
[122] = { 3, 0, sys_sched_setaffinity, "sched_setaffinity" },
[123] = { 3, 0, sys_sched_getaffinity, "sched_getaffinity" },
[124] = { 0, 0, sys_sched_yield, "sched_yield" },
[125] = { 1, 0, sys_sched_get_priority_max, "sched_get_priority_max"},
[126] = { 1, 0, sys_sched_get_priority_min, "sched_get_priority_min"},
[127] = { 2, 0, sys_sched_rr_get_interval, "sched_rr_get_interval" },
[128] = { 0, 0, sys_restart_syscall, "restart_syscall" },
[129] = { 2, TS, sys_kill, "kill" },
[130] = { 2, TS, sys_kill, "tkill" },
[131] = { 3, TS, sys_tgkill, "tgkill" },
[132] = { 2, TS, sys_sigaltstack, "sigaltstack" },
[133] = { 2, TS, sys_rt_sigsuspend, "rt_sigsuspend" },
[134] = { 4, TS, sys_rt_sigaction, "rt_sigaction" },
[135] = { 4, TS, sys_rt_sigprocmask, "rt_sigprocmask" },
[136] = { 2, TS, sys_rt_sigpending, "rt_sigpending" },
[137] = { 4, TS, sys_rt_sigtimedwait, "rt_sigtimedwait" },
[138] = { 3, TS, sys_rt_sigqueueinfo, "rt_sigqueueinfo" },
[139] = { 0, TS, sys_sigreturn, "rt_sigreturn" },
[140] = { 3, 0, sys_setpriority, "setpriority" },
[141] = { 2, 0, sys_getpriority, "getpriority" },
[142] = { 4, 0, sys_reboot, "reboot" },
[143] = { 2, 0, sys_setregid, "setregid" },
[144] = { 1, 0, sys_setgid, "setgid" },
[145] = { 2, 0, sys_setreuid, "setreuid" },
[146] = { 1, 0, sys_setuid, "setuid" },
[147] = { 3, 0, sys_setresuid, "setresuid" },
[148] = { 3, 0, sys_getresuid, "getresuid" },
[149] = { 3, 0, sys_setresgid, "setresgid" },
[150] = { 3, 0, sys_getresgid, "getresgid" },
[151] = { 1, NF, sys_setfsuid, "setfsuid" },
[152] = { 1, NF, sys_setfsgid, "setfsgid" },
[153] = { 1, 0, sys_times, "times" },
[154] = { 2, 0, sys_setpgid, "setpgid" },
[155] = { 1, 0, sys_getpgid, "getpgid" },
[156] = { 1, 0, sys_getsid, "getsid" },
[157] = { 0, 0, sys_setsid, "setsid" },
[158] = { 2, 0, sys_getgroups, "getgroups" },
[159] = { 2, 0, sys_setgroups, "setgroups" },
[160] = { 1, 0, sys_uname, "uname" },
[161] = { 2, 0, sys_sethostname, "sethostname" },
[162] = { 2, 0, sys_setdomainname, "setdomainname" },
[163] = { 2, 0, sys_getrlimit, "getrlimit" },
[164] = { 2, 0, sys_setrlimit, "setrlimit" },
[165] = { 2, 0, sys_getrusage, "getrusage" },
[166] = { 1, 0, sys_umask, "umask" },
[167] = { 5, 0, sys_prctl, "prctl" },
[168] = { 3, 0, sys_getcpu, "getcpu" },
[169] = { 2, 0, sys_gettimeofday, "gettimeofday" },
[170] = { 2, 0, sys_settimeofday, "settimeofday" },
[171] = { 1, 0, sys_adjtimex, "adjtimex" },
[172] = { 0, 0, sys_getpid, "getpid" },
[173] = { 0, 0, sys_getppid, "getppid" },
[174] = { 0, NF, sys_getuid, "getuid" },
[175] = { 0, NF, sys_geteuid, "geteuid" },
[176] = { 0, NF, sys_getgid, "getgid" },
[177] = { 0, NF, sys_getegid, "getegid" },
[178] = { 0, 0, sys_gettid, "gettid" },
[179] = { 1, 0, sys_sysinfo, "sysinfo" },
[180] = { 4, 0, sys_mq_open, "mq_open" },
[181] = { 1, 0, sys_mq_unlink, "mq_unlink" },
[182] = { 5, 0, sys_mq_timedsend, "mq_timedsend" },
[183] = { 5, 0, sys_mq_timedreceive, "mq_timedreceive" },
[184] = { 2, 0, sys_mq_notify, "mq_notify" },
[185] = { 3, 0, sys_mq_getsetattr, "mq_getsetattr" },
[186] = { 2, TI, sys_msgget, "msgget" },
[187] = { 3, TI, sys_msgctl, "msgctl" },
[188] = { 5, TI, sys_msgrcv, "msgrcv" },
[189] = { 4, TI, sys_msgsnd, "msgsnd" },
[190] = { 3, TI, sys_semget, "semget" },
[191] = { 4, TI, sys_semctl, "semctl" },
[192] = { 4, TI, sys_semtimedop, "semtimedop" },
[193] = { 3, TI, sys_semop, "semop" },
[194] = { 3, TI, sys_shmget, "shmget" },
[195] = { 3, TI, sys_shmctl, "shmctl" },
[196] = { 3, TI|TM|SI, sys_shmat, "shmat" },
[197] = { 1, TI|TM|SI, sys_shmdt, "shmdt" },
[198] = { 3, TN, sys_socket, "socket" },
[199] = { 4, TN, sys_socketpair, "socketpair" },
[200] = { 3, TN, sys_bind, "bind" },
[201] = { 2, TN, sys_listen, "listen" },
[202] = { 3, TN, sys_accept, "accept" },
[203] = { 3, TN, sys_connect, "connect" },
[204] = { 3, TN, sys_getsockname, "getsockname" },
[205] = { 3, TN, sys_getpeername, "getpeername" },
[206] = { 6, TN, sys_sendto, "sendto" },
[207] = { 6, TN, sys_recvfrom, "recvfrom" },
[208] = { 5, TN, sys_setsockopt, "setsockopt" },
[209] = { 5, TN, sys_getsockopt, "getsockopt" },
[210] = { 2, TN, sys_shutdown, "shutdown" },
[211] = { 3, TN, sys_sendmsg, "sendmsg" },
[212] = { 3, TN, sys_recvmsg, "recvmsg" },
[213] = { 3, TD, sys_readahead, "readahead" },
[214] = { 1, TM|SI, sys_brk, "brk" },
[215] = { 2, TM|SI, sys_munmap, "munmap" },
[216] = { 5, TM|SI, sys_mremap, "mremap" },
[217] = { 5, 0, sys_add_key, "add_key" },
[218] = { 4, 0, sys_request_key, "request_key" },
[219] = { 5, 0, sys_keyctl, "keyctl" },
[220] = { 5, TP, sys_clone, "clone" },
[221] = { 3, TF|TP|SE|SI, sys_execve, "execve" },
[222] = { 6, TD|TM|SI, sys_mmap, "mmap" },
[223] = { 4, TD, sys_fadvise64, "fadvise64" },
[224] = { 2, TF, sys_swapon, "swapon" },
[225] = { 1, TF, sys_swapoff, "swapoff" },
[226] = { 3, TM|SI, sys_mprotect, "mprotect" },
[227] = { 3, TM, sys_msync, "msync" },
[228] = { 2, TM, sys_mlock, "mlock" },
[229] = { 2, TM, sys_munlock, "munlock" },
[230] = { 1, TM, sys_mlockall, "mlockall" },
[231] = { 0, TM, sys_munlockall, "munlockall" },
[232] = { 3, TM, sys_mincore, "mincore" },
[233] = { 3, TM, sys_madvise, "madvise" },
[234] = { 5, TM|SI, sys_remap_file_pages, "remap_file_pages" },
[235] = { 6, TM, sys_mbind, "mbind" },
[236] = { 5, TM, sys_get_mempolicy, "get_mempolicy" },
[237] = { 3, TM, sys_set_mempolicy, "set_mempolicy" },
[238] = { 4, TM, sys_migrate_pages, "migrate_pages" },
[239] = { 6, TM, sys_move_pages, "move_pages" },
[240] = { 4, TP|TS, sys_rt_tgsigqueueinfo, "rt_tgsigqueueinfo" },
[241] = { 5, TD, sys_perf_event_open, "perf_event_open" },
[242] = { 4, TN, sys_accept4, "accept4" },
[243] = { 5, TN, sys_recvmmsg, "recvmmsg" },
[ 0] = { 2, 0, SEN(io_setup), "io_setup" },
[ 1] = { 1, 0, SEN(io_destroy), "io_destroy" },
[ 2] = { 3, 0, SEN(io_submit), "io_submit" },
[ 3] = { 3, 0, SEN(io_cancel), "io_cancel" },
[ 4] = { 5, 0, SEN(io_getevents), "io_getevents" },
[ 5] = { 5, TF, SEN(setxattr), "setxattr" },
[ 6] = { 5, TF, SEN(setxattr), "lsetxattr" },
[ 7] = { 5, TD, SEN(fsetxattr), "fsetxattr" },
[ 8] = { 4, TF, SEN(getxattr), "getxattr" },
[ 9] = { 4, TF, SEN(getxattr), "lgetxattr" },
[ 10] = { 4, TD, SEN(fgetxattr), "fgetxattr" },
[ 11] = { 3, TF, SEN(listxattr), "listxattr" },
[ 12] = { 3, TF, SEN(listxattr), "llistxattr" },
[ 13] = { 3, TD, SEN(flistxattr), "flistxattr" },
[ 14] = { 2, TF, SEN(removexattr), "removexattr" },
[ 15] = { 2, TF, SEN(removexattr), "lremovexattr" },
[ 16] = { 2, TD, SEN(fremovexattr), "fremovexattr" },
[ 17] = { 2, TF, SEN(getcwd), "getcwd" },
[ 18] = { 3, 0, SEN(lookup_dcookie), "lookup_dcookie" },
[ 19] = { 2, TD, SEN(eventfd2), "eventfd2" },
[ 20] = { 1, TD, SEN(epoll_create1), "epoll_create1" },
[ 21] = { 4, TD, SEN(epoll_ctl), "epoll_ctl" },
[ 22] = { 6, TD, SEN(epoll_pwait), "epoll_pwait" },
[ 23] = { 1, TD, SEN(dup), "dup" },
[ 24] = { 3, TD, SEN(dup3), "dup3" },
[ 25] = { 3, TD, SEN(fcntl), "fcntl" },
[ 26] = { 1, TD, SEN(inotify_init1), "inotify_init1" },
[ 27] = { 3, TD, SEN(inotify_add_watch), "inotify_add_watch" },
[ 28] = { 2, TD, SEN(inotify_rm_watch), "inotify_rm_watch" },
[ 29] = { 3, TD, SEN(ioctl), "ioctl" },
[ 30] = { 3, 0, SEN(ioprio_set), "ioprio_set" },
[ 31] = { 2, 0, SEN(ioprio_get), "ioprio_get" },
[ 32] = { 2, TD, SEN(flock), "flock" },
[ 33] = { 4, TD|TF, SEN(mknodat), "mknodat" },
[ 34] = { 3, TD|TF, SEN(mkdirat), "mkdirat" },
[ 35] = { 3, TD|TF, SEN(unlinkat), "unlinkat" },
[ 36] = { 3, TD|TF, SEN(symlinkat), "symlinkat" },
[ 37] = { 5, TD|TF, SEN(linkat), "linkat" },
[ 38] = { 4, TD|TF, SEN(renameat), "renameat" },
[ 39] = { 2, TF, SEN(umount2), "umount2" },
[ 40] = { 5, TF, SEN(mount), "mount" },
[ 41] = { 2, TF, SEN(pivotroot), "pivot_root" },
[ 42] = { 3, 0, SEN(nfsservctl), "nfsservctl" },
[ 43] = { 2, TF, SEN(statfs), "statfs" },
[ 44] = { 2, TD, SEN(fstatfs), "fstatfs" },
[ 45] = { 2, TF, SEN(truncate), "truncate" },
[ 46] = { 2, TD, SEN(ftruncate), "ftruncate" },
[ 47] = { 4, TD, SEN(fallocate), "fallocate" },
[ 48] = { 3, TD|TF, SEN(faccessat), "faccessat" },
[ 49] = { 1, TF, SEN(chdir), "chdir" },
[ 50] = { 1, TD, SEN(fchdir), "fchdir" },
[ 51] = { 1, TF, SEN(chroot), "chroot" },
[ 52] = { 2, TD, SEN(fchmod), "fchmod" },
[ 53] = { 3, TD|TF, SEN(fchmodat), "fchmodat" },
[ 54] = { 5, TD|TF, SEN(fchownat), "fchownat" },
[ 55] = { 3, TD, SEN(fchown), "fchown" },
[ 56] = { 4, TD|TF, SEN(openat), "openat" },
[ 57] = { 1, TD, SEN(close), "close" },
[ 58] = { 0, 0, SEN(vhangup), "vhangup" },
[ 59] = { 2, TD, SEN(pipe2), "pipe2" },
[ 60] = { 4, TF, SEN(quotactl), "quotactl" },
[ 61] = { 3, TD, SEN(getdents64), "getdents64" },
[ 62] = { 3, TD, SEN(lseek), "lseek" },
[ 63] = { 3, TD, SEN(read), "read" },
[ 64] = { 3, TD, SEN(write), "write" },
[ 65] = { 3, TD, SEN(readv), "readv" },
[ 66] = { 3, TD, SEN(writev), "writev" },
[ 67] = { 4, TD, SEN(pread), "pread64" },
[ 68] = { 4, TD, SEN(pwrite), "pwrite64" },
[ 69] = { 4, TD, SEN(preadv), "preadv" },
[ 70] = { 4, TD, SEN(pwritev), "pwritev" },
[ 71] = { 4, TD|TN, SEN(sendfile64), "sendfile" },
[ 72] = { 6, TD, SEN(pselect6), "pselect6" },
[ 73] = { 5, TD, SEN(ppoll), "ppoll" },
[ 74] = { 4, TD|TS, SEN(signalfd4), "signalfd4" },
[ 75] = { 4, TD, SEN(vmsplice), "vmsplice" },
[ 76] = { 6, TD, SEN(splice), "splice" },
[ 77] = { 4, TD, SEN(tee), "tee" },
[ 78] = { 4, TD|TF, SEN(readlinkat), "readlinkat" },
[ 79] = { 4, TD|TF, SEN(newfstatat), "newfstatat" },
[ 80] = { 2, TD, SEN(fstat), "fstat" },
[ 81] = { 0, 0, SEN(sync), "sync" },
[ 82] = { 1, TD, SEN(fsync), "fsync" },
[ 83] = { 1, TD, SEN(fdatasync), "fdatasync" },
[ 84] = { 4, TD, SEN(sync_file_range), "sync_file_range" },
[ 85] = { 2, TD, SEN(timerfd_create), "timerfd_create" },
[ 86] = { 4, TD, SEN(timerfd_settime), "timerfd_settime" },
[ 87] = { 2, TD, SEN(timerfd_gettime), "timerfd_gettime" },
[ 88] = { 4, TD|TF, SEN(utimensat), "utimensat" },
[ 89] = { 1, TF, SEN(acct), "acct" },
[ 90] = { 2, 0, SEN(capget), "capget" },
[ 91] = { 2, 0, SEN(capset), "capset" },
[ 92] = { 1, NF, SEN(personality), "personality" },
[ 93] = { 1, TP|SE, SEN(exit), "exit" },
[ 94] = { 1, TP|SE, SEN(exit), "exit_group" },
[ 95] = { 5, TP, SEN(waitid), "waitid" },
[ 96] = { 1, 0, SEN(set_tid_address), "set_tid_address" },
[ 97] = { 1, TP, SEN(unshare), "unshare" },
[ 98] = { 6, 0, SEN(futex), "futex" },
[ 99] = { 2, 0, SEN(set_robust_list), "set_robust_list" },
[100] = { 3, 0, SEN(get_robust_list), "get_robust_list" },
[101] = { 2, 0, SEN(nanosleep), "nanosleep" },
[102] = { 2, 0, SEN(getitimer), "getitimer" },
[103] = { 3, 0, SEN(setitimer), "setitimer" },
[104] = { 4, 0, SEN(kexec_load), "kexec_load" },
[105] = { 3, 0, SEN(init_module), "init_module" },
[106] = { 2, 0, SEN(delete_module), "delete_module" },
[107] = { 3, 0, SEN(timer_create), "timer_create" },
[108] = { 2, 0, SEN(timer_gettime), "timer_gettime" },
[109] = { 1, 0, SEN(timer_getoverrun), "timer_getoverrun" },
[110] = { 4, 0, SEN(timer_settime), "timer_settime" },
[111] = { 1, 0, SEN(timer_delete), "timer_delete" },
[112] = { 2, 0, SEN(clock_settime), "clock_settime" },
[113] = { 2, 0, SEN(clock_gettime), "clock_gettime" },
[114] = { 2, 0, SEN(clock_getres), "clock_getres" },
[115] = { 4, 0, SEN(clock_nanosleep), "clock_nanosleep" },
[116] = { 3, 0, SEN(syslog), "syslog" },
[117] = { 4, 0, SEN(ptrace), "ptrace" },
[118] = { 2, 0, SEN(sched_setparam), "sched_setparam" },
[119] = { 3, 0, SEN(sched_setscheduler), "sched_setscheduler" },
[120] = { 1, 0, SEN(sched_getscheduler), "sched_getscheduler" },
[121] = { 2, 0, SEN(sched_getparam), "sched_getparam" },
[122] = { 3, 0, SEN(sched_setaffinity), "sched_setaffinity" },
[123] = { 3, 0, SEN(sched_getaffinity), "sched_getaffinity" },
[124] = { 0, 0, SEN(sched_yield), "sched_yield" },
[125] = { 1, 0, SEN(sched_get_priority_max), "sched_get_priority_max"},
[126] = { 1, 0, SEN(sched_get_priority_min), "sched_get_priority_min"},
[127] = { 2, 0, SEN(sched_rr_get_interval), "sched_rr_get_interval" },
[128] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
[129] = { 2, TS, SEN(kill), "kill" },
[130] = { 2, TS, SEN(kill), "tkill" },
[131] = { 3, TS, SEN(tgkill), "tgkill" },
[132] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[133] = { 2, TS, SEN(rt_sigsuspend), "rt_sigsuspend" },
[134] = { 4, TS, SEN(rt_sigaction), "rt_sigaction" },
[135] = { 4, TS, SEN(rt_sigprocmask), "rt_sigprocmask" },
[136] = { 2, TS, SEN(rt_sigpending), "rt_sigpending" },
[137] = { 4, TS, SEN(rt_sigtimedwait), "rt_sigtimedwait" },
[138] = { 3, TS, SEN(rt_sigqueueinfo), "rt_sigqueueinfo" },
[139] = { 0, TS, SEN(sigreturn), "rt_sigreturn" },
[140] = { 3, 0, SEN(setpriority), "setpriority" },
[141] = { 2, 0, SEN(getpriority), "getpriority" },
[142] = { 4, 0, SEN(reboot), "reboot" },
[143] = { 2, 0, SEN(setregid), "setregid" },
[144] = { 1, 0, SEN(setgid), "setgid" },
[145] = { 2, 0, SEN(setreuid), "setreuid" },
[146] = { 1, 0, SEN(setuid), "setuid" },
[147] = { 3, 0, SEN(setresuid), "setresuid" },
[148] = { 3, 0, SEN(getresuid), "getresuid" },
[149] = { 3, 0, SEN(setresgid), "setresgid" },
[150] = { 3, 0, SEN(getresgid), "getresgid" },
[151] = { 1, NF, SEN(setfsuid), "setfsuid" },
[152] = { 1, NF, SEN(setfsgid), "setfsgid" },
[153] = { 1, 0, SEN(times), "times" },
[154] = { 2, 0, SEN(setpgid), "setpgid" },
[155] = { 1, 0, SEN(getpgid), "getpgid" },
[156] = { 1, 0, SEN(getsid), "getsid" },
[157] = { 0, 0, SEN(setsid), "setsid" },
[158] = { 2, 0, SEN(getgroups), "getgroups" },
[159] = { 2, 0, SEN(setgroups), "setgroups" },
[160] = { 1, 0, SEN(uname), "uname" },
[161] = { 2, 0, SEN(sethostname), "sethostname" },
[162] = { 2, 0, SEN(setdomainname), "setdomainname" },
[163] = { 2, 0, SEN(getrlimit), "getrlimit" },
[164] = { 2, 0, SEN(setrlimit), "setrlimit" },
[165] = { 2, 0, SEN(getrusage), "getrusage" },
[166] = { 1, NF, SEN(umask), "umask" },
[167] = { 5, 0, SEN(prctl), "prctl" },
[168] = { 3, 0, SEN(getcpu), "getcpu" },
[169] = { 2, 0, SEN(gettimeofday), "gettimeofday" },
[170] = { 2, 0, SEN(settimeofday), "settimeofday" },
[171] = { 1, 0, SEN(adjtimex), "adjtimex" },
[172] = { 0, NF, SEN(getpid), "getpid" },
[173] = { 0, NF, SEN(getppid), "getppid" },
[174] = { 0, NF, SEN(getuid), "getuid" },
[175] = { 0, NF, SEN(geteuid), "geteuid" },
[176] = { 0, NF, SEN(getgid), "getgid" },
[177] = { 0, NF, SEN(getegid), "getegid" },
[178] = { 0, NF, SEN(gettid), "gettid" },
[179] = { 1, 0, SEN(sysinfo), "sysinfo" },
[180] = { 4, 0, SEN(mq_open), "mq_open" },
[181] = { 1, 0, SEN(mq_unlink), "mq_unlink" },
[182] = { 5, 0, SEN(mq_timedsend), "mq_timedsend" },
[183] = { 5, 0, SEN(mq_timedreceive), "mq_timedreceive" },
[184] = { 2, 0, SEN(mq_notify), "mq_notify" },
[185] = { 3, 0, SEN(mq_getsetattr), "mq_getsetattr" },
[186] = { 2, TI, SEN(msgget), "msgget" },
[187] = { 3, TI, SEN(msgctl), "msgctl" },
[188] = { 5, TI, SEN(msgrcv), "msgrcv" },
[189] = { 4, TI, SEN(msgsnd), "msgsnd" },
[190] = { 3, TI, SEN(semget), "semget" },
[191] = { 4, TI, SEN(semctl), "semctl" },
[192] = { 4, TI, SEN(semtimedop), "semtimedop" },
[193] = { 3, TI, SEN(semop), "semop" },
[194] = { 3, TI, SEN(shmget), "shmget" },
[195] = { 3, TI, SEN(shmctl), "shmctl" },
[196] = { 3, TI|TM|SI, SEN(shmat), "shmat" },
[197] = { 1, TI|TM|SI, SEN(shmdt), "shmdt" },
[198] = { 3, TN, SEN(socket), "socket" },
[199] = { 4, TN, SEN(socketpair), "socketpair" },
[200] = { 3, TN, SEN(bind), "bind" },
[201] = { 2, TN, SEN(listen), "listen" },
[202] = { 3, TN, SEN(accept), "accept" },
[203] = { 3, TN, SEN(connect), "connect" },
[204] = { 3, TN, SEN(getsockname), "getsockname" },
[205] = { 3, TN, SEN(getpeername), "getpeername" },
[206] = { 6, TN, SEN(sendto), "sendto" },
[207] = { 6, TN, SEN(recvfrom), "recvfrom" },
[208] = { 5, TN, SEN(setsockopt), "setsockopt" },
[209] = { 5, TN, SEN(getsockopt), "getsockopt" },
[210] = { 2, TN, SEN(shutdown), "shutdown" },
[211] = { 3, TN, SEN(sendmsg), "sendmsg" },
[212] = { 3, TN, SEN(recvmsg), "recvmsg" },
[213] = { 3, TD, SEN(readahead), "readahead" },
[214] = { 1, TM|SI, SEN(brk), "brk" },
[215] = { 2, TM|SI, SEN(munmap), "munmap" },
[216] = { 5, TM|SI, SEN(mremap), "mremap" },
[217] = { 5, 0, SEN(add_key), "add_key" },
[218] = { 4, 0, SEN(request_key), "request_key" },
[219] = { 5, 0, SEN(keyctl), "keyctl" },
[220] = { 5, TP, SEN(clone), "clone" },
[221] = { 3, TF|TP|SE|SI, SEN(execve), "execve" },
[222] = { 6, TD|TM|SI, SEN(mmap), "mmap" },
[223] = { 4, TD, SEN(fadvise64), "fadvise64" },
[224] = { 2, TF, SEN(swapon), "swapon" },
[225] = { 1, TF, SEN(swapoff), "swapoff" },
[226] = { 3, TM|SI, SEN(mprotect), "mprotect" },
[227] = { 3, TM, SEN(msync), "msync" },
[228] = { 2, TM, SEN(mlock), "mlock" },
[229] = { 2, TM, SEN(munlock), "munlock" },
[230] = { 1, TM, SEN(mlockall), "mlockall" },
[231] = { 0, TM, SEN(munlockall), "munlockall" },
[232] = { 3, TM, SEN(mincore), "mincore" },
[233] = { 3, TM, SEN(madvise), "madvise" },
[234] = { 5, TM|SI, SEN(remap_file_pages), "remap_file_pages" },
[235] = { 6, TM, SEN(mbind), "mbind" },
[236] = { 5, TM, SEN(get_mempolicy), "get_mempolicy" },
[237] = { 3, TM, SEN(set_mempolicy), "set_mempolicy" },
[238] = { 4, TM, SEN(migrate_pages), "migrate_pages" },
[239] = { 6, TM, SEN(move_pages), "move_pages" },
[240] = { 4, TP|TS, SEN(rt_tgsigqueueinfo), "rt_tgsigqueueinfo" },
[241] = { 5, TD, SEN(perf_event_open), "perf_event_open" },
[242] = { 4, TN, SEN(accept4), "accept4" },
[243] = { 5, TN, SEN(recvmmsg), "recvmmsg" },
/* [244 ... 259] are arch specific */
[260] = { 4, TP, sys_wait4, "wait4" },
[261] = { 4, 0, sys_prlimit64, "prlimit64" },
[262] = { 2, TD, sys_fanotify_init, "fanotify_init" },
[263] = { 5, TD|TF, sys_fanotify_mark, "fanotify_mark" },
[264] = { 5, TD|TF, sys_name_to_handle_at, "name_to_handle_at" },
[265] = { 3, TD, sys_open_by_handle_at, "open_by_handle_at" },
[266] = { 2, 0, sys_clock_adjtime, "clock_adjtime" },
[267] = { 1, TD, sys_syncfs, "syncfs" },
[268] = { 2, TD, sys_setns, "setns" },
[269] = { 4, TN, sys_sendmmsg, "sendmmsg" },
[270] = { 6, 0, sys_process_vm_readv, "process_vm_readv" },
[271] = { 6, 0, sys_process_vm_writev, "process_vm_writev" },
[272] = { 5, 0, sys_kcmp, "kcmp" },
[273] = { 3, TD, sys_finit_module, "finit_module" },
[274] = { 3, 0, sys_sched_setattr, "sched_setattr" },
[275] = { 4, 0, sys_sched_getattr, "sched_getattr" },
[276] = { 5, TD|TF, sys_renameat2, "renameat2" },
[277] = { 3, 0, sys_seccomp, "seccomp", },
[278] = { 3, 0, sys_getrandom, "getrandom", },
[279] = { 2, TD, sys_memfd_create, "memfd_create", },
[280] = { 3, TD, sys_bpf, "bpf", },
[281] = { 5, TD|TF|TP|SE|SI, sys_execveat, "execveat", },
[260] = { 4, TP, SEN(wait4), "wait4" },
[261] = { 4, 0, SEN(prlimit64), "prlimit64" },
[262] = { 2, TD, SEN(fanotify_init), "fanotify_init" },
[263] = { 5, TD|TF, SEN(fanotify_mark), "fanotify_mark" },
[264] = { 5, TD|TF, SEN(name_to_handle_at), "name_to_handle_at" },
[265] = { 3, TD, SEN(open_by_handle_at), "open_by_handle_at" },
[266] = { 2, 0, SEN(clock_adjtime), "clock_adjtime" },
[267] = { 1, TD, SEN(syncfs), "syncfs" },
[268] = { 2, TD, SEN(setns), "setns" },
[269] = { 4, TN, SEN(sendmmsg), "sendmmsg" },
[270] = { 6, 0, SEN(process_vm_readv), "process_vm_readv" },
[271] = { 6, 0, SEN(process_vm_writev), "process_vm_writev" },
[272] = { 5, 0, SEN(kcmp), "kcmp" },
[273] = { 3, TD, SEN(finit_module), "finit_module" },
[274] = { 3, 0, SEN(sched_setattr), "sched_setattr" },
[275] = { 4, 0, SEN(sched_getattr), "sched_getattr" },
[276] = { 5, TD|TF, SEN(renameat2), "renameat2" },
[277] = { 3, 0, SEN(seccomp), "seccomp", },
[278] = { 3, 0, SEN(getrandom), "getrandom", },
[279] = { 2, TD, SEN(memfd_create), "memfd_create", },
[280] = { 3, TD, SEN(bpf), "bpf", },
[281] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
[282] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
[283] = { 2, 0, SEN(membarrier), "membarrier", },
[284] = { 3, TM, SEN(mlock2), "mlock2" },
[285] = { 6, TD, SEN(copy_file_range), "copy_file_range" },
[286] = { 6, TD, SEN(preadv2), "preadv2" },
[287] = { 6, TD, SEN(pwritev2), "pwritev2" },

38
linux/aarch64/arch_regs.c Normal file
View File

@ -0,0 +1,38 @@
struct arm_pt_regs {
uint32_t uregs[18];
};
#define ARM_cpsr uregs[16]
#define ARM_pc uregs[15]
#define ARM_lr uregs[14]
#define ARM_sp uregs[13]
#define ARM_ip uregs[12]
#define ARM_fp uregs[11]
#define ARM_r10 uregs[10]
#define ARM_r9 uregs[9]
#define ARM_r8 uregs[8]
#define ARM_r7 uregs[7]
#define ARM_r6 uregs[6]
#define ARM_r5 uregs[5]
#define ARM_r4 uregs[4]
#define ARM_r3 uregs[3]
#define ARM_r2 uregs[2]
#define ARM_r1 uregs[1]
#define ARM_r0 uregs[0]
#define ARM_ORIG_r0 uregs[17]
static union {
struct user_pt_regs aarch64_r;
struct arm_pt_regs arm_r;
} arm_regs_union;
#define aarch64_regs arm_regs_union.aarch64_r
#define arm_regs arm_regs_union.arm_r
uint64_t *const aarch64_sp_ptr = (uint64_t *) &aarch64_regs.sp;
uint32_t *const arm_sp_ptr = (uint32_t *) &arm_regs.ARM_sp;
static struct iovec aarch64_io = {
.iov_base = &arm_regs_union
};
#define ARCH_REGS_FOR_GETREGSET arm_regs_union
#define ARCH_IOVEC_FOR_GETREGSET aarch64_io
#define ARCH_PC_REG ((aarch64_io.iov_len == sizeof(arm_regs)) ? arm_regs.ARM_pc : aarch64_regs.pc)

View File

@ -0,0 +1 @@
#include "arm/arch_sigreturn.c"

View File

@ -1,2 +1,2 @@
/* Native AArch64 */
/* ARM personality */
#include "errnoent.h"

19
linux/aarch64/get_error.c Normal file
View File

@ -0,0 +1,19 @@
#define get_error arm_get_error
#include "arm/get_error.c"
#undef get_error
static void
get_error(struct tcb *tcp, const bool check_errno)
{
if (tcp->currpers == 1) {
arm_get_error(tcp, check_errno);
return;
}
if (check_errno && is_negated_errno(aarch64_regs.regs[0])) {
tcp->u_rval = -1;
tcp->u_error = -aarch64_regs.regs[0];
} else {
tcp->u_rval = aarch64_regs.regs[0];
}
}

24
linux/aarch64/get_scno.c Normal file
View File

@ -0,0 +1,24 @@
/* Return codes: 1 - ok, 0 - ignore, other - error. */
static int
arch_get_scno(struct tcb *tcp)
{
long scno = 0;
switch (aarch64_io.iov_len) {
case sizeof(aarch64_regs):
/* We are in 64-bit mode */
scno = aarch64_regs.regs[8];
update_personality(tcp, 0);
break;
case sizeof(arm_regs):
/* We are in 32-bit mode */
/* Note: we don't support OABI, unlike 32-bit ARM build */
scno = arm_regs.ARM_r7;
scno = shuffle_scno(scno);
update_personality(tcp, 1);
break;
}
tcp->scno = scno;
return 1;
}

View File

@ -0,0 +1,18 @@
#define get_syscall_args arm_get_syscall_args
#include "arm/get_syscall_args.c"
#undef get_syscall_args
/* Return -1 on error or 1 on success (never 0!). */
static int
get_syscall_args(struct tcb *tcp)
{
if (tcp->currpers == 1)
return arm_get_syscall_args(tcp);
tcp->u_arg[0] = aarch64_regs.regs[0];
tcp->u_arg[1] = aarch64_regs.regs[1];
tcp->u_arg[2] = aarch64_regs.regs[2];
tcp->u_arg[3] = aarch64_regs.regs[3];
tcp->u_arg[4] = aarch64_regs.regs[4];
tcp->u_arg[5] = aarch64_regs.regs[5];
return 1;
}

View File

@ -1 +1,71 @@
#include "../arm/syscallent.h"
#include "64/syscallent.h"
/* Arch-specific block, not used on AArch64 */
[244 ... 259] = { },
/* Quote from asm-generic/unistd.h:
*
* All syscalls below here should go away really,
* these are provided for both review and as a porting
* help for the C library version.
*
* Last chance: are any of these important enough to
* enable by default?
*/
[1024] = { 3, TD|TF, SEN(open), "open" },
[1025] = { 2, TF, SEN(link), "link" },
[1026] = { 1, TF, SEN(unlink), "unlink" },
[1027] = { 3, TF, SEN(mknod), "mknod" },
[1028] = { 2, TF, SEN(chmod), "chmod" },
[1029] = { 3, TF, SEN(chown), "chown" },
[1030] = { 2, TF, SEN(mkdir), "mkdir" },
[1031] = { 1, TF, SEN(rmdir), "rmdir" },
[1032] = { 3, TF, SEN(chown), "lchown" },
[1033] = { 2, TF, SEN(access), "access" },
[1034] = { 2, TF, SEN(rename), "rename" },
[1035] = { 3, TF, SEN(readlink), "readlink" },
[1036] = { 2, TF, SEN(symlink), "symlink" },
[1037] = { 2, TF, SEN(utimes), "utimes" },
[1038] = { 2, TF, SEN(stat), "stat" },
[1039] = { 2, TF, SEN(lstat), "lstat" },
[1040] = { 1, TD, SEN(pipe), "pipe" },
[1041] = { 2, TD, SEN(dup2), "dup2" },
[1042] = { 1, TD, SEN(epoll_create), "epoll_create" },
[1043] = { 0, TD, SEN(inotify_init), "inotify_init" },
[1044] = { 1, TD, SEN(eventfd), "eventfd" },
[1045] = { 3, TD|TS, SEN(signalfd), "signalfd" },
[1046] = { 4, TD|TN, SEN(sendfile64), "sendfile" },
[1047] = { 2, TD, SEN(ftruncate), "ftruncate" },
[1048] = { 2, TF, SEN(truncate), "truncate" },
[1049] = { 2, TF, SEN(stat), "stat" },
[1050] = { 2, TF, SEN(lstat), "lstat" },
[1051] = { 2, TD, SEN(fstat), "fstat" },
[1052] = { 3, TD, SEN(fcntl), "fcntl" },
[1053] = { 4, TD, SEN(fadvise64), "fadvise64" },
[1054] = { 4, TD|TF, SEN(newfstatat), "newfstatat" },
[1055] = { 2, TD, SEN(fstatfs), "fstatfs" },
[1056] = { 2, TF, SEN(statfs), "statfs" },
[1057] = { 3, TD, SEN(lseek), "lseek" },
[1058] = { 6, TD|TM|SI, SEN(mmap), "mmap" },
[1059] = { 1, 0, SEN(alarm), "alarm" },
[1060] = { 0, 0, SEN(getpgrp), "getpgrp" },
[1061] = { 0, TS, SEN(pause), "pause" },
[1062] = { 1, 0, SEN(time), "time" },
[1063] = { 2, TF, SEN(utime), "utime" },
[1064] = { 2, TD|TF, SEN(creat), "creat" },
[1065] = { 3, TD, SEN(getdents), "getdents" },
[1066] = { 3, TD|TF, SEN(futimesat), "futimesat" },
[1067] = { 5, TD, SEN(select), "select" },
[1068] = { 3, TD, SEN(poll), "poll" },
[1069] = { 4, TD, SEN(epoll_wait), "epoll_wait" },
[1070] = { 2, 0, SEN(ustat), "ustat" },
[1071] = { 0, TP, SEN(vfork), "vfork" },
[1072] = { 4, TP, SEN(wait4), "wait4" },
[1073] = { 4, TN, SEN(recv), "recv" },
[1074] = { 4, TN, SEN(send), "send" },
[1075] = { 2, 0, SEN(bdflush), "bdflush" },
[1076] = { 1, TF, SEN(umount), "umount" },
[1077] = { 1, TF, SEN(uselib), "uselib" },
[1078] = { 1, 0, SEN(sysctl), "sysctl" },
[1079] = { 0, TP, SEN(fork), "fork" },

View File

@ -1,74 +1 @@
#include "64/syscallent.h"
/* Arch-specific block, not used on AArch64 */
[244 ... 259] = { },
/* Blank down to 1023 */
[277 ... 1023] = { },
/* Quote from asm-generic/unistd.h:
*
* All syscalls below here should go away really,
* these are provided for both review and as a porting
* help for the C library version.
*
* Last chance: are any of these important enough to
* enable by default?
*/
[1024] = { 3, TD|TF, sys_open, "open" },
[1025] = { 2, TF, sys_link, "link" },
[1026] = { 1, TF, sys_unlink, "unlink" },
[1027] = { 3, TF, sys_mknod, "mknod" },
[1028] = { 2, TF, sys_chmod, "chmod" },
[1029] = { 3, TF, sys_chown, "chown" },
[1030] = { 2, TF, sys_mkdir, "mkdir" },
[1031] = { 1, TF, sys_rmdir, "rmdir" },
[1032] = { 3, TF, sys_chown, "lchown" },
[1033] = { 2, TF, sys_access, "access" },
[1034] = { 2, TF, sys_rename, "rename" },
[1035] = { 3, TF, sys_readlink, "readlink" },
[1036] = { 2, TF, sys_symlink, "symlink" },
[1037] = { 2, TF, sys_utimes, "utimes" },
[1038] = { 2, TF, sys_stat, "stat" },
[1039] = { 2, TF, sys_lstat, "lstat" },
[1040] = { 1, TD, sys_pipe, "pipe" },
[1041] = { 2, TD, sys_dup2, "dup2" },
[1042] = { 1, TD, sys_epoll_create, "epoll_create" },
[1043] = { 0, TD, sys_inotify_init, "inotify_init" },
[1044] = { 1, TD, sys_eventfd, "eventfd" },
[1045] = { 3, TD|TS, sys_signalfd, "signalfd" },
[1046] = { 4, TD|TN, sys_sendfile64, "sendfile" },
[1047] = { 2, TD, sys_ftruncate, "ftruncate" },
[1048] = { 2, TF, sys_truncate, "truncate" },
[1049] = { 2, TF, sys_stat, "stat" },
[1050] = { 2, TF, sys_lstat, "lstat" },
[1051] = { 2, TD, sys_fstat, "fstat" },
[1052] = { 3, TD, sys_fcntl, "fcntl" },
[1053] = { 4, TD, sys_fadvise64, "fadvise64" },
[1054] = { 4, TD|TF, sys_newfstatat, "newfstatat" },
[1055] = { 2, TD, sys_fstatfs, "fstatfs" },
[1056] = { 2, TF, sys_statfs, "statfs" },
[1057] = { 3, TD, sys_lseek, "lseek" },
[1058] = { 6, TD|TM|SI, sys_mmap, "mmap" },
[1059] = { 1, 0, sys_alarm, "alarm" },
[1060] = { 0, 0, sys_getpgrp, "getpgrp" },
[1061] = { 0, TS, sys_pause, "pause" },
[1062] = { 1, 0, sys_time, "time" },
[1063] = { 2, TF, sys_utime, "utime" },
[1064] = { 2, TD|TF, sys_creat, "creat" },
[1065] = { 3, TD, sys_getdents, "getdents" },
[1066] = { 3, TD|TF, sys_futimesat, "futimesat" },
[1067] = { 5, TD, sys_select, "select" },
[1068] = { 3, TD, sys_poll, "poll" },
[1069] = { 4, TD, sys_epoll_wait, "epoll_wait" },
[1070] = { 2, 0, sys_ustat, "ustat" },
[1071] = { 0, TP, sys_vfork, "vfork" },
[1072] = { 4, TP, sys_wait4, "wait4" },
[1073] = { 6, TN, sys_recv, "recv" },
[1074] = { 4, TN, sys_send, "send" },
[1075] = { 2, 0, sys_bdflush, "bdflush" },
[1076] = { 1, TF, sys_umount, "umount" },
[1077] = { 1, TF, sys_uselib, "uselib" },
[1078] = { 1, 0, sys_sysctl, "sysctl" },
[1079] = { 0, TP, sys_fork, "fork" },
#include "../arm/syscallent.h"

View File

@ -0,0 +1,8 @@
long
getrval2(struct tcb *tcp)
{
long r20;
if (upeek(tcp->pid, 20, &r20) < 0)
return -1;
return r20;
}

3
linux/alpha/arch_regs.c Normal file
View File

@ -0,0 +1,3 @@
static long alpha_r0;
static long alpha_a3;
#define ARCH_PC_PEEK_ADDR REG_PC

Some files were not shown because too many files have changed in this diff Show More