summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-14 19:33:32 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-14 19:33:32 +0000
commit8bb05ac73a5b448b339ce0bc8d396c82c459b47f (patch)
tree1fdda006866bca20d41cb206767ea5241e36852f /tests
parentAdding debian version 2.39.3-11. (diff)
downloadutil-linux-8bb05ac73a5b448b339ce0bc8d396c82c459b47f.tar.xz
util-linux-8bb05ac73a5b448b339ce0bc8d396c82c459b47f.zip
Merging upstream version 2.40.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/Makemodule.am4
-rw-r--r--tests/commands.sh17
-rw-r--r--tests/expected/blkid/low-probe-bcache-B2
-rw-r--r--tests/expected/blkid/low-probe-bcache-C2
-rw-r--r--tests/expected/blkid/low-probe-bcache-journal4
-rw-r--r--tests/expected/blkid/low-probe-swap-luks8
-rw-r--r--tests/expected/blkid/low-probe-vxfs-be6
-rw-r--r--tests/expected/blkid/low-probe-vxfs-le6
-rw-r--r--tests/expected/build-sys/config-all15
-rw-r--r--tests/expected/build-sys/config-all-devel1
-rw-r--r--tests/expected/build-sys/config-all-non-nls15
-rw-r--r--tests/expected/build-sys/config-audit13
-rw-r--r--tests/expected/build-sys/config-chfnsh-libuser13
-rw-r--r--tests/expected/build-sys/config-chfnsh-no-password13
-rw-r--r--tests/expected/build-sys/config-chfnsh-pam13
-rw-r--r--tests/expected/build-sys/config-core13
-rw-r--r--tests/expected/build-sys/config-cryptsetup15
-rw-r--r--tests/expected/build-sys/config-devel15
-rw-r--r--tests/expected/build-sys/config-devel-new-mount1
-rw-r--r--tests/expected/build-sys/config-devel-non-asan15
-rw-r--r--tests/expected/build-sys/config-devel-non-docs15
-rw-r--r--tests/expected/build-sys/config-non-libblkid11
-rw-r--r--tests/expected/build-sys/config-non-libmount11
-rw-r--r--tests/expected/build-sys/config-non-libs10
-rw-r--r--tests/expected/build-sys/config-non-libsmartcols20
-rw-r--r--tests/expected/build-sys/config-non-libuuid13
-rw-r--r--tests/expected/build-sys/config-non-nls13
-rw-r--r--tests/expected/build-sys/config-non-widechar4
-rw-r--r--tests/expected/build-sys/config-selinux13
-rw-r--r--tests/expected/build-sys/config-slang13
-rw-r--r--tests/expected/build-sys/config-static13
-rw-r--r--tests/expected/column/table-noheaders6
-rw-r--r--tests/expected/dmesg/cid-json535
-rw-r--r--tests/expected/dmesg/cid-kmsg-colors59
-rw-r--r--tests/expected/dmesg/cid-kmsg-console-levels146
-rw-r--r--tests/expected/dmesg/cid-kmsg-decode59
-rw-r--r--tests/expected/dmesg/cid-kmsg-delta59
-rw-r--r--tests/expected/dmesg/cid-kmsg-facilities73
-rw-r--r--tests/expected/dmesg/cid-kmsg-indentation28
-rw-r--r--tests/expected/dmesg/cid-kmsg-json295
-rw-r--r--tests/expected/dmesg/cid-kmsg-limit31
-rw-r--r--tests/expected/dmesg/colors19
-rw-r--r--tests/expected/dmesg/console-levels5
-rw-r--r--tests/expected/dmesg/decode19
-rw-r--r--tests/expected/dmesg/delta1
-rw-r--r--tests/expected/dmesg/facilities8
-rw-r--r--tests/expected/dmesg/json429
-rw-r--r--tests/expected/dmesg/kmsg-file185
-rw-r--r--tests/expected/dmesg/timestamp-format (renamed from tests/expected/mount/special)0
-rw-r--r--tests/expected/dmesg/timestamp-format-delta106
-rw-r--r--tests/expected/dmesg/timestamp-format-delta-ctime106
-rw-r--r--tests/expected/dmesg/timestamp-format-delta-raw106
-rw-r--r--tests/expected/dmesg/timestamp-format-multiple106
-rw-r--r--tests/expected/exch/exch4
-rw-r--r--tests/expected/fadvise/drop26
-rw-r--r--tests/expected/fdisk/mbr-nondos-mode-first-sector-at-end1
-rw-r--r--tests/expected/fdisk/resize75
-rw-r--r--tests/expected/fdisk/sunlabel-create-second-partition1
-rw-r--r--tests/expected/fincore/count.409632
-rw-r--r--tests/expected/fincore/count.6553632
-rw-r--r--tests/expected/fincore/count.nosize32
-rw-r--r--tests/expected/hexdump/format-strings-1b_hex41
-rw-r--r--tests/expected/libfdisk/gpt-all-defaults1
-rw-r--r--tests/expected/libfdisk/gpt-all-defaults-with-typo1
-rw-r--r--tests/expected/libmount/optlist-append5
-rw-r--r--tests/expected/libmount/optlist-append-empty-value4
-rw-r--r--tests/expected/libmount/optlist-append-value4
-rw-r--r--tests/expected/libmount/optlist-get4
-rw-r--r--tests/expected/libmount/optlist-get-flg-linux1
-rw-r--r--tests/expected/libmount/optlist-get-flg-user1
-rw-r--r--tests/expected/libmount/optlist-get-str4
-rw-r--r--tests/expected/libmount/optlist-get-str-linux5
-rw-r--r--tests/expected/libmount/optlist-get-str-user5
-rw-r--r--tests/expected/libmount/optlist-get-value4
-rw-r--r--tests/expected/libmount/optlist-prepend4
-rw-r--r--tests/expected/libmount/optlist-prepend-empty-value4
-rw-r--r--tests/expected/libmount/optlist-prepend-list6
-rw-r--r--tests/expected/libmount/optlist-prepend-value4
-rw-r--r--tests/expected/libmount/optlist-remove12
-rw-r--r--tests/expected/libmount/optlist-remove-empty-value12
-rw-r--r--tests/expected/libmount/optlist-remove-quoted12
-rw-r--r--tests/expected/libmount/optlist-remove-value12
-rw-r--r--tests/expected/libmount/optlist-set4
-rw-r--r--tests/expected/libmount/optlist-set-empty1
-rw-r--r--tests/expected/libmount/optlist-set-large1
-rw-r--r--tests/expected/libmount/optlist-set-new1
-rw-r--r--tests/expected/libmount/optlist-set-new-empty1
-rw-r--r--tests/expected/libmount/optlist-set-new-end1
-rw-r--r--tests/expected/libmount/optlist-set-new-end-empty1
-rw-r--r--tests/expected/libmount/optlist-set-remove1
-rw-r--r--tests/expected/libmount/optlist-set-small1
-rw-r--r--tests/expected/libmount/optstr-prepend-list1
-rw-r--r--tests/expected/libsmartcols/continuous-json40
-rw-r--r--tests/expected/libsmartcols/filter1
-rw-r--r--tests/expected/libsmartcols/filter-bool-and7
-rw-r--r--tests/expected/libsmartcols/filter-bool-as-string2
-rw-r--r--tests/expected/libsmartcols/filter-bool-as-string22
-rw-r--r--tests/expected/libsmartcols/filter-bool-eq-false8
-rw-r--r--tests/expected/libsmartcols/filter-bool-eq-false28
-rw-r--r--tests/expected/libsmartcols/filter-bool-eq-false39
-rw-r--r--tests/expected/libsmartcols/filter-bool-eq-true7
-rw-r--r--tests/expected/libsmartcols/filter-bool-eq-true27
-rw-r--r--tests/expected/libsmartcols/filter-bool-eq-true37
-rw-r--r--tests/expected/libsmartcols/filter-bool-is7
-rw-r--r--tests/expected/libsmartcols/filter-bool-ne7
-rw-r--r--tests/expected/libsmartcols/filter-bool-ne28
-rw-r--r--tests/expected/libsmartcols/filter-bool-neg9
-rw-r--r--tests/expected/libsmartcols/filter-bool-or13
-rw-r--r--tests/expected/libsmartcols/filter-broken-bad-column4
-rw-r--r--tests/expected/libsmartcols/filter-broken-bad-float3
-rw-r--r--tests/expected/libsmartcols/filter-broken-bad-number3
-rw-r--r--tests/expected/libsmartcols/filter-broken-bad-oper3
-rw-r--r--tests/expected/libsmartcols/filter-broken-bad-oper23
-rw-r--r--tests/expected/libsmartcols/filter-broken-no-close3
-rw-r--r--tests/expected/libsmartcols/filter-broken-no-column3
-rw-r--r--tests/expected/libsmartcols/filter-broken-no-param3
-rw-r--r--tests/expected/libsmartcols/filter-broken-no-start3
-rw-r--r--tests/expected/libsmartcols/filter-float-and12
-rw-r--r--tests/expected/libsmartcols/filter-float-as-string4
-rw-r--r--tests/expected/libsmartcols/filter-float-as-string24
-rw-r--r--tests/expected/libsmartcols/filter-float-eq4
-rw-r--r--tests/expected/libsmartcols/filter-float-eq24
-rw-r--r--tests/expected/libsmartcols/filter-float-ge11
-rw-r--r--tests/expected/libsmartcols/filter-float-ge210
-rw-r--r--tests/expected/libsmartcols/filter-float-gt6
-rw-r--r--tests/expected/libsmartcols/filter-float-gt25
-rw-r--r--tests/expected/libsmartcols/filter-float-is12
-rw-r--r--tests/expected/libsmartcols/filter-float-le6
-rw-r--r--tests/expected/libsmartcols/filter-float-le27
-rw-r--r--tests/expected/libsmartcols/filter-float-lt5
-rw-r--r--tests/expected/libsmartcols/filter-float-lt26
-rw-r--r--tests/expected/libsmartcols/filter-float-ne12
-rw-r--r--tests/expected/libsmartcols/filter-float-ne212
-rw-r--r--tests/expected/libsmartcols/filter-float-neg4
-rw-r--r--tests/expected/libsmartcols/filter-float-or13
-rw-r--r--tests/expected/libsmartcols/filter-number-and12
-rw-r--r--tests/expected/libsmartcols/filter-number-and-or7
-rw-r--r--tests/expected/libsmartcols/filter-number-as-string4
-rw-r--r--tests/expected/libsmartcols/filter-number-eq4
-rw-r--r--tests/expected/libsmartcols/filter-number-expr-and-expr7
-rw-r--r--tests/expected/libsmartcols/filter-number-expr-or-expr5
-rw-r--r--tests/expected/libsmartcols/filter-number-ge10
-rw-r--r--tests/expected/libsmartcols/filter-number-gt7
-rw-r--r--tests/expected/libsmartcols/filter-number-is12
-rw-r--r--tests/expected/libsmartcols/filter-number-le7
-rw-r--r--tests/expected/libsmartcols/filter-number-lt6
-rw-r--r--tests/expected/libsmartcols/filter-number-ne12
-rw-r--r--tests/expected/libsmartcols/filter-number-neg4
-rw-r--r--tests/expected/libsmartcols/filter-number-or13
-rw-r--r--tests/expected/libsmartcols/filter-string-eq4
-rw-r--r--tests/expected/libsmartcols/filter-string-ge12
-rw-r--r--tests/expected/libsmartcols/filter-string-gt11
-rw-r--r--tests/expected/libsmartcols/filter-string-is13
-rw-r--r--tests/expected/libsmartcols/filter-string-le5
-rw-r--r--tests/expected/libsmartcols/filter-string-lt4
-rw-r--r--tests/expected/libsmartcols/filter-string-ne12
-rw-r--r--tests/expected/libsmartcols/filter-string-neg2
-rw-r--r--tests/expected/libsmartcols/filter-string-nreg12
-rw-r--r--tests/expected/libsmartcols/filter-string-reg4
-rw-r--r--tests/expected/libsmartcols/fromfile-tree-json20
-rw-r--r--tests/expected/libsmartcols/fromfile-wrapzero19
-rw-r--r--tests/expected/libsmartcols/fromfile-wrapzero-tree19
-rw-r--r--tests/expected/lscpu/lscpu-rv64-linux19
-rw-r--r--tests/expected/lscpu/lscpu-rv64-visionfive233
-rw-r--r--tests/expected/lsfd/column-ainodeclass-inotify2
-rw-r--r--tests/expected/lsfd/column-ainodeclass-pidfd2
-rw-r--r--tests/expected/lsfd/column-deleted-make-regular-file2
-rw-r--r--tests/expected/lsfd/column-deleted-ro-regular-file2
-rw-r--r--tests/expected/lsfd/column-name-deleted-file2
-rw-r--r--tests/expected/lsfd/column-name-pidfd2
-rw-r--r--tests/expected/lsfd/column-name-ro-regular-file2
-rw-r--r--tests/expected/lsfd/column-name-socketpair2
-rw-r--r--tests/expected/lsfd/column-source-namespace-ASSOC7
-rw-r--r--tests/expected/lsfd/column-source-with-root-SysVIPC-shmem2
-rw-r--r--tests/expected/lsfd/column-type-inotify2
-rw-r--r--tests/expected/lsfd/column-type-pidfd2
-rw-r--r--tests/expected/lsfd/column-type-ro-regular-file2
-rw-r--r--tests/expected/lsfd/column-type-socketpair2
-rw-r--r--tests/expected/lsfd/column-xmode-MODE-r-bit2
-rw-r--r--tests/expected/lsfd/column-xmode-MODE-w-bit2
-rw-r--r--tests/expected/lsfd/column-xmode-MODE-x-bit2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-D-bit2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-L-bit-flock-ex2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-L-bit-lease-w2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-L-bit-ofd--w2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-L-bit-ofd-rw2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-L-bit-posix--w2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-L-bit-posix-rw2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-l-bit-flock-sh2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-l-bit-lease-r2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-l-bit-ofd-r-2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-l-bit-posix-r-2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-m-bit3
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-r-bit2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-w-bit2
-rw-r--r--tests/expected/lsfd/column-xmode-XMODE-x-bit2
-rw-r--r--tests/expected/lsfd/filter-broken-exp4
-rw-r--r--tests/expected/lsfd/filter-floating-point-nums15
-rw-r--r--tests/expected/lsfd/mkfds-bpf-map2
-rw-r--r--tests/expected/lsfd/mkfds-bpf-prog2
-rw-r--r--tests/expected/lsfd/mkfds-cdev-tun4
-rw-r--r--tests/expected/lsfd/mkfds-directory2
-rw-r--r--tests/expected/lsfd/mkfds-eventfd12
-rw-r--r--tests/expected/lsfd/mkfds-eventpoll16
-rw-r--r--tests/expected/lsfd/mkfds-inotify4
-rw-r--r--tests/expected/lsfd/mkfds-inotify-btrfs4
-rw-r--r--tests/expected/lsfd/mkfds-mapped-packet-socket8
-rw-r--r--tests/expected/lsfd/mkfds-mqueue8
-rw-r--r--tests/expected/lsfd/mkfds-multiplexing-poll13
-rw-r--r--tests/expected/lsfd/mkfds-multiplexing-ppoll13
-rw-r--r--tests/expected/lsfd/mkfds-multiplexing-pselect613
-rw-r--r--tests/expected/lsfd/mkfds-multiplexing-select13
-rw-r--r--tests/expected/lsfd/mkfds-netlink-groups2
-rw-r--r--tests/expected/lsfd/mkfds-netlink-protocol2
-rw-r--r--tests/expected/lsfd/mkfds-netns2
-rw-r--r--tests/expected/lsfd/mkfds-pidfd2
-rw-r--r--tests/expected/lsfd/mkfds-ping-ping4
-rw-r--r--tests/expected/lsfd/mkfds-ping-ping64
-rw-r--r--tests/expected/lsfd/mkfds-pipe-no-fork4
-rw-r--r--tests/expected/lsfd/mkfds-pty10
-rw-r--r--tests/expected/lsfd/mkfds-raw2
-rw-r--r--tests/expected/lsfd/mkfds-raw62
-rw-r--r--tests/expected/lsfd/mkfds-ro-block-device2
-rw-r--r--tests/expected/lsfd/mkfds-ro-regular-file2
-rw-r--r--tests/expected/lsfd/mkfds-rw-character-device2
-rw-r--r--tests/expected/lsfd/mkfds-signalfd2
-rw-r--r--tests/expected/lsfd/mkfds-socketpair3
-rw-r--r--tests/expected/lsfd/mkfds-socketpair-DGRAM3
-rw-r--r--tests/expected/lsfd/mkfds-socketpair-STREAM3
-rw-r--r--tests/expected/lsfd/mkfds-socketpair-STREAM-ENDPOINT3
-rw-r--r--tests/expected/lsfd/mkfds-socketpair-STREAM-ENDPOINT-halfclose3
-rw-r--r--tests/expected/lsfd/mkfds-socketpair-STREAM-SHUTDOWN-STATE3
-rw-r--r--tests/expected/lsfd/mkfds-symlink2
-rw-r--r--tests/expected/lsfd/mkfds-tcp6
-rw-r--r--tests/expected/lsfd/mkfds-tcp66
-rw-r--r--tests/expected/lsfd/mkfds-timerfd0
-rw-r--r--tests/expected/lsfd/mkfds-timerfd-alarm16
-rw-r--r--tests/expected/lsfd/mkfds-timerfd-boottime-interval-only8
-rw-r--r--tests/expected/lsfd/mkfds-timerfd-monotonic-remaining-only8
-rw-r--r--tests/expected/lsfd/mkfds-timerfd-realtime-remaining-and-interval8
-rw-r--r--tests/expected/lsfd/mkfds-udp24
-rw-r--r--tests/expected/lsfd/mkfds-udp624
-rw-r--r--tests/expected/lsfd/mkfds-unix-dgram8
-rw-r--r--tests/expected/lsfd/mkfds-unix-in-netns-dgram4
-rw-r--r--tests/expected/lsfd/mkfds-unix-in-netns-seqpacket4
-rw-r--r--tests/expected/lsfd/mkfds-unix-in-netns-stream4
-rw-r--r--tests/expected/lsfd/mkfds-unix-stream48
-rw-r--r--tests/expected/lsfd/mkfds-unix-stream-requiring-sockdiag8
-rw-r--r--tests/expected/lsfd/option-filter-broken-exp7
-rw-r--r--tests/expected/lsfd/option-inet80
-rw-r--r--tests/expected/lsfd/option-summary6
-rw-r--r--tests/expected/lslocks/lslocks-flock-ex4
-rw-r--r--tests/expected/lslocks/lslocks-flock-ex+HOLDERS2
-rw-r--r--tests/expected/lslocks/lslocks-flock-sh4
-rw-r--r--tests/expected/lslocks/lslocks-flock-sh+HOLDERS2
-rw-r--r--tests/expected/lslocks/lslocks-lease-w4
-rw-r--r--tests/expected/lslocks/lslocks-lease-w+HOLDERS2
-rw-r--r--tests/expected/lslocks/lslocks-ofd--w4
-rw-r--r--tests/expected/lslocks/lslocks-ofd--w+HOLDERS2
-rw-r--r--tests/expected/lslocks/lslocks-ofd-r-4
-rw-r--r--tests/expected/lslocks/lslocks-ofd-r-+HOLDERS2
-rw-r--r--tests/expected/lslocks/lslocks-ofd-rw6
-rw-r--r--tests/expected/lslocks/lslocks-ofd-rw+HOLDERS3
-rw-r--r--tests/expected/lslocks/lslocks-posix--w4
-rw-r--r--tests/expected/lslocks/lslocks-posix-r-4
-rw-r--r--tests/expected/lslocks/lslocks-posix-rw6
-rw-r--r--tests/expected/misc/boilerplate-exec1
-rw-r--r--tests/expected/misc/boilerplate-help24
-rw-r--r--tests/expected/misc/enosys-basic4
-rw-r--r--tests/expected/misc/enosys-exec1
-rw-r--r--tests/expected/misc/enosys-ioctl5
-rw-r--r--tests/expected/misc/lsclocks-basic10
-rw-r--r--tests/expected/misc/lsclocks-cpu1
-rw-r--r--tests/expected/misc/lsclocks-dynamic1
-rw-r--r--tests/expected/misc/lsclocks-rtc1
-rw-r--r--tests/expected/misc/lsclocks-time1
-rw-r--r--tests/expected/misc/setpgid2
-rw-r--r--tests/expected/misc/time_t1
-rw-r--r--tests/expected/mount/special-missing-options1
-rw-r--r--tests/expected/rename/basic1
-rw-r--r--tests/expected/schedutils/chrt-deadline6
-rw-r--r--tests/expected/setpriv/landlock-nothing-allowed1
-rw-r--r--tests/expected/setpriv/landlock-partial-access-fail1
-rw-r--r--tests/expected/utmp/utmpdump-subsecond2
-rw-r--r--tests/expected/wipefs/signatures-bcachefs3
-rw-r--r--tests/functions.sh53
-rw-r--r--tests/helpers/Makemodule.am10
-rw-r--r--tests/helpers/test_cap.c33
-rw-r--r--tests/helpers/test_enosys.c126
-rw-r--r--tests/helpers/test_mkfds.c1900
-rw-r--r--tests/helpers/test_mkfds.h85
-rw-r--r--tests/helpers/test_mkfds_ppoll.c79
-rw-r--r--tests/helpers/test_sysinfo.c12
-rw-r--r--tests/ts/blkid/images-fs/swap-luks.img.xzbin0 -> 388 bytes
-rw-r--r--tests/ts/blkid/images-fs/vxfs-be.img.xzbin0 -> 128 bytes
-rw-r--r--tests/ts/blkid/images-fs/vxfs-le.img.xzbin0 -> 104 bytes
-rwxr-xr-xtests/ts/column/table7
-rw-r--r--tests/ts/dmesg/cid-input106
-rwxr-xr-xtests/ts/dmesg/cid-json28
-rwxr-xr-xtests/ts/dmesg/cid-kmsg-colors34
-rwxr-xr-xtests/ts/dmesg/cid-kmsg-console-levels49
-rwxr-xr-xtests/ts/dmesg/cid-kmsg-decode33
-rwxr-xr-xtests/ts/dmesg/cid-kmsg-delta33
-rwxr-xr-xtests/ts/dmesg/cid-kmsg-facilities36
-rwxr-xr-xtests/ts/dmesg/cid-kmsg-indentation45
-rw-r--r--tests/ts/dmesg/cid-kmsg-inputbin0 -> 5464 bytes
-rwxr-xr-xtests/ts/dmesg/cid-kmsg-json28
-rwxr-xr-xtests/ts/dmesg/cid-kmsg-limit34
-rw-r--r--tests/ts/dmesg/cid-kmsg-newlinesbin0 -> 152 bytes
-rw-r--r--tests/ts/dmesg/input1
-rwxr-xr-xtests/ts/dmesg/json28
-rwxr-xr-xtests/ts/dmesg/kmsg-file28
-rw-r--r--tests/ts/dmesg/kmsg-inputbin0 -> 3944 bytes
-rwxr-xr-xtests/ts/dmesg/timestamp-format42
-rwxr-xr-xtests/ts/eject/umount10
-rwxr-xr-xtests/ts/exch/exch40
-rwxr-xr-xtests/ts/fadvise/drop28
-rwxr-xr-xtests/ts/fdisk/resize66
-rwxr-xr-xtests/ts/fincore/count5
-rwxr-xr-xtests/ts/hexdump/format-strings4
-rwxr-xr-xtests/ts/lib/timeutils8
-rwxr-xr-xtests/ts/liblastlog2/dlopen23
-rwxr-xr-xtests/ts/liblastlog2/pam_lastlog2_output17
-rwxr-xr-xtests/ts/liblastlog2/remove_entry15
-rwxr-xr-xtests/ts/liblastlog2/rename_user15
-rwxr-xr-xtests/ts/liblastlog2/sqlite3_time15
-rwxr-xr-xtests/ts/liblastlog2/write_read_user15
-rwxr-xr-xtests/ts/liblastlog2/y2038_ll2_read_all15
-rwxr-xr-xtests/ts/libmount/optlist67
-rwxr-xr-xtests/ts/libmount/optstr8
-rwxr-xr-xtests/ts/libmount/update1
-rwxr-xr-xtests/ts/libmount/update-py1
-rwxr-xr-xtests/ts/libsmartcols/continuous-json28
-rw-r--r--tests/ts/libsmartcols/files/col-bool1
-rw-r--r--tests/ts/libsmartcols/files/col-float1
-rw-r--r--tests/ts/libsmartcols/files/col-hidden4
-rw-r--r--tests/ts/libsmartcols/files/col-id4
-rw-r--r--tests/ts/libsmartcols/files/col-name4
-rw-r--r--tests/ts/libsmartcols/files/col-noextremes4
-rw-r--r--tests/ts/libsmartcols/files/col-number4
-rw-r--r--tests/ts/libsmartcols/files/col-parent4
-rw-r--r--tests/ts/libsmartcols/files/col-strict4
-rw-r--r--tests/ts/libsmartcols/files/col-string4
-rw-r--r--tests/ts/libsmartcols/files/col-tree4
-rw-r--r--tests/ts/libsmartcols/files/col-trunc4
-rw-r--r--tests/ts/libsmartcols/files/col-wrap4
-rw-r--r--tests/ts/libsmartcols/files/col-wrapnl4
-rw-r--r--tests/ts/libsmartcols/files/col-wrapzero1
-rw-r--r--tests/ts/libsmartcols/files/data-bool10
-rw-r--r--tests/ts/libsmartcols/files/data-float10
-rw-r--r--tests/ts/libsmartcols/files/data-string-nl10
-rw-r--r--tests/ts/libsmartcols/files/data-string-zero10
-rwxr-xr-xtests/ts/libsmartcols/filter217
-rwxr-xr-xtests/ts/libsmartcols/fromfile26
-rw-r--r--tests/ts/lscpu/dumps/rv64-visionfive2.tar.gzbin0 -> 14329 bytes
-rwxr-xr-xtests/ts/lsfd/column-ainodeclass4
-rwxr-xr-xtests/ts/lsfd/column-deleted61
-rwxr-xr-xtests/ts/lsfd/column-kthread2
-rwxr-xr-xtests/ts/lsfd/column-name20
-rwxr-xr-xtests/ts/lsfd/column-source51
-rwxr-xr-xtests/ts/lsfd/column-source-with-root44
-rwxr-xr-xtests/ts/lsfd/column-type4
-rwxr-xr-xtests/ts/lsfd/column-xmode202
-rwxr-xr-xtests/ts/lsfd/filter-broken-exp (renamed from tests/ts/lsfd/option-filter-broken-exp)5
-rwxr-xr-xtests/ts/lsfd/filter-floating-point-nums90
-rw-r--r--tests/ts/lsfd/lsfd-functions.bash44
-rwxr-xr-xtests/ts/lsfd/mkfds-bpf-map49
-rwxr-xr-xtests/ts/lsfd/mkfds-bpf-prog49
-rwxr-xr-xtests/ts/lsfd/mkfds-cdev-tun65
-rwxr-xr-xtests/ts/lsfd/mkfds-directory2
-rwxr-xr-xtests/ts/lsfd/mkfds-eventfd104
-rwxr-xr-xtests/ts/lsfd/mkfds-eventpoll46
-rwxr-xr-xtests/ts/lsfd/mkfds-inotify74
-rwxr-xr-xtests/ts/lsfd/mkfds-inotify-btrfs91
-rwxr-xr-xtests/ts/lsfd/mkfds-mapped-packet-socket2
-rwxr-xr-xtests/ts/lsfd/mkfds-mqueue83
-rwxr-xr-xtests/ts/lsfd/mkfds-multiplexing70
-rwxr-xr-xtests/ts/lsfd/mkfds-netlink-groups2
-rwxr-xr-xtests/ts/lsfd/mkfds-netlink-protocol2
-rwxr-xr-xtests/ts/lsfd/mkfds-netns5
-rwxr-xr-xtests/ts/lsfd/mkfds-pidfd4
-rwxr-xr-xtests/ts/lsfd/mkfds-ping6
-rwxr-xr-xtests/ts/lsfd/mkfds-pipe-no-fork2
-rwxr-xr-xtests/ts/lsfd/mkfds-pty73
-rwxr-xr-xtests/ts/lsfd/mkfds-raw2
-rwxr-xr-xtests/ts/lsfd/mkfds-raw62
-rwxr-xr-xtests/ts/lsfd/mkfds-ro-block-device2
-rwxr-xr-xtests/ts/lsfd/mkfds-ro-regular-file2
-rwxr-xr-xtests/ts/lsfd/mkfds-rw-character-device2
-rwxr-xr-xtests/ts/lsfd/mkfds-signalfd64
-rwxr-xr-xtests/ts/lsfd/mkfds-socketpair95
-rwxr-xr-xtests/ts/lsfd/mkfds-symlink2
-rwxr-xr-xtests/ts/lsfd/mkfds-tcp6
-rwxr-xr-xtests/ts/lsfd/mkfds-tcp66
-rwxr-xr-xtests/ts/lsfd/mkfds-timerfd109
-rwxr-xr-xtests/ts/lsfd/mkfds-timerfd-alarm56
-rwxr-xr-xtests/ts/lsfd/mkfds-udp24
-rwxr-xr-xtests/ts/lsfd/mkfds-udp624
-rwxr-xr-xtests/ts/lsfd/mkfds-unix-dgram8
-rwxr-xr-xtests/ts/lsfd/mkfds-unix-in-netns4
-rwxr-xr-xtests/ts/lsfd/mkfds-unix-stream8
-rwxr-xr-xtests/ts/lsfd/mkfds-unix-stream-requiring-sockdiag58
-rwxr-xr-xtests/ts/lsfd/option-inet70
-rwxr-xr-xtests/ts/lsfd/option-pid2
-rwxr-xr-xtests/ts/lsfd/option-summary4
-rwxr-xr-xtests/ts/lslocks/lslocks117
-rwxr-xr-xtests/ts/misc/boilerplate39
-rwxr-xr-xtests/ts/misc/enosys58
-rwxr-xr-xtests/ts/misc/lsclocks70
-rwxr-xr-xtests/ts/misc/setpgid33
-rwxr-xr-xtests/ts/misc/time_t28
-rwxr-xr-xtests/ts/misc/waitpid4
-rwxr-xr-xtests/ts/mkswap/mkswap44
-rwxr-xr-xtests/ts/mount/fallback10
-rwxr-xr-xtests/ts/mount/fslists2
-rwxr-xr-xtests/ts/mount/fstab-all37
-rwxr-xr-xtests/ts/mount/fstab-bind2
-rwxr-xr-xtests/ts/mount/fstab-broken6
-rwxr-xr-xtests/ts/mount/fstab-btrfs8
-rwxr-xr-xtests/ts/mount/fstab-devname4
-rwxr-xr-xtests/ts/mount/fstab-devname2label2
-rwxr-xr-xtests/ts/mount/fstab-devname2uuid2
-rwxr-xr-xtests/ts/mount/fstab-label6
-rwxr-xr-xtests/ts/mount/fstab-label2devname4
-rwxr-xr-xtests/ts/mount/fstab-label2uuid4
-rwxr-xr-xtests/ts/mount/fstab-loop4
-rwxr-xr-xtests/ts/mount/fstab-none2
-rwxr-xr-xtests/ts/mount/fstab-symlink2
-rwxr-xr-xtests/ts/mount/fstab-uuid6
-rwxr-xr-xtests/ts/mount/fstab-uuid2devname4
-rwxr-xr-xtests/ts/mount/fstab-uuid2label4
-rwxr-xr-xtests/ts/mount/special43
-rwxr-xr-xtests/ts/mount/umount-recursive2
-rwxr-xr-xtests/ts/rename/basic4
-rwxr-xr-xtests/ts/schedutils/chrt11
-rwxr-xr-xtests/ts/setpriv/landlock64
-rwxr-xr-xtests/ts/swapon/devname4
-rw-r--r--tests/ts/wipefs/images/bcachefs.img.xzbin0 -> 5312 bytes
-rwxr-xr-xtests/ts/wipefs/signatures40
-rwxr-xr-xtests/ts/wipefs/wipefs18
440 files changed, 9645 insertions, 724 deletions
diff --git a/tests/Makemodule.am b/tests/Makemodule.am
index d5422be..3a66f27 100644
--- a/tests/Makemodule.am
+++ b/tests/Makemodule.am
@@ -15,11 +15,13 @@ CLEAN_LOCALS += clean-local-tests
TESTS_OPTIONS = --nonroot --show-diff
TESTS_PARALLEL = --parallel
+TESTS_COMPONENTS =
TESTS_COMMAND = $(top_srcdir)/tests/run.sh \
--srcdir=$(abs_top_srcdir) \
--builddir=$(abs_top_builddir) \
$(TESTS_PARALLEL) \
- $(TESTS_OPTIONS)
+ $(TESTS_OPTIONS) \
+ $(TESTS_COMPONENTS)
check-local-tests: $(check_PROGRAMS)
$(AM_V_GEN) $(TESTS_COMMAND)
diff --git a/tests/commands.sh b/tests/commands.sh
index 8dfb135..cb8013e 100644
--- a/tests/commands.sh
+++ b/tests/commands.sh
@@ -2,8 +2,10 @@
TS_TESTUSER=${TS_TESTUSER:-"nobody"}
# helpers
+TS_HELPER_BOILERPLATE="${ts_helpersdir}test_boilerplate"
TS_HELPER_BYTESWAP="${ts_helpersdir}test_byteswap"
TS_HELPER_CPUSET="${ts_helpersdir}test_cpuset"
+TS_HELPER_CAP="${ts_helpersdir}test_cap"
TS_HELPER_DMESG="${ts_helpersdir}test_dmesg"
TS_HELPER_ENOSYS="${ts_helpersdir}test_enosys"
TS_HELPER_ISLOCAL="${ts_helpersdir}test_islocal"
@@ -13,14 +15,23 @@ TS_HELPER_LIBFDISK_MKPART="${ts_helpersdir}sample-fdisk-mkpart"
TS_HELPER_LIBMOUNT_CONTEXT="${ts_helpersdir}test_mount_context"
TS_HELPER_LIBFDISK_MKPART_FULLSPEC="${ts_helpersdir}sample-fdisk-mkpart-fullspec"
TS_HELPER_LIBFDISK_SCRIPT_FUZZ="${ts_helpersdir}test_fdisk_script_fuzz"
+TS_HELPER_LIBLASTLOG2_DLOPEN="${ts_helpersdir}test_lastlog2_dlopen"
+TS_HELPER_LIBLASTLOG2_PAM_LASTLOG2_OUTPUT="${ts_helpersdir}test_lastlog2_pam_lastlog2_output"
+TS_HELPER_LIBLASTLOG2_REMOVE_ENTRY="${ts_helpersdir}test_lastlog2_remove_entry"
+TS_HELPER_LIBLASTLOG2_RENAME_USER="${ts_helpersdir}test_lastlog2_rename_user"
+TS_HELPER_LIBLASTLOG2_WRITE_READ_USER="${ts_helpersdir}test_lastlog2_write_read_user"
+TS_HELPER_LIBLASTLOG2_Y2038_LL2_READ_ALL="${ts_helpersdir}test_lastlog2_y2038_ll2_read_all"
+TS_HELPER_LIBLASTLOG2_Y2038_SQLITE2_TIME="${ts_helpersdir}test_lastlog2_y2038_sqlite3_time"
TS_HELPER_LIBMOUNT_LOCK="${ts_helpersdir}test_mount_lock"
TS_HELPER_LIBMOUNT_OPTSTR="${ts_helpersdir}test_mount_optstr"
+TS_HELPER_LIBMOUNT_OPTLIST="${ts_helpersdir}test_mount_optlist"
TS_HELPER_LIBMOUNT_TABDIFF="${ts_helpersdir}test_mount_tab_diff"
TS_HELPER_LIBMOUNT_TAB="${ts_helpersdir}test_mount_tab"
TS_HELPER_LIBMOUNT_UPDATE="${ts_helpersdir}test_mount_tab_update"
TS_HELPER_LIBMOUNT_UTILS="${ts_helpersdir}test_mount_utils"
TS_HELPER_LIBMOUNT_DEBUG="${ts_helpersdir}test_mount_debug"
TS_HELPER_LIBMOUNT_FUZZ="${ts_helpersdir}test_mount_fuzz"
+TS_HELPER_LIBSMARTCOLS_CONTINUOUS_JSON="${ts_helpersdir}sample-scols-continuous-json"
TS_HELPER_LIBSMARTCOLS_FROMFILE="${ts_helpersdir}sample-scols-fromfile"
TS_HELPER_LIBSMARTCOLS_TITLE="${ts_helpersdir}sample-scols-title"
TS_HELPER_PYLIBMOUNT_CONTEXT="$top_srcdir/libmount/python/test_mount_context.py"
@@ -60,7 +71,9 @@ TS_CMD_COLCRT=${TS_CMD_COLCRT:-"${ts_commandsdir}colcrt"}
TS_CMD_COLRM=${TS_CMD_COLRM:-"${ts_commandsdir}colrm"}
TS_CMD_COL=${TS_CMD_COL:-"${ts_commandsdir}col"}
TS_CMD_COLUMN=${TS_CMD_COLUMN:-"${ts_commandsdir}column"}
+TS_CMD_ENOSYS=${TS_CMD_ENOSYS-"${ts_commandsdir}enosys"}
TS_CMD_EJECT=${TS_CMD_EJECT-"${ts_commandsdir}eject"}
+TS_CMD_EXCH=${TS_CMD_EXCH-"${ts_commandsdir}exch"}
TS_CMD_FALLOCATE=${TS_CMD_FALLOCATE-"${ts_commandsdir}fallocate"}
TS_CMD_FDISK=${TS_CMD_FDISK-"${ts_commandsdir}fdisk"}
TS_CMD_FLOCK=${TS_CMD_FLOCK-"${ts_commandsdir}flock"}
@@ -85,8 +98,10 @@ TS_CMD_LINE=${TS_CMD_LINE-"${ts_commandsdir}line"}
TS_CMD_LOOK=${TS_CMD_LOOK-"${ts_commandsdir}look"}
TS_CMD_LOSETUP=${TS_CMD_LOSETUP:-"${ts_commandsdir}losetup"}
TS_CMD_LSBLK=${TS_CMD_LSBLK-"${ts_commandsdir}lsblk"}
+TS_CMD_LSCLOCKS=${TS_CMD_LSCPU-"${ts_commandsdir}lsclocks"}
TS_CMD_LSCPU=${TS_CMD_LSCPU-"${ts_commandsdir}lscpu"}
TS_CMD_LSFD=${TS_CMD_LSFD-"${ts_commandsdir}lsfd"}
+TS_CMD_LSLOCKS=${TS_CMD_LSLOCKS-"${ts_commandsdir}lslocks"}
TS_CMD_LSMEM=${TS_CMD_LSMEM-"${ts_commandsdir}lsmem"}
TS_CMD_LSNS=${TS_CMD_LSNS-"${ts_commandsdir}lsns"}
TS_CMD_MCOOKIE=${TS_CMD_MCOOKIE-"${ts_commandsdir}mcookie"}
@@ -105,6 +120,8 @@ TS_CMD_SCRIPT=${TS_CMD_SCRIPT-"${ts_commandsdir}script"}
TS_CMD_SCRIPTREPLAY=${TS_CMD_SCRIPTREPLAY-"${ts_commandsdir}scriptreplay"}
TS_CMD_SCRIPTLIVE=${TS_CMD_SCRIPTLIVE-"${ts_commandsdir}scriptlive"}
TS_CMD_SETARCH=${TS_CMD_SETARCH-"${ts_commandsdir}setarch"}
+TS_CMD_SETPGID=${TS_CMD_SETPGID-"${ts_commandsdir}setpgid"}
+TS_CMD_SETPRIV=${TS_CMD_SETPRIV-"${ts_commandsdir}setpriv"}
TS_CMD_SETSID=${TS_CMD_SETSID-"${ts_commandsdir}setsid"}
TS_CMD_SWAPLABEL=${TS_CMD_SWAPLABEL:-"${ts_commandsdir}swaplabel"}
TS_CMD_SWAPOFF=${TS_CMD_SWAPOFF:-"${ts_commandsdir}swapoff"}
diff --git a/tests/expected/blkid/low-probe-bcache-B b/tests/expected/blkid/low-probe-bcache-B
index 7396632..2753678 100644
--- a/tests/expected/blkid/low-probe-bcache-B
+++ b/tests/expected/blkid/low-probe-bcache-B
@@ -1,4 +1,6 @@
+ID_FS_BLOCK_SIZE=4096
ID_FS_TYPE=bcache
ID_FS_USAGE=other
ID_FS_UUID=8fb7f716-4c19-4517-bfbb-6f4a2becad60
ID_FS_UUID_ENC=8fb7f716-4c19-4517-bfbb-6f4a2becad60
+ID_FS_VERSION=1
diff --git a/tests/expected/blkid/low-probe-bcache-C b/tests/expected/blkid/low-probe-bcache-C
index b3c5f88..da4b314 100644
--- a/tests/expected/blkid/low-probe-bcache-C
+++ b/tests/expected/blkid/low-probe-bcache-C
@@ -1,4 +1,6 @@
+ID_FS_BLOCK_SIZE=4096
ID_FS_TYPE=bcache
ID_FS_USAGE=other
ID_FS_UUID=7a343627-ac87-4bf0-b76f-46067cbc9b8c
ID_FS_UUID_ENC=7a343627-ac87-4bf0-b76f-46067cbc9b8c
+ID_FS_VERSION=0
diff --git a/tests/expected/blkid/low-probe-bcache-journal b/tests/expected/blkid/low-probe-bcache-journal
index c46ba22..cfff870 100644
--- a/tests/expected/blkid/low-probe-bcache-journal
+++ b/tests/expected/blkid/low-probe-bcache-journal
@@ -1,4 +1,8 @@
+ID_FS_BLOCK_SIZE=4096
+ID_FS_LABEL=journal-cache
+ID_FS_LABEL_ENC=journal-cache
ID_FS_TYPE=bcache
ID_FS_USAGE=other
ID_FS_UUID=fc6ea56f-372e-474e-bc5b-2ddc8430ddd1
ID_FS_UUID_ENC=fc6ea56f-372e-474e-bc5b-2ddc8430ddd1
+ID_FS_VERSION=3
diff --git a/tests/expected/blkid/low-probe-swap-luks b/tests/expected/blkid/low-probe-swap-luks
new file mode 100644
index 0000000..97cd5de
--- /dev/null
+++ b/tests/expected/blkid/low-probe-swap-luks
@@ -0,0 +1,8 @@
+ID_FS_ENDIANNESS=LITTLE
+ID_FS_FSBLOCKSIZE=4096
+ID_FS_FSSIZE=258048
+ID_FS_TYPE=swap
+ID_FS_USAGE=other
+ID_FS_UUID=0eb5f96f-188d-4d61-9e9c-d89ce8206846
+ID_FS_UUID_ENC=0eb5f96f-188d-4d61-9e9c-d89ce8206846
+ID_FS_VERSION=1
diff --git a/tests/expected/blkid/low-probe-vxfs-be b/tests/expected/blkid/low-probe-vxfs-be
new file mode 100644
index 0000000..bede9b6
--- /dev/null
+++ b/tests/expected/blkid/low-probe-vxfs-be
@@ -0,0 +1,6 @@
+ID_FS_BLOCK_SIZE=512
+ID_FS_ENDIANNESS=BIG
+ID_FS_FSBLOCKSIZE=512
+ID_FS_TYPE=vxfs
+ID_FS_USAGE=filesystem
+ID_FS_VERSION=3
diff --git a/tests/expected/blkid/low-probe-vxfs-le b/tests/expected/blkid/low-probe-vxfs-le
new file mode 100644
index 0000000..ba29986
--- /dev/null
+++ b/tests/expected/blkid/low-probe-vxfs-le
@@ -0,0 +1,6 @@
+ID_FS_BLOCK_SIZE=512
+ID_FS_ENDIANNESS=LITTLE
+ID_FS_FSBLOCKSIZE=512
+ID_FS_TYPE=vxfs
+ID_FS_USAGE=filesystem
+ID_FS_VERSION=3
diff --git a/tests/expected/build-sys/config-all b/tests/expected/build-sys/config-all
index 0574f23..88b6e06 100644
--- a/tests/expected/build-sys/config-all
+++ b/tests/expected/build-sys/config-all
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libuuid
mount: libmount
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
fdformat:
@@ -109,6 +115,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -123,6 +130,6 @@ unshare:
utmpdump:
vipw:
waitpid:
-wall:
+wall: libsystemd
whereis:
-write:
+write: libsystemd
diff --git a/tests/expected/build-sys/config-all-devel b/tests/expected/build-sys/config-all-devel
index 3e9a720..da9afc1 100644
--- a/tests/expected/build-sys/config-all-devel
+++ b/tests/expected/build-sys/config-all-devel
@@ -89,6 +89,7 @@ readprofile:
renice:
rtcwake:
setarch:
+setpgid:
setsid:
switch_root:
tunelp:
diff --git a/tests/expected/build-sys/config-all-non-nls b/tests/expected/build-sys/config-all-non-nls
index 0574f23..88b6e06 100644
--- a/tests/expected/build-sys/config-all-non-nls
+++ b/tests/expected/build-sys/config-all-non-nls
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libuuid
mount: libmount
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
fdformat:
@@ -109,6 +115,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -123,6 +130,6 @@ unshare:
utmpdump:
vipw:
waitpid:
-wall:
+wall: libsystemd
whereis:
-write:
+write: libsystemd
diff --git a/tests/expected/build-sys/config-audit b/tests/expected/build-sys/config-audit
index bdcd087..749a35b 100644
--- a/tests/expected/build-sys/config-audit
+++ b/tests/expected/build-sys/config-audit
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libuuid
mount: libmount
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -105,6 +111,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -117,5 +124,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-chfnsh-libuser b/tests/expected/build-sys/config-chfnsh-libuser
index 97e1ae6..238c150 100644
--- a/tests/expected/build-sys/config-chfnsh-libuser
+++ b/tests/expected/build-sys/config-chfnsh-libuser
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid libselinux
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libselinux libuuid
mount: libmount libselinux
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount libselinux
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -105,6 +111,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -117,5 +124,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-chfnsh-no-password b/tests/expected/build-sys/config-chfnsh-no-password
index 734113e..41bd6c5 100644
--- a/tests/expected/build-sys/config-chfnsh-no-password
+++ b/tests/expected/build-sys/config-chfnsh-no-password
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid libselinux
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libselinux libuuid
mount: libmount libselinux
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount libselinux
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -105,6 +111,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -117,5 +124,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-chfnsh-pam b/tests/expected/build-sys/config-chfnsh-pam
index 532013c..17cd06c 100644
--- a/tests/expected/build-sys/config-chfnsh-pam
+++ b/tests/expected/build-sys/config-chfnsh-pam
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid libselinux
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libselinux libuuid
mount: libmount libselinux
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount libselinux
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -105,6 +111,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -117,5 +124,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-core b/tests/expected/build-sys/config-core
index a20517c..bb4ac01 100644
--- a/tests/expected/build-sys/config-core
+++ b/tests/expected/build-sys/config-core
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libuuid
mount: libmount
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -105,6 +111,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -117,5 +124,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-cryptsetup b/tests/expected/build-sys/config-cryptsetup
index c4aae45..b21174e 100644
--- a/tests/expected/build-sys/config-cryptsetup
+++ b/tests/expected/build-sys/config-cryptsetup
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid libcryptsetup
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libuuid
mount: libmount
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libcryptsetup libmount
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
fdformat:
@@ -109,6 +115,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -123,6 +130,6 @@ unshare:
utmpdump:
vipw:
waitpid:
-wall:
+wall: libsystemd
whereis:
-write:
+write: libsystemd
diff --git a/tests/expected/build-sys/config-devel b/tests/expected/build-sys/config-devel
index 5682413..4b44616 100644
--- a/tests/expected/build-sys/config-devel
+++ b/tests/expected/build-sys/config-devel
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid libselinux
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libselinux libuuid
mount: libmount libselinux
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount libselinux
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
fdformat:
@@ -109,6 +115,7 @@ script: libutempter
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -123,6 +130,6 @@ unshare:
utmpdump:
vipw: libselinux
waitpid:
-wall:
+wall: libsystemd
whereis:
-write:
+write: libsystemd
diff --git a/tests/expected/build-sys/config-devel-new-mount b/tests/expected/build-sys/config-devel-new-mount
index 9ac8272..8befe4c 100644
--- a/tests/expected/build-sys/config-devel-new-mount
+++ b/tests/expected/build-sys/config-devel-new-mount
@@ -94,6 +94,7 @@ readprofile:
renice:
rtcwake:
setarch:
+setpgid:
setsid:
switch_root:
tunelp:
diff --git a/tests/expected/build-sys/config-devel-non-asan b/tests/expected/build-sys/config-devel-non-asan
index 5682413..4b44616 100644
--- a/tests/expected/build-sys/config-devel-non-asan
+++ b/tests/expected/build-sys/config-devel-non-asan
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid libselinux
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libselinux libuuid
mount: libmount libselinux
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount libselinux
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
fdformat:
@@ -109,6 +115,7 @@ script: libutempter
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -123,6 +130,6 @@ unshare:
utmpdump:
vipw: libselinux
waitpid:
-wall:
+wall: libsystemd
whereis:
-write:
+write: libsystemd
diff --git a/tests/expected/build-sys/config-devel-non-docs b/tests/expected/build-sys/config-devel-non-docs
index 5682413..4b44616 100644
--- a/tests/expected/build-sys/config-devel-non-docs
+++ b/tests/expected/build-sys/config-devel-non-docs
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid libselinux
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libselinux libuuid
mount: libmount libselinux
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount libselinux
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
fdformat:
@@ -109,6 +115,7 @@ script: libutempter
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -123,6 +130,6 @@ unshare:
utmpdump:
vipw: libselinux
waitpid:
-wall:
+wall: libsystemd
whereis:
-write:
+write: libsystemd
diff --git a/tests/expected/build-sys/config-non-libblkid b/tests/expected/build-sys/config-non-libblkid
index ed38eb5..0cce945 100644
--- a/tests/expected/build-sys/config-non-libblkid
+++ b/tests/expected/build-sys/config-non-libblkid
@@ -3,10 +3,13 @@ column: libsmartcols
fdisk: libfdisk libreadline libsmartcols libtinfo
fincore: libsmartcols
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libfdisk.so.1.1.0: libuuid
+liblastlog2.so.2.0.0: libsqlite3
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -14,6 +17,7 @@ lsirq: libsmartcols
lslogins: libsmartcols libsystemd
lsmem: libsmartcols
mkswap: libuuid
+pam_lastlog2.so:
prlimit: libsmartcols
rfkill: libsmartcols
sfdisk: libfdisk libreadline libsmartcols libtinfo
@@ -22,7 +26,7 @@ uuidgen: libuuid
uuidparse: libsmartcols libuuid
wdctl: libsmartcols
zramctl: libsmartcols
-agetty:
+agetty: libsystemd
blkdiscard:
blkpr:
blkzone:
@@ -39,6 +43,8 @@ colcrt:
colrm:
ctrlaltdel:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -82,6 +88,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -94,5 +101,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-non-libmount b/tests/expected/build-sys/config-non-libmount
index 45ff711..ed8895b 100644
--- a/tests/expected/build-sys/config-non-libmount
+++ b/tests/expected/build-sys/config-non-libmount
@@ -6,11 +6,14 @@ fdisk: libfdisk libreadline libsmartcols libtinfo
fincore: libsmartcols
findfs: libblkid
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -18,6 +21,7 @@ lsirq: libsmartcols
lslogins: libsmartcols libsystemd
lsmem: libsmartcols
mkswap: libblkid libuuid
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
rfkill: libsmartcols
@@ -30,7 +34,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -47,6 +51,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -91,6 +97,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -103,5 +110,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-non-libs b/tests/expected/build-sys/config-non-libs
index b88a6a1..f517ba5 100644
--- a/tests/expected/build-sys/config-non-libs
+++ b/tests/expected/build-sys/config-non-libs
@@ -1,4 +1,7 @@
-agetty:
+lastlog2: liblastlog2
+liblastlog2.so.2.0.0: libsqlite3
+pam_lastlog2.so:
+agetty: libsystemd
blkdiscard:
blkpr:
blkzone:
@@ -15,6 +18,8 @@ colcrt:
colrm:
ctrlaltdel:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -59,6 +64,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -71,5 +77,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-non-libsmartcols b/tests/expected/build-sys/config-non-libsmartcols
index 28ff817..6889c74 100644
--- a/tests/expected/build-sys/config-non-libsmartcols
+++ b/tests/expected/build-sys/config-non-libsmartcols
@@ -1,22 +1,25 @@
blkdiscard: libblkid
blkid: libblkid
-eject: libmount
+eject: libblkid libmount
findfs: libblkid
fsck: libblkid libmount
-fstrim: libmount
+fstrim: libblkid libmount
+lastlog2: liblastlog2 libsqlite3
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid
libuuid.so.1.3.0:
mkswap: libblkid libuuid
-mount: libmount
-mountpoint: libmount
+mount: libblkid libmount
+mountpoint: libblkid libmount
+pam_lastlog2.so:
pylibmount.so: libblkid libmount
swaplabel: libblkid libuuid
-umount: libmount
+umount: libblkid libmount
uuidd: libsystemd libuuid
uuidgen: libuuid
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -32,6 +35,8 @@ colcrt:
colrm:
ctrlaltdel:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -75,6 +80,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -87,5 +93,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-non-libuuid b/tests/expected/build-sys/config-non-libuuid
index 3e5a295..8d19e47 100644
--- a/tests/expected/build-sys/config-non-libuuid
+++ b/tests/expected/build-sys/config-non-libuuid
@@ -8,11 +8,14 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid
libsmartcols.so.1.1.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -24,6 +27,7 @@ lsns: libmount libsmartcols
mkswap: libblkid
mount: libmount
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount
@@ -36,7 +40,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -53,6 +57,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -97,6 +103,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -109,5 +116,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-non-nls b/tests/expected/build-sys/config-non-nls
index a20517c..bb4ac01 100644
--- a/tests/expected/build-sys/config-non-nls
+++ b/tests/expected/build-sys/config-non-nls
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libuuid
mount: libmount
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -105,6 +111,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -117,5 +124,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-non-widechar b/tests/expected/build-sys/config-non-widechar
index e69de29..56e9f2f 100644
--- a/tests/expected/build-sys/config-non-widechar
+++ b/tests/expected/build-sys/config-non-widechar
@@ -0,0 +1,4 @@
+pam_lastlog2.so:
+fsfreeze:
+pivot_root:
+switch_root:
diff --git a/tests/expected/build-sys/config-selinux b/tests/expected/build-sys/config-selinux
index 4d2e5f8..c8aa80c 100644
--- a/tests/expected/build-sys/config-selinux
+++ b/tests/expected/build-sys/config-selinux
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid libselinux
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libselinux libuuid
mount: libmount libselinux
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount libselinux
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -105,6 +111,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -117,5 +124,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-slang b/tests/expected/build-sys/config-slang
index 5a3ac99..6b676cc 100644
--- a/tests/expected/build-sys/config-slang
+++ b/tests/expected/build-sys/config-slang
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libslang libsmartcols
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libuuid
mount: libmount
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkpr:
blkzone:
blockdev:
@@ -61,6 +65,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
flock:
@@ -105,6 +111,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -117,5 +124,5 @@ ul: libtinfo
unshare:
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/build-sys/config-static b/tests/expected/build-sys/config-static
index 92de9d7..10d1052 100644
--- a/tests/expected/build-sys/config-static
+++ b/tests/expected/build-sys/config-static
@@ -10,13 +10,16 @@ findmnt: libblkid libmount libsmartcols libudev
fsck: libblkid libmount
fstrim: libmount
irqtop: libncursesw libsmartcols libtinfo
+lastlog2: liblastlog2
libblkid.so.1.1.0:
libfdisk.so.1.1.0: libblkid libuuid
+liblastlog2.so.2.0.0: libsqlite3
libmount.so.1.1.0: libblkid
libsmartcols.so.1.1.0:
libuuid.so.1.3.0:
losetup: libsmartcols
-lsblk: libblkid libmount libsmartcols libudev
+lsblk: libblkid libmount libsmartcols libtinfo libudev
+lsclocks: libsmartcols
lscpu: libsmartcols
lsfd: libsmartcols
lsipc: libsmartcols
@@ -28,6 +31,7 @@ lsns: libmount libsmartcols
mkswap: libblkid libuuid
mount: libmount
mountpoint: libmount
+pam_lastlog2.so:
partx: libblkid libsmartcols
prlimit: libsmartcols
pylibmount.so: libblkid libmount
@@ -44,7 +48,7 @@ wdctl: libsmartcols
wipefs: libblkid libsmartcols
zramctl: libsmartcols
addpart:
-agetty:
+agetty: libsystemd
blkid.static: STATIC
blkpr:
blkzone:
@@ -62,6 +66,8 @@ colrm:
ctrlaltdel:
delpart:
dmesg: libtinfo
+enosys:
+exch:
fadvise:
fallocate:
fdisk.static: STATIC
@@ -110,6 +116,7 @@ script:
scriptlive:
scriptreplay:
setarch:
+setpgid:
setpriv: libcap-ng
setsid:
setterm: libtinfo
@@ -125,5 +132,5 @@ unshare:
unshare.static: STATIC
utmpdump:
waitpid:
-wall:
+wall: libsystemd
whereis:
diff --git a/tests/expected/column/table-noheaders b/tests/expected/column/table-noheaders
new file mode 100644
index 0000000..5fc905d
--- /dev/null
+++ b/tests/expected/column/table-noheaders
@@ -0,0 +1,6 @@
+AAA BBBB C DDDD
+A BBB CCCC DDD
+AA BB CCC DD
+AAAA B CC D
+AA BB CC DD
+AAAAA BBB CCC DDDD
diff --git a/tests/expected/dmesg/cid-json b/tests/expected/dmesg/cid-json
new file mode 100644
index 0000000..8a4d0e2
--- /dev/null
+++ b/tests/expected/dmesg/cid-json
@@ -0,0 +1,535 @@
+{
+ "dmesg": [
+ {
+ "pri": 0,
+ "time": 0.000000,
+ "caller": "T0",
+ "msg": "example[0]"
+ },{
+ "pri": 1,
+ "time": 1.000000,
+ "caller": "T1",
+ "msg": "example[1]"
+ },{
+ "pri": 2,
+ "time": 8.000000,
+ "caller": "T2",
+ "msg": "example[2]"
+ },{
+ "pri": 3,
+ "time": 27.000000,
+ "caller": "T3",
+ "msg": "example[3]"
+ },{
+ "pri": 4,
+ "time": 64.000000,
+ "caller": "T4",
+ "msg": "example[4]"
+ },{
+ "pri": 5,
+ "time": 125.000000,
+ "caller": "T5",
+ "msg": "example[5]"
+ },{
+ "pri": 6,
+ "time": 216.000000,
+ "caller": "T6",
+ "msg": "example[6]"
+ },{
+ "pri": 7,
+ "time": 343.000000,
+ "caller": "T7",
+ "msg": "example[7]"
+ },{
+ "pri": 8,
+ "time": 512.000000,
+ "caller": "T8",
+ "msg": "example[8]"
+ },{
+ "pri": 9,
+ "time": 729.000000,
+ "caller": "T9",
+ "msg": "example[9]"
+ },{
+ "pri": 10,
+ "time": 1000.000000,
+ "caller": "T10",
+ "msg": "example[10]"
+ },{
+ "pri": 11,
+ "time": 1331.000000,
+ "caller": "T11",
+ "msg": "example[11]"
+ },{
+ "pri": 12,
+ "time": 1728.000000,
+ "caller": "T12",
+ "msg": "example[12]"
+ },{
+ "pri": 13,
+ "time": 2197.000000,
+ "caller": "T13",
+ "msg": "example[13]"
+ },{
+ "pri": 14,
+ "time": 2744.000000,
+ "caller": "T14",
+ "msg": "example[14]"
+ },{
+ "pri": 15,
+ "time": 3375.000000,
+ "caller": "T15",
+ "msg": "example[15]"
+ },{
+ "pri": 16,
+ "time": 4096.000000,
+ "caller": "T16",
+ "msg": "example[16]"
+ },{
+ "pri": 17,
+ "time": 4913.000000,
+ "caller": "T17",
+ "msg": "example[17]"
+ },{
+ "pri": 18,
+ "time": 5832.000000,
+ "caller": "T18",
+ "msg": "example[18]"
+ },{
+ "pri": 19,
+ "time": 6859.000000,
+ "caller": "T19",
+ "msg": "example[19]"
+ },{
+ "pri": 20,
+ "time": 8000.000000,
+ "caller": "T20",
+ "msg": "example[20]"
+ },{
+ "pri": 21,
+ "time": 9261.000000,
+ "caller": "T21",
+ "msg": "example[21]"
+ },{
+ "pri": 22,
+ "time": 10648.000000,
+ "caller": "T22",
+ "msg": "example[22]"
+ },{
+ "pri": 23,
+ "time": 12167.000000,
+ "caller": "T23",
+ "msg": "example[23]"
+ },{
+ "pri": 24,
+ "time": 13824.000000,
+ "caller": "T24",
+ "msg": "example[24]"
+ },{
+ "pri": 25,
+ "time": 15625.000000,
+ "caller": "T25",
+ "msg": "example[25]"
+ },{
+ "pri": 26,
+ "time": 17576.000000,
+ "caller": "T26",
+ "msg": "example[26]"
+ },{
+ "pri": 27,
+ "time": 19683.000000,
+ "caller": "T27",
+ "msg": "example[27]"
+ },{
+ "pri": 28,
+ "time": 21952.000000,
+ "caller": "T28",
+ "msg": "example[28]"
+ },{
+ "pri": 29,
+ "time": 24389.000000,
+ "caller": "T29",
+ "msg": "example[29]"
+ },{
+ "pri": 30,
+ "time": 27000.000000,
+ "caller": "T10",
+ "msg": "example[30]"
+ },{
+ "pri": 31,
+ "time": 29791.000000,
+ "caller": "T31",
+ "msg": "example[31]"
+ },{
+ "pri": 32,
+ "time": 32768.000000,
+ "caller": "T32",
+ "msg": "example[32]"
+ },{
+ "pri": 33,
+ "time": 35937.000000,
+ "caller": "T33",
+ "msg": "example[33]"
+ },{
+ "pri": 34,
+ "time": 39304.000000,
+ "caller": "T34",
+ "msg": "example[34]"
+ },{
+ "pri": 35,
+ "time": 42875.000000,
+ "caller": "T35",
+ "msg": "example[35]"
+ },{
+ "pri": 36,
+ "time": 46656.000000,
+ "caller": "T36",
+ "msg": "example[36]"
+ },{
+ "pri": 37,
+ "time": 50653.000000,
+ "caller": "T37",
+ "msg": "example[37]"
+ },{
+ "pri": 38,
+ "time": 54872.000000,
+ "caller": "T38",
+ "msg": "example[38]"
+ },{
+ "pri": 39,
+ "time": 59319.000000,
+ "caller": "T39",
+ "msg": "example[39]"
+ },{
+ "pri": 40,
+ "time": 64000.000000,
+ "caller": "T40",
+ "msg": "example[40]"
+ },{
+ "pri": 41,
+ "time": 68921.000000,
+ "caller": "T41",
+ "msg": "example[41]"
+ },{
+ "pri": 42,
+ "time": 74088.000000,
+ "caller": "T42",
+ "msg": "example[42]"
+ },{
+ "pri": 43,
+ "time": 79507.000000,
+ "caller": "T43",
+ "msg": "example[43]"
+ },{
+ "pri": 44,
+ "time": 85184.000000,
+ "caller": "T44",
+ "msg": "example[44]"
+ },{
+ "pri": 45,
+ "time": 91125.000000,
+ "caller": "T45",
+ "msg": "example[45]"
+ },{
+ "pri": 46,
+ "time": 97336.000000,
+ "caller": "T46",
+ "msg": "example[46]"
+ },{
+ "pri": 47,
+ "time": 103823.000000,
+ "caller": "T47",
+ "msg": "example[47]"
+ },{
+ "pri": 48,
+ "time": 110592.000000,
+ "caller": "T48",
+ "msg": "example[48]"
+ },{
+ "pri": 49,
+ "time": 117649.000000,
+ "caller": "T49",
+ "msg": "example[49]"
+ },{
+ "pri": 50,
+ "time": 125000.000000,
+ "caller": "T50",
+ "msg": "example[50]"
+ },{
+ "pri": 51,
+ "time": 132651.000000,
+ "caller": "T51",
+ "msg": "example[51]"
+ },{
+ "pri": 52,
+ "time": 140608.000000,
+ "caller": "T52",
+ "msg": "example[52]"
+ },{
+ "pri": 53,
+ "time": 148877.000000,
+ "caller": "T53",
+ "msg": "example[53]"
+ },{
+ "pri": 54,
+ "time": 157464.000000,
+ "caller": "T54",
+ "msg": "example[54]"
+ },{
+ "pri": 55,
+ "time": 166375.000000,
+ "caller": "T55",
+ "msg": "example[55]"
+ },{
+ "pri": 56,
+ "time": 175616.000000,
+ "caller": "T56",
+ "msg": "example[56]"
+ },{
+ "pri": 57,
+ "time": 185193.000000,
+ "caller": "T57",
+ "msg": "example[57]"
+ },{
+ "pri": 58,
+ "time": 195112.000000,
+ "caller": "T58",
+ "msg": "example[58]"
+ },{
+ "pri": 59,
+ "time": 205379.000000,
+ "caller": "T59",
+ "msg": "example[59]"
+ },{
+ "pri": 60,
+ "time": 216000.000000,
+ "caller": "T60",
+ "msg": "example[60]"
+ },{
+ "pri": 61,
+ "time": 226981.000000,
+ "caller": "T61",
+ "msg": "example[61]"
+ },{
+ "pri": 62,
+ "time": 238328.000000,
+ "caller": "T62",
+ "msg": "example[62]"
+ },{
+ "pri": 63,
+ "time": 250047.000000,
+ "caller": "T63",
+ "msg": "example[63]"
+ },{
+ "pri": 64,
+ "time": 262144.000000,
+ "caller": "T64",
+ "msg": "example[64]"
+ },{
+ "pri": 65,
+ "time": 274625.000000,
+ "caller": "T65",
+ "msg": "example[65]"
+ },{
+ "pri": 66,
+ "time": 287496.000000,
+ "caller": "T66",
+ "msg": "example[66]"
+ },{
+ "pri": 67,
+ "time": 300763.000000,
+ "caller": "T67",
+ "msg": "example[67]"
+ },{
+ "pri": 68,
+ "time": 314432.000000,
+ "caller": "T68",
+ "msg": "example[68]"
+ },{
+ "pri": 69,
+ "time": 328509.000000,
+ "caller": "T69",
+ "msg": "example[69]"
+ },{
+ "pri": 70,
+ "time": 343000.000000,
+ "caller": "T70",
+ "msg": "example[70]"
+ },{
+ "pri": 71,
+ "time": 357911.000000,
+ "caller": "T71",
+ "msg": "example[71]"
+ },{
+ "pri": 72,
+ "time": 373248.000000,
+ "caller": "T72",
+ "msg": "example[72]"
+ },{
+ "pri": 73,
+ "time": 389017.000000,
+ "caller": "T73",
+ "msg": "example[73]"
+ },{
+ "pri": 74,
+ "time": 405224.000000,
+ "caller": "T74",
+ "msg": "example[74]"
+ },{
+ "pri": 75,
+ "time": 421875.000000,
+ "caller": "T75",
+ "msg": "example[75]"
+ },{
+ "pri": 76,
+ "time": 438976.000000,
+ "caller": "T76",
+ "msg": "example[76]"
+ },{
+ "pri": 77,
+ "time": 456533.000000,
+ "caller": "T77",
+ "msg": "example[77]"
+ },{
+ "pri": 78,
+ "time": 474552.000000,
+ "caller": "T78",
+ "msg": "example[78]"
+ },{
+ "pri": 79,
+ "time": 493039.000000,
+ "caller": "T79",
+ "msg": "example[79]"
+ },{
+ "pri": 80,
+ "time": 512000.000000,
+ "caller": "T80",
+ "msg": "example[80]"
+ },{
+ "pri": 81,
+ "time": 531441.000000,
+ "caller": "T81",
+ "msg": "example[81]"
+ },{
+ "pri": 82,
+ "time": 551368.000000,
+ "caller": "T82",
+ "msg": "example[82]"
+ },{
+ "pri": 83,
+ "time": 571787.000000,
+ "caller": "T83",
+ "msg": "example[83]"
+ },{
+ "pri": 84,
+ "time": 592704.000000,
+ "caller": "T84",
+ "msg": "example[84]"
+ },{
+ "pri": 85,
+ "time": 614125.000000,
+ "caller": "T85",
+ "msg": "example[85]"
+ },{
+ "pri": 86,
+ "time": 636056.000000,
+ "caller": "T86",
+ "msg": "example[86]"
+ },{
+ "pri": 87,
+ "time": 658503.000000,
+ "caller": "T87",
+ "msg": "example[87]"
+ },{
+ "pri": 88,
+ "time": 681472.000000,
+ "caller": "T88",
+ "msg": "example[88]"
+ },{
+ "pri": 89,
+ "time": 704969.000000,
+ "caller": "T89",
+ "msg": "example[89]"
+ },{
+ "pri": 90,
+ "time": 729000.000000,
+ "caller": "T90",
+ "msg": "example[90]"
+ },{
+ "pri": 91,
+ "time": 753571.000000,
+ "caller": "T91",
+ "msg": "example[91]"
+ },{
+ "pri": 92,
+ "time": 778688.000000,
+ "caller": "T92",
+ "msg": "example[92]"
+ },{
+ "pri": 93,
+ "time": 804357.000000,
+ "caller": "T93",
+ "msg": "example[93]"
+ },{
+ "pri": 94,
+ "time": 830584.000000,
+ "caller": "T94",
+ "msg": "example[94]"
+ },{
+ "pri": 95,
+ "time": 857375.000000,
+ "caller": "T95",
+ "msg": "example[95]"
+ },{
+ "pri": 96,
+ "time": 884736.000000,
+ "caller": "T96",
+ "msg": "example[96]"
+ },{
+ "pri": 97,
+ "time": 912673.000000,
+ "caller": "T97",
+ "msg": "example[97]"
+ },{
+ "pri": 98,
+ "time": 941192.000000,
+ "caller": "T98",
+ "msg": "example[98]"
+ },{
+ "pri": 99,
+ "time": 970299.000000,
+ "caller": "T99",
+ "msg": "example[99]"
+ },{
+ "pri": 100,
+ "time": 1000000.000000,
+ "caller": "T100",
+ "msg": "example[100]"
+ },{
+ "pri": 101,
+ "time": 1030301.000000,
+ "caller": "T101",
+ "msg": "example[101]"
+ },{
+ "pri": 102,
+ "time": 1061208.000000,
+ "caller": "T102",
+ "msg": "example[102]"
+ },{
+ "pri": 103,
+ "time": 1092727.000000,
+ "caller": "T103",
+ "msg": "example[103]"
+ },{
+ "pri": 104,
+ "time": 1124864.000000,
+ "caller": "T104",
+ "msg": "example[104]"
+ },{
+ "pri": 150,
+ "time": 4557523.000000,
+ "caller": "T105",
+ "msg": "example[105]"
+ }
+ ]
+}
diff --git a/tests/expected/dmesg/cid-kmsg-colors b/tests/expected/dmesg/cid-kmsg-colors
new file mode 100644
index 0000000..d3dbd1e
--- /dev/null
+++ b/tests/expected/dmesg/cid-kmsg-colors
@@ -0,0 +1,59 @@
+kern :emerg : [ 0.000000] [T1] Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000
+kern :alert : [ 0.000001] [T2] Command line: initrd=\ucode.img initrd=\initramfs-linux.img rw cryptdevice=/dev/nvme0n1p3:system:discard root=/dev/mapper/system
+kern :crit : [ 0.000002] [T3] BIOS-provided physical RAM map:
+kern :err : [ 0.000003] [T4] BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable
+kern :warn : [ 0.000004] [T5] BIOS-e820: [mem 0x000000000009f000-0x00000000000bffff] reserved
+kern :notice: [ 0.000005] [T6] BIOS-e820: [mem 0x0000000000100000-0x0000000009afffff] usable
+kern :info : [ 0.000006] [T7] BIOS-e820: [mem 0x0000000009b00000-0x0000000009dfffff] reserved
+kern :debug : [ 0.000007] [T8] BIOS-e820: [mem 0x0000000009e00000-0x0000000009efffff] usable
+kern :info : [ 0.000008] [T9] BIOS-e820: [mem 0x0000000009f00000-0x0000000009f3bfff] ACPI NVS
+kern :info : [ 0.000009] [T10] BIOS-e820: [mem 0x0000000009f3c000-0x000000004235ffff] usable
+kern :info : [ 0.000010] [T11] BIOS-e820: [mem 0x0000000042360000-0x000000004455ffff] reserved
+kern :info : [ 0.201607] [T12] smp: Bringing up secondary CPUs ...
+kern :info : [ 0.201607] [T13] smpboot: x86: Booting SMP configuration:
+kern :warn : [ 0.209670] [T14]  #1 #3 #5 #7
+kern :info : [ 0.212630] [T15] smp: Brought up 1 node, 16 CPUs
+kern :notice: [ 0.215936] [T16] audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1
+kern :info : [ 0.215937] [T17] thermal_sys: Registered thermal governor 'fair_share'
+kern :warn : [ 0.215966] [T18] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
+kern :info : [ 0.367657] [T19] ACPI: \_SB_.PCI0.GP19.NHI1.PWRS: New power resource
+kern :info : [ 0.368615] [T20] ACPI: \_SB_.PCI0.GP19.XHC4.PWRS: New power resource
+kern :info : [ 0.376316] [T21] ACPI: \_SB_.PRWL: New power resource
+kern :info : [ 0.376343] [T22] ACPI: \_SB_.PRWB: New power resource
+kern :info : [ 0.377373] [T23] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
+kern :info : [ 0.377378] [T24] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
+kern :info : [ 0.377569] [T25] acpi PNP0A08:00: _OSC: platform does not support [SHPCHotplug AER]
+kern :info : [ 0.377933] [T26] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME PCIeCapability LTR DPC]
+kern :info : [ 0.378458] [T27] PCI host bridge to bus 0000:00
+kern :info : [ 0.378459] [T28] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
+kern :info : [ 0.378461] [T29] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
+user :notice: [ 9.398562] [T30] user network daemon initialization complete
+daemon:info : [ 10.441520] [T31] systemd[1]: systemd 254.7-1.fc39 running in system mode
+daemon:info : [ 11.441524] [T32] systemd[1]: Detected architecture x86-64.
+daemon:info : [ 12.441525] [T33] systemd[1]: Running in initrd.
+daemon:info : [ 13.541598] [T34] systemd[1]: Hostname set to <catalina>.
+kern :info : [ 15.641860] [T35] usb 3-3: New USB device found, idVendor=1a40, idProduct=0101, bcdDevice= 1.11
+kern :err : [ 16.690000] [T36] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found.
+kern :err : [ 17.710000] [T37] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+syslog:info : [ 18.720000] [T38] systemd-journald[723]: Received client request to flush runtime journal.
+syslog:warn : [ 20.740000] [T39] systemd-journald[723]: File /var/log/journal/a124ea923b144109a12d557d5ac53179/system.journal corrupted or uncleanly shut down, renaming and replacing.
+syslog:info : [ 21.752348] [T40] systemd-journald[723]: /var/log/journal/ad7a2547ac0e4342a342e62a34a3eae4/user-1000.journal: Journal file uses a different sequence number ID, rotating.
+kern :warn : [ 24.761100] [T41] PEFILE: Unsigned PE binary
+kern :err : [ 35.768091] [T42] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+kern :info : [ 137.791785] [C1] usb 3-3.1: device firmware changed
+kern :info : [ 146.803248] [C2] usb 3-3.1: USB disconnect, device number 44
+kern :info : [ 148.821859] [C3] usb 3-3.1: New USB device found, idVendor=17ef, idProduct=6047, bcdDevice= 3.30
+kern :info : [ 149.840480] [C4] perf: interrupt took too long (2518 > 2500)
+kern :info : [ 150.853128] [C5] perf: interrupt took too long (3217 > 3147)
+kern :info : [ 153.859311] [C12] perf: interrupt took too long (3654 > 3239)
+kern :info : [ 155.861908] [C123] perf: interrupt took too long (3789 > 3545)
+kern :info : [ 158.870434] [C1234] perf: interrupt took too long (3891 > 3647)
+kern :info : [ 161.887625] [C12345] perf: interrupt took too long (3947 > 3789)
+kern :info : [ 163.898434] [C123456] perf: interrupt took too long (4011 > 3898)
+kern :info : [ 166.909842] [C1234567] perf: interrupt took too long (4174 > 3987)
+user :warn : [ 169.911147] [T123] User program Dmesg Test Message at warn priority
+user :warn : [ 178.927435] [T1234] User program Dmesg Test Message at warn priority
+user :notice: [ 185.943456] [T12345] User program Dmesg Test Message at notice priority
+user :info : [ 189.963238] [T123456] User program Dmesg Test Message at info priority
+user :debug : [ 207.987439] [T1234567] User program Dmesg Test Message at debug priority
+
diff --git a/tests/expected/dmesg/cid-kmsg-console-levels b/tests/expected/dmesg/cid-kmsg-console-levels
new file mode 100644
index 0000000..ef2e83c
--- /dev/null
+++ b/tests/expected/dmesg/cid-kmsg-console-levels
@@ -0,0 +1,146 @@
+Display console level: -1
+Display console level: 0
+[ 0.000000] [T1] Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000
+Display console level: 1
+[ 0.000001] [T2] Command line: initrd=\ucode.img initrd=\initramfs-linux.img rw cryptdevice=/dev/nvme0n1p3:system:discard root=/dev/mapper/system
+Display console level: 2
+[ 0.000002] [T3] BIOS-provided physical RAM map:
+Display console level: 3
+[ 0.000003] [T4] BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable
+[ 16.690000] [T36] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found.
+[ 17.710000] [T37] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+[ 35.768091] [T42] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+Display console level: 4
+[ 0.000004] [T5] BIOS-e820: [mem 0x000000000009f000-0x00000000000bffff] reserved
+[ 0.209670] [T14] #1 #3 #5 #7
+[ 0.215966] [T18] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
+[ 20.740000] [T39] systemd-journald[723]: File /var/log/journal/a124ea923b144109a12d557d5ac53179/system.journal corrupted or uncleanly shut down, renaming and replacing.
+[ 24.761100] [T41] PEFILE: Unsigned PE binary
+[ 169.911147] [T123] User program Dmesg Test Message at warn priority
+[ 178.927435] [T1234] User program Dmesg Test Message at warn priority
+Display console level: 5
+[ 0.000005] [T6] BIOS-e820: [mem 0x0000000000100000-0x0000000009afffff] usable
+[ 0.215936] [T16] audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1
+[ 9.398562] [T30] user network daemon initialization complete
+[ 185.943456] [T12345] User program Dmesg Test Message at notice priority
+Display console level: 6
+[ 0.000006] [T7] BIOS-e820: [mem 0x0000000009b00000-0x0000000009dfffff] reserved
+[ 0.000008] [T9] BIOS-e820: [mem 0x0000000009f00000-0x0000000009f3bfff] ACPI NVS
+[ 0.000009] [T10] BIOS-e820: [mem 0x0000000009f3c000-0x000000004235ffff] usable
+[ 0.000010] [T11] BIOS-e820: [mem 0x0000000042360000-0x000000004455ffff] reserved
+[ 0.201607] [T12] smp: Bringing up secondary CPUs ...
+[ 0.201607] [T13] smpboot: x86: Booting SMP configuration:
+[ 0.212630] [T15] smp: Brought up 1 node, 16 CPUs
+[ 0.215937] [T17] thermal_sys: Registered thermal governor 'fair_share'
+[ 0.367657] [T19] ACPI: \_SB_.PCI0.GP19.NHI1.PWRS: New power resource
+[ 0.368615] [T20] ACPI: \_SB_.PCI0.GP19.XHC4.PWRS: New power resource
+[ 0.376316] [T21] ACPI: \_SB_.PRWL: New power resource
+[ 0.376343] [T22] ACPI: \_SB_.PRWB: New power resource
+[ 0.377373] [T23] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
+[ 0.377378] [T24] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
+[ 0.377569] [T25] acpi PNP0A08:00: _OSC: platform does not support [SHPCHotplug AER]
+[ 0.377933] [T26] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME PCIeCapability LTR DPC]
+[ 0.378458] [T27] PCI host bridge to bus 0000:00
+[ 0.378459] [T28] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
+[ 0.378461] [T29] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
+[ 10.441520] [T31] systemd[1]: systemd 254.7-1.fc39 running in system mode
+[ 11.441524] [T32] systemd[1]: Detected architecture x86-64.
+[ 12.441525] [T33] systemd[1]: Running in initrd.
+[ 13.541598] [T34] systemd[1]: Hostname set to <catalina>.
+[ 15.641860] [T35] usb 3-3: New USB device found, idVendor=1a40, idProduct=0101, bcdDevice= 1.11
+[ 18.720000] [T38] systemd-journald[723]: Received client request to flush runtime journal.
+[ 21.752348] [T40] systemd-journald[723]: /var/log/journal/ad7a2547ac0e4342a342e62a34a3eae4/user-1000.journal: Journal file uses a different sequence number ID, rotating.
+[ 137.791785] [C1] usb 3-3.1: device firmware changed
+[ 146.803248] [C2] usb 3-3.1: USB disconnect, device number 44
+[ 148.821859] [C3] usb 3-3.1: New USB device found, idVendor=17ef, idProduct=6047, bcdDevice= 3.30
+[ 149.840480] [C4] perf: interrupt took too long (2518 > 2500)
+[ 150.853128] [C5] perf: interrupt took too long (3217 > 3147)
+[ 153.859311] [C12] perf: interrupt took too long (3654 > 3239)
+[ 155.861908] [C123] perf: interrupt took too long (3789 > 3545)
+[ 158.870434] [C1234] perf: interrupt took too long (3891 > 3647)
+[ 161.887625] [C12345] perf: interrupt took too long (3947 > 3789)
+[ 163.898434] [C123456] perf: interrupt took too long (4011 > 3898)
+[ 166.909842] [C1234567] perf: interrupt took too long (4174 > 3987)
+[ 189.963238] [T123456] User program Dmesg Test Message at info priority
+Display console level: 7
+[ 0.000007] [T8] BIOS-e820: [mem 0x0000000009e00000-0x0000000009efffff] usable
+[ 207.987439] [T1234567] User program Dmesg Test Message at debug priority
+
+Display console level: 8
+Display console level: err+
+[ 0.000000] [T1] Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000
+[ 0.000001] [T2] Command line: initrd=\ucode.img initrd=\initramfs-linux.img rw cryptdevice=/dev/nvme0n1p3:system:discard root=/dev/mapper/system
+[ 0.000002] [T3] BIOS-provided physical RAM map:
+[ 0.000003] [T4] BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable
+[ 16.690000] [T36] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found.
+[ 17.710000] [T37] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+[ 35.768091] [T42] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+Display console level: emerg+
+[ 0.000000] [T1] Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000
+Display console level: +err
+[ 0.000003] [T4] BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable
+[ 0.000004] [T5] BIOS-e820: [mem 0x000000000009f000-0x00000000000bffff] reserved
+[ 0.000005] [T6] BIOS-e820: [mem 0x0000000000100000-0x0000000009afffff] usable
+[ 0.000006] [T7] BIOS-e820: [mem 0x0000000009b00000-0x0000000009dfffff] reserved
+[ 0.000007] [T8] BIOS-e820: [mem 0x0000000009e00000-0x0000000009efffff] usable
+[ 0.000008] [T9] BIOS-e820: [mem 0x0000000009f00000-0x0000000009f3bfff] ACPI NVS
+[ 0.000009] [T10] BIOS-e820: [mem 0x0000000009f3c000-0x000000004235ffff] usable
+[ 0.000010] [T11] BIOS-e820: [mem 0x0000000042360000-0x000000004455ffff] reserved
+[ 0.201607] [T12] smp: Bringing up secondary CPUs ...
+[ 0.201607] [T13] smpboot: x86: Booting SMP configuration:
+[ 0.209670] [T14] #1 #3 #5 #7
+[ 0.212630] [T15] smp: Brought up 1 node, 16 CPUs
+[ 0.215936] [T16] audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1
+[ 0.215937] [T17] thermal_sys: Registered thermal governor 'fair_share'
+[ 0.215966] [T18] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
+[ 0.367657] [T19] ACPI: \_SB_.PCI0.GP19.NHI1.PWRS: New power resource
+[ 0.368615] [T20] ACPI: \_SB_.PCI0.GP19.XHC4.PWRS: New power resource
+[ 0.376316] [T21] ACPI: \_SB_.PRWL: New power resource
+[ 0.376343] [T22] ACPI: \_SB_.PRWB: New power resource
+[ 0.377373] [T23] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
+[ 0.377378] [T24] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
+[ 0.377569] [T25] acpi PNP0A08:00: _OSC: platform does not support [SHPCHotplug AER]
+[ 0.377933] [T26] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME PCIeCapability LTR DPC]
+[ 0.378458] [T27] PCI host bridge to bus 0000:00
+[ 0.378459] [T28] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
+[ 0.378461] [T29] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
+[ 9.398562] [T30] user network daemon initialization complete
+[ 10.441520] [T31] systemd[1]: systemd 254.7-1.fc39 running in system mode
+[ 11.441524] [T32] systemd[1]: Detected architecture x86-64.
+[ 12.441525] [T33] systemd[1]: Running in initrd.
+[ 13.541598] [T34] systemd[1]: Hostname set to <catalina>.
+[ 15.641860] [T35] usb 3-3: New USB device found, idVendor=1a40, idProduct=0101, bcdDevice= 1.11
+[ 16.690000] [T36] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found.
+[ 17.710000] [T37] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+[ 18.720000] [T38] systemd-journald[723]: Received client request to flush runtime journal.
+[ 20.740000] [T39] systemd-journald[723]: File /var/log/journal/a124ea923b144109a12d557d5ac53179/system.journal corrupted or uncleanly shut down, renaming and replacing.
+[ 21.752348] [T40] systemd-journald[723]: /var/log/journal/ad7a2547ac0e4342a342e62a34a3eae4/user-1000.journal: Journal file uses a different sequence number ID, rotating.
+[ 24.761100] [T41] PEFILE: Unsigned PE binary
+[ 35.768091] [T42] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+[ 137.791785] [C1] usb 3-3.1: device firmware changed
+[ 146.803248] [C2] usb 3-3.1: USB disconnect, device number 44
+[ 148.821859] [C3] usb 3-3.1: New USB device found, idVendor=17ef, idProduct=6047, bcdDevice= 3.30
+[ 149.840480] [C4] perf: interrupt took too long (2518 > 2500)
+[ 150.853128] [C5] perf: interrupt took too long (3217 > 3147)
+[ 153.859311] [C12] perf: interrupt took too long (3654 > 3239)
+[ 155.861908] [C123] perf: interrupt took too long (3789 > 3545)
+[ 158.870434] [C1234] perf: interrupt took too long (3891 > 3647)
+[ 161.887625] [C12345] perf: interrupt took too long (3947 > 3789)
+[ 163.898434] [C123456] perf: interrupt took too long (4011 > 3898)
+[ 166.909842] [C1234567] perf: interrupt took too long (4174 > 3987)
+[ 169.911147] [T123] User program Dmesg Test Message at warn priority
+[ 178.927435] [T1234] User program Dmesg Test Message at warn priority
+[ 185.943456] [T12345] User program Dmesg Test Message at notice priority
+[ 189.963238] [T123456] User program Dmesg Test Message at info priority
+[ 207.987439] [T1234567] User program Dmesg Test Message at debug priority
+
+Display console level: +debug
+[ 0.000007] [T8] BIOS-e820: [mem 0x0000000009e00000-0x0000000009efffff] usable
+[ 207.987439] [T1234567] User program Dmesg Test Message at debug priority
+
+Display console level: debug
+[ 0.000007] [T8] BIOS-e820: [mem 0x0000000009e00000-0x0000000009efffff] usable
+[ 207.987439] [T1234567] User program Dmesg Test Message at debug priority
+
+Display console level: + (invalid)
+test_dmesg: unknown level '+'
diff --git a/tests/expected/dmesg/cid-kmsg-decode b/tests/expected/dmesg/cid-kmsg-decode
new file mode 100644
index 0000000..e1cecfa
--- /dev/null
+++ b/tests/expected/dmesg/cid-kmsg-decode
@@ -0,0 +1,59 @@
+kern :emerg : [ 0.000000] [T1] Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000
+kern :alert : [ 0.000001] [T2] Command line: initrd=\ucode.img initrd=\initramfs-linux.img rw cryptdevice=/dev/nvme0n1p3:system:discard root=/dev/mapper/system
+kern :crit : [ 0.000002] [T3] BIOS-provided physical RAM map:
+kern :err : [ 0.000003] [T4] BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable
+kern :warn : [ 0.000004] [T5] BIOS-e820: [mem 0x000000000009f000-0x00000000000bffff] reserved
+kern :notice: [ 0.000005] [T6] BIOS-e820: [mem 0x0000000000100000-0x0000000009afffff] usable
+kern :info : [ 0.000006] [T7] BIOS-e820: [mem 0x0000000009b00000-0x0000000009dfffff] reserved
+kern :debug : [ 0.000007] [T8] BIOS-e820: [mem 0x0000000009e00000-0x0000000009efffff] usable
+kern :info : [ 0.000008] [T9] BIOS-e820: [mem 0x0000000009f00000-0x0000000009f3bfff] ACPI NVS
+kern :info : [ 0.000009] [T10] BIOS-e820: [mem 0x0000000009f3c000-0x000000004235ffff] usable
+kern :info : [ 0.000010] [T11] BIOS-e820: [mem 0x0000000042360000-0x000000004455ffff] reserved
+kern :info : [ 0.201607] [T12] smp: Bringing up secondary CPUs ...
+kern :info : [ 0.201607] [T13] smpboot: x86: Booting SMP configuration:
+kern :warn : [ 0.209670] [T14] #1 #3 #5 #7
+kern :info : [ 0.212630] [T15] smp: Brought up 1 node, 16 CPUs
+kern :notice: [ 0.215936] [T16] audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1
+kern :info : [ 0.215937] [T17] thermal_sys: Registered thermal governor 'fair_share'
+kern :warn : [ 0.215966] [T18] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
+kern :info : [ 0.367657] [T19] ACPI: \_SB_.PCI0.GP19.NHI1.PWRS: New power resource
+kern :info : [ 0.368615] [T20] ACPI: \_SB_.PCI0.GP19.XHC4.PWRS: New power resource
+kern :info : [ 0.376316] [T21] ACPI: \_SB_.PRWL: New power resource
+kern :info : [ 0.376343] [T22] ACPI: \_SB_.PRWB: New power resource
+kern :info : [ 0.377373] [T23] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
+kern :info : [ 0.377378] [T24] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
+kern :info : [ 0.377569] [T25] acpi PNP0A08:00: _OSC: platform does not support [SHPCHotplug AER]
+kern :info : [ 0.377933] [T26] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME PCIeCapability LTR DPC]
+kern :info : [ 0.378458] [T27] PCI host bridge to bus 0000:00
+kern :info : [ 0.378459] [T28] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
+kern :info : [ 0.378461] [T29] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
+user :notice: [ 9.398562] [T30] user network daemon initialization complete
+daemon:info : [ 10.441520] [T31] systemd[1]: systemd 254.7-1.fc39 running in system mode
+daemon:info : [ 11.441524] [T32] systemd[1]: Detected architecture x86-64.
+daemon:info : [ 12.441525] [T33] systemd[1]: Running in initrd.
+daemon:info : [ 13.541598] [T34] systemd[1]: Hostname set to <catalina>.
+kern :info : [ 15.641860] [T35] usb 3-3: New USB device found, idVendor=1a40, idProduct=0101, bcdDevice= 1.11
+kern :err : [ 16.690000] [T36] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found.
+kern :err : [ 17.710000] [T37] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+syslog:info : [ 18.720000] [T38] systemd-journald[723]: Received client request to flush runtime journal.
+syslog:warn : [ 20.740000] [T39] systemd-journald[723]: File /var/log/journal/a124ea923b144109a12d557d5ac53179/system.journal corrupted or uncleanly shut down, renaming and replacing.
+syslog:info : [ 21.752348] [T40] systemd-journald[723]: /var/log/journal/ad7a2547ac0e4342a342e62a34a3eae4/user-1000.journal: Journal file uses a different sequence number ID, rotating.
+kern :warn : [ 24.761100] [T41] PEFILE: Unsigned PE binary
+kern :err : [ 35.768091] [T42] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+kern :info : [ 137.791785] [C1] usb 3-3.1: device firmware changed
+kern :info : [ 146.803248] [C2] usb 3-3.1: USB disconnect, device number 44
+kern :info : [ 148.821859] [C3] usb 3-3.1: New USB device found, idVendor=17ef, idProduct=6047, bcdDevice= 3.30
+kern :info : [ 149.840480] [C4] perf: interrupt took too long (2518 > 2500)
+kern :info : [ 150.853128] [C5] perf: interrupt took too long (3217 > 3147)
+kern :info : [ 153.859311] [C12] perf: interrupt took too long (3654 > 3239)
+kern :info : [ 155.861908] [C123] perf: interrupt took too long (3789 > 3545)
+kern :info : [ 158.870434] [C1234] perf: interrupt took too long (3891 > 3647)
+kern :info : [ 161.887625] [C12345] perf: interrupt took too long (3947 > 3789)
+kern :info : [ 163.898434] [C123456] perf: interrupt took too long (4011 > 3898)
+kern :info : [ 166.909842] [C1234567] perf: interrupt took too long (4174 > 3987)
+user :warn : [ 169.911147] [T123] User program Dmesg Test Message at warn priority
+user :warn : [ 178.927435] [T1234] User program Dmesg Test Message at warn priority
+user :notice: [ 185.943456] [T12345] User program Dmesg Test Message at notice priority
+user :info : [ 189.963238] [T123456] User program Dmesg Test Message at info priority
+user :debug : [ 207.987439] [T1234567] User program Dmesg Test Message at debug priority
+
diff --git a/tests/expected/dmesg/cid-kmsg-delta b/tests/expected/dmesg/cid-kmsg-delta
new file mode 100644
index 0000000..e767b2b
--- /dev/null
+++ b/tests/expected/dmesg/cid-kmsg-delta
@@ -0,0 +1,59 @@
+[ 0.000000 < 0.000000>] [T1] Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000
+[ 0.000001 < 0.000000>] [T2] Command line: initrd=\ucode.img initrd=\initramfs-linux.img rw cryptdevice=/dev/nvme0n1p3:system:discard root=/dev/mapper/system
+[ 0.000002 < 0.000001>] [T3] BIOS-provided physical RAM map:
+[ 0.000003 < 0.000001>] [T4] BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable
+[ 0.000004 < 0.000001>] [T5] BIOS-e820: [mem 0x000000000009f000-0x00000000000bffff] reserved
+[ 0.000005 < 0.000001>] [T6] BIOS-e820: [mem 0x0000000000100000-0x0000000009afffff] usable
+[ 0.000006 < 0.000001>] [T7] BIOS-e820: [mem 0x0000000009b00000-0x0000000009dfffff] reserved
+[ 0.000007 < 0.000001>] [T8] BIOS-e820: [mem 0x0000000009e00000-0x0000000009efffff] usable
+[ 0.000008 < 0.000001>] [T9] BIOS-e820: [mem 0x0000000009f00000-0x0000000009f3bfff] ACPI NVS
+[ 0.000009 < 0.000001>] [T10] BIOS-e820: [mem 0x0000000009f3c000-0x000000004235ffff] usable
+[ 0.000010 < 0.000001>] [T11] BIOS-e820: [mem 0x0000000042360000-0x000000004455ffff] reserved
+[ 0.201607 < 0.201597>] [T12] smp: Bringing up secondary CPUs ...
+[ 0.201607 < 0.000000>] [T13] smpboot: x86: Booting SMP configuration:
+[ 0.209670 < 0.008063>] [T14] #1 #3 #5 #7
+[ 0.212630 < 0.002960>] [T15] smp: Brought up 1 node, 16 CPUs
+[ 0.215936 < 0.003306>] [T16] audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1
+[ 0.215937 < 0.000001>] [T17] thermal_sys: Registered thermal governor 'fair_share'
+[ 0.215966 < 0.000029>] [T18] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
+[ 0.367657 < 0.151691>] [T19] ACPI: \_SB_.PCI0.GP19.NHI1.PWRS: New power resource
+[ 0.368615 < 0.000958>] [T20] ACPI: \_SB_.PCI0.GP19.XHC4.PWRS: New power resource
+[ 0.376316 < 0.007701>] [T21] ACPI: \_SB_.PRWL: New power resource
+[ 0.376343 < 0.000027>] [T22] ACPI: \_SB_.PRWB: New power resource
+[ 0.377373 < 0.001030>] [T23] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
+[ 0.377378 < 0.000005>] [T24] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
+[ 0.377569 < 0.000191>] [T25] acpi PNP0A08:00: _OSC: platform does not support [SHPCHotplug AER]
+[ 0.377933 < 0.000364>] [T26] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME PCIeCapability LTR DPC]
+[ 0.378458 < 0.000525>] [T27] PCI host bridge to bus 0000:00
+[ 0.378459 < 0.000001>] [T28] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
+[ 0.378461 < 0.000002>] [T29] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
+[ 9.398562 < 9.020101>] [T30] user network daemon initialization complete
+[ 10.441520 < 1.042958>] [T31] systemd[1]: systemd 254.7-1.fc39 running in system mode
+[ 11.441524 < 1.000004>] [T32] systemd[1]: Detected architecture x86-64.
+[ 12.441525 < 1.000001>] [T33] systemd[1]: Running in initrd.
+[ 13.541598 < 1.100073>] [T34] systemd[1]: Hostname set to <catalina>.
+[ 15.641860 < 2.100262>] [T35] usb 3-3: New USB device found, idVendor=1a40, idProduct=0101, bcdDevice= 1.11
+[ 16.690000 < 1.048140>] [T36] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found.
+[ 17.710000 < 1.020000>] [T37] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+[ 18.720000 < 1.010000>] [T38] systemd-journald[723]: Received client request to flush runtime journal.
+[ 20.740000 < 2.020000>] [T39] systemd-journald[723]: File /var/log/journal/a124ea923b144109a12d557d5ac53179/system.journal corrupted or uncleanly shut down, renaming and replacing.
+[ 21.752348 < 1.012348>] [T40] systemd-journald[723]: /var/log/journal/ad7a2547ac0e4342a342e62a34a3eae4/user-1000.journal: Journal file uses a different sequence number ID, rotating.
+[ 24.761100 < 3.008752>] [T41] PEFILE: Unsigned PE binary
+[ 35.768091 < 11.006991>] [T42] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+[ 137.791785 < 102.023694>] [C1] usb 3-3.1: device firmware changed
+[ 146.803248 < 9.011463>] [C2] usb 3-3.1: USB disconnect, device number 44
+[ 148.821859 < 2.018611>] [C3] usb 3-3.1: New USB device found, idVendor=17ef, idProduct=6047, bcdDevice= 3.30
+[ 149.840480 < 1.018621>] [C4] perf: interrupt took too long (2518 > 2500)
+[ 150.853128 < 1.012648>] [C5] perf: interrupt took too long (3217 > 3147)
+[ 153.859311 < 3.006183>] [C12] perf: interrupt took too long (3654 > 3239)
+[ 155.861908 < 2.002597>] [C123] perf: interrupt took too long (3789 > 3545)
+[ 158.870434 < 3.008526>] [C1234] perf: interrupt took too long (3891 > 3647)
+[ 161.887625 < 3.017191>] [C12345] perf: interrupt took too long (3947 > 3789)
+[ 163.898434 < 2.010809>] [C123456] perf: interrupt took too long (4011 > 3898)
+[ 166.909842 < 3.011408>] [C1234567] perf: interrupt took too long (4174 > 3987)
+[ 169.911147 < 3.001305>] [T123] User program Dmesg Test Message at warn priority
+[ 178.927435 < 9.016288>] [T1234] User program Dmesg Test Message at warn priority
+[ 185.943456 < 7.016021>] [T12345] User program Dmesg Test Message at notice priority
+[ 189.963238 < 4.019782>] [T123456] User program Dmesg Test Message at info priority
+[ 207.987439 < 18.024201>] [T1234567] User program Dmesg Test Message at debug priority
+
diff --git a/tests/expected/dmesg/cid-kmsg-facilities b/tests/expected/dmesg/cid-kmsg-facilities
new file mode 100644
index 0000000..bacfbd1
--- /dev/null
+++ b/tests/expected/dmesg/cid-kmsg-facilities
@@ -0,0 +1,73 @@
+Display facility list: -1
+Display facility list: 0
+kern :emerg : [ 0.000000] [T1] Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000
+kern :alert : [ 0.000001] [T2] Command line: initrd=\ucode.img initrd=\initramfs-linux.img rw cryptdevice=/dev/nvme0n1p3:system:discard root=/dev/mapper/system
+kern :crit : [ 0.000002] [T3] BIOS-provided physical RAM map:
+kern :err : [ 0.000003] [T4] BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable
+kern :warn : [ 0.000004] [T5] BIOS-e820: [mem 0x000000000009f000-0x00000000000bffff] reserved
+kern :notice: [ 0.000005] [T6] BIOS-e820: [mem 0x0000000000100000-0x0000000009afffff] usable
+kern :info : [ 0.000006] [T7] BIOS-e820: [mem 0x0000000009b00000-0x0000000009dfffff] reserved
+kern :debug : [ 0.000007] [T8] BIOS-e820: [mem 0x0000000009e00000-0x0000000009efffff] usable
+kern :info : [ 0.000008] [T9] BIOS-e820: [mem 0x0000000009f00000-0x0000000009f3bfff] ACPI NVS
+kern :info : [ 0.000009] [T10] BIOS-e820: [mem 0x0000000009f3c000-0x000000004235ffff] usable
+kern :info : [ 0.000010] [T11] BIOS-e820: [mem 0x0000000042360000-0x000000004455ffff] reserved
+kern :info : [ 0.201607] [T12] smp: Bringing up secondary CPUs ...
+kern :info : [ 0.201607] [T13] smpboot: x86: Booting SMP configuration:
+kern :warn : [ 0.209670] [T14] #1 #3 #5 #7
+kern :info : [ 0.212630] [T15] smp: Brought up 1 node, 16 CPUs
+kern :notice: [ 0.215936] [T16] audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1
+kern :info : [ 0.215937] [T17] thermal_sys: Registered thermal governor 'fair_share'
+kern :warn : [ 0.215966] [T18] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
+kern :info : [ 0.367657] [T19] ACPI: \_SB_.PCI0.GP19.NHI1.PWRS: New power resource
+kern :info : [ 0.368615] [T20] ACPI: \_SB_.PCI0.GP19.XHC4.PWRS: New power resource
+kern :info : [ 0.376316] [T21] ACPI: \_SB_.PRWL: New power resource
+kern :info : [ 0.376343] [T22] ACPI: \_SB_.PRWB: New power resource
+kern :info : [ 0.377373] [T23] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
+kern :info : [ 0.377378] [T24] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
+kern :info : [ 0.377569] [T25] acpi PNP0A08:00: _OSC: platform does not support [SHPCHotplug AER]
+kern :info : [ 0.377933] [T26] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME PCIeCapability LTR DPC]
+kern :info : [ 0.378458] [T27] PCI host bridge to bus 0000:00
+kern :info : [ 0.378459] [T28] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
+kern :info : [ 0.378461] [T29] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
+kern :info : [ 15.641860] [T35] usb 3-3: New USB device found, idVendor=1a40, idProduct=0101, bcdDevice= 1.11
+kern :err : [ 16.690000] [T36] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found.
+kern :err : [ 17.710000] [T37] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+kern :warn : [ 24.761100] [T41] PEFILE: Unsigned PE binary
+kern :err : [ 35.768091] [T42] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+kern :info : [ 137.791785] [C1] usb 3-3.1: device firmware changed
+kern :info : [ 146.803248] [C2] usb 3-3.1: USB disconnect, device number 44
+kern :info : [ 148.821859] [C3] usb 3-3.1: New USB device found, idVendor=17ef, idProduct=6047, bcdDevice= 3.30
+kern :info : [ 149.840480] [C4] perf: interrupt took too long (2518 > 2500)
+kern :info : [ 150.853128] [C5] perf: interrupt took too long (3217 > 3147)
+kern :info : [ 153.859311] [C12] perf: interrupt took too long (3654 > 3239)
+kern :info : [ 155.861908] [C123] perf: interrupt took too long (3789 > 3545)
+kern :info : [ 158.870434] [C1234] perf: interrupt took too long (3891 > 3647)
+kern :info : [ 161.887625] [C12345] perf: interrupt took too long (3947 > 3789)
+kern :info : [ 163.898434] [C123456] perf: interrupt took too long (4011 > 3898)
+kern :info : [ 166.909842] [C1234567] perf: interrupt took too long (4174 > 3987)
+Display facility list: 1
+user :notice: [ 9.398562] [T30] user network daemon initialization complete
+user :warn : [ 169.911147] [T123] User program Dmesg Test Message at warn priority
+user :warn : [ 178.927435] [T1234] User program Dmesg Test Message at warn priority
+user :notice: [ 185.943456] [T12345] User program Dmesg Test Message at notice priority
+user :info : [ 189.963238] [T123456] User program Dmesg Test Message at info priority
+user :debug : [ 207.987439] [T1234567] User program Dmesg Test Message at debug priority
+
+Display facility list: 2
+Display facility list: 3
+daemon:info : [ 10.441520] [T31] systemd[1]: systemd 254.7-1.fc39 running in system mode
+daemon:info : [ 11.441524] [T32] systemd[1]: Detected architecture x86-64.
+daemon:info : [ 12.441525] [T33] systemd[1]: Running in initrd.
+daemon:info : [ 13.541598] [T34] systemd[1]: Hostname set to <catalina>.
+Display facility list: 4
+Display facility list: 5
+syslog:info : [ 18.720000] [T38] systemd-journald[723]: Received client request to flush runtime journal.
+syslog:warn : [ 20.740000] [T39] systemd-journald[723]: File /var/log/journal/a124ea923b144109a12d557d5ac53179/system.journal corrupted or uncleanly shut down, renaming and replacing.
+syslog:info : [ 21.752348] [T40] systemd-journald[723]: /var/log/journal/ad7a2547ac0e4342a342e62a34a3eae4/user-1000.journal: Journal file uses a different sequence number ID, rotating.
+Display facility list: 6
+Display facility list: 7
+Display facility list: 8
+Display facility list: 9
+Display facility list: 10
+Display facility list: 11
+Display facility list: 12
diff --git a/tests/expected/dmesg/cid-kmsg-indentation b/tests/expected/dmesg/cid-kmsg-indentation
new file mode 100644
index 0000000..28c0199
--- /dev/null
+++ b/tests/expected/dmesg/cid-kmsg-indentation
@@ -0,0 +1,28 @@
+[ 0.000000] [T0] line zero
+[ 1.000000] [T1] new
+[ 2.000000] [T2] two
+[ 3.000000] [T3] three
+[ 0.000000] [T0] line zero
+[ 1.000000] [T1] new
+[ 2.000000] [T2] two
+[ 3.000000] [T3] three
+[< 0.000000>] [T0] line zero
+[< 0.000000>] [T1] new
+[< 1.000000>] [T2] two
+[< 1.000000>] [T3] three
+[T0] line zero
+[T1] new
+[T2] two
+[T3] three
+[Feb13 23:31] [T0] line zero
+[ +0.000000] [T1] new
+[ +1.000000] [T2] two
+[ +1.000000] [T3] three
+[Fri Feb 13 23:31:30 2009] [T0] line zero
+[Fri Feb 13 23:31:31 2009] [T1] new
+[Fri Feb 13 23:31:32 2009] [T2] two
+[Fri Feb 13 23:31:33 2009] [T3] three
+2009-02-13T23:31:30,123456+00:00 [T0] line zero
+2009-02-13T23:31:31,123456+00:00 [T1] new
+2009-02-13T23:31:32,123456+00:00 [T2] two
+2009-02-13T23:31:33,123456+00:00 [T3] three
diff --git a/tests/expected/dmesg/cid-kmsg-json b/tests/expected/dmesg/cid-kmsg-json
new file mode 100644
index 0000000..942506c
--- /dev/null
+++ b/tests/expected/dmesg/cid-kmsg-json
@@ -0,0 +1,295 @@
+{
+ "dmesg": [
+ {
+ "pri": 0,
+ "time": 0.000000,
+ "caller": "T1",
+ "msg": "Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000"
+ },{
+ "pri": 1,
+ "time": 0.000001,
+ "caller": "T2",
+ "msg": "Command line: initrd=\\ucode.img initrd=\\initramfs-linux.img rw cryptdevice=/dev/nvme0n1p3:system:discard root=/dev/mapper/system"
+ },{
+ "pri": 2,
+ "time": 0.000002,
+ "caller": "T3",
+ "msg": "BIOS-provided physical RAM map:"
+ },{
+ "pri": 3,
+ "time": 0.000003,
+ "caller": "T4",
+ "msg": "BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable"
+ },{
+ "pri": 4,
+ "time": 0.000004,
+ "caller": "T5",
+ "msg": "BIOS-e820: [mem 0x000000000009f000-0x00000000000bffff] reserved"
+ },{
+ "pri": 5,
+ "time": 0.000005,
+ "caller": "T6",
+ "msg": "BIOS-e820: [mem 0x0000000000100000-0x0000000009afffff] usable"
+ },{
+ "pri": 6,
+ "time": 0.000006,
+ "caller": "T7",
+ "msg": "BIOS-e820: [mem 0x0000000009b00000-0x0000000009dfffff] reserved"
+ },{
+ "pri": 7,
+ "time": 0.000007,
+ "caller": "T8",
+ "msg": "BIOS-e820: [mem 0x0000000009e00000-0x0000000009efffff] usable"
+ },{
+ "pri": 6,
+ "time": 0.000008,
+ "caller": "T9",
+ "msg": "BIOS-e820: [mem 0x0000000009f00000-0x0000000009f3bfff] ACPI NVS"
+ },{
+ "pri": 6,
+ "time": 0.000009,
+ "caller": "T10",
+ "msg": "BIOS-e820: [mem 0x0000000009f3c000-0x000000004235ffff] usable"
+ },{
+ "pri": 6,
+ "time": 0.000010,
+ "caller": "T11",
+ "msg": "BIOS-e820: [mem 0x0000000042360000-0x000000004455ffff] reserved"
+ },{
+ "pri": 6,
+ "time": 0.201607,
+ "caller": "T12",
+ "msg": "smp: Bringing up secondary CPUs ..."
+ },{
+ "pri": 6,
+ "time": 0.201607,
+ "caller": "T13",
+ "msg": "smpboot: x86: Booting SMP configuration:"
+ },{
+ "pri": 4,
+ "time": 0.209670,
+ "caller": "T14",
+ "msg": " #1 #3 #5 #7"
+ },{
+ "pri": 6,
+ "time": 0.212630,
+ "caller": "T15",
+ "msg": "smp: Brought up 1 node, 16 CPUs"
+ },{
+ "pri": 5,
+ "time": 0.215936,
+ "caller": "T16",
+ "msg": "audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1"
+ },{
+ "pri": 6,
+ "time": 0.215937,
+ "caller": "T17",
+ "msg": "thermal_sys: Registered thermal governor 'fair_share'"
+ },{
+ "pri": 4,
+ "time": 0.215966,
+ "caller": "T18",
+ "msg": "ENERGY_PERF_BIAS: Set to 'normal', was 'performance'"
+ },{
+ "pri": 6,
+ "time": 0.367657,
+ "caller": "T19",
+ "msg": "ACPI: \\_SB_.PCI0.GP19.NHI1.PWRS: New power resource"
+ },{
+ "pri": 6,
+ "time": 0.368615,
+ "caller": "T20",
+ "msg": "ACPI: \\_SB_.PCI0.GP19.XHC4.PWRS: New power resource"
+ },{
+ "pri": 6,
+ "time": 0.376316,
+ "caller": "T21",
+ "msg": "ACPI: \\_SB_.PRWL: New power resource"
+ },{
+ "pri": 6,
+ "time": 0.376343,
+ "caller": "T22",
+ "msg": "ACPI: \\_SB_.PRWB: New power resource"
+ },{
+ "pri": 6,
+ "time": 0.377373,
+ "caller": "T23",
+ "msg": "ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])"
+ },{
+ "pri": 6,
+ "time": 0.377378,
+ "caller": "T24",
+ "msg": "acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]"
+ },{
+ "pri": 6,
+ "time": 0.377569,
+ "caller": "T25",
+ "msg": "acpi PNP0A08:00: _OSC: platform does not support [SHPCHotplug AER]"
+ },{
+ "pri": 6,
+ "time": 0.377933,
+ "caller": "T26",
+ "msg": "acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME PCIeCapability LTR DPC]"
+ },{
+ "pri": 6,
+ "time": 0.378458,
+ "caller": "T27",
+ "msg": "PCI host bridge to bus 0000:00"
+ },{
+ "pri": 6,
+ "time": 0.378459,
+ "caller": "T28",
+ "msg": "pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]"
+ },{
+ "pri": 6,
+ "time": 0.378461,
+ "caller": "T29",
+ "msg": "pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]"
+ },{
+ "pri": 13,
+ "time": 9.398562,
+ "caller": "T30",
+ "msg": "user network daemon initialization complete"
+ },{
+ "pri": 30,
+ "time": 10.441520,
+ "caller": "T31",
+ "msg": "systemd[1]: systemd 254.7-1.fc39 running in system mode"
+ },{
+ "pri": 30,
+ "time": 11.441524,
+ "caller": "T32",
+ "msg": "systemd[1]: Detected architecture x86-64."
+ },{
+ "pri": 30,
+ "time": 12.441525,
+ "caller": "T33",
+ "msg": "systemd[1]: Running in initrd."
+ },{
+ "pri": 30,
+ "time": 13.541598,
+ "caller": "T34",
+ "msg": "systemd[1]: Hostname set to <catalina>."
+ },{
+ "pri": 6,
+ "time": 15.641860,
+ "caller": "T35",
+ "msg": "usb 3-3: New USB device found, idVendor=1a40, idProduct=0101, bcdDevice= 1.11"
+ },{
+ "pri": 3,
+ "time": 16.690000,
+ "caller": "T36",
+ "msg": "Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found."
+ },{
+ "pri": 3,
+ "time": 17.710000,
+ "caller": "T37",
+ "msg": "snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535"
+ },{
+ "pri": 46,
+ "time": 18.720000,
+ "caller": "T38",
+ "msg": "systemd-journald[723]: Received client request to flush runtime journal."
+ },{
+ "pri": 44,
+ "time": 20.740000,
+ "caller": "T39",
+ "msg": "systemd-journald[723]: File /var/log/journal/a124ea923b144109a12d557d5ac53179/system.journal corrupted or uncleanly shut down, renaming and replacing."
+ },{
+ "pri": 46,
+ "time": 21.752348,
+ "caller": "T40",
+ "msg": "systemd-journald[723]: /var/log/journal/ad7a2547ac0e4342a342e62a34a3eae4/user-1000.journal: Journal file uses a different sequence number ID, rotating."
+ },{
+ "pri": 4,
+ "time": 24.761100,
+ "caller": "T41",
+ "msg": "PEFILE: Unsigned PE binary"
+ },{
+ "pri": 3,
+ "time": 35.768091,
+ "caller": "T42",
+ "msg": "snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535"
+ },{
+ "pri": 6,
+ "time": 137.791785,
+ "caller": "C1",
+ "msg": "usb 3-3.1: device firmware changed"
+ },{
+ "pri": 6,
+ "time": 146.803248,
+ "caller": "C2",
+ "msg": "usb 3-3.1: USB disconnect, device number 44"
+ },{
+ "pri": 6,
+ "time": 148.821859,
+ "caller": "C3",
+ "msg": "usb 3-3.1: New USB device found, idVendor=17ef, idProduct=6047, bcdDevice= 3.30"
+ },{
+ "pri": 6,
+ "time": 149.840480,
+ "caller": "C4",
+ "msg": "perf: interrupt took too long (2518 > 2500)"
+ },{
+ "pri": 6,
+ "time": 150.853128,
+ "caller": "C5",
+ "msg": "perf: interrupt took too long (3217 > 3147)"
+ },{
+ "pri": 6,
+ "time": 153.859311,
+ "caller": "C12",
+ "msg": "perf: interrupt took too long (3654 > 3239)"
+ },{
+ "pri": 6,
+ "time": 155.861908,
+ "caller": "C123",
+ "msg": "perf: interrupt took too long (3789 > 3545)"
+ },{
+ "pri": 6,
+ "time": 158.870434,
+ "caller": "C1234",
+ "msg": "perf: interrupt took too long (3891 > 3647)"
+ },{
+ "pri": 6,
+ "time": 161.887625,
+ "caller": "C12345",
+ "msg": "perf: interrupt took too long (3947 > 3789)"
+ },{
+ "pri": 6,
+ "time": 163.898434,
+ "caller": "C123456",
+ "msg": "perf: interrupt took too long (4011 > 3898)"
+ },{
+ "pri": 6,
+ "time": 166.909842,
+ "caller": "C1234567",
+ "msg": "perf: interrupt took too long (4174 > 3987)"
+ },{
+ "pri": 12,
+ "time": 169.911147,
+ "caller": "T123",
+ "msg": "User program Dmesg Test Message at warn priority"
+ },{
+ "pri": 12,
+ "time": 178.927435,
+ "caller": "T1234",
+ "msg": "User program Dmesg Test Message at warn priority"
+ },{
+ "pri": 13,
+ "time": 185.943456,
+ "caller": "T12345",
+ "msg": "User program Dmesg Test Message at notice priority"
+ },{
+ "pri": 14,
+ "time": 189.963238,
+ "caller": "T123456",
+ "msg": "User program Dmesg Test Message at info priority"
+ },{
+ "pri": 15,
+ "time": 207.987439,
+ "caller": "T1234567",
+ "msg": "User program Dmesg Test Message at debug priority\n"
+ }
+ ]
+}
diff --git a/tests/expected/dmesg/cid-kmsg-limit b/tests/expected/dmesg/cid-kmsg-limit
new file mode 100644
index 0000000..372432d
--- /dev/null
+++ b/tests/expected/dmesg/cid-kmsg-limit
@@ -0,0 +1,31 @@
+[ 0.201607] [T12] smp: Bringing up secondary CPUs ...
+[ 0.201607] [T13] smpboot: x86: Booting SMP configuration:
+[ 0.209670] [T14] #1 #3 #5 #7
+[ 0.212630] [T15] smp: Brought up 1 node, 16 CPUs
+[ 0.215936] [T16] audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1
+[ 0.215937] [T17] thermal_sys: Registered thermal governor 'fair_share'
+[ 0.215966] [T18] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
+[ 0.367657] [T19] ACPI: \_SB_.PCI0.GP19.NHI1.PWRS: New power resource
+[ 0.368615] [T20] ACPI: \_SB_.PCI0.GP19.XHC4.PWRS: New power resource
+[ 0.376316] [T21] ACPI: \_SB_.PRWL: New power resource
+[ 0.376343] [T22] ACPI: \_SB_.PRWB: New power resource
+[ 0.377373] [T23] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
+[ 0.377378] [T24] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
+[ 0.377569] [T25] acpi PNP0A08:00: _OSC: platform does not support [SHPCHotplug AER]
+[ 0.377933] [T26] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME PCIeCapability LTR DPC]
+[ 0.378458] [T27] PCI host bridge to bus 0000:00
+[ 0.378459] [T28] pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
+[ 0.378461] [T29] pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
+[ 9.398562] [T30] user network daemon initialization complete
+[ 10.441520] [T31] systemd[1]: systemd 254.7-1.fc39 running in system mode
+[ 11.441524] [T32] systemd[1]: Detected architecture x86-64.
+[ 12.441525] [T33] systemd[1]: Running in initrd.
+[ 13.541598] [T34] systemd[1]: Hostname set to <catalina>.
+[ 15.641860] [T35] usb 3-3: New USB device found, idVendor=1a40, idProduct=0101, bcdDevice= 1.11
+[ 16.690000] [T36] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found.
+[ 17.710000] [T37] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
+[ 18.720000] [T38] systemd-journald[723]: Received client request to flush runtime journal.
+[ 20.740000] [T39] systemd-journald[723]: File /var/log/journal/a124ea923b144109a12d557d5ac53179/system.journal corrupted or uncleanly shut down, renaming and replacing.
+[ 21.752348] [T40] systemd-journald[723]: /var/log/journal/ad7a2547ac0e4342a342e62a34a3eae4/user-1000.journal: Journal file uses a different sequence number ID, rotating.
+[ 24.761100] [T41] PEFILE: Unsigned PE binary
+[ 35.768091] [T42] snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535
diff --git a/tests/expected/dmesg/colors b/tests/expected/dmesg/colors
index 40aca73..7a5035e 100644
--- a/tests/expected/dmesg/colors
+++ b/tests/expected/dmesg/colors
@@ -94,12 +94,13 @@ ftp :warn : [778688.000000] example[92]
ftp :notice: [804357.000000] example[93]
ftp :info : [830584.000000] example[94]
ftp :debug : [857375.000000] example[95]
-[884736.000000] example[96]
-[912673.000000] example[97]
-[941192.000000] example[98]
-[970299.000000] example[99]
-[1000000.000000] example[100]
-[1030301.000000] example[101]
-[1061208.000000] example[102]
-[1092727.000000] example[103]
-[1124864.000000] example[104]
+res0 :emerg : [884736.000000] example[96]
+res0 :alert : [912673.000000] example[97]
+res0 :crit : [941192.000000] example[98]
+res0 :err : [970299.000000] example[99]
+res0 :warn : [1000000.000000] example[100]
+res0 :notice: [1030301.000000] example[101]
+res0 :info : [1061208.000000] example[102]
+res0 :debug : [1092727.000000] example[103]
+res1 :emerg : [1124864.000000] example[104]
+local2:info : [4557523.000000] example[105]
diff --git a/tests/expected/dmesg/console-levels b/tests/expected/dmesg/console-levels
index 43615f8..7229e8c 100644
--- a/tests/expected/dmesg/console-levels
+++ b/tests/expected/dmesg/console-levels
@@ -11,6 +11,7 @@
[512000.000000] example[80]
[681472.000000] example[88]
[884736.000000] example[96]
+[1124864.000000] example[104]
[ 1.000000] example[1]
[ 729.000000] example[9]
[ 4913.000000] example[17]
@@ -89,6 +90,7 @@
[636056.000000] example[86]
[830584.000000] example[94]
[1061208.000000] example[102]
+[4557523.000000] example[105]
[ 343.000000] example[7]
[ 3375.000000] example[15]
[12167.000000] example[23]
@@ -154,6 +156,7 @@
[912673.000000] example[97]
[941192.000000] example[98]
[970299.000000] example[99]
+[1124864.000000] example[104]
[ 0.000000] example[0]
[ 512.000000] example[8]
[ 4096.000000] example[16]
@@ -167,6 +170,7 @@
[512000.000000] example[80]
[681472.000000] example[88]
[884736.000000] example[96]
+[1124864.000000] example[104]
[ 27.000000] example[3]
[ 64.000000] example[4]
[ 125.000000] example[5]
@@ -232,6 +236,7 @@
[1030301.000000] example[101]
[1061208.000000] example[102]
[1092727.000000] example[103]
+[4557523.000000] example[105]
[ 343.000000] example[7]
[ 3375.000000] example[15]
[12167.000000] example[23]
diff --git a/tests/expected/dmesg/decode b/tests/expected/dmesg/decode
index f3541a6..f8088d0 100644
--- a/tests/expected/dmesg/decode
+++ b/tests/expected/dmesg/decode
@@ -94,12 +94,13 @@ ftp :warn : [778688.000000] example[92]
ftp :notice: [804357.000000] example[93]
ftp :info : [830584.000000] example[94]
ftp :debug : [857375.000000] example[95]
-[884736.000000] example[96]
-[912673.000000] example[97]
-[941192.000000] example[98]
-[970299.000000] example[99]
-[1000000.000000] example[100]
-[1030301.000000] example[101]
-[1061208.000000] example[102]
-[1092727.000000] example[103]
-[1124864.000000] example[104]
+res0 :emerg : [884736.000000] example[96]
+res0 :alert : [912673.000000] example[97]
+res0 :crit : [941192.000000] example[98]
+res0 :err : [970299.000000] example[99]
+res0 :warn : [1000000.000000] example[100]
+res0 :notice: [1030301.000000] example[101]
+res0 :info : [1061208.000000] example[102]
+res0 :debug : [1092727.000000] example[103]
+res1 :emerg : [1124864.000000] example[104]
+local2:info : [4557523.000000] example[105]
diff --git a/tests/expected/dmesg/delta b/tests/expected/dmesg/delta
index 01dfec3..d90d494 100644
--- a/tests/expected/dmesg/delta
+++ b/tests/expected/dmesg/delta
@@ -103,3 +103,4 @@
[1061208.000000 <30907.000000>] example[102]
[1092727.000000 <31519.000000>] example[103]
[1124864.000000 <32137.000000>] example[104]
+[4557523.000000 <3432659.000000>] example[105]
diff --git a/tests/expected/dmesg/facilities b/tests/expected/dmesg/facilities
index 9733e56..d5c4c43 100644
--- a/tests/expected/dmesg/facilities
+++ b/tests/expected/dmesg/facilities
@@ -94,3 +94,11 @@
[804357.000000] example[93]
[830584.000000] example[94]
[857375.000000] example[95]
+[884736.000000] example[96]
+[912673.000000] example[97]
+[941192.000000] example[98]
+[970299.000000] example[99]
+[1000000.000000] example[100]
+[1030301.000000] example[101]
+[1061208.000000] example[102]
+[1092727.000000] example[103]
diff --git a/tests/expected/dmesg/json b/tests/expected/dmesg/json
new file mode 100644
index 0000000..894d629
--- /dev/null
+++ b/tests/expected/dmesg/json
@@ -0,0 +1,429 @@
+{
+ "dmesg": [
+ {
+ "pri": 0,
+ "time": 0.000000,
+ "msg": "example[0]"
+ },{
+ "pri": 1,
+ "time": 1.000000,
+ "msg": "example[1]"
+ },{
+ "pri": 2,
+ "time": 8.000000,
+ "msg": "example[2]"
+ },{
+ "pri": 3,
+ "time": 27.000000,
+ "msg": "example[3]"
+ },{
+ "pri": 4,
+ "time": 64.000000,
+ "msg": "example[4]"
+ },{
+ "pri": 5,
+ "time": 125.000000,
+ "msg": "example[5]"
+ },{
+ "pri": 6,
+ "time": 216.000000,
+ "msg": "example[6]"
+ },{
+ "pri": 7,
+ "time": 343.000000,
+ "msg": "example[7]"
+ },{
+ "pri": 8,
+ "time": 512.000000,
+ "msg": "example[8]"
+ },{
+ "pri": 9,
+ "time": 729.000000,
+ "msg": "example[9]"
+ },{
+ "pri": 10,
+ "time": 1000.000000,
+ "msg": "example[10]"
+ },{
+ "pri": 11,
+ "time": 1331.000000,
+ "msg": "example[11]"
+ },{
+ "pri": 12,
+ "time": 1728.000000,
+ "msg": "example[12]"
+ },{
+ "pri": 13,
+ "time": 2197.000000,
+ "msg": "example[13]"
+ },{
+ "pri": 14,
+ "time": 2744.000000,
+ "msg": "example[14]"
+ },{
+ "pri": 15,
+ "time": 3375.000000,
+ "msg": "example[15]"
+ },{
+ "pri": 16,
+ "time": 4096.000000,
+ "msg": "example[16]"
+ },{
+ "pri": 17,
+ "time": 4913.000000,
+ "msg": "example[17]"
+ },{
+ "pri": 18,
+ "time": 5832.000000,
+ "msg": "example[18]"
+ },{
+ "pri": 19,
+ "time": 6859.000000,
+ "msg": "example[19]"
+ },{
+ "pri": 20,
+ "time": 8000.000000,
+ "msg": "example[20]"
+ },{
+ "pri": 21,
+ "time": 9261.000000,
+ "msg": "example[21]"
+ },{
+ "pri": 22,
+ "time": 10648.000000,
+ "msg": "example[22]"
+ },{
+ "pri": 23,
+ "time": 12167.000000,
+ "msg": "example[23]"
+ },{
+ "pri": 24,
+ "time": 13824.000000,
+ "msg": "example[24]"
+ },{
+ "pri": 25,
+ "time": 15625.000000,
+ "msg": "example[25]"
+ },{
+ "pri": 26,
+ "time": 17576.000000,
+ "msg": "example[26]"
+ },{
+ "pri": 27,
+ "time": 19683.000000,
+ "msg": "example[27]"
+ },{
+ "pri": 28,
+ "time": 21952.000000,
+ "msg": "example[28]"
+ },{
+ "pri": 29,
+ "time": 24389.000000,
+ "msg": "example[29]"
+ },{
+ "pri": 30,
+ "time": 27000.000000,
+ "msg": "example[30]"
+ },{
+ "pri": 31,
+ "time": 29791.000000,
+ "msg": "example[31]"
+ },{
+ "pri": 32,
+ "time": 32768.000000,
+ "msg": "example[32]"
+ },{
+ "pri": 33,
+ "time": 35937.000000,
+ "msg": "example[33]"
+ },{
+ "pri": 34,
+ "time": 39304.000000,
+ "msg": "example[34]"
+ },{
+ "pri": 35,
+ "time": 42875.000000,
+ "msg": "example[35]"
+ },{
+ "pri": 36,
+ "time": 46656.000000,
+ "msg": "example[36]"
+ },{
+ "pri": 37,
+ "time": 50653.000000,
+ "msg": "example[37]"
+ },{
+ "pri": 38,
+ "time": 54872.000000,
+ "msg": "example[38]"
+ },{
+ "pri": 39,
+ "time": 59319.000000,
+ "msg": "example[39]"
+ },{
+ "pri": 40,
+ "time": 64000.000000,
+ "msg": "example[40]"
+ },{
+ "pri": 41,
+ "time": 68921.000000,
+ "msg": "example[41]"
+ },{
+ "pri": 42,
+ "time": 74088.000000,
+ "msg": "example[42]"
+ },{
+ "pri": 43,
+ "time": 79507.000000,
+ "msg": "example[43]"
+ },{
+ "pri": 44,
+ "time": 85184.000000,
+ "msg": "example[44]"
+ },{
+ "pri": 45,
+ "time": 91125.000000,
+ "msg": "example[45]"
+ },{
+ "pri": 46,
+ "time": 97336.000000,
+ "msg": "example[46]"
+ },{
+ "pri": 47,
+ "time": 103823.000000,
+ "msg": "example[47]"
+ },{
+ "pri": 48,
+ "time": 110592.000000,
+ "msg": "example[48]"
+ },{
+ "pri": 49,
+ "time": 117649.000000,
+ "msg": "example[49]"
+ },{
+ "pri": 50,
+ "time": 125000.000000,
+ "msg": "example[50]"
+ },{
+ "pri": 51,
+ "time": 132651.000000,
+ "msg": "example[51]"
+ },{
+ "pri": 52,
+ "time": 140608.000000,
+ "msg": "example[52]"
+ },{
+ "pri": 53,
+ "time": 148877.000000,
+ "msg": "example[53]"
+ },{
+ "pri": 54,
+ "time": 157464.000000,
+ "msg": "example[54]"
+ },{
+ "pri": 55,
+ "time": 166375.000000,
+ "msg": "example[55]"
+ },{
+ "pri": 56,
+ "time": 175616.000000,
+ "msg": "example[56]"
+ },{
+ "pri": 57,
+ "time": 185193.000000,
+ "msg": "example[57]"
+ },{
+ "pri": 58,
+ "time": 195112.000000,
+ "msg": "example[58]"
+ },{
+ "pri": 59,
+ "time": 205379.000000,
+ "msg": "example[59]"
+ },{
+ "pri": 60,
+ "time": 216000.000000,
+ "msg": "example[60]"
+ },{
+ "pri": 61,
+ "time": 226981.000000,
+ "msg": "example[61]"
+ },{
+ "pri": 62,
+ "time": 238328.000000,
+ "msg": "example[62]"
+ },{
+ "pri": 63,
+ "time": 250047.000000,
+ "msg": "example[63]"
+ },{
+ "pri": 64,
+ "time": 262144.000000,
+ "msg": "example[64]"
+ },{
+ "pri": 65,
+ "time": 274625.000000,
+ "msg": "example[65]"
+ },{
+ "pri": 66,
+ "time": 287496.000000,
+ "msg": "example[66]"
+ },{
+ "pri": 67,
+ "time": 300763.000000,
+ "msg": "example[67]"
+ },{
+ "pri": 68,
+ "time": 314432.000000,
+ "msg": "example[68]"
+ },{
+ "pri": 69,
+ "time": 328509.000000,
+ "msg": "example[69]"
+ },{
+ "pri": 70,
+ "time": 343000.000000,
+ "msg": "example[70]"
+ },{
+ "pri": 71,
+ "time": 357911.000000,
+ "msg": "example[71]"
+ },{
+ "pri": 72,
+ "time": 373248.000000,
+ "msg": "example[72]"
+ },{
+ "pri": 73,
+ "time": 389017.000000,
+ "msg": "example[73]"
+ },{
+ "pri": 74,
+ "time": 405224.000000,
+ "msg": "example[74]"
+ },{
+ "pri": 75,
+ "time": 421875.000000,
+ "msg": "example[75]"
+ },{
+ "pri": 76,
+ "time": 438976.000000,
+ "msg": "example[76]"
+ },{
+ "pri": 77,
+ "time": 456533.000000,
+ "msg": "example[77]"
+ },{
+ "pri": 78,
+ "time": 474552.000000,
+ "msg": "example[78]"
+ },{
+ "pri": 79,
+ "time": 493039.000000,
+ "msg": "example[79]"
+ },{
+ "pri": 80,
+ "time": 512000.000000,
+ "msg": "example[80]"
+ },{
+ "pri": 81,
+ "time": 531441.000000,
+ "msg": "example[81]"
+ },{
+ "pri": 82,
+ "time": 551368.000000,
+ "msg": "example[82]"
+ },{
+ "pri": 83,
+ "time": 571787.000000,
+ "msg": "example[83]"
+ },{
+ "pri": 84,
+ "time": 592704.000000,
+ "msg": "example[84]"
+ },{
+ "pri": 85,
+ "time": 614125.000000,
+ "msg": "example[85]"
+ },{
+ "pri": 86,
+ "time": 636056.000000,
+ "msg": "example[86]"
+ },{
+ "pri": 87,
+ "time": 658503.000000,
+ "msg": "example[87]"
+ },{
+ "pri": 88,
+ "time": 681472.000000,
+ "msg": "example[88]"
+ },{
+ "pri": 89,
+ "time": 704969.000000,
+ "msg": "example[89]"
+ },{
+ "pri": 90,
+ "time": 729000.000000,
+ "msg": "example[90]"
+ },{
+ "pri": 91,
+ "time": 753571.000000,
+ "msg": "example[91]"
+ },{
+ "pri": 92,
+ "time": 778688.000000,
+ "msg": "example[92]"
+ },{
+ "pri": 93,
+ "time": 804357.000000,
+ "msg": "example[93]"
+ },{
+ "pri": 94,
+ "time": 830584.000000,
+ "msg": "example[94]"
+ },{
+ "pri": 95,
+ "time": 857375.000000,
+ "msg": "example[95]"
+ },{
+ "pri": 96,
+ "time": 884736.000000,
+ "msg": "example[96]"
+ },{
+ "pri": 97,
+ "time": 912673.000000,
+ "msg": "example[97]"
+ },{
+ "pri": 98,
+ "time": 941192.000000,
+ "msg": "example[98]"
+ },{
+ "pri": 99,
+ "time": 970299.000000,
+ "msg": "example[99]"
+ },{
+ "pri": 100,
+ "time": 1000000.000000,
+ "msg": "example[100]"
+ },{
+ "pri": 101,
+ "time": 1030301.000000,
+ "msg": "example[101]"
+ },{
+ "pri": 102,
+ "time": 1061208.000000,
+ "msg": "example[102]"
+ },{
+ "pri": 103,
+ "time": 1092727.000000,
+ "msg": "example[103]"
+ },{
+ "pri": 104,
+ "time": 1124864.000000,
+ "msg": "example[104]"
+ },{
+ "pri": 150,
+ "time": 4557523.000000,
+ "msg": "example[105]"
+ }
+ ]
+}
diff --git a/tests/expected/dmesg/kmsg-file b/tests/expected/dmesg/kmsg-file
new file mode 100644
index 0000000..984588e
--- /dev/null
+++ b/tests/expected/dmesg/kmsg-file
@@ -0,0 +1,185 @@
+{
+ "dmesg": [
+ {
+ "pri": 0,
+ "time": 0.000000,
+ "msg": "Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000"
+ },{
+ "pri": 1,
+ "time": 0.000001,
+ "msg": "Command line: initrd=\\ucode.img initrd=\\initramfs-linux.img rw cryptdevice=/dev/nvme0n1p3:system:discard root=/dev/mapper/system"
+ },{
+ "pri": 2,
+ "time": 0.000002,
+ "msg": "BIOS-provided physical RAM map:"
+ },{
+ "pri": 3,
+ "time": 0.000003,
+ "msg": "BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable"
+ },{
+ "pri": 4,
+ "time": 0.000004,
+ "msg": "BIOS-e820: [mem 0x000000000009f000-0x00000000000bffff] reserved"
+ },{
+ "pri": 5,
+ "time": 0.000005,
+ "msg": "BIOS-e820: [mem 0x0000000000100000-0x0000000009afffff] usable"
+ },{
+ "pri": 6,
+ "time": 0.000006,
+ "msg": "BIOS-e820: [mem 0x0000000009b00000-0x0000000009dfffff] reserved"
+ },{
+ "pri": 7,
+ "time": 0.000007,
+ "msg": "BIOS-e820: [mem 0x0000000009e00000-0x0000000009efffff] usable"
+ },{
+ "pri": 6,
+ "time": 0.000008,
+ "msg": "BIOS-e820: [mem 0x0000000009f00000-0x0000000009f3bfff] ACPI NVS"
+ },{
+ "pri": 6,
+ "time": 0.000009,
+ "msg": "BIOS-e820: [mem 0x0000000009f3c000-0x000000004235ffff] usable"
+ },{
+ "pri": 6,
+ "time": 0.000010,
+ "msg": "BIOS-e820: [mem 0x0000000042360000-0x000000004455ffff] reserved"
+ },{
+ "pri": 6,
+ "time": 0.201607,
+ "msg": "smp: Bringing up secondary CPUs ..."
+ },{
+ "pri": 6,
+ "time": 0.201607,
+ "msg": "smpboot: x86: Booting SMP configuration:"
+ },{
+ "pri": 4,
+ "time": 0.209670,
+ "msg": " #1 #3 #5 #7"
+ },{
+ "pri": 6,
+ "time": 0.212630,
+ "msg": "smp: Brought up 1 node, 16 CPUs"
+ },{
+ "pri": 5,
+ "time": 0.215936,
+ "msg": "audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1"
+ },{
+ "pri": 6,
+ "time": 0.215937,
+ "msg": "thermal_sys: Registered thermal governor 'fair_share'"
+ },{
+ "pri": 4,
+ "time": 0.215966,
+ "msg": "ENERGY_PERF_BIAS: Set to 'normal', was 'performance'"
+ },{
+ "pri": 6,
+ "time": 0.367657,
+ "msg": "ACPI: \\_SB_.PCI0.GP19.NHI1.PWRS: New power resource"
+ },{
+ "pri": 6,
+ "time": 0.368615,
+ "msg": "ACPI: \\_SB_.PCI0.GP19.XHC4.PWRS: New power resource"
+ },{
+ "pri": 6,
+ "time": 0.376316,
+ "msg": "ACPI: \\_SB_.PRWL: New power resource"
+ },{
+ "pri": 6,
+ "time": 0.376343,
+ "msg": "ACPI: \\_SB_.PRWB: New power resource"
+ },{
+ "pri": 6,
+ "time": 0.377373,
+ "msg": "ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])"
+ },{
+ "pri": 6,
+ "time": 0.377378,
+ "msg": "acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]"
+ },{
+ "pri": 6,
+ "time": 0.377569,
+ "msg": "acpi PNP0A08:00: _OSC: platform does not support [SHPCHotplug AER]"
+ },{
+ "pri": 6,
+ "time": 0.377933,
+ "msg": "acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME PCIeCapability LTR DPC]"
+ },{
+ "pri": 6,
+ "time": 0.378458,
+ "msg": "PCI host bridge to bus 0000:00"
+ },{
+ "pri": 6,
+ "time": 0.378459,
+ "msg": "pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]"
+ },{
+ "pri": 6,
+ "time": 0.378461,
+ "msg": "pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]"
+ },{
+ "pri": 13,
+ "time": 9.398562,
+ "msg": "user network daemon initialization complete"
+ },{
+ "pri": 30,
+ "time": 10.441520,
+ "msg": "systemd[1]: systemd 254.7-1.fc39 running in system mode"
+ },{
+ "pri": 30,
+ "time": 11.441524,
+ "msg": "systemd[1]: Detected architecture x86-64."
+ },{
+ "pri": 30,
+ "time": 12.441525,
+ "msg": "systemd[1]: Running in initrd."
+ },{
+ "pri": 30,
+ "time": 13.541598,
+ "msg": "systemd[1]: Hostname set to <catalina>."
+ },{
+ "pri": 6,
+ "time": 15.641860,
+ "msg": "usb 3-3: New USB device found, idVendor=1a40, idProduct=0101, bcdDevice= 1.11"
+ },{
+ "pri": 3,
+ "time": 16.690000,
+ "msg": "Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found."
+ },{
+ "pri": 3,
+ "time": 17.710000,
+ "msg": "snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535"
+ },{
+ "pri": 46,
+ "time": 18.820000,
+ "msg": "systemd-journald[723]: Received client request to flush runtime journal."
+ },{
+ "pri": 44,
+ "time": 20.840000,
+ "msg": "systemd-journald[723]: File /var/log/journal/a124ea923b144109a12d557d5ac53179/system.journal corrupted or uncleanly shut down, renaming and replacing."
+ },{
+ "pri": 46,
+ "time": 21.852348,
+ "msg": "systemd-journald[723]: /var/log/journal/ad7a2547ac0e4342a342e62a34a3eae4/user-1000.journal: Journal file uses a different sequence number ID, rotating."
+ },{
+ "pri": 4,
+ "time": 24.871100,
+ "msg": "PEFILE: Unsigned PE binary"
+ },{
+ "pri": 3,
+ "time": 33.918091,
+ "msg": "snd_hda_intel 0000:00:1f.3: CORB reset timeout#2, CORBRP = 65535"
+ },{
+ "pri": 6,
+ "time": 144.931785,
+ "msg": "usb 3-3.1: device firmware changed"
+ },{
+ "pri": 6,
+ "time": 145.953248,
+ "msg": "usb 3-3.1: USB disconnect, device number 44"
+ },{
+ "pri": 6,
+ "time": 147.981859,
+ "msg": "usb 3-3.1: New USB device found, idVendor=17ef, idProduct=6047, bcdDevice= 3.30"
+ }
+ ]
+}
diff --git a/tests/expected/mount/special b/tests/expected/dmesg/timestamp-format
index e69de29..e69de29 100644
--- a/tests/expected/mount/special
+++ b/tests/expected/dmesg/timestamp-format
diff --git a/tests/expected/dmesg/timestamp-format-delta b/tests/expected/dmesg/timestamp-format-delta
new file mode 100644
index 0000000..3eb2ddb
--- /dev/null
+++ b/tests/expected/dmesg/timestamp-format-delta
@@ -0,0 +1,106 @@
+2009-02-13T23:31:30,123456+00:00 [< 0.000000>] example[0]
+2009-02-13T23:31:31,123456+00:00 [< 0.000000>] example[1]
+2009-02-13T23:31:38,123456+00:00 [< 7.000000>] example[2]
+2009-02-13T23:31:57,123456+00:00 [< 19.000000>] example[3]
+2009-02-13T23:32:34,123456+00:00 [< 37.000000>] example[4]
+2009-02-13T23:33:35,123456+00:00 [< 61.000000>] example[5]
+2009-02-13T23:35:06,123456+00:00 [< 91.000000>] example[6]
+2009-02-13T23:37:13,123456+00:00 [< 127.000000>] example[7]
+2009-02-13T23:40:02,123456+00:00 [< 169.000000>] example[8]
+2009-02-13T23:43:39,123456+00:00 [< 217.000000>] example[9]
+2009-02-13T23:48:10,123456+00:00 [< 271.000000>] example[10]
+2009-02-13T23:53:41,123456+00:00 [< 331.000000>] example[11]
+2009-02-14T00:00:18,123456+00:00 [< 397.000000>] example[12]
+2009-02-14T00:08:07,123456+00:00 [< 469.000000>] example[13]
+2009-02-14T00:17:14,123456+00:00 [< 547.000000>] example[14]
+2009-02-14T00:27:45,123456+00:00 [< 631.000000>] example[15]
+2009-02-14T00:39:46,123456+00:00 [< 721.000000>] example[16]
+2009-02-14T00:53:23,123456+00:00 [< 817.000000>] example[17]
+2009-02-14T01:08:42,123456+00:00 [< 919.000000>] example[18]
+2009-02-14T01:25:49,123456+00:00 [< 1027.000000>] example[19]
+2009-02-14T01:44:50,123456+00:00 [< 1141.000000>] example[20]
+2009-02-14T02:05:51,123456+00:00 [< 1261.000000>] example[21]
+2009-02-14T02:28:58,123456+00:00 [< 1387.000000>] example[22]
+2009-02-14T02:54:17,123456+00:00 [< 1519.000000>] example[23]
+2009-02-14T03:21:54,123456+00:00 [< 1657.000000>] example[24]
+2009-02-14T03:51:55,123456+00:00 [< 1801.000000>] example[25]
+2009-02-14T04:24:26,123456+00:00 [< 1951.000000>] example[26]
+2009-02-14T04:59:33,123456+00:00 [< 2107.000000>] example[27]
+2009-02-14T05:37:22,123456+00:00 [< 2269.000000>] example[28]
+2009-02-14T06:17:59,123456+00:00 [< 2437.000000>] example[29]
+2009-02-14T07:01:30,123456+00:00 [< 2611.000000>] example[30]
+2009-02-14T07:48:01,123456+00:00 [< 2791.000000>] example[31]
+2009-02-14T08:37:38,123456+00:00 [< 2977.000000>] example[32]
+2009-02-14T09:30:27,123456+00:00 [< 3169.000000>] example[33]
+2009-02-14T10:26:34,123456+00:00 [< 3367.000000>] example[34]
+2009-02-14T11:26:05,123456+00:00 [< 3571.000000>] example[35]
+2009-02-14T12:29:06,123456+00:00 [< 3781.000000>] example[36]
+2009-02-14T13:35:43,123456+00:00 [< 3997.000000>] example[37]
+2009-02-14T14:46:02,123456+00:00 [< 4219.000000>] example[38]
+2009-02-14T16:00:09,123456+00:00 [< 4447.000000>] example[39]
+2009-02-14T17:18:10,123456+00:00 [< 4681.000000>] example[40]
+2009-02-14T18:40:11,123456+00:00 [< 4921.000000>] example[41]
+2009-02-14T20:06:18,123456+00:00 [< 5167.000000>] example[42]
+2009-02-14T21:36:37,123456+00:00 [< 5419.000000>] example[43]
+2009-02-14T23:11:14,123456+00:00 [< 5677.000000>] example[44]
+2009-02-15T00:50:15,123456+00:00 [< 5941.000000>] example[45]
+2009-02-15T02:33:46,123456+00:00 [< 6211.000000>] example[46]
+2009-02-15T04:21:53,123456+00:00 [< 6487.000000>] example[47]
+2009-02-15T06:14:42,123456+00:00 [< 6769.000000>] example[48]
+2009-02-15T08:12:19,123456+00:00 [< 7057.000000>] example[49]
+2009-02-15T10:14:50,123456+00:00 [< 7351.000000>] example[50]
+2009-02-15T12:22:21,123456+00:00 [< 7651.000000>] example[51]
+2009-02-15T14:34:58,123456+00:00 [< 7957.000000>] example[52]
+2009-02-15T16:52:47,123456+00:00 [< 8269.000000>] example[53]
+2009-02-15T19:15:54,123456+00:00 [< 8587.000000>] example[54]
+2009-02-15T21:44:25,123456+00:00 [< 8911.000000>] example[55]
+2009-02-16T00:18:26,123456+00:00 [< 9241.000000>] example[56]
+2009-02-16T02:58:03,123456+00:00 [< 9577.000000>] example[57]
+2009-02-16T05:43:22,123456+00:00 [< 9919.000000>] example[58]
+2009-02-16T08:34:29,123456+00:00 [<10267.000000>] example[59]
+2009-02-16T11:31:30,123456+00:00 [<10621.000000>] example[60]
+2009-02-16T14:34:31,123456+00:00 [<10981.000000>] example[61]
+2009-02-16T17:43:38,123456+00:00 [<11347.000000>] example[62]
+2009-02-16T20:58:57,123456+00:00 [<11719.000000>] example[63]
+2009-02-17T00:20:34,123456+00:00 [<12097.000000>] example[64]
+2009-02-17T03:48:35,123456+00:00 [<12481.000000>] example[65]
+2009-02-17T07:23:06,123456+00:00 [<12871.000000>] example[66]
+2009-02-17T11:04:13,123456+00:00 [<13267.000000>] example[67]
+2009-02-17T14:52:02,123456+00:00 [<13669.000000>] example[68]
+2009-02-17T18:46:39,123456+00:00 [<14077.000000>] example[69]
+2009-02-17T22:48:10,123456+00:00 [<14491.000000>] example[70]
+2009-02-18T02:56:41,123456+00:00 [<14911.000000>] example[71]
+2009-02-18T07:12:18,123456+00:00 [<15337.000000>] example[72]
+2009-02-18T11:35:07,123456+00:00 [<15769.000000>] example[73]
+2009-02-18T16:05:14,123456+00:00 [<16207.000000>] example[74]
+2009-02-18T20:42:45,123456+00:00 [<16651.000000>] example[75]
+2009-02-19T01:27:46,123456+00:00 [<17101.000000>] example[76]
+2009-02-19T06:20:23,123456+00:00 [<17557.000000>] example[77]
+2009-02-19T11:20:42,123456+00:00 [<18019.000000>] example[78]
+2009-02-19T16:28:49,123456+00:00 [<18487.000000>] example[79]
+2009-02-19T21:44:50,123456+00:00 [<18961.000000>] example[80]
+2009-02-20T03:08:51,123456+00:00 [<19441.000000>] example[81]
+2009-02-20T08:40:58,123456+00:00 [<19927.000000>] example[82]
+2009-02-20T14:21:17,123456+00:00 [<20419.000000>] example[83]
+2009-02-20T20:09:54,123456+00:00 [<20917.000000>] example[84]
+2009-02-21T02:06:55,123456+00:00 [<21421.000000>] example[85]
+2009-02-21T08:12:26,123456+00:00 [<21931.000000>] example[86]
+2009-02-21T14:26:33,123456+00:00 [<22447.000000>] example[87]
+2009-02-21T20:49:22,123456+00:00 [<22969.000000>] example[88]
+2009-02-22T03:20:59,123456+00:00 [<23497.000000>] example[89]
+2009-02-22T10:01:30,123456+00:00 [<24031.000000>] example[90]
+2009-02-22T16:51:01,123456+00:00 [<24571.000000>] example[91]
+2009-02-22T23:49:38,123456+00:00 [<25117.000000>] example[92]
+2009-02-23T06:57:27,123456+00:00 [<25669.000000>] example[93]
+2009-02-23T14:14:34,123456+00:00 [<26227.000000>] example[94]
+2009-02-23T21:41:05,123456+00:00 [<26791.000000>] example[95]
+2009-02-24T05:17:06,123456+00:00 [<27361.000000>] example[96]
+2009-02-24T13:02:43,123456+00:00 [<27937.000000>] example[97]
+2009-02-24T20:58:02,123456+00:00 [<28519.000000>] example[98]
+2009-02-25T05:03:09,123456+00:00 [<29107.000000>] example[99]
+2009-02-25T13:18:10,123456+00:00 [<29701.000000>] example[100]
+2009-02-25T21:43:11,123456+00:00 [<30301.000000>] example[101]
+2009-02-26T06:18:18,123456+00:00 [<30907.000000>] example[102]
+2009-02-26T15:03:37,123456+00:00 [<31519.000000>] example[103]
+2009-02-26T23:59:14,123456+00:00 [<32137.000000>] example[104]
+2009-04-07T17:30:13,123456+00:00 [<3432659.000000>] example[105]
diff --git a/tests/expected/dmesg/timestamp-format-delta-ctime b/tests/expected/dmesg/timestamp-format-delta-ctime
new file mode 100644
index 0000000..a171051
--- /dev/null
+++ b/tests/expected/dmesg/timestamp-format-delta-ctime
@@ -0,0 +1,106 @@
+[Feb13 23:31] [Fri Feb 13 23:31:30 2009 < 0.000000>] example[0]
+[ +0.000000] [Fri Feb 13 23:31:31 2009 < 0.000000>] example[1]
+[ +7.000000] [Fri Feb 13 23:31:38 2009 < 7.000000>] example[2]
+[ +19.000000] [Fri Feb 13 23:31:57 2009 < 19.000000>] example[3]
+[Feb13 23:32] [Fri Feb 13 23:32:34 2009 < 37.000000>] example[4]
+[Feb13 23:33] [Fri Feb 13 23:33:35 2009 < 61.000000>] example[5]
+[Feb13 23:35] [Fri Feb 13 23:35:06 2009 < 91.000000>] example[6]
+[Feb13 23:37] [Fri Feb 13 23:37:13 2009 < 127.000000>] example[7]
+[Feb13 23:40] [Fri Feb 13 23:40:02 2009 < 169.000000>] example[8]
+[Feb13 23:43] [Fri Feb 13 23:43:39 2009 < 217.000000>] example[9]
+[Feb13 23:48] [Fri Feb 13 23:48:10 2009 < 271.000000>] example[10]
+[Feb13 23:53] [Fri Feb 13 23:53:41 2009 < 331.000000>] example[11]
+[Feb14 00:00] [Sat Feb 14 00:00:18 2009 < 397.000000>] example[12]
+[Feb14 00:08] [Sat Feb 14 00:08:07 2009 < 469.000000>] example[13]
+[Feb14 00:17] [Sat Feb 14 00:17:14 2009 < 547.000000>] example[14]
+[Feb14 00:27] [Sat Feb 14 00:27:45 2009 < 631.000000>] example[15]
+[Feb14 00:39] [Sat Feb 14 00:39:46 2009 < 721.000000>] example[16]
+[Feb14 00:53] [Sat Feb 14 00:53:23 2009 < 817.000000>] example[17]
+[Feb14 01:08] [Sat Feb 14 01:08:42 2009 < 919.000000>] example[18]
+[Feb14 01:25] [Sat Feb 14 01:25:49 2009 < 1027.000000>] example[19]
+[Feb14 01:44] [Sat Feb 14 01:44:50 2009 < 1141.000000>] example[20]
+[Feb14 02:05] [Sat Feb 14 02:05:51 2009 < 1261.000000>] example[21]
+[Feb14 02:28] [Sat Feb 14 02:28:58 2009 < 1387.000000>] example[22]
+[Feb14 02:54] [Sat Feb 14 02:54:17 2009 < 1519.000000>] example[23]
+[Feb14 03:21] [Sat Feb 14 03:21:54 2009 < 1657.000000>] example[24]
+[Feb14 03:51] [Sat Feb 14 03:51:55 2009 < 1801.000000>] example[25]
+[Feb14 04:24] [Sat Feb 14 04:24:26 2009 < 1951.000000>] example[26]
+[Feb14 04:59] [Sat Feb 14 04:59:33 2009 < 2107.000000>] example[27]
+[Feb14 05:37] [Sat Feb 14 05:37:22 2009 < 2269.000000>] example[28]
+[Feb14 06:17] [Sat Feb 14 06:17:59 2009 < 2437.000000>] example[29]
+[Feb14 07:01] [Sat Feb 14 07:01:30 2009 < 2611.000000>] example[30]
+[Feb14 07:48] [Sat Feb 14 07:48:01 2009 < 2791.000000>] example[31]
+[Feb14 08:37] [Sat Feb 14 08:37:38 2009 < 2977.000000>] example[32]
+[Feb14 09:30] [Sat Feb 14 09:30:27 2009 < 3169.000000>] example[33]
+[Feb14 10:26] [Sat Feb 14 10:26:34 2009 < 3367.000000>] example[34]
+[Feb14 11:26] [Sat Feb 14 11:26:05 2009 < 3571.000000>] example[35]
+[Feb14 12:29] [Sat Feb 14 12:29:06 2009 < 3781.000000>] example[36]
+[Feb14 13:35] [Sat Feb 14 13:35:43 2009 < 3997.000000>] example[37]
+[Feb14 14:46] [Sat Feb 14 14:46:02 2009 < 4219.000000>] example[38]
+[Feb14 16:00] [Sat Feb 14 16:00:09 2009 < 4447.000000>] example[39]
+[Feb14 17:18] [Sat Feb 14 17:18:10 2009 < 4681.000000>] example[40]
+[Feb14 18:40] [Sat Feb 14 18:40:11 2009 < 4921.000000>] example[41]
+[Feb14 20:06] [Sat Feb 14 20:06:18 2009 < 5167.000000>] example[42]
+[Feb14 21:36] [Sat Feb 14 21:36:37 2009 < 5419.000000>] example[43]
+[Feb14 23:11] [Sat Feb 14 23:11:14 2009 < 5677.000000>] example[44]
+[Feb15 00:50] [Sun Feb 15 00:50:15 2009 < 5941.000000>] example[45]
+[Feb15 02:33] [Sun Feb 15 02:33:46 2009 < 6211.000000>] example[46]
+[Feb15 04:21] [Sun Feb 15 04:21:53 2009 < 6487.000000>] example[47]
+[Feb15 06:14] [Sun Feb 15 06:14:42 2009 < 6769.000000>] example[48]
+[Feb15 08:12] [Sun Feb 15 08:12:19 2009 < 7057.000000>] example[49]
+[Feb15 10:14] [Sun Feb 15 10:14:50 2009 < 7351.000000>] example[50]
+[Feb15 12:22] [Sun Feb 15 12:22:21 2009 < 7651.000000>] example[51]
+[Feb15 14:34] [Sun Feb 15 14:34:58 2009 < 7957.000000>] example[52]
+[Feb15 16:52] [Sun Feb 15 16:52:47 2009 < 8269.000000>] example[53]
+[Feb15 19:15] [Sun Feb 15 19:15:54 2009 < 8587.000000>] example[54]
+[Feb15 21:44] [Sun Feb 15 21:44:25 2009 < 8911.000000>] example[55]
+[Feb16 00:18] [Mon Feb 16 00:18:26 2009 < 9241.000000>] example[56]
+[Feb16 02:58] [Mon Feb 16 02:58:03 2009 < 9577.000000>] example[57]
+[Feb16 05:43] [Mon Feb 16 05:43:22 2009 < 9919.000000>] example[58]
+[Feb16 08:34] [Mon Feb 16 08:34:29 2009 <10267.000000>] example[59]
+[Feb16 11:31] [Mon Feb 16 11:31:30 2009 <10621.000000>] example[60]
+[Feb16 14:34] [Mon Feb 16 14:34:31 2009 <10981.000000>] example[61]
+[Feb16 17:43] [Mon Feb 16 17:43:38 2009 <11347.000000>] example[62]
+[Feb16 20:58] [Mon Feb 16 20:58:57 2009 <11719.000000>] example[63]
+[Feb17 00:20] [Tue Feb 17 00:20:34 2009 <12097.000000>] example[64]
+[Feb17 03:48] [Tue Feb 17 03:48:35 2009 <12481.000000>] example[65]
+[Feb17 07:23] [Tue Feb 17 07:23:06 2009 <12871.000000>] example[66]
+[Feb17 11:04] [Tue Feb 17 11:04:13 2009 <13267.000000>] example[67]
+[Feb17 14:52] [Tue Feb 17 14:52:02 2009 <13669.000000>] example[68]
+[Feb17 18:46] [Tue Feb 17 18:46:39 2009 <14077.000000>] example[69]
+[Feb17 22:48] [Tue Feb 17 22:48:10 2009 <14491.000000>] example[70]
+[Feb18 02:56] [Wed Feb 18 02:56:41 2009 <14911.000000>] example[71]
+[Feb18 07:12] [Wed Feb 18 07:12:18 2009 <15337.000000>] example[72]
+[Feb18 11:35] [Wed Feb 18 11:35:07 2009 <15769.000000>] example[73]
+[Feb18 16:05] [Wed Feb 18 16:05:14 2009 <16207.000000>] example[74]
+[Feb18 20:42] [Wed Feb 18 20:42:45 2009 <16651.000000>] example[75]
+[Feb19 01:27] [Thu Feb 19 01:27:46 2009 <17101.000000>] example[76]
+[Feb19 06:20] [Thu Feb 19 06:20:23 2009 <17557.000000>] example[77]
+[Feb19 11:20] [Thu Feb 19 11:20:42 2009 <18019.000000>] example[78]
+[Feb19 16:28] [Thu Feb 19 16:28:49 2009 <18487.000000>] example[79]
+[Feb19 21:44] [Thu Feb 19 21:44:50 2009 <18961.000000>] example[80]
+[Feb20 03:08] [Fri Feb 20 03:08:51 2009 <19441.000000>] example[81]
+[Feb20 08:40] [Fri Feb 20 08:40:58 2009 <19927.000000>] example[82]
+[Feb20 14:21] [Fri Feb 20 14:21:17 2009 <20419.000000>] example[83]
+[Feb20 20:09] [Fri Feb 20 20:09:54 2009 <20917.000000>] example[84]
+[Feb21 02:06] [Sat Feb 21 02:06:55 2009 <21421.000000>] example[85]
+[Feb21 08:12] [Sat Feb 21 08:12:26 2009 <21931.000000>] example[86]
+[Feb21 14:26] [Sat Feb 21 14:26:33 2009 <22447.000000>] example[87]
+[Feb21 20:49] [Sat Feb 21 20:49:22 2009 <22969.000000>] example[88]
+[Feb22 03:20] [Sun Feb 22 03:20:59 2009 <23497.000000>] example[89]
+[Feb22 10:01] [Sun Feb 22 10:01:30 2009 <24031.000000>] example[90]
+[Feb22 16:51] [Sun Feb 22 16:51:01 2009 <24571.000000>] example[91]
+[Feb22 23:49] [Sun Feb 22 23:49:38 2009 <25117.000000>] example[92]
+[Feb23 06:57] [Mon Feb 23 06:57:27 2009 <25669.000000>] example[93]
+[Feb23 14:14] [Mon Feb 23 14:14:34 2009 <26227.000000>] example[94]
+[Feb23 21:41] [Mon Feb 23 21:41:05 2009 <26791.000000>] example[95]
+[Feb24 05:17] [Tue Feb 24 05:17:06 2009 <27361.000000>] example[96]
+[Feb24 13:02] [Tue Feb 24 13:02:43 2009 <27937.000000>] example[97]
+[Feb24 20:58] [Tue Feb 24 20:58:02 2009 <28519.000000>] example[98]
+[Feb25 05:03] [Wed Feb 25 05:03:09 2009 <29107.000000>] example[99]
+[Feb25 13:18] [Wed Feb 25 13:18:10 2009 <29701.000000>] example[100]
+[Feb25 21:43] [Wed Feb 25 21:43:11 2009 <30301.000000>] example[101]
+[Feb26 06:18] [Thu Feb 26 06:18:18 2009 <30907.000000>] example[102]
+[Feb26 15:03] [Thu Feb 26 15:03:37 2009 <31519.000000>] example[103]
+[Feb26 23:59] [Thu Feb 26 23:59:14 2009 <32137.000000>] example[104]
+[Apr 7 17:30] [Tue Apr 7 17:30:13 2009 <3432659.000000>] example[105]
diff --git a/tests/expected/dmesg/timestamp-format-delta-raw b/tests/expected/dmesg/timestamp-format-delta-raw
new file mode 100644
index 0000000..90d3bb7
--- /dev/null
+++ b/tests/expected/dmesg/timestamp-format-delta-raw
@@ -0,0 +1,106 @@
+[ 0.000000 < 0.000000>] [Fri Feb 13 23:31:30 2009] example[0]
+[ 1.000000 < 0.000000>] [Fri Feb 13 23:31:31 2009] example[1]
+[ 8.000000 < 7.000000>] [Fri Feb 13 23:31:38 2009] example[2]
+[ 27.000000 < 19.000000>] [Fri Feb 13 23:31:57 2009] example[3]
+[ 64.000000 < 37.000000>] [Fri Feb 13 23:32:34 2009] example[4]
+[ 125.000000 < 61.000000>] [Fri Feb 13 23:33:35 2009] example[5]
+[ 216.000000 < 91.000000>] [Fri Feb 13 23:35:06 2009] example[6]
+[ 343.000000 < 127.000000>] [Fri Feb 13 23:37:13 2009] example[7]
+[ 512.000000 < 169.000000>] [Fri Feb 13 23:40:02 2009] example[8]
+[ 729.000000 < 217.000000>] [Fri Feb 13 23:43:39 2009] example[9]
+[ 1000.000000 < 271.000000>] [Fri Feb 13 23:48:10 2009] example[10]
+[ 1331.000000 < 331.000000>] [Fri Feb 13 23:53:41 2009] example[11]
+[ 1728.000000 < 397.000000>] [Sat Feb 14 00:00:18 2009] example[12]
+[ 2197.000000 < 469.000000>] [Sat Feb 14 00:08:07 2009] example[13]
+[ 2744.000000 < 547.000000>] [Sat Feb 14 00:17:14 2009] example[14]
+[ 3375.000000 < 631.000000>] [Sat Feb 14 00:27:45 2009] example[15]
+[ 4096.000000 < 721.000000>] [Sat Feb 14 00:39:46 2009] example[16]
+[ 4913.000000 < 817.000000>] [Sat Feb 14 00:53:23 2009] example[17]
+[ 5832.000000 < 919.000000>] [Sat Feb 14 01:08:42 2009] example[18]
+[ 6859.000000 < 1027.000000>] [Sat Feb 14 01:25:49 2009] example[19]
+[ 8000.000000 < 1141.000000>] [Sat Feb 14 01:44:50 2009] example[20]
+[ 9261.000000 < 1261.000000>] [Sat Feb 14 02:05:51 2009] example[21]
+[10648.000000 < 1387.000000>] [Sat Feb 14 02:28:58 2009] example[22]
+[12167.000000 < 1519.000000>] [Sat Feb 14 02:54:17 2009] example[23]
+[13824.000000 < 1657.000000>] [Sat Feb 14 03:21:54 2009] example[24]
+[15625.000000 < 1801.000000>] [Sat Feb 14 03:51:55 2009] example[25]
+[17576.000000 < 1951.000000>] [Sat Feb 14 04:24:26 2009] example[26]
+[19683.000000 < 2107.000000>] [Sat Feb 14 04:59:33 2009] example[27]
+[21952.000000 < 2269.000000>] [Sat Feb 14 05:37:22 2009] example[28]
+[24389.000000 < 2437.000000>] [Sat Feb 14 06:17:59 2009] example[29]
+[27000.000000 < 2611.000000>] [Sat Feb 14 07:01:30 2009] example[30]
+[29791.000000 < 2791.000000>] [Sat Feb 14 07:48:01 2009] example[31]
+[32768.000000 < 2977.000000>] [Sat Feb 14 08:37:38 2009] example[32]
+[35937.000000 < 3169.000000>] [Sat Feb 14 09:30:27 2009] example[33]
+[39304.000000 < 3367.000000>] [Sat Feb 14 10:26:34 2009] example[34]
+[42875.000000 < 3571.000000>] [Sat Feb 14 11:26:05 2009] example[35]
+[46656.000000 < 3781.000000>] [Sat Feb 14 12:29:06 2009] example[36]
+[50653.000000 < 3997.000000>] [Sat Feb 14 13:35:43 2009] example[37]
+[54872.000000 < 4219.000000>] [Sat Feb 14 14:46:02 2009] example[38]
+[59319.000000 < 4447.000000>] [Sat Feb 14 16:00:09 2009] example[39]
+[64000.000000 < 4681.000000>] [Sat Feb 14 17:18:10 2009] example[40]
+[68921.000000 < 4921.000000>] [Sat Feb 14 18:40:11 2009] example[41]
+[74088.000000 < 5167.000000>] [Sat Feb 14 20:06:18 2009] example[42]
+[79507.000000 < 5419.000000>] [Sat Feb 14 21:36:37 2009] example[43]
+[85184.000000 < 5677.000000>] [Sat Feb 14 23:11:14 2009] example[44]
+[91125.000000 < 5941.000000>] [Sun Feb 15 00:50:15 2009] example[45]
+[97336.000000 < 6211.000000>] [Sun Feb 15 02:33:46 2009] example[46]
+[103823.000000 < 6487.000000>] [Sun Feb 15 04:21:53 2009] example[47]
+[110592.000000 < 6769.000000>] [Sun Feb 15 06:14:42 2009] example[48]
+[117649.000000 < 7057.000000>] [Sun Feb 15 08:12:19 2009] example[49]
+[125000.000000 < 7351.000000>] [Sun Feb 15 10:14:50 2009] example[50]
+[132651.000000 < 7651.000000>] [Sun Feb 15 12:22:21 2009] example[51]
+[140608.000000 < 7957.000000>] [Sun Feb 15 14:34:58 2009] example[52]
+[148877.000000 < 8269.000000>] [Sun Feb 15 16:52:47 2009] example[53]
+[157464.000000 < 8587.000000>] [Sun Feb 15 19:15:54 2009] example[54]
+[166375.000000 < 8911.000000>] [Sun Feb 15 21:44:25 2009] example[55]
+[175616.000000 < 9241.000000>] [Mon Feb 16 00:18:26 2009] example[56]
+[185193.000000 < 9577.000000>] [Mon Feb 16 02:58:03 2009] example[57]
+[195112.000000 < 9919.000000>] [Mon Feb 16 05:43:22 2009] example[58]
+[205379.000000 <10267.000000>] [Mon Feb 16 08:34:29 2009] example[59]
+[216000.000000 <10621.000000>] [Mon Feb 16 11:31:30 2009] example[60]
+[226981.000000 <10981.000000>] [Mon Feb 16 14:34:31 2009] example[61]
+[238328.000000 <11347.000000>] [Mon Feb 16 17:43:38 2009] example[62]
+[250047.000000 <11719.000000>] [Mon Feb 16 20:58:57 2009] example[63]
+[262144.000000 <12097.000000>] [Tue Feb 17 00:20:34 2009] example[64]
+[274625.000000 <12481.000000>] [Tue Feb 17 03:48:35 2009] example[65]
+[287496.000000 <12871.000000>] [Tue Feb 17 07:23:06 2009] example[66]
+[300763.000000 <13267.000000>] [Tue Feb 17 11:04:13 2009] example[67]
+[314432.000000 <13669.000000>] [Tue Feb 17 14:52:02 2009] example[68]
+[328509.000000 <14077.000000>] [Tue Feb 17 18:46:39 2009] example[69]
+[343000.000000 <14491.000000>] [Tue Feb 17 22:48:10 2009] example[70]
+[357911.000000 <14911.000000>] [Wed Feb 18 02:56:41 2009] example[71]
+[373248.000000 <15337.000000>] [Wed Feb 18 07:12:18 2009] example[72]
+[389017.000000 <15769.000000>] [Wed Feb 18 11:35:07 2009] example[73]
+[405224.000000 <16207.000000>] [Wed Feb 18 16:05:14 2009] example[74]
+[421875.000000 <16651.000000>] [Wed Feb 18 20:42:45 2009] example[75]
+[438976.000000 <17101.000000>] [Thu Feb 19 01:27:46 2009] example[76]
+[456533.000000 <17557.000000>] [Thu Feb 19 06:20:23 2009] example[77]
+[474552.000000 <18019.000000>] [Thu Feb 19 11:20:42 2009] example[78]
+[493039.000000 <18487.000000>] [Thu Feb 19 16:28:49 2009] example[79]
+[512000.000000 <18961.000000>] [Thu Feb 19 21:44:50 2009] example[80]
+[531441.000000 <19441.000000>] [Fri Feb 20 03:08:51 2009] example[81]
+[551368.000000 <19927.000000>] [Fri Feb 20 08:40:58 2009] example[82]
+[571787.000000 <20419.000000>] [Fri Feb 20 14:21:17 2009] example[83]
+[592704.000000 <20917.000000>] [Fri Feb 20 20:09:54 2009] example[84]
+[614125.000000 <21421.000000>] [Sat Feb 21 02:06:55 2009] example[85]
+[636056.000000 <21931.000000>] [Sat Feb 21 08:12:26 2009] example[86]
+[658503.000000 <22447.000000>] [Sat Feb 21 14:26:33 2009] example[87]
+[681472.000000 <22969.000000>] [Sat Feb 21 20:49:22 2009] example[88]
+[704969.000000 <23497.000000>] [Sun Feb 22 03:20:59 2009] example[89]
+[729000.000000 <24031.000000>] [Sun Feb 22 10:01:30 2009] example[90]
+[753571.000000 <24571.000000>] [Sun Feb 22 16:51:01 2009] example[91]
+[778688.000000 <25117.000000>] [Sun Feb 22 23:49:38 2009] example[92]
+[804357.000000 <25669.000000>] [Mon Feb 23 06:57:27 2009] example[93]
+[830584.000000 <26227.000000>] [Mon Feb 23 14:14:34 2009] example[94]
+[857375.000000 <26791.000000>] [Mon Feb 23 21:41:05 2009] example[95]
+[884736.000000 <27361.000000>] [Tue Feb 24 05:17:06 2009] example[96]
+[912673.000000 <27937.000000>] [Tue Feb 24 13:02:43 2009] example[97]
+[941192.000000 <28519.000000>] [Tue Feb 24 20:58:02 2009] example[98]
+[970299.000000 <29107.000000>] [Wed Feb 25 05:03:09 2009] example[99]
+[1000000.000000 <29701.000000>] [Wed Feb 25 13:18:10 2009] example[100]
+[1030301.000000 <30301.000000>] [Wed Feb 25 21:43:11 2009] example[101]
+[1061208.000000 <30907.000000>] [Thu Feb 26 06:18:18 2009] example[102]
+[1092727.000000 <31519.000000>] [Thu Feb 26 15:03:37 2009] example[103]
+[1124864.000000 <32137.000000>] [Thu Feb 26 23:59:14 2009] example[104]
+[4557523.000000 <3432659.000000>] [Tue Apr 7 17:30:13 2009] example[105]
diff --git a/tests/expected/dmesg/timestamp-format-multiple b/tests/expected/dmesg/timestamp-format-multiple
new file mode 100644
index 0000000..c64a036
--- /dev/null
+++ b/tests/expected/dmesg/timestamp-format-multiple
@@ -0,0 +1,106 @@
+[ 0.000000] [Fri Feb 13 23:31:30 2009] 2009-02-13T23:31:30,123456+00:00 example[0]
+[ 1.000000] [Fri Feb 13 23:31:31 2009] 2009-02-13T23:31:31,123456+00:00 example[1]
+[ 8.000000] [Fri Feb 13 23:31:38 2009] 2009-02-13T23:31:38,123456+00:00 example[2]
+[ 27.000000] [Fri Feb 13 23:31:57 2009] 2009-02-13T23:31:57,123456+00:00 example[3]
+[ 64.000000] [Fri Feb 13 23:32:34 2009] 2009-02-13T23:32:34,123456+00:00 example[4]
+[ 125.000000] [Fri Feb 13 23:33:35 2009] 2009-02-13T23:33:35,123456+00:00 example[5]
+[ 216.000000] [Fri Feb 13 23:35:06 2009] 2009-02-13T23:35:06,123456+00:00 example[6]
+[ 343.000000] [Fri Feb 13 23:37:13 2009] 2009-02-13T23:37:13,123456+00:00 example[7]
+[ 512.000000] [Fri Feb 13 23:40:02 2009] 2009-02-13T23:40:02,123456+00:00 example[8]
+[ 729.000000] [Fri Feb 13 23:43:39 2009] 2009-02-13T23:43:39,123456+00:00 example[9]
+[ 1000.000000] [Fri Feb 13 23:48:10 2009] 2009-02-13T23:48:10,123456+00:00 example[10]
+[ 1331.000000] [Fri Feb 13 23:53:41 2009] 2009-02-13T23:53:41,123456+00:00 example[11]
+[ 1728.000000] [Sat Feb 14 00:00:18 2009] 2009-02-14T00:00:18,123456+00:00 example[12]
+[ 2197.000000] [Sat Feb 14 00:08:07 2009] 2009-02-14T00:08:07,123456+00:00 example[13]
+[ 2744.000000] [Sat Feb 14 00:17:14 2009] 2009-02-14T00:17:14,123456+00:00 example[14]
+[ 3375.000000] [Sat Feb 14 00:27:45 2009] 2009-02-14T00:27:45,123456+00:00 example[15]
+[ 4096.000000] [Sat Feb 14 00:39:46 2009] 2009-02-14T00:39:46,123456+00:00 example[16]
+[ 4913.000000] [Sat Feb 14 00:53:23 2009] 2009-02-14T00:53:23,123456+00:00 example[17]
+[ 5832.000000] [Sat Feb 14 01:08:42 2009] 2009-02-14T01:08:42,123456+00:00 example[18]
+[ 6859.000000] [Sat Feb 14 01:25:49 2009] 2009-02-14T01:25:49,123456+00:00 example[19]
+[ 8000.000000] [Sat Feb 14 01:44:50 2009] 2009-02-14T01:44:50,123456+00:00 example[20]
+[ 9261.000000] [Sat Feb 14 02:05:51 2009] 2009-02-14T02:05:51,123456+00:00 example[21]
+[10648.000000] [Sat Feb 14 02:28:58 2009] 2009-02-14T02:28:58,123456+00:00 example[22]
+[12167.000000] [Sat Feb 14 02:54:17 2009] 2009-02-14T02:54:17,123456+00:00 example[23]
+[13824.000000] [Sat Feb 14 03:21:54 2009] 2009-02-14T03:21:54,123456+00:00 example[24]
+[15625.000000] [Sat Feb 14 03:51:55 2009] 2009-02-14T03:51:55,123456+00:00 example[25]
+[17576.000000] [Sat Feb 14 04:24:26 2009] 2009-02-14T04:24:26,123456+00:00 example[26]
+[19683.000000] [Sat Feb 14 04:59:33 2009] 2009-02-14T04:59:33,123456+00:00 example[27]
+[21952.000000] [Sat Feb 14 05:37:22 2009] 2009-02-14T05:37:22,123456+00:00 example[28]
+[24389.000000] [Sat Feb 14 06:17:59 2009] 2009-02-14T06:17:59,123456+00:00 example[29]
+[27000.000000] [Sat Feb 14 07:01:30 2009] 2009-02-14T07:01:30,123456+00:00 example[30]
+[29791.000000] [Sat Feb 14 07:48:01 2009] 2009-02-14T07:48:01,123456+00:00 example[31]
+[32768.000000] [Sat Feb 14 08:37:38 2009] 2009-02-14T08:37:38,123456+00:00 example[32]
+[35937.000000] [Sat Feb 14 09:30:27 2009] 2009-02-14T09:30:27,123456+00:00 example[33]
+[39304.000000] [Sat Feb 14 10:26:34 2009] 2009-02-14T10:26:34,123456+00:00 example[34]
+[42875.000000] [Sat Feb 14 11:26:05 2009] 2009-02-14T11:26:05,123456+00:00 example[35]
+[46656.000000] [Sat Feb 14 12:29:06 2009] 2009-02-14T12:29:06,123456+00:00 example[36]
+[50653.000000] [Sat Feb 14 13:35:43 2009] 2009-02-14T13:35:43,123456+00:00 example[37]
+[54872.000000] [Sat Feb 14 14:46:02 2009] 2009-02-14T14:46:02,123456+00:00 example[38]
+[59319.000000] [Sat Feb 14 16:00:09 2009] 2009-02-14T16:00:09,123456+00:00 example[39]
+[64000.000000] [Sat Feb 14 17:18:10 2009] 2009-02-14T17:18:10,123456+00:00 example[40]
+[68921.000000] [Sat Feb 14 18:40:11 2009] 2009-02-14T18:40:11,123456+00:00 example[41]
+[74088.000000] [Sat Feb 14 20:06:18 2009] 2009-02-14T20:06:18,123456+00:00 example[42]
+[79507.000000] [Sat Feb 14 21:36:37 2009] 2009-02-14T21:36:37,123456+00:00 example[43]
+[85184.000000] [Sat Feb 14 23:11:14 2009] 2009-02-14T23:11:14,123456+00:00 example[44]
+[91125.000000] [Sun Feb 15 00:50:15 2009] 2009-02-15T00:50:15,123456+00:00 example[45]
+[97336.000000] [Sun Feb 15 02:33:46 2009] 2009-02-15T02:33:46,123456+00:00 example[46]
+[103823.000000] [Sun Feb 15 04:21:53 2009] 2009-02-15T04:21:53,123456+00:00 example[47]
+[110592.000000] [Sun Feb 15 06:14:42 2009] 2009-02-15T06:14:42,123456+00:00 example[48]
+[117649.000000] [Sun Feb 15 08:12:19 2009] 2009-02-15T08:12:19,123456+00:00 example[49]
+[125000.000000] [Sun Feb 15 10:14:50 2009] 2009-02-15T10:14:50,123456+00:00 example[50]
+[132651.000000] [Sun Feb 15 12:22:21 2009] 2009-02-15T12:22:21,123456+00:00 example[51]
+[140608.000000] [Sun Feb 15 14:34:58 2009] 2009-02-15T14:34:58,123456+00:00 example[52]
+[148877.000000] [Sun Feb 15 16:52:47 2009] 2009-02-15T16:52:47,123456+00:00 example[53]
+[157464.000000] [Sun Feb 15 19:15:54 2009] 2009-02-15T19:15:54,123456+00:00 example[54]
+[166375.000000] [Sun Feb 15 21:44:25 2009] 2009-02-15T21:44:25,123456+00:00 example[55]
+[175616.000000] [Mon Feb 16 00:18:26 2009] 2009-02-16T00:18:26,123456+00:00 example[56]
+[185193.000000] [Mon Feb 16 02:58:03 2009] 2009-02-16T02:58:03,123456+00:00 example[57]
+[195112.000000] [Mon Feb 16 05:43:22 2009] 2009-02-16T05:43:22,123456+00:00 example[58]
+[205379.000000] [Mon Feb 16 08:34:29 2009] 2009-02-16T08:34:29,123456+00:00 example[59]
+[216000.000000] [Mon Feb 16 11:31:30 2009] 2009-02-16T11:31:30,123456+00:00 example[60]
+[226981.000000] [Mon Feb 16 14:34:31 2009] 2009-02-16T14:34:31,123456+00:00 example[61]
+[238328.000000] [Mon Feb 16 17:43:38 2009] 2009-02-16T17:43:38,123456+00:00 example[62]
+[250047.000000] [Mon Feb 16 20:58:57 2009] 2009-02-16T20:58:57,123456+00:00 example[63]
+[262144.000000] [Tue Feb 17 00:20:34 2009] 2009-02-17T00:20:34,123456+00:00 example[64]
+[274625.000000] [Tue Feb 17 03:48:35 2009] 2009-02-17T03:48:35,123456+00:00 example[65]
+[287496.000000] [Tue Feb 17 07:23:06 2009] 2009-02-17T07:23:06,123456+00:00 example[66]
+[300763.000000] [Tue Feb 17 11:04:13 2009] 2009-02-17T11:04:13,123456+00:00 example[67]
+[314432.000000] [Tue Feb 17 14:52:02 2009] 2009-02-17T14:52:02,123456+00:00 example[68]
+[328509.000000] [Tue Feb 17 18:46:39 2009] 2009-02-17T18:46:39,123456+00:00 example[69]
+[343000.000000] [Tue Feb 17 22:48:10 2009] 2009-02-17T22:48:10,123456+00:00 example[70]
+[357911.000000] [Wed Feb 18 02:56:41 2009] 2009-02-18T02:56:41,123456+00:00 example[71]
+[373248.000000] [Wed Feb 18 07:12:18 2009] 2009-02-18T07:12:18,123456+00:00 example[72]
+[389017.000000] [Wed Feb 18 11:35:07 2009] 2009-02-18T11:35:07,123456+00:00 example[73]
+[405224.000000] [Wed Feb 18 16:05:14 2009] 2009-02-18T16:05:14,123456+00:00 example[74]
+[421875.000000] [Wed Feb 18 20:42:45 2009] 2009-02-18T20:42:45,123456+00:00 example[75]
+[438976.000000] [Thu Feb 19 01:27:46 2009] 2009-02-19T01:27:46,123456+00:00 example[76]
+[456533.000000] [Thu Feb 19 06:20:23 2009] 2009-02-19T06:20:23,123456+00:00 example[77]
+[474552.000000] [Thu Feb 19 11:20:42 2009] 2009-02-19T11:20:42,123456+00:00 example[78]
+[493039.000000] [Thu Feb 19 16:28:49 2009] 2009-02-19T16:28:49,123456+00:00 example[79]
+[512000.000000] [Thu Feb 19 21:44:50 2009] 2009-02-19T21:44:50,123456+00:00 example[80]
+[531441.000000] [Fri Feb 20 03:08:51 2009] 2009-02-20T03:08:51,123456+00:00 example[81]
+[551368.000000] [Fri Feb 20 08:40:58 2009] 2009-02-20T08:40:58,123456+00:00 example[82]
+[571787.000000] [Fri Feb 20 14:21:17 2009] 2009-02-20T14:21:17,123456+00:00 example[83]
+[592704.000000] [Fri Feb 20 20:09:54 2009] 2009-02-20T20:09:54,123456+00:00 example[84]
+[614125.000000] [Sat Feb 21 02:06:55 2009] 2009-02-21T02:06:55,123456+00:00 example[85]
+[636056.000000] [Sat Feb 21 08:12:26 2009] 2009-02-21T08:12:26,123456+00:00 example[86]
+[658503.000000] [Sat Feb 21 14:26:33 2009] 2009-02-21T14:26:33,123456+00:00 example[87]
+[681472.000000] [Sat Feb 21 20:49:22 2009] 2009-02-21T20:49:22,123456+00:00 example[88]
+[704969.000000] [Sun Feb 22 03:20:59 2009] 2009-02-22T03:20:59,123456+00:00 example[89]
+[729000.000000] [Sun Feb 22 10:01:30 2009] 2009-02-22T10:01:30,123456+00:00 example[90]
+[753571.000000] [Sun Feb 22 16:51:01 2009] 2009-02-22T16:51:01,123456+00:00 example[91]
+[778688.000000] [Sun Feb 22 23:49:38 2009] 2009-02-22T23:49:38,123456+00:00 example[92]
+[804357.000000] [Mon Feb 23 06:57:27 2009] 2009-02-23T06:57:27,123456+00:00 example[93]
+[830584.000000] [Mon Feb 23 14:14:34 2009] 2009-02-23T14:14:34,123456+00:00 example[94]
+[857375.000000] [Mon Feb 23 21:41:05 2009] 2009-02-23T21:41:05,123456+00:00 example[95]
+[884736.000000] [Tue Feb 24 05:17:06 2009] 2009-02-24T05:17:06,123456+00:00 example[96]
+[912673.000000] [Tue Feb 24 13:02:43 2009] 2009-02-24T13:02:43,123456+00:00 example[97]
+[941192.000000] [Tue Feb 24 20:58:02 2009] 2009-02-24T20:58:02,123456+00:00 example[98]
+[970299.000000] [Wed Feb 25 05:03:09 2009] 2009-02-25T05:03:09,123456+00:00 example[99]
+[1000000.000000] [Wed Feb 25 13:18:10 2009] 2009-02-25T13:18:10,123456+00:00 example[100]
+[1030301.000000] [Wed Feb 25 21:43:11 2009] 2009-02-25T21:43:11,123456+00:00 example[101]
+[1061208.000000] [Thu Feb 26 06:18:18 2009] 2009-02-26T06:18:18,123456+00:00 example[102]
+[1092727.000000] [Thu Feb 26 15:03:37 2009] 2009-02-26T15:03:37,123456+00:00 example[103]
+[1124864.000000] [Thu Feb 26 23:59:14 2009] 2009-02-26T23:59:14,123456+00:00 example[104]
+[4557523.000000] [Tue Apr 7 17:30:13 2009] 2009-04-07T17:30:13,123456+00:00 example[105]
diff --git a/tests/expected/exch/exch b/tests/expected/exch/exch
new file mode 100644
index 0000000..646ff6d
--- /dev/null
+++ b/tests/expected/exch/exch
@@ -0,0 +1,4 @@
+A
+B
+B
+A
diff --git a/tests/expected/fadvise/drop b/tests/expected/fadvise/drop
index f2360b5..e7bb26b 100644
--- a/tests/expected/fadvise/drop
+++ b/tests/expected/fadvise/drop
@@ -1,23 +1,23 @@
- RES PAGES SIZE FILE
- 32K 8 32K ddtest
+ RES SIZE FILE
+ 512K 512K ddtest
whole file
status: 0
-RES PAGES SIZE FILE
- 0B 0 32K ddtest
+RES SIZE FILE
+ 0B 512K ddtest
-offset: 8192
+offset: 131072
status: 0
-RES PAGES SIZE FILE
- 8K 2 32K ddtest
+ RES SIZE FILE
+ 128K 512K ddtest
-length: 16384
+length: 262144
status: 0
- RES PAGES SIZE FILE
- 16K 4 32K ddtest
+ RES SIZE FILE
+ 256K 512K ddtest
-offset: 8192, length: 16384 fd: 42
+offset: 131072, length: 262144 fd: 42
status: 0
- RES PAGES SIZE FILE
- 16K 4 32K ddtest
+ RES SIZE FILE
+ 256K 512K ddtest
diff --git a/tests/expected/fdisk/mbr-nondos-mode-first-sector-at-end b/tests/expected/fdisk/mbr-nondos-mode-first-sector-at-end
index 3656a0b..0251f31 100644
--- a/tests/expected/fdisk/mbr-nondos-mode-first-sector-at-end
+++ b/tests/expected/fdisk/mbr-nondos-mode-first-sector-at-end
@@ -27,7 +27,6 @@ Select (default p): Partition number (2-4, default 2): First sector (2048-19999,
Created a new partition <removed>.
Command (m for help): The partition table has been altered.
-Syncing disks.
---layout----------
diff --git a/tests/expected/fdisk/resize b/tests/expected/fdisk/resize
new file mode 100644
index 0000000..32f9ce2
--- /dev/null
+++ b/tests/expected/fdisk/resize
@@ -0,0 +1,75 @@
+Create initial partitions
+
+---layout----------
+Disk <removed>: 10 MiB, 10485760 bytes, 20480 sectors
+Units: sectors of 1 * 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / <removed> bytes
+Disklabel type: gpt
+Disk identifier: <removed>
+
+Device Start End Sectors Size Type
+<removed>1 2048 4095 2048 1M Linux filesystem
+<removed>2 8192 10239 2048 1M Linux filesystem
+-------------------
+
+Grow first to max
+
+---layout----------
+Disk <removed>: 10 MiB, 10485760 bytes, 20480 sectors
+Units: sectors of 1 * 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / <removed> bytes
+Disklabel type: gpt
+Disk identifier: <removed>
+
+Device Start End Sectors Size Type
+<removed>1 2048 8191 6144 3M Linux filesystem
+<removed>2 8192 10239 2048 1M Linux filesystem
+-------------------
+
+Grow second to max
+
+---layout----------
+Disk <removed>: 10 MiB, 10485760 bytes, 20480 sectors
+Units: sectors of 1 * 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / <removed> bytes
+Disklabel type: gpt
+Disk identifier: <removed>
+
+Device Start End Sectors Size Type
+<removed>1 2048 8191 6144 3M Linux filesystem
+<removed>2 8192 20446 12255 6M Linux filesystem
+-------------------
+
+Resize first to 4096 bytes
+
+---layout----------
+Disk <removed>: 10 MiB, 10485760 bytes, 20480 sectors
+Units: sectors of 1 * 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / <removed> bytes
+Disklabel type: gpt
+Disk identifier: <removed>
+
+Device Start End Sectors Size Type
+<removed>1 2048 2055 8 4K Linux filesystem
+<removed>2 8192 20446 12255 6M Linux filesystem
+-------------------
+
+Resize second to 8 sectors
+
+---layout----------
+Disk <removed>: 10 MiB, 10485760 bytes, 20480 sectors
+Units: sectors of 1 * 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / <removed> bytes
+Disklabel type: gpt
+Disk identifier: <removed>
+
+Device Start End Sectors Size Type
+<removed>1 2048 2055 8 4K Linux filesystem
+<removed>2 8192 8199 8 4K Linux filesystem
+-------------------
+
diff --git a/tests/expected/fdisk/sunlabel-create-second-partition b/tests/expected/fdisk/sunlabel-create-second-partition
index f6442d3..124f71b 100644
--- a/tests/expected/fdisk/sunlabel-create-second-partition
+++ b/tests/expected/fdisk/sunlabel-create-second-partition
@@ -8,7 +8,6 @@ Command (m for help): Partition number (2-8, default 2): First cylinder (128-325
Created a new partition <removed>.
Command (m for help): The partition table has been altered.
-Syncing disks.
a87e80830aa13d2d68b766962f052750 sunlabel.img
Disk <removed>: 10 MiB, 10485760 bytes, 20480 sectors
diff --git a/tests/expected/fincore/count.4096 b/tests/expected/fincore/count.4096
index e90044c..a5d764f 100644
--- a/tests/expected/fincore/count.4096
+++ b/tests/expected/fincore/count.4096
@@ -1,36 +1,36 @@
[ NO EXCITING FILE ]
return value: 1
- 0 0 i_EMPTY_FILE
+0 0 i_EMPTY_FILE
return value: 0
- 1 4095 i_PAGESIZE_-1__incore_
+1 4095 i_PAGESIZE_-1__incore_
return value: 0
- 1 4096 i_JUST_PAGESIZE_incore_
+1 4096 i_JUST_PAGESIZE_incore_
return value: 0
- 0 4096 i_JUST_PAGESIZE_directio_
+0 4096 i_JUST_PAGESIZE_directio_
return value: 0
- 2 8192 i_TWO_PAGES_incore_
+2 8192 i_TWO_PAGES_incore_
return value: 0
- 0 8192 i_TWO_PAGES_directio_
+0 8192 i_TWO_PAGES_directio_
return value: 0
- 1 8192 i_TWO_PAGES_mixed_directio_incore_
+1 8192 i_TWO_PAGES_mixed_directio_incore_
return value: 0
- 1 8192 i_TWO_PAGES_mixed_incore_directio_
+1 8192 i_TWO_PAGES_mixed_incore_directio_
return value: 0
- 2 134213632 i_WINDOW_SIZE_incore-sparse-incore_
+2 134213632 i_WINDOW_SIZE_incore-sparse-incore_
return value: 0
- 0 134213632 i_WINDOW_SIZE_directio-sparse-directio_
+0 134213632 i_WINDOW_SIZE_directio-sparse-directio_
return value: 0
- 1 134213632 i_WINDOW_SIZE_incore-sparse-directio_
+1 134213632 i_WINDOW_SIZE_incore-sparse-directio_
return value: 0
- 1 134213632 i_WINDOW_SIZE_directio-sparse-incore_
+1 134213632 i_WINDOW_SIZE_directio-sparse-incore_
return value: 0
- 2 134217728 i_WINDOW_SIZE_+_1_page_incore-sparse-incore_
+2 134217728 i_WINDOW_SIZE_+_1_page_incore-sparse-incore_
return value: 0
- 0 134217728 i_WINDOW_SIZE_+_1_page_directio-sparse-directio_
+0 134217728 i_WINDOW_SIZE_+_1_page_directio-sparse-directio_
return value: 0
- 1 134217728 i_WINDOW_SIZE_+_1_page_incore-sparse-directio_
+1 134217728 i_WINDOW_SIZE_+_1_page_incore-sparse-directio_
return value: 0
- 1 134217728 i_WINDOW_SIZE_+_1_page_directio-sparse-incore_
+1 134217728 i_WINDOW_SIZE_+_1_page_directio-sparse-incore_
return value: 0
[ MULTIPLE FILES ]
PAGES SIZE FILE
diff --git a/tests/expected/fincore/count.65536 b/tests/expected/fincore/count.65536
index 22d6a08..07a97d2 100644
--- a/tests/expected/fincore/count.65536
+++ b/tests/expected/fincore/count.65536
@@ -1,36 +1,36 @@
[ NO EXCITING FILE ]
return value: 1
- 0 0 i_EMPTY_FILE
+0 0 i_EMPTY_FILE
return value: 0
- 1 65535 i_PAGESIZE_-1__incore_
+1 65535 i_PAGESIZE_-1__incore_
return value: 0
- 1 65536 i_JUST_PAGESIZE_incore_
+1 65536 i_JUST_PAGESIZE_incore_
return value: 0
- 0 65536 i_JUST_PAGESIZE_directio_
+0 65536 i_JUST_PAGESIZE_directio_
return value: 0
- 2 131072 i_TWO_PAGES_incore_
+2 131072 i_TWO_PAGES_incore_
return value: 0
- 0 131072 i_TWO_PAGES_directio_
+0 131072 i_TWO_PAGES_directio_
return value: 0
- 1 131072 i_TWO_PAGES_mixed_directio_incore_
+1 131072 i_TWO_PAGES_mixed_directio_incore_
return value: 0
- 1 131072 i_TWO_PAGES_mixed_incore_directio_
+1 131072 i_TWO_PAGES_mixed_incore_directio_
return value: 0
- 2 2147418112 i_WINDOW_SIZE_incore-sparse-incore_
+2 2147418112 i_WINDOW_SIZE_incore-sparse-incore_
return value: 0
- 0 2147418112 i_WINDOW_SIZE_directio-sparse-directio_
+0 2147418112 i_WINDOW_SIZE_directio-sparse-directio_
return value: 0
- 1 2147418112 i_WINDOW_SIZE_incore-sparse-directio_
+1 2147418112 i_WINDOW_SIZE_incore-sparse-directio_
return value: 0
- 1 2147418112 i_WINDOW_SIZE_directio-sparse-incore_
+1 2147418112 i_WINDOW_SIZE_directio-sparse-incore_
return value: 0
- 2 2147483648 i_WINDOW_SIZE_+_1_page_incore-sparse-incore_
+2 2147483648 i_WINDOW_SIZE_+_1_page_incore-sparse-incore_
return value: 0
- 0 2147483648 i_WINDOW_SIZE_+_1_page_directio-sparse-directio_
+0 2147483648 i_WINDOW_SIZE_+_1_page_directio-sparse-directio_
return value: 0
- 1 2147483648 i_WINDOW_SIZE_+_1_page_incore-sparse-directio_
+1 2147483648 i_WINDOW_SIZE_+_1_page_incore-sparse-directio_
return value: 0
- 1 2147483648 i_WINDOW_SIZE_+_1_page_directio-sparse-incore_
+1 2147483648 i_WINDOW_SIZE_+_1_page_directio-sparse-incore_
return value: 0
[ MULTIPLE FILES ]
PAGES SIZE FILE
diff --git a/tests/expected/fincore/count.nosize b/tests/expected/fincore/count.nosize
index 6fdcea0..ec26542 100644
--- a/tests/expected/fincore/count.nosize
+++ b/tests/expected/fincore/count.nosize
@@ -1,36 +1,36 @@
[ NO EXCITING FILE ]
return value: 1
- 0 i_EMPTY_FILE
+0 i_EMPTY_FILE
return value: 0
- 1 i_PAGESIZE_-1__incore_
+1 i_PAGESIZE_-1__incore_
return value: 0
- 1 i_JUST_PAGESIZE_incore_
+1 i_JUST_PAGESIZE_incore_
return value: 0
- 0 i_JUST_PAGESIZE_directio_
+0 i_JUST_PAGESIZE_directio_
return value: 0
- 2 i_TWO_PAGES_incore_
+2 i_TWO_PAGES_incore_
return value: 0
- 0 i_TWO_PAGES_directio_
+0 i_TWO_PAGES_directio_
return value: 0
- 1 i_TWO_PAGES_mixed_directio_incore_
+1 i_TWO_PAGES_mixed_directio_incore_
return value: 0
- 1 i_TWO_PAGES_mixed_incore_directio_
+1 i_TWO_PAGES_mixed_incore_directio_
return value: 0
- 2 i_WINDOW_SIZE_incore-sparse-incore_
+2 i_WINDOW_SIZE_incore-sparse-incore_
return value: 0
- 0 i_WINDOW_SIZE_directio-sparse-directio_
+0 i_WINDOW_SIZE_directio-sparse-directio_
return value: 0
- 1 i_WINDOW_SIZE_incore-sparse-directio_
+1 i_WINDOW_SIZE_incore-sparse-directio_
return value: 0
- 1 i_WINDOW_SIZE_directio-sparse-incore_
+1 i_WINDOW_SIZE_directio-sparse-incore_
return value: 0
- 2 i_WINDOW_SIZE_+_1_page_incore-sparse-incore_
+2 i_WINDOW_SIZE_+_1_page_incore-sparse-incore_
return value: 0
- 0 i_WINDOW_SIZE_+_1_page_directio-sparse-directio_
+0 i_WINDOW_SIZE_+_1_page_directio-sparse-directio_
return value: 0
- 1 i_WINDOW_SIZE_+_1_page_incore-sparse-directio_
+1 i_WINDOW_SIZE_+_1_page_incore-sparse-directio_
return value: 0
- 1 i_WINDOW_SIZE_+_1_page_directio-sparse-incore_
+1 i_WINDOW_SIZE_+_1_page_directio-sparse-incore_
return value: 0
[ MULTIPLE FILES ]
PAGES FILE
diff --git a/tests/expected/hexdump/format-strings-1b_hex b/tests/expected/hexdump/format-strings-1b_hex
new file mode 100644
index 0000000..ecd4960
--- /dev/null
+++ b/tests/expected/hexdump/format-strings-1b_hex
@@ -0,0 +1,41 @@
+0000000 00 20 01 20 02 20 03 20 04 20 05 20 06 20 07 20
+0000010 08 20 09 20 0a 20 0b 20 0c 20 0d 20 0e 20 0f 20
+0000020 10 20 11 20 12 20 13 20 14 20 15 20 16 20 17 20
+0000030 18 20 19 20 1a 20 1b 20 1c 20 1d 20 1e 20 1f 20
+0000040 20 20 21 20 22 20 23 20 24 20 25 20 26 20 27 20
+0000050 28 20 29 20 2a 20 2b 20 2c 20 2d 20 2e 20 2f 20
+0000060 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37 20
+0000070 38 20 39 20 3a 20 3b 20 3c 20 3d 20 3e 20 3f 20
+0000080 40 20 41 20 42 20 43 20 44 20 45 20 46 20 47 20
+0000090 48 20 49 20 4a 20 4b 20 4c 20 4d 20 4e 20 4f 20
+00000a0 50 20 51 20 52 20 53 20 54 20 55 20 56 20 57 20
+00000b0 58 20 59 20 5a 20 5b 20 5c 20 5d 20 5e 20 5f 20
+00000c0 60 20 61 20 62 20 63 20 64 20 65 20 66 20 67 20
+00000d0 68 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 6f 20
+00000e0 70 20 71 20 72 20 73 20 74 20 75 20 76 20 77 20
+00000f0 78 20 79 20 7a 20 7b 20 7c 20 7d 20 7e 20 7f 20
+0000100 c2 80 20 c2 81 20 c2 82 20 c2 83 20 c2 84 20 c2
+0000110 85 20 c2 86 20 c2 87 20 c2 88 20 c2 89 20 c2 8a
+0000120 20 c2 8b 20 c2 8c 20 c2 8d 20 c2 8e 20 c2 8f 20
+0000130 c2 90 20 c2 91 20 c2 92 20 c2 93 20 c2 94 20 c2
+0000140 95 20 c2 96 20 c2 97 20 c2 98 20 c2 99 20 c2 9a
+0000150 20 c2 9b 20 c2 9c 20 c2 9d 20 c2 9e 20 c2 9f 20
+0000160 c2 a0 20 c2 a1 20 c2 a2 20 c2 a3 20 c2 a4 20 c2
+0000170 a5 20 c2 a6 20 c2 a7 20 c2 a8 20 c2 a9 20 c2 aa
+0000180 20 c2 ab 20 c2 ac 20 c2 ad 20 c2 ae 20 c2 af 20
+0000190 c2 b0 20 c2 b1 20 c2 b2 20 c2 b3 20 c2 b4 20 c2
+00001a0 b5 20 c2 b6 20 c2 b7 20 c2 b8 20 c2 b9 20 c2 ba
+00001b0 20 c2 bb 20 c2 bc 20 c2 bd 20 c2 be 20 c2 bf 20
+00001c0 c3 80 20 c3 81 20 c3 82 20 c3 83 20 c3 84 20 c3
+00001d0 85 20 c3 86 20 c3 87 20 c3 88 20 c3 89 20 c3 8a
+00001e0 20 c3 8b 20 c3 8c 20 c3 8d 20 c3 8e 20 c3 8f 20
+00001f0 c3 90 20 c3 91 20 c3 92 20 c3 93 20 c3 94 20 c3
+0000200 95 20 c3 96 20 c3 97 20 c3 98 20 c3 99 20 c3 9a
+0000210 20 c3 9b 20 c3 9c 20 c3 9d 20 c3 9e 20 c3 9f 20
+0000220 c3 a0 20 c3 a1 20 c3 a2 20 c3 a3 20 c3 a4 20 c3
+0000230 a5 20 c3 a6 20 c3 a7 20 c3 a8 20 c3 a9 20 c3 aa
+0000240 20 c3 ab 20 c3 ac 20 c3 ad 20 c3 ae 20 c3 af 20
+0000250 c3 b0 20 c3 b1 20 c3 b2 20 c3 b3 20 c3 b4 20 c3
+0000260 b5 20 c3 b6 20 c3 b7 20 c3 b8 20 c3 b9 20 c3 ba
+0000270 20 c3 bb 20 c3 bc 20 c3 bd 20 c3 be 20 c3 bf 20
+0000280
diff --git a/tests/expected/libfdisk/gpt-all-defaults b/tests/expected/libfdisk/gpt-all-defaults
index 218338a..e9df0bd 100644
--- a/tests/expected/libfdisk/gpt-all-defaults
+++ b/tests/expected/libfdisk/gpt-all-defaults
@@ -21,4 +21,3 @@ Device Start End Sectors Size Type
<removed>2 12288 18431 6144 3M Linux filesystem
The partition table has been altered.
-Syncing disks.
diff --git a/tests/expected/libfdisk/gpt-all-defaults-with-typo b/tests/expected/libfdisk/gpt-all-defaults-with-typo
index 218338a..e9df0bd 100644
--- a/tests/expected/libfdisk/gpt-all-defaults-with-typo
+++ b/tests/expected/libfdisk/gpt-all-defaults-with-typo
@@ -21,4 +21,3 @@ Device Start End Sectors Size Type
<removed>2 12288 18431 6144 3M Linux filesystem
The partition table has been altered.
-Syncing disks.
diff --git a/tests/expected/libmount/optlist-append b/tests/expected/libmount/optlist-append
new file mode 100644
index 0000000..d6951ed
--- /dev/null
+++ b/tests/expected/libmount/optlist-append
@@ -0,0 +1,5 @@
+#01 [ unknown ] name:'aaa', value:'(null)'
+#02 [ unknown ] name:'bbb', value:'BBB'
+#03 [ unknown ] name:'context', value:'foo,bar,gogo'
+#04 [ unknown ] name:'ccc', value:'(null)'
+#05 [ unknown ] name:'ddd', value:'(null)'
diff --git a/tests/expected/libmount/optlist-append-empty-value b/tests/expected/libmount/optlist-append-empty-value
new file mode 100644
index 0000000..1ed1028
--- /dev/null
+++ b/tests/expected/libmount/optlist-append-empty-value
@@ -0,0 +1,4 @@
+#01 [ unknown ] name:'aaa', value:'(null)'
+#02 [ unknown ] name:'bbb', value:'BBB'
+#03 [ unknown ] name:'ccc', value:'(null)'
+#04 [ unknown ] name:'ddd', value:'(null)'
diff --git a/tests/expected/libmount/optlist-append-value b/tests/expected/libmount/optlist-append-value
new file mode 100644
index 0000000..24f9115
--- /dev/null
+++ b/tests/expected/libmount/optlist-append-value
@@ -0,0 +1,4 @@
+#01 [ unknown ] name:'aaa', value:'(null)'
+#02 [ unknown ] name:'bbb', value:'BBB'
+#03 [ unknown ] name:'ccc', value:'(null)'
+#04 [ unknown ] name:'ddd', value:'DDD'
diff --git a/tests/expected/libmount/optlist-get b/tests/expected/libmount/optlist-get
new file mode 100644
index 0000000..217a6f7
--- /dev/null
+++ b/tests/expected/libmount/optlist-get
@@ -0,0 +1,4 @@
+Default: rw,aaa,bbb=BBB,ccc
+All: rw,aaa,bbb=BBB,ccc
+Unknown: aaa,bbb=BBB,ccc
+Helpers: rw,aaa,bbb=BBB,ccc
diff --git a/tests/expected/libmount/optlist-get-flg-linux b/tests/expected/libmount/optlist-get-flg-linux
new file mode 100644
index 0000000..f57108b
--- /dev/null
+++ b/tests/expected/libmount/optlist-get-flg-linux
@@ -0,0 +1 @@
+0x00000008
diff --git a/tests/expected/libmount/optlist-get-flg-user b/tests/expected/libmount/optlist-get-flg-user
new file mode 100644
index 0000000..83ab8b2
--- /dev/null
+++ b/tests/expected/libmount/optlist-get-flg-user
@@ -0,0 +1 @@
+0x0000000c
diff --git a/tests/expected/libmount/optlist-get-str b/tests/expected/libmount/optlist-get-str
new file mode 100644
index 0000000..f7f3a13
--- /dev/null
+++ b/tests/expected/libmount/optlist-get-str
@@ -0,0 +1,4 @@
+Default: rw,aaa,bbb=BBB,ccc,defaults
+All: rw,aaa,bbb=BBB,ccc,defaults
+Unknown: aaa,bbb=BBB,ccc
+Helpers: rw,aaa,bbb=BBB,ccc
diff --git a/tests/expected/libmount/optlist-get-str-linux b/tests/expected/libmount/optlist-get-str-linux
new file mode 100644
index 0000000..abe63b4
--- /dev/null
+++ b/tests/expected/libmount/optlist-get-str-linux
@@ -0,0 +1,5 @@
+Default: rw,noexec [0x00000008] (in linux map)
+Default: rw,noexec,noauto,user,defaults
+All: rw,noexec,noauto,user,defaults
+Unknown: (null)
+Helpers: rw,noexec,user
diff --git a/tests/expected/libmount/optlist-get-str-user b/tests/expected/libmount/optlist-get-str-user
new file mode 100644
index 0000000..d047003
--- /dev/null
+++ b/tests/expected/libmount/optlist-get-str-user
@@ -0,0 +1,5 @@
+Default: noauto,user,defaults [0x0000000c] (in user map)
+Default: rw,noexec,noauto,user,defaults
+All: rw,noexec,noauto,user,defaults
+Unknown: (null)
+Helpers: rw,noexec,user
diff --git a/tests/expected/libmount/optlist-get-value b/tests/expected/libmount/optlist-get-value
new file mode 100644
index 0000000..217a6f7
--- /dev/null
+++ b/tests/expected/libmount/optlist-get-value
@@ -0,0 +1,4 @@
+Default: rw,aaa,bbb=BBB,ccc
+All: rw,aaa,bbb=BBB,ccc
+Unknown: aaa,bbb=BBB,ccc
+Helpers: rw,aaa,bbb=BBB,ccc
diff --git a/tests/expected/libmount/optlist-prepend b/tests/expected/libmount/optlist-prepend
new file mode 100644
index 0000000..24c64c6
--- /dev/null
+++ b/tests/expected/libmount/optlist-prepend
@@ -0,0 +1,4 @@
+#01 [ unknown ] name:'ddd', value:'(null)'
+#02 [ unknown ] name:'aaa', value:'(null)'
+#03 [ unknown ] name:'bbb', value:'BBB'
+#04 [ unknown ] name:'ccc', value:'(null)'
diff --git a/tests/expected/libmount/optlist-prepend-empty-value b/tests/expected/libmount/optlist-prepend-empty-value
new file mode 100644
index 0000000..24c64c6
--- /dev/null
+++ b/tests/expected/libmount/optlist-prepend-empty-value
@@ -0,0 +1,4 @@
+#01 [ unknown ] name:'ddd', value:'(null)'
+#02 [ unknown ] name:'aaa', value:'(null)'
+#03 [ unknown ] name:'bbb', value:'BBB'
+#04 [ unknown ] name:'ccc', value:'(null)'
diff --git a/tests/expected/libmount/optlist-prepend-list b/tests/expected/libmount/optlist-prepend-list
new file mode 100644
index 0000000..9e5005f
--- /dev/null
+++ b/tests/expected/libmount/optlist-prepend-list
@@ -0,0 +1,6 @@
+#01 [ unknown ] name:'ddd', value:'(null)'
+#02 [ unknown ] name:'eee', value:'EEE'
+#03 [ unknown ] name:'fff', value:'(null)'
+#04 [ unknown ] name:'aaa', value:'(null)'
+#05 [ unknown ] name:'bbb', value:'BBB'
+#06 [ unknown ] name:'ccc', value:'(null)'
diff --git a/tests/expected/libmount/optlist-prepend-value b/tests/expected/libmount/optlist-prepend-value
new file mode 100644
index 0000000..eed5de5
--- /dev/null
+++ b/tests/expected/libmount/optlist-prepend-value
@@ -0,0 +1,4 @@
+#01 [ unknown ] name:'ddd', value:'DDD'
+#02 [ unknown ] name:'aaa', value:'(null)'
+#03 [ unknown ] name:'bbb', value:'BBB'
+#04 [ unknown ] name:'ccc', value:'(null)'
diff --git a/tests/expected/libmount/optlist-remove b/tests/expected/libmount/optlist-remove
new file mode 100644
index 0000000..08f3898
--- /dev/null
+++ b/tests/expected/libmount/optlist-remove
@@ -0,0 +1,12 @@
+
+Usage:
+ test_mount_optlist <test> [testoptions]
+Tests:
+ --append-str <list> <str> [linux|user] append to the list
+ --prepend-str <list> <str> [linux|user] prepend to the list
+ --set-str <list> <str> [linux|user] set to the list
+ --append-flg <list> <flg> linux|user append to the list
+ --set-flg <list> <flg> linux|user set to the list
+ --get-str <list> [linux|user] all options in string
+ --get-flg <list> linux|user all options by flags
+
diff --git a/tests/expected/libmount/optlist-remove-empty-value b/tests/expected/libmount/optlist-remove-empty-value
new file mode 100644
index 0000000..08f3898
--- /dev/null
+++ b/tests/expected/libmount/optlist-remove-empty-value
@@ -0,0 +1,12 @@
+
+Usage:
+ test_mount_optlist <test> [testoptions]
+Tests:
+ --append-str <list> <str> [linux|user] append to the list
+ --prepend-str <list> <str> [linux|user] prepend to the list
+ --set-str <list> <str> [linux|user] set to the list
+ --append-flg <list> <flg> linux|user append to the list
+ --set-flg <list> <flg> linux|user set to the list
+ --get-str <list> [linux|user] all options in string
+ --get-flg <list> linux|user all options by flags
+
diff --git a/tests/expected/libmount/optlist-remove-quoted b/tests/expected/libmount/optlist-remove-quoted
new file mode 100644
index 0000000..08f3898
--- /dev/null
+++ b/tests/expected/libmount/optlist-remove-quoted
@@ -0,0 +1,12 @@
+
+Usage:
+ test_mount_optlist <test> [testoptions]
+Tests:
+ --append-str <list> <str> [linux|user] append to the list
+ --prepend-str <list> <str> [linux|user] prepend to the list
+ --set-str <list> <str> [linux|user] set to the list
+ --append-flg <list> <flg> linux|user append to the list
+ --set-flg <list> <flg> linux|user set to the list
+ --get-str <list> [linux|user] all options in string
+ --get-flg <list> linux|user all options by flags
+
diff --git a/tests/expected/libmount/optlist-remove-value b/tests/expected/libmount/optlist-remove-value
new file mode 100644
index 0000000..08f3898
--- /dev/null
+++ b/tests/expected/libmount/optlist-remove-value
@@ -0,0 +1,12 @@
+
+Usage:
+ test_mount_optlist <test> [testoptions]
+Tests:
+ --append-str <list> <str> [linux|user] append to the list
+ --prepend-str <list> <str> [linux|user] prepend to the list
+ --set-str <list> <str> [linux|user] set to the list
+ --append-flg <list> <flg> linux|user append to the list
+ --set-flg <list> <flg> linux|user set to the list
+ --get-str <list> [linux|user] all options in string
+ --get-flg <list> linux|user all options by flags
+
diff --git a/tests/expected/libmount/optlist-set b/tests/expected/libmount/optlist-set
new file mode 100644
index 0000000..a9f1e66
--- /dev/null
+++ b/tests/expected/libmount/optlist-set
@@ -0,0 +1,4 @@
+#01 [ unknown ] name:'new', value:'(null)'
+#02 [ unknown ] name:'data', value:'(null)'
+#03 [ unknown ] name:'for', value:'(null)'
+#04 [ unknown ] name:'list', value:'(null)'
diff --git a/tests/expected/libmount/optlist-set-empty b/tests/expected/libmount/optlist-set-empty
new file mode 100644
index 0000000..02e1b58
--- /dev/null
+++ b/tests/expected/libmount/optlist-set-empty
@@ -0,0 +1 @@
+#01 [ unknown ] name:'bbb', value:'(null)'
diff --git a/tests/expected/libmount/optlist-set-large b/tests/expected/libmount/optlist-set-large
new file mode 100644
index 0000000..02e1b58
--- /dev/null
+++ b/tests/expected/libmount/optlist-set-large
@@ -0,0 +1 @@
+#01 [ unknown ] name:'bbb', value:'(null)'
diff --git a/tests/expected/libmount/optlist-set-new b/tests/expected/libmount/optlist-set-new
new file mode 100644
index 0000000..c538cbe
--- /dev/null
+++ b/tests/expected/libmount/optlist-set-new
@@ -0,0 +1 @@
+#01 [ unknown ] name:'aaa', value:'(null)'
diff --git a/tests/expected/libmount/optlist-set-new-empty b/tests/expected/libmount/optlist-set-new-empty
new file mode 100644
index 0000000..c538cbe
--- /dev/null
+++ b/tests/expected/libmount/optlist-set-new-empty
@@ -0,0 +1 @@
+#01 [ unknown ] name:'aaa', value:'(null)'
diff --git a/tests/expected/libmount/optlist-set-new-end b/tests/expected/libmount/optlist-set-new-end
new file mode 100644
index 0000000..12d6779
--- /dev/null
+++ b/tests/expected/libmount/optlist-set-new-end
@@ -0,0 +1 @@
+#01 [ unknown ] name:'ccc', value:'(null)'
diff --git a/tests/expected/libmount/optlist-set-new-end-empty b/tests/expected/libmount/optlist-set-new-end-empty
new file mode 100644
index 0000000..12d6779
--- /dev/null
+++ b/tests/expected/libmount/optlist-set-new-end-empty
@@ -0,0 +1 @@
+#01 [ unknown ] name:'ccc', value:'(null)'
diff --git a/tests/expected/libmount/optlist-set-remove b/tests/expected/libmount/optlist-set-remove
new file mode 100644
index 0000000..02e1b58
--- /dev/null
+++ b/tests/expected/libmount/optlist-set-remove
@@ -0,0 +1 @@
+#01 [ unknown ] name:'bbb', value:'(null)'
diff --git a/tests/expected/libmount/optlist-set-small b/tests/expected/libmount/optlist-set-small
new file mode 100644
index 0000000..02e1b58
--- /dev/null
+++ b/tests/expected/libmount/optlist-set-small
@@ -0,0 +1 @@
+#01 [ unknown ] name:'bbb', value:'(null)'
diff --git a/tests/expected/libmount/optstr-prepend-list b/tests/expected/libmount/optstr-prepend-list
new file mode 100644
index 0000000..9f289fd
--- /dev/null
+++ b/tests/expected/libmount/optstr-prepend-list
@@ -0,0 +1 @@
+result: >ddd,eee=EEE,fff,aaa,bbb=BBB,ccc<
diff --git a/tests/expected/libsmartcols/continuous-json b/tests/expected/libsmartcols/continuous-json
new file mode 100644
index 0000000..e8ba584
--- /dev/null
+++ b/tests/expected/libsmartcols/continuous-json
@@ -0,0 +1,40 @@
+{
+ "count": "0",
+ "text": "text0"
+}
+{
+ "count": "1",
+ "text": "text1"
+}
+{
+ "count": "2",
+ "text": "text2"
+}
+{
+ "count": "3",
+ "text": "text3"
+}
+{
+ "count": "4",
+ "text": "text4"
+}
+{
+ "count": "5",
+ "text": "text5"
+}
+{
+ "count": "6",
+ "text": "text6"
+}
+{
+ "count": "7",
+ "text": "text7"
+}
+{
+ "count": "8",
+ "text": "text8"
+}
+{
+ "count": "9",
+ "text": "text9"
+}
diff --git a/tests/expected/libsmartcols/filter b/tests/expected/libsmartcols/filter
new file mode 100644
index 0000000..4155aa3
--- /dev/null
+++ b/tests/expected/libsmartcols/filter
@@ -0,0 +1 @@
+...done.
diff --git a/tests/expected/libsmartcols/filter-bool-and b/tests/expected/libsmartcols/filter-bool-and
new file mode 100644
index 0000000..136149c
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-and
@@ -0,0 +1,7 @@
+expr: BOOL && NAME
+
+NAME BOOL
+bbb 1
+ee true
+hhh TRUE
+jj 1
diff --git a/tests/expected/libsmartcols/filter-bool-as-string b/tests/expected/libsmartcols/filter-bool-as-string
new file mode 100644
index 0000000..213ce58
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-as-string
@@ -0,0 +1,2 @@
+expr: BOOL == "0"
+
diff --git a/tests/expected/libsmartcols/filter-bool-as-string2 b/tests/expected/libsmartcols/filter-bool-as-string2
new file mode 100644
index 0000000..c4ddd20
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-as-string2
@@ -0,0 +1,2 @@
+expr: BOOL == "1"
+
diff --git a/tests/expected/libsmartcols/filter-bool-eq-false b/tests/expected/libsmartcols/filter-bool-eq-false
new file mode 100644
index 0000000..8454205
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-eq-false
@@ -0,0 +1,8 @@
+expr: BOOL == FALSE
+
+NAME BOOL
+aaaa 0
+dddddd 0
+ffff false
+gggggg FALSE
+iiiiii 0
diff --git a/tests/expected/libsmartcols/filter-bool-eq-false2 b/tests/expected/libsmartcols/filter-bool-eq-false2
new file mode 100644
index 0000000..d0d19ff
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-eq-false2
@@ -0,0 +1,8 @@
+expr: BOOL == false
+
+NAME BOOL
+aaaa 0
+dddddd 0
+ffff false
+gggggg FALSE
+iiiiii 0
diff --git a/tests/expected/libsmartcols/filter-bool-eq-false3 b/tests/expected/libsmartcols/filter-bool-eq-false3
new file mode 100644
index 0000000..605bc93
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-eq-false3
@@ -0,0 +1,9 @@
+expr: BOOL == 0
+
+NAME BOOL
+aaaa 0
+ccccc
+dddddd 0
+ffff false
+gggggg FALSE
+iiiiii 0
diff --git a/tests/expected/libsmartcols/filter-bool-eq-true b/tests/expected/libsmartcols/filter-bool-eq-true
new file mode 100644
index 0000000..d2d9199
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-eq-true
@@ -0,0 +1,7 @@
+expr: BOOL == TRUE
+
+NAME BOOL
+bbb 1
+ee true
+hhh TRUE
+jj 1
diff --git a/tests/expected/libsmartcols/filter-bool-eq-true2 b/tests/expected/libsmartcols/filter-bool-eq-true2
new file mode 100644
index 0000000..12dedc2
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-eq-true2
@@ -0,0 +1,7 @@
+expr: BOOL == true
+
+NAME BOOL
+bbb 1
+ee true
+hhh TRUE
+jj 1
diff --git a/tests/expected/libsmartcols/filter-bool-eq-true3 b/tests/expected/libsmartcols/filter-bool-eq-true3
new file mode 100644
index 0000000..801ee24
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-eq-true3
@@ -0,0 +1,7 @@
+expr: BOOL == 1
+
+NAME BOOL
+bbb 1
+ee true
+hhh TRUE
+jj 1
diff --git a/tests/expected/libsmartcols/filter-bool-is b/tests/expected/libsmartcols/filter-bool-is
new file mode 100644
index 0000000..1e8b359
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-is
@@ -0,0 +1,7 @@
+expr: BOOL
+
+NAME BOOL
+bbb 1
+ee true
+hhh TRUE
+jj 1
diff --git a/tests/expected/libsmartcols/filter-bool-ne b/tests/expected/libsmartcols/filter-bool-ne
new file mode 100644
index 0000000..6491fad
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-ne
@@ -0,0 +1,7 @@
+expr: BOOL != false
+
+NAME BOOL
+bbb 1
+ee true
+hhh TRUE
+jj 1
diff --git a/tests/expected/libsmartcols/filter-bool-ne2 b/tests/expected/libsmartcols/filter-bool-ne2
new file mode 100644
index 0000000..9fc6844
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-ne2
@@ -0,0 +1,8 @@
+expr: BOOL != true
+
+NAME BOOL
+aaaa 0
+dddddd 0
+ffff false
+gggggg FALSE
+iiiiii 0
diff --git a/tests/expected/libsmartcols/filter-bool-neg b/tests/expected/libsmartcols/filter-bool-neg
new file mode 100644
index 0000000..9311918
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-neg
@@ -0,0 +1,9 @@
+expr: !BOOL
+
+NAME BOOL
+aaaa 0
+ccccc
+dddddd 0
+ffff false
+gggggg FALSE
+iiiiii 0
diff --git a/tests/expected/libsmartcols/filter-bool-or b/tests/expected/libsmartcols/filter-bool-or
new file mode 100644
index 0000000..506242c
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-bool-or
@@ -0,0 +1,13 @@
+expr: BOOL || NAME
+
+NAME BOOL
+aaaa 0
+bbb 1
+ccccc
+dddddd 0
+ee true
+ffff false
+gggggg FALSE
+hhh TRUE
+iiiiii 0
+jj 1
diff --git a/tests/expected/libsmartcols/filter-broken-bad-column b/tests/expected/libsmartcols/filter-broken-bad-column
new file mode 100644
index 0000000..484d84a
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-broken-bad-column
@@ -0,0 +1,4 @@
+expr: XXX == 100
+
+sample-scols-fromfile: unknown column 'XXX' in filter
+sample-scols-fromfile: failed to initialize filter
diff --git a/tests/expected/libsmartcols/filter-broken-bad-float b/tests/expected/libsmartcols/filter-broken-bad-float
new file mode 100644
index 0000000..bc11bbc
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-broken-bad-float
@@ -0,0 +1,3 @@
+expr: NUM == 100 . 5
+
+sample-scols-fromfile: failed to parse filter: <bison syntax error message removed>
diff --git a/tests/expected/libsmartcols/filter-broken-bad-number b/tests/expected/libsmartcols/filter-broken-bad-number
new file mode 100644
index 0000000..d7d5e70
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-broken-bad-number
@@ -0,0 +1,3 @@
+expr: NUM == 1y0
+
+sample-scols-fromfile: failed to parse filter: <bison syntax error message removed>
diff --git a/tests/expected/libsmartcols/filter-broken-bad-oper b/tests/expected/libsmartcols/filter-broken-bad-oper
new file mode 100644
index 0000000..f0600ca
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-broken-bad-oper
@@ -0,0 +1,3 @@
+expr: NUM ** 100
+
+sample-scols-fromfile: failed to parse filter: <bison syntax error message removed>
diff --git a/tests/expected/libsmartcols/filter-broken-bad-oper2 b/tests/expected/libsmartcols/filter-broken-bad-oper2
new file mode 100644
index 0000000..69e62a2
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-broken-bad-oper2
@@ -0,0 +1,3 @@
+expr: NUM = 100
+
+sample-scols-fromfile: failed to parse filter: <bison syntax error message removed>
diff --git a/tests/expected/libsmartcols/filter-broken-no-close b/tests/expected/libsmartcols/filter-broken-no-close
new file mode 100644
index 0000000..9298977
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-broken-no-close
@@ -0,0 +1,3 @@
+expr: (NUM == 100
+
+sample-scols-fromfile: failed to parse filter: <bison syntax error message removed>
diff --git a/tests/expected/libsmartcols/filter-broken-no-column b/tests/expected/libsmartcols/filter-broken-no-column
new file mode 100644
index 0000000..db17bca
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-broken-no-column
@@ -0,0 +1,3 @@
+expr: == 100
+
+sample-scols-fromfile: failed to parse filter: <bison syntax error message removed>
diff --git a/tests/expected/libsmartcols/filter-broken-no-param b/tests/expected/libsmartcols/filter-broken-no-param
new file mode 100644
index 0000000..50f18ea
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-broken-no-param
@@ -0,0 +1,3 @@
+expr: NUM ==
+
+sample-scols-fromfile: failed to parse filter: <bison syntax error message removed>
diff --git a/tests/expected/libsmartcols/filter-broken-no-start b/tests/expected/libsmartcols/filter-broken-no-start
new file mode 100644
index 0000000..227c027
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-broken-no-start
@@ -0,0 +1,3 @@
+expr: NUM == 100)
+
+sample-scols-fromfile: failed to parse filter: <bison syntax error message removed>
diff --git a/tests/expected/libsmartcols/filter-float-and b/tests/expected/libsmartcols/filter-float-and
new file mode 100644
index 0000000..dd733fb
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-and
@@ -0,0 +1,12 @@
+expr: NUM && NAME
+
+NAME NUM
+bbb 100
+ccccc 100.5
+dddddd 99.9
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8000
+jj 8000.5
diff --git a/tests/expected/libsmartcols/filter-float-as-string b/tests/expected/libsmartcols/filter-float-as-string
new file mode 100644
index 0000000..5e2d9eb
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-as-string
@@ -0,0 +1,4 @@
+expr: NUM == "100"
+
+NAME NUM
+bbb 100
diff --git a/tests/expected/libsmartcols/filter-float-as-string2 b/tests/expected/libsmartcols/filter-float-as-string2
new file mode 100644
index 0000000..a829b9c
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-as-string2
@@ -0,0 +1,4 @@
+expr: NUM == "100.5"
+
+NAME NUM
+ccccc 100.5
diff --git a/tests/expected/libsmartcols/filter-float-eq b/tests/expected/libsmartcols/filter-float-eq
new file mode 100644
index 0000000..e6e1451
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-eq
@@ -0,0 +1,4 @@
+expr: NUM == 100
+
+NAME NUM
+bbb 100
diff --git a/tests/expected/libsmartcols/filter-float-eq2 b/tests/expected/libsmartcols/filter-float-eq2
new file mode 100644
index 0000000..71e27e2
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-eq2
@@ -0,0 +1,4 @@
+expr: NUM == 100.5
+
+NAME NUM
+ccccc 100.5
diff --git a/tests/expected/libsmartcols/filter-float-ge b/tests/expected/libsmartcols/filter-float-ge
new file mode 100644
index 0000000..ca892d2
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-ge
@@ -0,0 +1,11 @@
+expr: NUM >= 100
+
+NAME NUM
+bbb 100
+ccccc 100.5
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8000
+jj 8000.5
diff --git a/tests/expected/libsmartcols/filter-float-ge2 b/tests/expected/libsmartcols/filter-float-ge2
new file mode 100644
index 0000000..c089fed
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-ge2
@@ -0,0 +1,10 @@
+expr: NUM >= 100.5
+
+NAME NUM
+ccccc 100.5
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8000
+jj 8000.5
diff --git a/tests/expected/libsmartcols/filter-float-gt b/tests/expected/libsmartcols/filter-float-gt
new file mode 100644
index 0000000..283f13d
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-gt
@@ -0,0 +1,6 @@
+expr: NUM > 8000
+
+NAME NUM
+gggggg 678993321
+hhh 7666666
+jj 8000.5
diff --git a/tests/expected/libsmartcols/filter-float-gt2 b/tests/expected/libsmartcols/filter-float-gt2
new file mode 100644
index 0000000..bd54c05
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-gt2
@@ -0,0 +1,5 @@
+expr: NUM > 8000.5
+
+NAME NUM
+gggggg 678993321
+hhh 7666666
diff --git a/tests/expected/libsmartcols/filter-float-is b/tests/expected/libsmartcols/filter-float-is
new file mode 100644
index 0000000..79e30ba
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-is
@@ -0,0 +1,12 @@
+expr: NUM
+
+NAME NUM
+bbb 100
+ccccc 100.5
+dddddd 99.9
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8000
+jj 8000.5
diff --git a/tests/expected/libsmartcols/filter-float-le b/tests/expected/libsmartcols/filter-float-le
new file mode 100644
index 0000000..6954d68
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-le
@@ -0,0 +1,6 @@
+expr: NUM <= 100
+
+NAME NUM
+aaaa 0
+bbb 100
+dddddd 99.9
diff --git a/tests/expected/libsmartcols/filter-float-le2 b/tests/expected/libsmartcols/filter-float-le2
new file mode 100644
index 0000000..c8693cc
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-le2
@@ -0,0 +1,7 @@
+expr: NUM <= 100.5
+
+NAME NUM
+aaaa 0
+bbb 100
+ccccc 100.5
+dddddd 99.9
diff --git a/tests/expected/libsmartcols/filter-float-lt b/tests/expected/libsmartcols/filter-float-lt
new file mode 100644
index 0000000..ac67cd7
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-lt
@@ -0,0 +1,5 @@
+expr: NUM < 100
+
+NAME NUM
+aaaa 0
+dddddd 99.9
diff --git a/tests/expected/libsmartcols/filter-float-lt2 b/tests/expected/libsmartcols/filter-float-lt2
new file mode 100644
index 0000000..0c26b03
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-lt2
@@ -0,0 +1,6 @@
+expr: NUM < 100.5
+
+NAME NUM
+aaaa 0
+bbb 100
+dddddd 99.9
diff --git a/tests/expected/libsmartcols/filter-float-ne b/tests/expected/libsmartcols/filter-float-ne
new file mode 100644
index 0000000..b16c48e
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-ne
@@ -0,0 +1,12 @@
+expr: NUM != 100
+
+NAME NUM
+aaaa 0
+ccccc 100.5
+dddddd 99.9
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8000
+jj 8000.5
diff --git a/tests/expected/libsmartcols/filter-float-ne2 b/tests/expected/libsmartcols/filter-float-ne2
new file mode 100644
index 0000000..3d55387
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-ne2
@@ -0,0 +1,12 @@
+expr: NUM != 100.5
+
+NAME NUM
+aaaa 0
+bbb 100
+dddddd 99.9
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8000
+jj 8000.5
diff --git a/tests/expected/libsmartcols/filter-float-neg b/tests/expected/libsmartcols/filter-float-neg
new file mode 100644
index 0000000..647af52
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-neg
@@ -0,0 +1,4 @@
+expr: !NUM
+
+NAME NUM
+aaaa 0
diff --git a/tests/expected/libsmartcols/filter-float-or b/tests/expected/libsmartcols/filter-float-or
new file mode 100644
index 0000000..40f2291
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-float-or
@@ -0,0 +1,13 @@
+expr: NUM || NAME
+
+NAME NUM
+aaaa 0
+bbb 100
+ccccc 100.5
+dddddd 99.9
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8000
+jj 8000.5
diff --git a/tests/expected/libsmartcols/filter-number-and b/tests/expected/libsmartcols/filter-number-and
new file mode 100644
index 0000000..be82bf5
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-and
@@ -0,0 +1,12 @@
+expr: NUM && NAME
+
+NAME NUM
+bbb 100
+ccccc 21
+dddddd 3
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8765
+jj 987456
diff --git a/tests/expected/libsmartcols/filter-number-and-or b/tests/expected/libsmartcols/filter-number-and-or
new file mode 100644
index 0000000..79ee4cb
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-and-or
@@ -0,0 +1,7 @@
+expr: (NUM >= 3 && NUM <= 100) || NUM == 0
+
+NAME NUM
+aaaa 0
+bbb 100
+ccccc 21
+dddddd 3
diff --git a/tests/expected/libsmartcols/filter-number-as-string b/tests/expected/libsmartcols/filter-number-as-string
new file mode 100644
index 0000000..5e2d9eb
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-as-string
@@ -0,0 +1,4 @@
+expr: NUM == "100"
+
+NAME NUM
+bbb 100
diff --git a/tests/expected/libsmartcols/filter-number-eq b/tests/expected/libsmartcols/filter-number-eq
new file mode 100644
index 0000000..e6e1451
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-eq
@@ -0,0 +1,4 @@
+expr: NUM == 100
+
+NAME NUM
+bbb 100
diff --git a/tests/expected/libsmartcols/filter-number-expr-and-expr b/tests/expected/libsmartcols/filter-number-expr-and-expr
new file mode 100644
index 0000000..5bc6b37
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-expr-and-expr
@@ -0,0 +1,7 @@
+expr: NUM > 10 && NUM < 8000
+
+NAME NUM
+bbb 100
+ccccc 21
+ee 411
+ffff 5111
diff --git a/tests/expected/libsmartcols/filter-number-expr-or-expr b/tests/expected/libsmartcols/filter-number-expr-or-expr
new file mode 100644
index 0000000..2e3f83b
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-expr-or-expr
@@ -0,0 +1,5 @@
+expr: NUM == 3 || NUM == 100
+
+NAME NUM
+bbb 100
+dddddd 3
diff --git a/tests/expected/libsmartcols/filter-number-ge b/tests/expected/libsmartcols/filter-number-ge
new file mode 100644
index 0000000..23899e5
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-ge
@@ -0,0 +1,10 @@
+expr: NUM >= 100
+
+NAME NUM
+bbb 100
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8765
+jj 987456
diff --git a/tests/expected/libsmartcols/filter-number-gt b/tests/expected/libsmartcols/filter-number-gt
new file mode 100644
index 0000000..6668cd4
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-gt
@@ -0,0 +1,7 @@
+expr: NUM > 8000
+
+NAME NUM
+gggggg 678993321
+hhh 7666666
+iiiiii 8765
+jj 987456
diff --git a/tests/expected/libsmartcols/filter-number-is b/tests/expected/libsmartcols/filter-number-is
new file mode 100644
index 0000000..85dd344
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-is
@@ -0,0 +1,12 @@
+expr: NUM
+
+NAME NUM
+bbb 100
+ccccc 21
+dddddd 3
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8765
+jj 987456
diff --git a/tests/expected/libsmartcols/filter-number-le b/tests/expected/libsmartcols/filter-number-le
new file mode 100644
index 0000000..f2d7521
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-le
@@ -0,0 +1,7 @@
+expr: NUM <= 100
+
+NAME NUM
+aaaa 0
+bbb 100
+ccccc 21
+dddddd 3
diff --git a/tests/expected/libsmartcols/filter-number-lt b/tests/expected/libsmartcols/filter-number-lt
new file mode 100644
index 0000000..b0784db
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-lt
@@ -0,0 +1,6 @@
+expr: NUM < 100
+
+NAME NUM
+aaaa 0
+ccccc 21
+dddddd 3
diff --git a/tests/expected/libsmartcols/filter-number-ne b/tests/expected/libsmartcols/filter-number-ne
new file mode 100644
index 0000000..c2ee709
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-ne
@@ -0,0 +1,12 @@
+expr: NUM != 100
+
+NAME NUM
+aaaa 0
+ccccc 21
+dddddd 3
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8765
+jj 987456
diff --git a/tests/expected/libsmartcols/filter-number-neg b/tests/expected/libsmartcols/filter-number-neg
new file mode 100644
index 0000000..647af52
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-neg
@@ -0,0 +1,4 @@
+expr: !NUM
+
+NAME NUM
+aaaa 0
diff --git a/tests/expected/libsmartcols/filter-number-or b/tests/expected/libsmartcols/filter-number-or
new file mode 100644
index 0000000..8a32fac
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-number-or
@@ -0,0 +1,13 @@
+expr: NUM || NAME
+
+NAME NUM
+aaaa 0
+bbb 100
+ccccc 21
+dddddd 3
+ee 411
+ffff 5111
+gggggg 678993321
+hhh 7666666
+iiiiii 8765
+jj 987456
diff --git a/tests/expected/libsmartcols/filter-string-eq b/tests/expected/libsmartcols/filter-string-eq
new file mode 100644
index 0000000..ac96885
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-string-eq
@@ -0,0 +1,4 @@
+expr: NAME == "bbb"
+
+NAME
+bbb
diff --git a/tests/expected/libsmartcols/filter-string-ge b/tests/expected/libsmartcols/filter-string-ge
new file mode 100644
index 0000000..4e2d7de
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-string-ge
@@ -0,0 +1,12 @@
+expr: NAME >= "bbb"
+
+NAME
+bbb
+ccccc
+dddddd
+ee
+ffff
+gggggg
+hhh
+iiiiii
+jj
diff --git a/tests/expected/libsmartcols/filter-string-gt b/tests/expected/libsmartcols/filter-string-gt
new file mode 100644
index 0000000..b33b8ac
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-string-gt
@@ -0,0 +1,11 @@
+expr: NAME > "bbb"
+
+NAME
+ccccc
+dddddd
+ee
+ffff
+gggggg
+hhh
+iiiiii
+jj
diff --git a/tests/expected/libsmartcols/filter-string-is b/tests/expected/libsmartcols/filter-string-is
new file mode 100644
index 0000000..c4d8245
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-string-is
@@ -0,0 +1,13 @@
+expr: NAME
+
+NAME
+aaaa
+bbb
+ccccc
+dddddd
+ee
+ffff
+gggggg
+hhh
+iiiiii
+jj
diff --git a/tests/expected/libsmartcols/filter-string-le b/tests/expected/libsmartcols/filter-string-le
new file mode 100644
index 0000000..3fea9f1
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-string-le
@@ -0,0 +1,5 @@
+expr: NAME <= "bbb"
+
+NAME
+aaaa
+bbb
diff --git a/tests/expected/libsmartcols/filter-string-lt b/tests/expected/libsmartcols/filter-string-lt
new file mode 100644
index 0000000..f60cb56
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-string-lt
@@ -0,0 +1,4 @@
+expr: NAME < "bbb"
+
+NAME
+aaaa
diff --git a/tests/expected/libsmartcols/filter-string-ne b/tests/expected/libsmartcols/filter-string-ne
new file mode 100644
index 0000000..d69f05b
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-string-ne
@@ -0,0 +1,12 @@
+expr: NAME != "bbb"
+
+NAME
+aaaa
+ccccc
+dddddd
+ee
+ffff
+gggggg
+hhh
+iiiiii
+jj
diff --git a/tests/expected/libsmartcols/filter-string-neg b/tests/expected/libsmartcols/filter-string-neg
new file mode 100644
index 0000000..bd5a0dd
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-string-neg
@@ -0,0 +1,2 @@
+expr: !NAME
+
diff --git a/tests/expected/libsmartcols/filter-string-nreg b/tests/expected/libsmartcols/filter-string-nreg
new file mode 100644
index 0000000..e85030e
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-string-nreg
@@ -0,0 +1,12 @@
+expr: NAME !~ "aaa.*"
+
+NAME
+bbb
+ccccc
+dddddd
+ee
+ffff
+gggggg
+hhh
+iiiiii
+jj
diff --git a/tests/expected/libsmartcols/filter-string-reg b/tests/expected/libsmartcols/filter-string-reg
new file mode 100644
index 0000000..3c32c01
--- /dev/null
+++ b/tests/expected/libsmartcols/filter-string-reg
@@ -0,0 +1,4 @@
+expr: NAME =~ "aaa.*"
+
+NAME
+aaaa
diff --git a/tests/expected/libsmartcols/fromfile-tree-json b/tests/expected/libsmartcols/fromfile-tree-json
index 3d65183..aada9f0 100644
--- a/tests/expected/libsmartcols/fromfile-tree-json
+++ b/tests/expected/libsmartcols/fromfile-tree-json
@@ -2,56 +2,56 @@
"testtable": [
{
"tree": "aaaa",
- "id": "1",
+ "id": 1,
"parent": "0",
"strings": "qqqqqqqqqqqqqqqqqX",
"children": [
{
"tree": "bbb",
- "id": "2",
+ "id": 2,
"parent": "1",
"strings": "dddddddddddddX",
"children": [
{
"tree": "ee",
- "id": "5",
+ "id": 5,
"parent": "2",
"strings": "ddddddddddddddddddddddddddX"
},{
"tree": "ffff",
- "id": "6",
+ "id": 6,
"parent": "2",
"strings": "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjX"
}
]
},{
"tree": "ccccc",
- "id": "3",
+ "id": 3,
"parent": "1",
"strings": "ffffffffffffffffffffffffffffffffffffffffX",
"children": [
{
"tree": "gggggg",
- "id": "7",
+ "id": 7,
"parent": "3",
"strings": "mmmmmmmmmmmmmmmmmmmX",
"children": [
{
"tree": "hhh",
- "id": "8",
+ "id": 8,
"parent": "7",
"strings": "lllllllllllllllllllllllllllllllllllllX",
"children": [
{
"tree": "iiiiii",
- "id": "9",
+ "id": 9,
"parent": "8",
"strings": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyX"
}
]
},{
"tree": "jj",
- "id": "10",
+ "id": 10,
"parent": "7",
"strings": "pppppppppX"
}
@@ -60,7 +60,7 @@
]
},{
"tree": "dddddd",
- "id": "4",
+ "id": 4,
"parent": "1",
"strings": "ssssssssssX"
}
diff --git a/tests/expected/libsmartcols/fromfile-wrapzero b/tests/expected/libsmartcols/fromfile-wrapzero
new file mode 100644
index 0000000..11370ff
--- /dev/null
+++ b/tests/expected/libsmartcols/fromfile-wrapzero
@@ -0,0 +1,19 @@
+NAME NUM WRAPZERO
+aaaa 0 aaa
+bbb 100 bbbbb
+ccccc 21 cccc
+ CCCC
+dddddd 3 dddddddd
+ DDDD
+ DD
+ee 411 hello
+ baby
+ffff 5111 aaa
+ bbb
+ ccc
+ ddd
+gggggg 678993321 eee
+hhh 7666666 fffff
+iiiiii 8765 g
+ hhhhh
+jj 987456 ppppppppp
diff --git a/tests/expected/libsmartcols/fromfile-wrapzero-tree b/tests/expected/libsmartcols/fromfile-wrapzero-tree
new file mode 100644
index 0000000..552470d
--- /dev/null
+++ b/tests/expected/libsmartcols/fromfile-wrapzero-tree
@@ -0,0 +1,19 @@
+TREE ID PARENT WRAPZERO
+aaaa 1 0 aaa
+|-bbb 2 1 bbbbb
+| |-ee 5 2 hello
+| | baby
+| `-ffff 6 2 aaa
+| bbb
+| ccc
+| ddd
+|-ccccc 3 1 cccc
+| | CCCC
+| `-gggggg 7 3 eee
+| |-hhh 8 7 fffff
+| | `-iiiiii 9 8 g
+| | hhhhh
+| `-jj 10 7 ppppppppp
+`-dddddd 4 1 dddddddd
+ DDDD
+ DD
diff --git a/tests/expected/lscpu/lscpu-rv64-linux b/tests/expected/lscpu/lscpu-rv64-linux
index 22767db..d741cae 100644
--- a/tests/expected/lscpu/lscpu-rv64-linux
+++ b/tests/expected/lscpu/lscpu-rv64-linux
@@ -1,16 +1,23 @@
CPU(s): 2
On-line CPU(s) list: 0,1
+Model name: sifive,u74-mc
+Thread(s) per core: 2
+Core(s) per socket: 1
+Socket(s): 1
+L1d cache: 64 KiB (2 instances)
+L1i cache: 64 KiB (2 instances)
+L2 cache: 2 MiB (1 instance)
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting usually from zero.
-# CPU,Core,Socket,Node
-,,,
-,,,
+# CPU,Core,Socket,Node,,L1d,L1i,L2
+0,0,0,,,0,0,0
+1,0,0,,,1,1,0
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting usually from zero.
-# CPU,Core,Socket,Node
-,,,
-,,,
+# CPU,Core,Socket,Node,,L1d,L1i,L2
+0,-,-,,,0,0,0
+1,-,-,,,1,1,0
diff --git a/tests/expected/lscpu/lscpu-rv64-visionfive2 b/tests/expected/lscpu/lscpu-rv64-visionfive2
new file mode 100644
index 0000000..0b2390d
--- /dev/null
+++ b/tests/expected/lscpu/lscpu-rv64-visionfive2
@@ -0,0 +1,33 @@
+Byte Order: Little Endian
+CPU(s): 4
+On-line CPU(s) list: 0-3
+Vendor ID: 0x489
+Model name: sifive,u74-mc
+CPU family: 0x8000000000000007
+Model: 0x4210427
+Thread(s) per core: 1
+Core(s) per socket: 4
+Socket(s): 1
+L1d cache: 128 KiB (4 instances)
+L1i cache: 128 KiB (4 instances)
+L2 cache: 2 MiB (1 instance)
+NUMA node(s): 1
+NUMA node0 CPU(s): 0-3
+
+# The following is the parsable format, which can be fed to other
+# programs. Each different item in every column has an unique ID
+# starting usually from zero.
+# CPU,Core,Socket,Node,,L1d,L1i,L2
+0,0,0,0,,0,0,0
+1,1,0,0,,1,1,0
+2,2,0,0,,2,2,0
+3,3,0,0,,3,3,0
+
+# The following is the parsable format, which can be fed to other
+# programs. Each different item in every column has an unique ID
+# starting usually from zero.
+# CPU,Core,Socket,Node,,L1d,L1i,L2
+0,3,0,0,,0,0,0
+1,1,0,0,,1,1,0
+2,2,0,0,,2,2,0
+3,4,0,0,,3,3,0
diff --git a/tests/expected/lsfd/column-ainodeclass-inotify b/tests/expected/lsfd/column-ainodeclass-inotify
index f93e19e..b1561dd 100644
--- a/tests/expected/lsfd/column-ainodeclass-inotify
+++ b/tests/expected/lsfd/column-ainodeclass-inotify
@@ -1,2 +1,2 @@
- 3 UNKN inotify
+3 UNKN inotify
inotify:ASSOC,STTYPE,AINODECLASS: 0
diff --git a/tests/expected/lsfd/column-ainodeclass-pidfd b/tests/expected/lsfd/column-ainodeclass-pidfd
index 269cea5..5fe751c 100644
--- a/tests/expected/lsfd/column-ainodeclass-pidfd
+++ b/tests/expected/lsfd/column-ainodeclass-pidfd
@@ -1,2 +1,2 @@
- 3 UNKN pidfd
+3 UNKN pidfd
pidfd:ASSOC,STTYPE,AINODECLASS: 0
diff --git a/tests/expected/lsfd/column-deleted-make-regular-file b/tests/expected/lsfd/column-deleted-make-regular-file
new file mode 100644
index 0000000..86e46bc
--- /dev/null
+++ b/tests/expected/lsfd/column-deleted-make-regular-file
@@ -0,0 +1,2 @@
+1
+make-regular-file: DELETED: 0
diff --git a/tests/expected/lsfd/column-deleted-ro-regular-file b/tests/expected/lsfd/column-deleted-ro-regular-file
new file mode 100644
index 0000000..ccaf14e
--- /dev/null
+++ b/tests/expected/lsfd/column-deleted-ro-regular-file
@@ -0,0 +1,2 @@
+0
+ro-regular-file: DELETED: 0
diff --git a/tests/expected/lsfd/column-name-deleted-file b/tests/expected/lsfd/column-name-deleted-file
new file mode 100644
index 0000000..de33c8b
--- /dev/null
+++ b/tests/expected/lsfd/column-name-deleted-file
@@ -0,0 +1,2 @@
+tmp-column-name
+make-regular-file: DELETED,NAME: 0
diff --git a/tests/expected/lsfd/column-name-pidfd b/tests/expected/lsfd/column-name-pidfd
index 49abe81..10e3c5e 100644
--- a/tests/expected/lsfd/column-name-pidfd
+++ b/tests/expected/lsfd/column-name-pidfd
@@ -1,2 +1,2 @@
- 3 anon_inode:[pidfd] pid=1 comm= nspid=1
+3 anon_inode:[pidfd] pid=1 comm= nspid=1
pidfd:ASSOC,KNAME,NAME: 0
diff --git a/tests/expected/lsfd/column-name-ro-regular-file b/tests/expected/lsfd/column-name-ro-regular-file
index 446a916..e7fc7c6 100644
--- a/tests/expected/lsfd/column-name-ro-regular-file
+++ b/tests/expected/lsfd/column-name-ro-regular-file
@@ -1,2 +1,2 @@
- 3 /etc/passwd /etc/passwd
+3 /etc/passwd /etc/passwd
ro-regular-file:ASSOC,KNAME,NAME: 0
diff --git a/tests/expected/lsfd/column-name-socketpair b/tests/expected/lsfd/column-name-socketpair
index bd94e56..b4aaf7b 100644
--- a/tests/expected/lsfd/column-name-socketpair
+++ b/tests/expected/lsfd/column-name-socketpair
@@ -1,2 +1,2 @@
- 3 socket:[INODENUM] state=connected type=dgram
+3 socket:[INODENUM] state=connected type=dgram
socketpair:ASSOC,KNAME,NAME: 0
diff --git a/tests/expected/lsfd/column-source-namespace-ASSOC b/tests/expected/lsfd/column-source-namespace-ASSOC
new file mode 100644
index 0000000..e6ed958
--- /dev/null
+++ b/tests/expected/lsfd/column-source-namespace-ASSOC
@@ -0,0 +1,7 @@
+ ipc nsfs
+ mnt nsfs
+ net nsfs
+ pid nsfs
+pid4c nsfs
+ user nsfs
+ uts nsfs
diff --git a/tests/expected/lsfd/column-source-with-root-SysVIPC-shmem b/tests/expected/lsfd/column-source-with-root-SysVIPC-shmem
new file mode 100644
index 0000000..db40d92
--- /dev/null
+++ b/tests/expected/lsfd/column-source-with-root-SysVIPC-shmem
@@ -0,0 +1,2 @@
+shm tmpfs
+ASSOC,SOURCE: 0
diff --git a/tests/expected/lsfd/column-type-inotify b/tests/expected/lsfd/column-type-inotify
index 69588d9..15363f5 100644
--- a/tests/expected/lsfd/column-type-inotify
+++ b/tests/expected/lsfd/column-type-inotify
@@ -1,2 +1,2 @@
- 3 UNKN inotify
+3 UNKN inotify
inotify:ASSOC,STTYPE,TYPE: 0
diff --git a/tests/expected/lsfd/column-type-pidfd b/tests/expected/lsfd/column-type-pidfd
index a3278d2..6c9a963 100644
--- a/tests/expected/lsfd/column-type-pidfd
+++ b/tests/expected/lsfd/column-type-pidfd
@@ -1,2 +1,2 @@
- 3 UNKN pidfd
+3 UNKN pidfd
pidfd:ASSOC,STTYPE,TYPE: 0
diff --git a/tests/expected/lsfd/column-type-ro-regular-file b/tests/expected/lsfd/column-type-ro-regular-file
index 63b4356..7028264 100644
--- a/tests/expected/lsfd/column-type-ro-regular-file
+++ b/tests/expected/lsfd/column-type-ro-regular-file
@@ -1,2 +1,2 @@
- 3 REG REG
+3 REG REG
ro-regular-file:ASSOC,STTYPE,TYPE: 0
diff --git a/tests/expected/lsfd/column-type-socketpair b/tests/expected/lsfd/column-type-socketpair
index 22a61b7..ec00f65 100644
--- a/tests/expected/lsfd/column-type-socketpair
+++ b/tests/expected/lsfd/column-type-socketpair
@@ -1,2 +1,2 @@
- 3 SOCK UNIX
+3 SOCK UNIX
socketpair:ASSOC,STTYPE,TYPE: 0
diff --git a/tests/expected/lsfd/column-xmode-MODE-r-bit b/tests/expected/lsfd/column-xmode-MODE-r-bit
new file mode 100644
index 0000000..05b2dd1
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-MODE-r-bit
@@ -0,0 +1,2 @@
+r--
+MODE(r-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-MODE-w-bit b/tests/expected/lsfd/column-xmode-MODE-w-bit
new file mode 100644
index 0000000..bd0cca6
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-MODE-w-bit
@@ -0,0 +1,2 @@
+-w-
+MODE(w-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-MODE-x-bit b/tests/expected/lsfd/column-xmode-MODE-x-bit
new file mode 100644
index 0000000..8ab32fd
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-MODE-x-bit
@@ -0,0 +1,2 @@
+r-x
+MODE(x-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-D-bit b/tests/expected/lsfd/column-xmode-XMODE-D-bit
new file mode 100644
index 0000000..5ede600
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-D-bit
@@ -0,0 +1,2 @@
+-w-D--
+XMODE(D-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-L-bit-flock-ex b/tests/expected/lsfd/column-xmode-XMODE-L-bit-flock-ex
new file mode 100644
index 0000000..3799161
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-L-bit-flock-ex
@@ -0,0 +1,2 @@
+-w--L-
+XMODE(L-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-L-bit-lease-w b/tests/expected/lsfd/column-xmode-XMODE-L-bit-lease-w
new file mode 100644
index 0000000..3799161
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-L-bit-lease-w
@@ -0,0 +1,2 @@
+-w--L-
+XMODE(L-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-L-bit-ofd--w b/tests/expected/lsfd/column-xmode-XMODE-L-bit-ofd--w
new file mode 100644
index 0000000..3799161
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-L-bit-ofd--w
@@ -0,0 +1,2 @@
+-w--L-
+XMODE(L-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-L-bit-ofd-rw b/tests/expected/lsfd/column-xmode-XMODE-L-bit-ofd-rw
new file mode 100644
index 0000000..1b763f7
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-L-bit-ofd-rw
@@ -0,0 +1,2 @@
+rw--L-
+XMODE(L-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-L-bit-posix--w b/tests/expected/lsfd/column-xmode-XMODE-L-bit-posix--w
new file mode 100644
index 0000000..3799161
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-L-bit-posix--w
@@ -0,0 +1,2 @@
+-w--L-
+XMODE(L-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-L-bit-posix-rw b/tests/expected/lsfd/column-xmode-XMODE-L-bit-posix-rw
new file mode 100644
index 0000000..1b763f7
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-L-bit-posix-rw
@@ -0,0 +1,2 @@
+rw--L-
+XMODE(L-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-l-bit-flock-sh b/tests/expected/lsfd/column-xmode-XMODE-l-bit-flock-sh
new file mode 100644
index 0000000..3299e66
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-l-bit-flock-sh
@@ -0,0 +1,2 @@
+-w--l-
+XMODE(l-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-l-bit-lease-r b/tests/expected/lsfd/column-xmode-XMODE-l-bit-lease-r
new file mode 100644
index 0000000..585ea21
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-l-bit-lease-r
@@ -0,0 +1,2 @@
+r---l-
+XMODE(l-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-l-bit-ofd-r- b/tests/expected/lsfd/column-xmode-XMODE-l-bit-ofd-r-
new file mode 100644
index 0000000..0288697
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-l-bit-ofd-r-
@@ -0,0 +1,2 @@
+rw--l-
+XMODE(l-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-l-bit-posix-r- b/tests/expected/lsfd/column-xmode-XMODE-l-bit-posix-r-
new file mode 100644
index 0000000..0288697
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-l-bit-posix-r-
@@ -0,0 +1,2 @@
+rw--l-
+XMODE(l-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-m-bit b/tests/expected/lsfd/column-xmode-XMODE-m-bit
new file mode 100644
index 0000000..238f28d
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-m-bit
@@ -0,0 +1,3 @@
+r----m
+-w---m
+XMODE(m-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-r-bit b/tests/expected/lsfd/column-xmode-XMODE-r-bit
new file mode 100644
index 0000000..655aa7b
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-r-bit
@@ -0,0 +1,2 @@
+r-----
+XMODE(r-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-w-bit b/tests/expected/lsfd/column-xmode-XMODE-w-bit
new file mode 100644
index 0000000..b4b4b1f
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-w-bit
@@ -0,0 +1,2 @@
+-w----
+XMODE(w-bit): 0
diff --git a/tests/expected/lsfd/column-xmode-XMODE-x-bit b/tests/expected/lsfd/column-xmode-XMODE-x-bit
new file mode 100644
index 0000000..2baf1e7
--- /dev/null
+++ b/tests/expected/lsfd/column-xmode-XMODE-x-bit
@@ -0,0 +1,2 @@
+r-x---
+XMODE(x-bit): 0
diff --git a/tests/expected/lsfd/filter-broken-exp b/tests/expected/lsfd/filter-broken-exp
new file mode 100644
index 0000000..61512e0
--- /dev/null
+++ b/tests/expected/lsfd/filter-broken-exp
@@ -0,0 +1,4 @@
+lsfd: failed to parse "(": <bison syntax error message removed>
+lsfd: failed to parse ")": <bison syntax error message removed>
+lsfd: failed to parse "(FD == 1)garbage": <bison syntax error message removed>
+lsfd: unknown column: NOSUCHCOLUMN
diff --git a/tests/expected/lsfd/filter-floating-point-nums b/tests/expected/lsfd/filter-floating-point-nums
new file mode 100644
index 0000000..60d87a9
--- /dev/null
+++ b/tests/expected/lsfd/filter-floating-point-nums
@@ -0,0 +1,15 @@
+pid in a range: 0
+coparing pids: 0
+3 10.000050000
+FD,TIMERFD.INTERVAL: (TIMERFD.INTERVAL < 10.000051) and (TIMERFD.INTERVAL > 10): 0
+FD,TIMERFD.INTERVAL: (TIMERFD.INTERVAL <= 10) and (TIMERFD.INTERVAL > 9.99): 0
+3 10.000050000
+FD,TIMERFD.INTERVAL: (TIMERFD.INTERVAL >= 10): 0
+3 10.000050000
+FD,TIMERFD.INTERVAL: (TIMERFD.INTERVAL >= 10.0): 0
+FD,TIMERFD.INTERVAL: (TIMERFD.INTERVAL < 10) and (0 < TIMERFD.INTERVAL): 0
+FD,TIMERFD.INTERVAL: (TIMERFD.INTERVAL < 10) and (0.0 < TIMERFD.INTERVAL): 0
+FD,TIMERFD.INTERVAL: (TIMERFD.INTERVAL > 11): 0
+3 10.000050000
+FD,TIMERFD.INTERVAL: (TIMERFD.INTERVAL == 10.00005): 0
+FD,TIMERFD.INTERVAL: (TIMERFD.INTERVAL == 10.000051): 0
diff --git a/tests/expected/lsfd/mkfds-bpf-map b/tests/expected/lsfd/mkfds-bpf-map
new file mode 100644
index 0000000..b4f7964
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-bpf-map
@@ -0,0 +1,2 @@
+array 2 mkfds_map
+BPF-MAP.TYPE,BPF-MAP.TYPE.RAW,BPF.NAME: 0
diff --git a/tests/expected/lsfd/mkfds-bpf-prog b/tests/expected/lsfd/mkfds-bpf-prog
new file mode 100644
index 0000000..b67afc5
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-bpf-prog
@@ -0,0 +1,2 @@
+kprobe 2 mkdfs_prog
+BPF-PROG.TYPE,BPF-PROG.TYPE.RAW,BPF.NAME: 0
diff --git a/tests/expected/lsfd/mkfds-cdev-tun b/tests/expected/lsfd/mkfds-cdev-tun
new file mode 100644
index 0000000..5217d79
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-cdev-tun
@@ -0,0 +1,4 @@
+3 rw- CHR misc:tun
+ASSOC,MODE,TYPE,SOURCE: 0
+NAME: 0
+TUN.IFACE: 0
diff --git a/tests/expected/lsfd/mkfds-directory b/tests/expected/lsfd/mkfds-directory
index fd7f293..62c9d5c 100644
--- a/tests/expected/lsfd/mkfds-directory
+++ b/tests/expected/lsfd/mkfds-directory
@@ -1,4 +1,4 @@
- 3 r-- DIR directory /
+3 r-- DIR directory /
ASSOC,MODE,TYPE,FLAGS,NAME: 0
PID[RUN]: 0
PID[STR]: 0
diff --git a/tests/expected/lsfd/mkfds-eventfd b/tests/expected/lsfd/mkfds-eventfd
new file mode 100644
index 0000000..d99157e
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-eventfd
@@ -0,0 +1,12 @@
+3 rw- eventfd anon_inodefs
+parent: ASSOC,MODE,TYPE,SOURCE: 0
+parent: NAME: 0
+parent: ID: 0
+4 rw- eventfd anon_inodefs
+child: ASSOC,MODE,TYPE,SOURCE: 0
+child: NAME: 0
+child: ID: 0
+NAME[STR]: 0
+ID[STR]: 0
+NAMExID[STR]: 0
+ENDPOINTS[STR]: 0
diff --git a/tests/expected/lsfd/mkfds-eventpoll b/tests/expected/lsfd/mkfds-eventpoll
new file mode 100644
index 0000000..d494fb4
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-eventpoll
@@ -0,0 +1,16 @@
+3 eventpoll tfds=5,7 5
+ 7
+ASSOC,TYPE,NAME,EVENTPOLL.TFDS: 0
+{
+ "lsfd": [
+ {
+ "assoc": "3",
+ "type": "eventpoll",
+ "name": "tfds=5,7",
+ "eventpoll.tfds": [
+ 5, 7
+ ]
+ }
+ ]
+}
+ASSOC,TYPE,NAME,EVENTPOLL.TFDS (JSON): 0
diff --git a/tests/expected/lsfd/mkfds-inotify b/tests/expected/lsfd/mkfds-inotify
new file mode 100644
index 0000000..6fc0d12
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-inotify
@@ -0,0 +1,4 @@
+INOTIFY.INODES.RAW: 0
+INOTIFY.INODES.RAW == CMDLINE\x0aPROC
+INOTIFY.INODES.RAW (JSON): 0
+INOTIFY.INODES.RAW == EXPECTED_JSON
diff --git a/tests/expected/lsfd/mkfds-inotify-btrfs b/tests/expected/lsfd/mkfds-inotify-btrfs
new file mode 100644
index 0000000..cb55f96
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-inotify-btrfs
@@ -0,0 +1,4 @@
+INOTIFY.INODES.RAW: 0
+INOTIFY.INODES.RAW == FSTAB\x0aROOT
+INOTIFY.INODES.RAW (JSON): 0
+INOTIFY.INODES.RAW == EXPECTED_JSON
diff --git a/tests/expected/lsfd/mkfds-mapped-packet-socket b/tests/expected/lsfd/mkfds-mapped-packet-socket
index 7c1b503..ec8795b 100644
--- a/tests/expected/lsfd/mkfds-mapped-packet-socket
+++ b/tests/expected/lsfd/mkfds-mapped-packet-socket
@@ -1,8 +1,8 @@
- PACKET
+PACKET
SOCK.PROTONAME: 0
-type=raw protocol=all iface=lo raw PACKET lo all
+type=raw protocol=all iface=lo raw PACKET lo all
NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL: 0
- PACKET
+PACKET
SOCK.PROTONAME: 0
-type=dgram protocol=all iface=lo dgram PACKET lo all
+type=dgram protocol=all iface=lo dgram PACKET lo all
NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL: 0
diff --git a/tests/expected/lsfd/mkfds-mqueue b/tests/expected/lsfd/mkfds-mqueue
new file mode 100644
index 0000000..b08de13
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-mqueue
@@ -0,0 +1,8 @@
+3 r-- mqueue mqueue /mkfds-mqueue
+parent: ASSOC,MODE,TYPE,SOURCE,NAME: 0
+parent: INODE: 0
+4 -w- mqueue mqueue
+child: ASSOC,MODE,TYPE,SOURCE: 0
+child: INODE: 0
+INODE[STR]: 0
+ENDPOINTS[STR]: 0
diff --git a/tests/expected/lsfd/mkfds-multiplexing-poll b/tests/expected/lsfd/mkfds-multiplexing-poll
new file mode 100644
index 0000000..c23fa0f
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-multiplexing-poll
@@ -0,0 +1,13 @@
+10 r----m
+11 -w----
+12 -w---m
+13 r-----
+14 r----m
+15 -w----
+16 r----m
+17 -w----
+18 -w---m
+19 r-----
+20 r----m
+21 -w----
+[poll] ASSOC,XMODE: 0
diff --git a/tests/expected/lsfd/mkfds-multiplexing-ppoll b/tests/expected/lsfd/mkfds-multiplexing-ppoll
new file mode 100644
index 0000000..46f860b
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-multiplexing-ppoll
@@ -0,0 +1,13 @@
+10 r----m
+11 -w----
+12 -w---m
+13 r-----
+14 r----m
+15 -w----
+16 r----m
+17 -w----
+18 -w---m
+19 r-----
+20 r----m
+21 -w----
+[ppoll] ASSOC,XMODE: 0
diff --git a/tests/expected/lsfd/mkfds-multiplexing-pselect6 b/tests/expected/lsfd/mkfds-multiplexing-pselect6
new file mode 100644
index 0000000..fbdb773
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-multiplexing-pselect6
@@ -0,0 +1,13 @@
+10 r----m
+11 -w----
+12 -w---m
+13 r-----
+14 r----m
+15 -w----
+16 r----m
+17 -w----
+18 -w---m
+19 r-----
+20 r----m
+21 -w----
+[pselect6] ASSOC,XMODE: 0
diff --git a/tests/expected/lsfd/mkfds-multiplexing-select b/tests/expected/lsfd/mkfds-multiplexing-select
new file mode 100644
index 0000000..a44b0da
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-multiplexing-select
@@ -0,0 +1,13 @@
+10 r----m
+11 -w----
+12 -w---m
+13 r-----
+14 r----m
+15 -w----
+16 r----m
+17 -w----
+18 -w---m
+19 r-----
+20 r----m
+21 -w----
+[select] ASSOC,XMODE: 0
diff --git a/tests/expected/lsfd/mkfds-netlink-groups b/tests/expected/lsfd/mkfds-netlink-groups
index ad50da1..e78c8eb 100644
--- a/tests/expected/lsfd/mkfds-netlink-groups
+++ b/tests/expected/lsfd/mkfds-netlink-groups
@@ -1,3 +1,3 @@
- 3 NETLINK protocol=sock_diag lport= groups=5 raw sock_diag 5
+3 NETLINK protocol=sock_diag lport= groups=5 raw sock_diag 5
ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,NETLINK.PROTOCOL,NETLINK.GROUPS: 0
LPORT: OK
diff --git a/tests/expected/lsfd/mkfds-netlink-protocol b/tests/expected/lsfd/mkfds-netlink-protocol
index df3dce7..77c4e1f 100644
--- a/tests/expected/lsfd/mkfds-netlink-protocol
+++ b/tests/expected/lsfd/mkfds-netlink-protocol
@@ -1,3 +1,3 @@
- 3 NETLINK protocol=sock_diag lport= raw sock_diag 0
+3 NETLINK protocol=sock_diag lport= raw sock_diag 0
ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,NETLINK.PROTOCOL: 0
LPORT: OK
diff --git a/tests/expected/lsfd/mkfds-netns b/tests/expected/lsfd/mkfds-netns
index 4b4c0ac..89d5bef 100644
--- a/tests/expected/lsfd/mkfds-netns
+++ b/tests/expected/lsfd/mkfds-netns
@@ -1,4 +1,4 @@
- net
+net
NAME_FD == NAME_NS: 0
NAME_FD == net:[INO_FD]: 0
NAME_FD == net:[INO_NS]: 0
diff --git a/tests/expected/lsfd/mkfds-pidfd b/tests/expected/lsfd/mkfds-pidfd
index 3f7edbb..9484699 100644
--- a/tests/expected/lsfd/mkfds-pidfd
+++ b/tests/expected/lsfd/mkfds-pidfd
@@ -1,2 +1,2 @@
- 3 UNKN anon_inodefs pid=1 comm=systemd nspid=1 systemd 1
+3 UNKN anon_inodefs pid=1 comm=systemd nspid=1 systemd 1
ASSOC,STTYPE,SOURCE,NAME,PIDFD.COMM,PIDFD.PID: 0
diff --git a/tests/expected/lsfd/mkfds-ping-ping b/tests/expected/lsfd/mkfds-ping-ping
index cad42b1..06fe2bd 100644
--- a/tests/expected/lsfd/mkfds-ping-ping
+++ b/tests/expected/lsfd/mkfds-ping-ping
@@ -1,4 +1,4 @@
- 3 PING state=established id=9999 laddr=127.0.0.1 raddr=127.0.0.1 established dgram 127.0.0.1 127.0.0.1 9999
+3 PING state=established id=9999 laddr=127.0.0.1 raddr=127.0.0.1 established dgram 127.0.0.1 127.0.0.1 9999
ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,INET.LADDR,INET.RADDR,PING.ID: 0
- 3 PING state=close id=9999 laddr=127.0.0.1 close dgram 127.0.0.1 0.0.0.0 9999
+3 PING state=close id=9999 laddr=127.0.0.1 close dgram 127.0.0.1 0.0.0.0 9999
ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,INET.LADDR,INET.RADDR,PING.ID: 0
diff --git a/tests/expected/lsfd/mkfds-ping-ping6 b/tests/expected/lsfd/mkfds-ping-ping6
index 3ef9730..6919ba1 100644
--- a/tests/expected/lsfd/mkfds-ping-ping6
+++ b/tests/expected/lsfd/mkfds-ping-ping6
@@ -1,4 +1,4 @@
- 3 PINGv6 state=established id=9999 laddr=::1 raddr=::1 established dgram ::1 ::1 9999
+3 PINGv6 state=established id=9999 laddr=::1 raddr=::1 established dgram ::1 ::1 9999
ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,INET6.LADDR,INET6.RADDR,PING.ID: 0
- 3 PINGv6 state=close id=9999 laddr=::1 close dgram ::1 :: 9999
+3 PINGv6 state=close id=9999 laddr=::1 close dgram ::1 :: 9999
ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,INET6.LADDR,INET6.RADDR,PING.ID: 0
diff --git a/tests/expected/lsfd/mkfds-pipe-no-fork b/tests/expected/lsfd/mkfds-pipe-no-fork
index 390b8a3..4cd2a55 100644
--- a/tests/expected/lsfd/mkfds-pipe-no-fork
+++ b/tests/expected/lsfd/mkfds-pipe-no-fork
@@ -1,5 +1,5 @@
- 3 r-- FIFO pipefs
- 4 -w- FIFO pipefs wronly,nonblock
+3 r-- FIFO pipefs
+4 -w- FIFO pipefs wronly,nonblock
ASSOC,MODE,TYPE,SOURCE,FLAGS: 0
PID[RUN]: 0
PID[STR]: 0
diff --git a/tests/expected/lsfd/mkfds-pty b/tests/expected/lsfd/mkfds-pty
new file mode 100644
index 0000000..ac38fc9
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-pty
@@ -0,0 +1,10 @@
+5 rw- CHR ptmx
+ASSOC,MODE,TYPE,SOURCE: 0
+NAME: 0
+ENDPOINTS: 0
+PTMX.TTY-INDEX: 0
+6 r-- CHR
+ASSOC,MODE,TYPE: 0
+SOURCE: 0
+NAME: 0
+ENDPOINTS: 0
diff --git a/tests/expected/lsfd/mkfds-raw b/tests/expected/lsfd/mkfds-raw
index e8bc41a..37baddc 100644
--- a/tests/expected/lsfd/mkfds-raw
+++ b/tests/expected/lsfd/mkfds-raw
@@ -1,2 +1,2 @@
- 3 RAW state=established protocol=5 laddr=127.0.0.1 raddr=127.0.0.2 established raw 127.0.0.1 127.0.0.2 5
+3 RAW state=established protocol=5 laddr=127.0.0.1 raddr=127.0.0.2 established raw 127.0.0.1 127.0.0.2 5
ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,INET.LADDR,INET.RADDR,RAW.PROTOCOL: 0
diff --git a/tests/expected/lsfd/mkfds-raw6 b/tests/expected/lsfd/mkfds-raw6
index a813a37..2d77e8f 100644
--- a/tests/expected/lsfd/mkfds-raw6
+++ b/tests/expected/lsfd/mkfds-raw6
@@ -1,2 +1,2 @@
- 3 RAWv6 state=established protocol=5 laddr=::1 raddr=::ffff:127.0.0.1 established raw ::1 ::ffff:127.0.0.1 5
+3 RAWv6 state=established protocol=5 laddr=::1 raddr=::ffff:127.0.0.1 established raw ::1 ::ffff:127.0.0.1 5
ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,INET6.LADDR,INET6.RADDR,RAW.PROTOCOL: 0
diff --git a/tests/expected/lsfd/mkfds-ro-block-device b/tests/expected/lsfd/mkfds-ro-block-device
index 3b2fe07..4c38d05 100644
--- a/tests/expected/lsfd/mkfds-ro-block-device
+++ b/tests/expected/lsfd/mkfds-ro-block-device
@@ -1,4 +1,4 @@
- 3 r-- BLK 0 loop blk
+3 r-- BLK 0 loop blk
ASSOC,MODE,TYPE,,POS,,BLKDRV,DEVTYPE: 0
NAME[RUN]: 0
NAME[STR]: 0
diff --git a/tests/expected/lsfd/mkfds-ro-regular-file b/tests/expected/lsfd/mkfds-ro-regular-file
index 092f40b..662daa8 100644
--- a/tests/expected/lsfd/mkfds-ro-regular-file
+++ b/tests/expected/lsfd/mkfds-ro-regular-file
@@ -1,4 +1,4 @@
-ABC 3 r-- REG /etc/passwd 1
+ABC 3 r-- REG /etc/passwd 1
COMMAND,ASSOC,MODE,TYPE,NAME,POS: 0
PID[RUN]: 0
PID[STR]: 0
diff --git a/tests/expected/lsfd/mkfds-rw-character-device b/tests/expected/lsfd/mkfds-rw-character-device
index 00423f4..fed92ec 100644
--- a/tests/expected/lsfd/mkfds-rw-character-device
+++ b/tests/expected/lsfd/mkfds-rw-character-device
@@ -1,4 +1,4 @@
- 3 rw- CHR /dev/zero mem:5 0 1:5 mem char 1:5
+3 rw- CHR /dev/zero mem:5 0 1:5 mem char 1:5
ASSOC,MODE,TYPE,NAME,SOURCE,POS,MAJ:MIN,CHRDRV,DEVTYPE,RDEV: 0
DEV[RUN]: 0
STAT[RUN]: 0
diff --git a/tests/expected/lsfd/mkfds-signalfd b/tests/expected/lsfd/mkfds-signalfd
new file mode 100644
index 0000000..16bf732
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-signalfd
@@ -0,0 +1,2 @@
+3 signalfd mask=FPE,USR1,42 FPE,USR1,42
+ASSOC,TYPE,NAME,SIGNALFD.MASK: 0
diff --git a/tests/expected/lsfd/mkfds-socketpair b/tests/expected/lsfd/mkfds-socketpair
deleted file mode 100644
index a015353..0000000
--- a/tests/expected/lsfd/mkfds-socketpair
+++ /dev/null
@@ -1,3 +0,0 @@
- 3 rw- SOCK sockfs UNIX
- 4 rw- SOCK sockfs UNIX
-ASSOC,MODE,STTYPE,SOURCE,SOCK.PROTONAME: 0
diff --git a/tests/expected/lsfd/mkfds-socketpair-DGRAM b/tests/expected/lsfd/mkfds-socketpair-DGRAM
new file mode 100644
index 0000000..d8ba4d0
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-socketpair-DGRAM
@@ -0,0 +1,3 @@
+3 rw- SOCK sockfs UNIX
+4 rw- SOCK sockfs UNIX
+ASSOC,MODE,STTYPE,SOURCE,SOCK.PROTONAME: 0
diff --git a/tests/expected/lsfd/mkfds-socketpair-STREAM b/tests/expected/lsfd/mkfds-socketpair-STREAM
new file mode 100644
index 0000000..d8ba4d0
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-socketpair-STREAM
@@ -0,0 +1,3 @@
+3 rw- SOCK sockfs UNIX
+4 rw- SOCK sockfs UNIX
+ASSOC,MODE,STTYPE,SOURCE,SOCK.PROTONAME: 0
diff --git a/tests/expected/lsfd/mkfds-socketpair-STREAM-ENDPOINT b/tests/expected/lsfd/mkfds-socketpair-STREAM-ENDPOINT
new file mode 100644
index 0000000..02f6498
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-socketpair-STREAM-ENDPOINT
@@ -0,0 +1,3 @@
+3 rw- SOCK sockfs 1,test_mkfds,4rw
+4 rw- SOCK sockfs 1,test_mkfds,3rw
+ASSOC,MODE,STTYPE,SOURCE,ENDPOINTS: 0
diff --git a/tests/expected/lsfd/mkfds-socketpair-STREAM-ENDPOINT-halfclose b/tests/expected/lsfd/mkfds-socketpair-STREAM-ENDPOINT-halfclose
new file mode 100644
index 0000000..72fa052
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-socketpair-STREAM-ENDPOINT-halfclose
@@ -0,0 +1,3 @@
+3 rw- SOCK sockfs 1,test_mkfds,4r-
+4 rw- SOCK sockfs 1,test_mkfds,3-w
+ASSOC,MODE,STTYPE,SOURCE,ENDPOINTS: 0
diff --git a/tests/expected/lsfd/mkfds-socketpair-STREAM-SHUTDOWN-STATE b/tests/expected/lsfd/mkfds-socketpair-STREAM-SHUTDOWN-STATE
new file mode 100644
index 0000000..a7a285c
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-socketpair-STREAM-SHUTDOWN-STATE
@@ -0,0 +1,3 @@
+3 rw- SOCK sockfs -w
+4 rw- SOCK sockfs r-
+ASSOC,MODE,STTYPE,SOURCE,SOCK.SHUTDOWN: 0
diff --git a/tests/expected/lsfd/mkfds-symlink b/tests/expected/lsfd/mkfds-symlink
index ab10159..6084e83 100644
--- a/tests/expected/lsfd/mkfds-symlink
+++ b/tests/expected/lsfd/mkfds-symlink
@@ -1,2 +1,2 @@
- 3 --- LINK /dev/stdin nofollow,path
+3 --- LINK /dev/stdin nofollow,path
ASSOC,MODE,TYPE,NAME,FLAGS: 0
diff --git a/tests/expected/lsfd/mkfds-tcp b/tests/expected/lsfd/mkfds-tcp
index dfec0ae..08b5735 100644
--- a/tests/expected/lsfd/mkfds-tcp
+++ b/tests/expected/lsfd/mkfds-tcp
@@ -1,4 +1,4 @@
- 3 TCP SOCK state=listen laddr=127.0.0.1:34567 listen stream 1 127.0.0.1 0.0.0.0 127.0.0.1:34567 34567 0.0.0.0:0 0
- 4 TCP SOCK state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567 established stream 0 127.0.0.1 127.0.0.1 127.0.0.1:23456 23456 127.0.0.1:34567 34567
- 5 TCP SOCK state=established laddr=127.0.0.1:34567 raddr=127.0.0.1:23456 established stream 0 127.0.0.1 127.0.0.1 127.0.0.1:34567 34567 127.0.0.1:23456 23456
+3 TCP SOCK state=listen laddr=127.0.0.1:56789 listen stream 1 127.0.0.1 0.0.0.0 127.0.0.1:56789 56789 0.0.0.0:0 0
+4 TCP SOCK state=established laddr=127.0.0.1:45678 raddr=127.0.0.1:56789 established stream 0 127.0.0.1 127.0.0.1 127.0.0.1:45678 45678 127.0.0.1:56789 56789
+5 TCP SOCK state=established laddr=127.0.0.1:56789 raddr=127.0.0.1:45678 established stream 0 127.0.0.1 127.0.0.1 127.0.0.1:56789 56789 127.0.0.1:45678 45678
ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,TCP.LADDR,TCP.LPORT,TCP.RADDR,TCP.RPORT: 0
diff --git a/tests/expected/lsfd/mkfds-tcp6 b/tests/expected/lsfd/mkfds-tcp6
index 26b6039..c6e5ee2 100644
--- a/tests/expected/lsfd/mkfds-tcp6
+++ b/tests/expected/lsfd/mkfds-tcp6
@@ -1,4 +1,4 @@
- 3 TCPv6 SOCK state=listen laddr=[::1]:34567 listen stream 1 ::1 :: [::1]:34567 34567 [::]:0 0
- 4 TCPv6 SOCK state=established laddr=[::1]:23456 raddr=[::1]:34567 established stream 0 ::1 ::1 [::1]:23456 23456 [::1]:34567 34567
- 5 TCPv6 SOCK state=established laddr=[::1]:34567 raddr=[::1]:23456 established stream 0 ::1 ::1 [::1]:34567 34567 [::1]:23456 23456
+3 TCPv6 SOCK state=listen laddr=[::1]:56789 listen stream 1 ::1 :: [::1]:56789 56789 [::]:0 0
+4 TCPv6 SOCK state=established laddr=[::1]:45678 raddr=[::1]:56789 established stream 0 ::1 ::1 [::1]:45678 45678 [::1]:56789 56789
+5 TCPv6 SOCK state=established laddr=[::1]:56789 raddr=[::1]:45678 established stream 0 ::1 ::1 [::1]:56789 56789 [::1]:45678 45678
ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,TCP.LADDR,TCP.LPORT,TCP.RADDR,TCP.RPORT: 0
diff --git a/tests/expected/lsfd/mkfds-timerfd b/tests/expected/lsfd/mkfds-timerfd
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-timerfd
diff --git a/tests/expected/lsfd/mkfds-timerfd-alarm b/tests/expected/lsfd/mkfds-timerfd-alarm
new file mode 100644
index 0000000..10dc4c3
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-timerfd-alarm
@@ -0,0 +1,16 @@
+3 timerfd clockid=realtime-alarm
+ASSOC,TYPE,NAME: 0
+realtime-alarm
+CLOCKID: 0
+0.000000000
+TIMERFD.REMAINING: 0
+0.000000000
+TIMERFD.INTERVAL: 0
+3 timerfd clockid=boottime-alarm
+ASSOC,TYPE,NAME: 0
+boottime-alarm
+CLOCKID: 0
+0.000000000
+TIMERFD.REMAINING: 0
+0.000000000
+TIMERFD.INTERVAL: 0
diff --git a/tests/expected/lsfd/mkfds-timerfd-boottime-interval-only b/tests/expected/lsfd/mkfds-timerfd-boottime-interval-only
new file mode 100644
index 0000000..b708c29
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-timerfd-boottime-interval-only
@@ -0,0 +1,8 @@
+3 timerfd clockid=boottime interval=10.123456789
+ASSOC,TYPE,NAME: 0
+boottime
+CLOCKID: 0
+0.000000000
+TIMERFD.REMAINING: 0
+10.123456789
+TIMERFD.INTERVAL: 0
diff --git a/tests/expected/lsfd/mkfds-timerfd-monotonic-remaining-only b/tests/expected/lsfd/mkfds-timerfd-monotonic-remaining-only
new file mode 100644
index 0000000..7aedda6
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-timerfd-monotonic-remaining-only
@@ -0,0 +1,8 @@
+3 timerfd clockid=monotonic remaining=100.987654321
+ASSOC,TYPE,NAME: 0
+monotonic
+CLOCKID: 0
+100.987654321
+TIMERFD.REMAINING: 0
+0.000000000
+TIMERFD.INTERVAL: 0
diff --git a/tests/expected/lsfd/mkfds-timerfd-realtime-remaining-and-interval b/tests/expected/lsfd/mkfds-timerfd-realtime-remaining-and-interval
new file mode 100644
index 0000000..4ba3d8e
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-timerfd-realtime-remaining-and-interval
@@ -0,0 +1,8 @@
+3 timerfd clockid=realtime remaining=100.987654321 interval=5.123456789
+ASSOC,TYPE,NAME: 0
+realtime
+CLOCKID: 0
+100.987654321
+TIMERFD.REMAINING: 0
+5.123456789
+TIMERFD.INTERVAL: 0
diff --git a/tests/expected/lsfd/mkfds-udp b/tests/expected/lsfd/mkfds-udp
index 58ce260..0595e3b 100644
--- a/tests/expected/lsfd/mkfds-udp
+++ b/tests/expected/lsfd/mkfds-udp
@@ -1,24 +1,24 @@
- 3 UDP SOCK state=close laddr=127.0.0.1:34567 close dgram 0 127.0.0.1 0.0.0.0 127.0.0.1:34567 34567 0.0.0.0:0 0
- 4 UDP SOCK state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567 established dgram 0 127.0.0.1 127.0.0.1 127.0.0.1:23456 23456 127.0.0.1:34567 34567
+3 UDP SOCK state=close laddr=127.0.0.1:56789 close dgram 0 127.0.0.1 0.0.0.0 127.0.0.1:56789 56789 0.0.0.0:0 0
+4 UDP SOCK state=established laddr=127.0.0.1:45678 raddr=127.0.0.1:56789 established dgram 0 127.0.0.1 127.0.0.1 127.0.0.1:45678 45678 127.0.0.1:56789 56789
ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,UDP.LADDR,UDP.LPORT,UDP.RADDR,UDP.RPORT: 0
- 3 UDP SOCK 0
+3 UDP SOCK 0
ASSOC,TYPE,STTYPE,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,UDP.LADDR,UDP.LPORT,UDP.RADDR,UDP.RPORT: 0
NAME pattern match: OK
- 4 UDP SOCK established dgram 0 127.0.0.1 127.0.0.1 127.0.0.1:34567 34567
+4 UDP SOCK established dgram 0 127.0.0.1 127.0.0.1 127.0.0.1:56789 56789
ASSOC,TYPE,STTYPE,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,UDP.RADDR,UDP.RPORT: 0
LADDR/LPORT pattern match: OK
- 3 UDP SOCK state=close laddr=127.0.0.1:34567 close dgram 0 127.0.0.1 0.0.0.0 127.0.0.1:34567 34567 0.0.0.0:0 0
- 4 UDP SOCK state=close laddr=127.0.0.1:23456 close dgram 0 127.0.0.1 0.0.0.0 127.0.0.1:23456 23456 0.0.0.0:0 0
+3 UDP SOCK state=close laddr=127.0.0.1:56789 close dgram 0 127.0.0.1 0.0.0.0 127.0.0.1:56789 56789 0.0.0.0:0 0
+4 UDP SOCK state=close laddr=127.0.0.1:45678 close dgram 0 127.0.0.1 0.0.0.0 127.0.0.1:45678 45678 0.0.0.0:0 0
ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,UDP.LADDR,UDP.LPORT,UDP.RADDR,UDP.RPORT: 0
- 3 UDP-Lite SOCK state=close laddr=127.0.0.1:34567 close dgram 0 127.0.0.1 0.0.0.0 127.0.0.1:34567 34567 0.0.0.0:0 0
- 4 UDP-Lite SOCK state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567 established dgram 0 127.0.0.1 127.0.0.1 127.0.0.1:23456 23456 127.0.0.1:34567 34567
+3 UDP-Lite SOCK state=close laddr=127.0.0.1:56789 close dgram 0 127.0.0.1 0.0.0.0 127.0.0.1:56789 56789 0.0.0.0:0 0
+4 UDP-Lite SOCK state=established laddr=127.0.0.1:45678 raddr=127.0.0.1:56789 established dgram 0 127.0.0.1 127.0.0.1 127.0.0.1:45678 45678 127.0.0.1:56789 56789
ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,UDPLite.LADDR,UDPLite.LPORT,UDPLite.RADDR,UDPLite.RPORT: 0
- 3 UDP-Lite SOCK 0
+3 UDP-Lite SOCK 0
ASSOC,TYPE,STTYPE,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,UDPLite.LADDR,UDPLite.LPORT,UDPLite.RADDR,UDPLite.RPORT: 0
NAME pattern match: OK
- 4 UDP-Lite SOCK established dgram 0 127.0.0.1 127.0.0.1 127.0.0.1:34567 34567
+4 UDP-Lite SOCK established dgram 0 127.0.0.1 127.0.0.1 127.0.0.1:56789 56789
ASSOC,TYPE,STTYPE,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,UDPLite.RADDR,UDPLite.RPORT: 0
LADDR/LPORT pattern match: OK
- 3 UDP-Lite SOCK state=close laddr=127.0.0.1:34567 close dgram 0 127.0.0.1 0.0.0.0
- 4 UDP-Lite SOCK state=close laddr=127.0.0.1:23456 close dgram 0 127.0.0.1 0.0.0.0
+3 UDP-Lite SOCK state=close laddr=127.0.0.1:56789 close dgram 0 127.0.0.1 0.0.0.0
+4 UDP-Lite SOCK state=close laddr=127.0.0.1:45678 close dgram 0 127.0.0.1 0.0.0.0
ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,UDP.LADDR,UDP.LPORT,UDP.RADDR,UDP.RPORT: 0
diff --git a/tests/expected/lsfd/mkfds-udp6 b/tests/expected/lsfd/mkfds-udp6
index e29797b..cbf44d0 100644
--- a/tests/expected/lsfd/mkfds-udp6
+++ b/tests/expected/lsfd/mkfds-udp6
@@ -1,24 +1,24 @@
- 3 UDPv6 SOCK state=close laddr=[::1]:34567 close dgram 0 ::1 :: [::1]:34567 34567 [::]:0 0
- 4 UDPv6 SOCK state=established laddr=[::1]:23456 raddr=[::1]:34567 established dgram 0 ::1 ::1 [::1]:23456 23456 [::1]:34567 34567
+3 UDPv6 SOCK state=close laddr=[::1]:56789 close dgram 0 ::1 :: [::1]:56789 56789 [::]:0 0
+4 UDPv6 SOCK state=established laddr=[::1]:45678 raddr=[::1]:56789 established dgram 0 ::1 ::1 [::1]:45678 45678 [::1]:56789 56789
ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,UDP.LADDR,UDP.LPORT,UDP.RADDR,UDP.RPORT: 0
- 3 UDPv6 SOCK 0
+3 UDPv6 SOCK 0
ASSOC,TYPE,STTYPE,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,UDP.LADDR,UDP.LPORT,UDP.RADDR,UDP.RPORT: 0
NAME pattern match: OK
- 4 UDPv6 SOCK established dgram 0 ::1 ::1 [::1]:34567 34567
+4 UDPv6 SOCK established dgram 0 ::1 ::1 [::1]:56789 56789
ASSOC,TYPE,STTYPE,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,UDP.RADDR,UDP.RPORT: 0
LADDR/LPORT pattern match: OK
- 3 UDPv6 SOCK state=close laddr=[::1]:34567 close dgram 0 ::1 :: [::1]:34567 34567 [::]:0 0
- 4 UDPv6 SOCK state=close laddr=[::1]:23456 close dgram 0 ::1 :: [::1]:23456 23456 [::]:0 0
+3 UDPv6 SOCK state=close laddr=[::1]:56789 close dgram 0 ::1 :: [::1]:56789 56789 [::]:0 0
+4 UDPv6 SOCK state=close laddr=[::1]:45678 close dgram 0 ::1 :: [::1]:45678 45678 [::]:0 0
ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,UDP.LADDR,UDP.LPORT,UDP.RADDR,UDP.RPORT: 0
- 3 UDPLITEv6 SOCK state=close laddr=[::1]:34567 close dgram 0 ::1 :: [::1]:34567 34567 [::]:0 0
- 4 UDPLITEv6 SOCK state=established laddr=[::1]:23456 raddr=[::1]:34567 established dgram 0 ::1 ::1 [::1]:23456 23456 [::1]:34567 34567
+3 UDPLITEv6 SOCK state=close laddr=[::1]:56789 close dgram 0 ::1 :: [::1]:56789 56789 [::]:0 0
+4 UDPLITEv6 SOCK state=established laddr=[::1]:45678 raddr=[::1]:56789 established dgram 0 ::1 ::1 [::1]:45678 45678 [::1]:56789 56789
ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,UDPLite.LADDR,UDPLite.LPORT,UDPLite.RADDR,UDPLite.RPORT: 0
- 3 UDPLITEv6 SOCK 0
+3 UDPLITEv6 SOCK 0
ASSOC,TYPE,STTYPE,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,UDPLite.LADDR,UDPLite.LPORT,UDPLite.RADDR,UDPLite.RPORT: 0
NAME pattern match: OK
- 4 UDPLITEv6 SOCK established dgram 0 ::1 ::1 [::1]:34567 34567
+4 UDPLITEv6 SOCK established dgram 0 ::1 ::1 [::1]:56789 56789
ASSOC,TYPE,STTYPE,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,UDPLite.RADDR,UDPLite.RPORT: 0
LADDR/LPORT pattern match: OK
- 3 UDPLITEv6 SOCK state=close laddr=[::1]:34567 close dgram 0 ::1 :: [::1]:34567 34567 [::]:0 0
- 4 UDPLITEv6 SOCK state=close laddr=[::1]:23456 close dgram 0 ::1 :: [::1]:23456 23456 [::]:0 0
+3 UDPLITEv6 SOCK state=close laddr=[::1]:56789 close dgram 0 ::1 :: [::1]:56789 56789 [::]:0 0
+4 UDPLITEv6 SOCK state=close laddr=[::1]:45678 close dgram 0 ::1 :: [::1]:45678 45678 [::]:0 0
ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,UDPLite.LADDR,UDPLite.LPORT,UDPLite.RADDR,UDPLite.RPORT: 0
diff --git a/tests/expected/lsfd/mkfds-unix-dgram b/tests/expected/lsfd/mkfds-unix-dgram
index b8fd9d4..dfd91e6 100644
--- a/tests/expected/lsfd/mkfds-unix-dgram
+++ b/tests/expected/lsfd/mkfds-unix-dgram
@@ -1,6 +1,6 @@
- 3 SOCK state=connected path=test_mkfds-unix-dgram type=dgram connected dgram 0 test_mkfds-unix-dgram
- 4 SOCK state=connected type=dgram connected dgram 0
+3 SOCK state=connected\x20path=test_mkfds-unix-dgram\x20type=dgram connected dgram 0 test_mkfds-unix-dgram
+4 SOCK state=connected\x20type=dgram connected dgram 0
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
- 3 SOCK state=connected path=@test_mkfds-unix-dgram type=dgram connected dgram 0 @test_mkfds-unix-dgram
- 4 SOCK state=connected type=dgram connected dgram 0
+3 SOCK state=connected\x20path=@test_mkfds-unix-dgram\x20type=dgram connected dgram 0 @test_mkfds-unix-dgram
+4 SOCK state=connected\x20type=dgram connected dgram 0
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
diff --git a/tests/expected/lsfd/mkfds-unix-in-netns-dgram b/tests/expected/lsfd/mkfds-unix-in-netns-dgram
index c33dd9a..48ac72f 100644
--- a/tests/expected/lsfd/mkfds-unix-in-netns-dgram
+++ b/tests/expected/lsfd/mkfds-unix-in-netns-dgram
@@ -1,6 +1,6 @@
- 5 SOCK state=unconnected path=test_mkfds-unix-dgram-ns type=dgram unconnected dgram 0 test_mkfds-unix-dgram-ns
+5 SOCK state=unconnected path=test_mkfds-unix-dgram-ns type=dgram unconnected dgram 0 test_mkfds-unix-dgram-ns
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
the netns for the dgram socket is extracted as expectedly
- 5 SOCK state=unconnected path=@test_mkfds-unix-dgram-ns type=dgram unconnected dgram 0 @test_mkfds-unix-dgram-ns
+5 SOCK state=unconnected path=@test_mkfds-unix-dgram-ns type=dgram unconnected dgram 0 @test_mkfds-unix-dgram-ns
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
the netns for the abstract dgram socket is extracted as expectedly
diff --git a/tests/expected/lsfd/mkfds-unix-in-netns-seqpacket b/tests/expected/lsfd/mkfds-unix-in-netns-seqpacket
index 1f70061..b997e55 100644
--- a/tests/expected/lsfd/mkfds-unix-in-netns-seqpacket
+++ b/tests/expected/lsfd/mkfds-unix-in-netns-seqpacket
@@ -1,6 +1,6 @@
- 5 SOCK state=listen path=test_mkfds-unix-seqpacket-ns type=seqpacket listen seqpacket 1 test_mkfds-unix-seqpacket-ns
+5 SOCK state=listen path=test_mkfds-unix-seqpacket-ns type=seqpacket listen seqpacket 1 test_mkfds-unix-seqpacket-ns
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
the netns for the seqpacket socket is extracted as expectedly
- 5 SOCK state=listen path=@test_mkfds-unix-seqpacket-ns type=seqpacket listen seqpacket 1 @test_mkfds-unix-seqpacket-ns
+5 SOCK state=listen path=@test_mkfds-unix-seqpacket-ns type=seqpacket listen seqpacket 1 @test_mkfds-unix-seqpacket-ns
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
the netns for the abstract seqpacket socket is extracted as expectedly
diff --git a/tests/expected/lsfd/mkfds-unix-in-netns-stream b/tests/expected/lsfd/mkfds-unix-in-netns-stream
index fd09105..c4ec9d4 100644
--- a/tests/expected/lsfd/mkfds-unix-in-netns-stream
+++ b/tests/expected/lsfd/mkfds-unix-in-netns-stream
@@ -1,6 +1,6 @@
- 5 SOCK state=listen path=test_mkfds-unix-stream-ns listen stream 1 test_mkfds-unix-stream-ns
+5 SOCK state=listen path=test_mkfds-unix-stream-ns listen stream 1 test_mkfds-unix-stream-ns
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
the netns for the stream socket is extracted as expectedly
- 5 SOCK state=listen path=@test_mkfds-unix-stream-ns listen stream 1 @test_mkfds-unix-stream-ns
+5 SOCK state=listen path=@test_mkfds-unix-stream-ns listen stream 1 @test_mkfds-unix-stream-ns
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
the netns for the abstract stream socket is extracted as expectedly
diff --git a/tests/expected/lsfd/mkfds-unix-stream b/tests/expected/lsfd/mkfds-unix-stream
index c2e64a7..645be81 100644
--- a/tests/expected/lsfd/mkfds-unix-stream
+++ b/tests/expected/lsfd/mkfds-unix-stream
@@ -1,32 +1,32 @@
- 3 SOCK state=listen path=test_mkfds-unix-stream listen stream 1 test_mkfds-unix-stream
- 4 SOCK state=connected connected stream 0
- 5 SOCK state=connected path=test_mkfds-unix-stream connected stream 0 test_mkfds-unix-stream
+3 SOCK state=listen path=test_mkfds-unix-stream listen stream 1 test_mkfds-unix-stream
+4 SOCK state=connected connected stream 0
+5 SOCK state=connected path=test_mkfds-unix-stream connected stream 0 test_mkfds-unix-stream
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
- 3 SOCK state=listen path=@test_mkfds-unix-stream-abs listen stream 1 @test_mkfds-unix-stream-abs
- 4 SOCK state=connected connected stream 0
- 5 SOCK state=connected path=@test_mkfds-unix-stream-abs connected stream 0 @test_mkfds-unix-stream-abs
+3 SOCK state=listen path=@test_mkfds-unix-stream-abs listen stream 1 @test_mkfds-unix-stream-abs
+4 SOCK state=connected connected stream 0
+5 SOCK state=connected path=@test_mkfds-unix-stream-abs connected stream 0 @test_mkfds-unix-stream-abs
(abs) ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
- 3 SOCK state=listen path=test_mkfds-unix-stream-shutdown listen stream 1 test_mkfds-unix-stream-shutdown
- 4 SOCK state=connected connected stream 0
- 5 SOCK state=connected path=test_mkfds-unix-stream-shutdown connected stream 0 test_mkfds-unix-stream-shutdown
+3 SOCK state=listen path=test_mkfds-unix-stream-shutdown listen stream 1 test_mkfds-unix-stream-shutdown
+4 SOCK state=connected connected stream 0
+5 SOCK state=connected path=test_mkfds-unix-stream-shutdown connected stream 0 test_mkfds-unix-stream-shutdown
(shutdown) ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
- 3 SOCK state=listen path=test_mkfds-unix with spaces stream listen stream 1 test_mkfds-unix with spaces stream
- 4 SOCK state=connected connected stream 0
- 5 SOCK state=connected path=test_mkfds-unix with spaces stream connected stream 0 test_mkfds-unix with spaces stream
+3 SOCK state=listen path=test_mkfds-unix with spaces stream listen stream 1 test_mkfds-unix with spaces stream
+4 SOCK state=connected connected stream 0
+5 SOCK state=connected path=test_mkfds-unix with spaces stream connected stream 0 test_mkfds-unix with spaces stream
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
- 3 SOCK state=listen path=test_mkfds-unix-seqpacket type=seqpacket listen seqpacket 1 test_mkfds-unix-seqpacket
- 4 SOCK state=connected type=seqpacket connected seqpacket 0
- 5 SOCK state=connected path=test_mkfds-unix-seqpacket type=seqpacket connected seqpacket 0 test_mkfds-unix-seqpacket
+3 SOCK state=listen path=test_mkfds-unix-seqpacket type=seqpacket listen seqpacket 1 test_mkfds-unix-seqpacket
+4 SOCK state=connected type=seqpacket connected seqpacket 0
+5 SOCK state=connected path=test_mkfds-unix-seqpacket type=seqpacket connected seqpacket 0 test_mkfds-unix-seqpacket
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
- 3 SOCK state=listen path=@test_mkfds-unix-seqpacket-abs listen stream 1 @test_mkfds-unix-seqpacket-abs
- 4 SOCK state=connected connected stream 0
- 5 SOCK state=connected path=@test_mkfds-unix-seqpacket-abs connected stream 0 @test_mkfds-unix-seqpacket-abs
+3 SOCK state=listen path=@test_mkfds-unix-seqpacket-abs listen stream 1 @test_mkfds-unix-seqpacket-abs
+4 SOCK state=connected connected stream 0
+5 SOCK state=connected path=@test_mkfds-unix-seqpacket-abs connected stream 0 @test_mkfds-unix-seqpacket-abs
(abs) ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
- 3 SOCK state=listen path=test_mkfds-unix-seqpacket-shutdown type=seqpacket listen seqpacket 1 test_mkfds-unix-seqpacket-shutdown
- 4 SOCK state=connected type=seqpacket connected seqpacket 0
- 5 SOCK state=connected path=test_mkfds-unix-seqpacket-shutdown type=seqpacket connected seqpacket 0 test_mkfds-unix-seqpacket-shutdown
+3 SOCK state=listen path=test_mkfds-unix-seqpacket-shutdown type=seqpacket listen seqpacket 1 test_mkfds-unix-seqpacket-shutdown
+4 SOCK state=connected type=seqpacket connected seqpacket 0
+5 SOCK state=connected path=test_mkfds-unix-seqpacket-shutdown type=seqpacket connected seqpacket 0 test_mkfds-unix-seqpacket-shutdown
(shutdown) ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
- 3 SOCK state=listen path=test_mkfds-unix with spaces seqpacket type=seqpacket listen seqpacket 1 test_mkfds-unix with spaces seqpacket
- 4 SOCK state=connected type=seqpacket connected seqpacket 0
- 5 SOCK state=connected path=test_mkfds-unix with spaces seqpacket type=seqpacket connected seqpacket 0 test_mkfds-unix with spaces seqpacket
+3 SOCK state=listen path=test_mkfds-unix with spaces seqpacket type=seqpacket listen seqpacket 1 test_mkfds-unix with spaces seqpacket
+4 SOCK state=connected type=seqpacket connected seqpacket 0
+5 SOCK state=connected path=test_mkfds-unix with spaces seqpacket type=seqpacket connected seqpacket 0 test_mkfds-unix with spaces seqpacket
ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
diff --git a/tests/expected/lsfd/mkfds-unix-stream-requiring-sockdiag b/tests/expected/lsfd/mkfds-unix-stream-requiring-sockdiag
new file mode 100644
index 0000000..946c95f
--- /dev/null
+++ b/tests/expected/lsfd/mkfds-unix-stream-requiring-sockdiag
@@ -0,0 +1,8 @@
+3 SOCK state=listen path=test_mkfds-unix with newline stream a\x0ab\x0ac listen stream 1 test_mkfds-unix with newline stream a\x0ab\x0ac
+4 SOCK state=connected connected stream 0
+5 SOCK state=connected path=test_mkfds-unix with newline stream a\x0ab\x0ac connected stream 0 test_mkfds-unix with newline stream a\x0ab\x0ac
+ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
+3 SOCK state=listen path=test_mkfds-unix with newline seqpacket a\x0ab\x0ac type=seqpacket listen seqpacket 1 test_mkfds-unix with newline seqpacket a\x0ab\x0ac
+4 SOCK state=connected type=seqpacket connected seqpacket 0
+5 SOCK state=connected path=test_mkfds-unix with newline seqpacket a\x0ab\x0ac type=seqpacket connected seqpacket 0 test_mkfds-unix with newline seqpacket a\x0ab\x0ac
+ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0
diff --git a/tests/expected/lsfd/option-filter-broken-exp b/tests/expected/lsfd/option-filter-broken-exp
deleted file mode 100644
index 8c14f22..0000000
--- a/tests/expected/lsfd/option-filter-broken-exp
+++ /dev/null
@@ -1,7 +0,0 @@
-lsfd: error: empty filter expression
-lsfd: error: empty filter expression
-lsfd: error: unbalanced parenthesis: )
-lsfd: error: unexpected token: garbage after OP2
-lsfd: error: bool expression is expected: FD
-lsfd: unknown column: NOSUCHCOLUMN
-lsfd: error: no such column: NOSUCHCOLUMN
diff --git a/tests/expected/lsfd/option-inet b/tests/expected/lsfd/option-inet
index cebfded..66edac9 100644
--- a/tests/expected/lsfd/option-inet
+++ b/tests/expected/lsfd/option-inet
@@ -1,46 +1,46 @@
# --inet
- 3 TCP state=listen laddr=127.0.0.1:34567
- 4 TCP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
- 5 TCP state=established laddr=127.0.0.1:34567 raddr=127.0.0.1:23456
- 3 TCPv6 state=listen laddr=[::1]:34567
- 4 TCPv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
- 5 TCPv6 state=established laddr=[::1]:34567 raddr=[::1]:23456
- 3 UDP state=close laddr=127.0.0.1:34567
- 4 UDP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
- 3 UDPLITEv6 state=close laddr=[::1]:34567
- 4 UDPLITEv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
+3 TCP state=listen laddr=127.0.0.1:34567
+4 TCP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
+5 TCP state=established laddr=127.0.0.1:34567 raddr=127.0.0.1:23456
+3 TCPv6 state=listen laddr=[::1]:34567
+4 TCPv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
+5 TCPv6 state=established laddr=[::1]:34567 raddr=[::1]:23456
+3 UDP state=close laddr=127.0.0.1:34567
+4 UDP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
+3 UDPLITEv6 state=close laddr=[::1]:34567
+4 UDPLITEv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
# --inet=4
- 3 TCP state=listen laddr=127.0.0.1:34567
- 4 TCP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
- 5 TCP state=established laddr=127.0.0.1:34567 raddr=127.0.0.1:23456
- 3 UDP state=close laddr=127.0.0.1:34567
- 4 UDP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
+3 TCP state=listen laddr=127.0.0.1:34567
+4 TCP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
+5 TCP state=established laddr=127.0.0.1:34567 raddr=127.0.0.1:23456
+3 UDP state=close laddr=127.0.0.1:34567
+4 UDP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
# --inet=6
- 3 TCPv6 state=listen laddr=[::1]:34567
- 4 TCPv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
- 5 TCPv6 state=established laddr=[::1]:34567 raddr=[::1]:23456
- 3 UDPLITEv6 state=close laddr=[::1]:34567
- 4 UDPLITEv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
+3 TCPv6 state=listen laddr=[::1]:34567
+4 TCPv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
+5 TCPv6 state=established laddr=[::1]:34567 raddr=[::1]:23456
+3 UDPLITEv6 state=close laddr=[::1]:34567
+4 UDPLITEv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
# -i
- 3 TCP state=listen laddr=127.0.0.1:34567
- 4 TCP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
- 5 TCP state=established laddr=127.0.0.1:34567 raddr=127.0.0.1:23456
- 3 TCPv6 state=listen laddr=[::1]:34567
- 4 TCPv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
- 5 TCPv6 state=established laddr=[::1]:34567 raddr=[::1]:23456
- 3 UDP state=close laddr=127.0.0.1:34567
- 4 UDP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
- 3 UDPLITEv6 state=close laddr=[::1]:34567
- 4 UDPLITEv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
+3 TCP state=listen laddr=127.0.0.1:34567
+4 TCP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
+5 TCP state=established laddr=127.0.0.1:34567 raddr=127.0.0.1:23456
+3 TCPv6 state=listen laddr=[::1]:34567
+4 TCPv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
+5 TCPv6 state=established laddr=[::1]:34567 raddr=[::1]:23456
+3 UDP state=close laddr=127.0.0.1:34567
+4 UDP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
+3 UDPLITEv6 state=close laddr=[::1]:34567
+4 UDPLITEv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
# -i4
- 3 TCP state=listen laddr=127.0.0.1:34567
- 4 TCP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
- 5 TCP state=established laddr=127.0.0.1:34567 raddr=127.0.0.1:23456
- 3 UDP state=close laddr=127.0.0.1:34567
- 4 UDP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
+3 TCP state=listen laddr=127.0.0.1:34567
+4 TCP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
+5 TCP state=established laddr=127.0.0.1:34567 raddr=127.0.0.1:23456
+3 UDP state=close laddr=127.0.0.1:34567
+4 UDP state=established laddr=127.0.0.1:23456 raddr=127.0.0.1:34567
# -i6
- 3 TCPv6 state=listen laddr=[::1]:34567
- 4 TCPv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
- 5 TCPv6 state=established laddr=[::1]:34567 raddr=[::1]:23456
- 3 UDPLITEv6 state=close laddr=[::1]:34567
- 4 UDPLITEv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
+3 TCPv6 state=listen laddr=[::1]:34567
+4 TCPv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
+5 TCPv6 state=established laddr=[::1]:34567 raddr=[::1]:23456
+3 UDPLITEv6 state=close laddr=[::1]:34567
+4 UDPLITEv6 state=established laddr=[::1]:23456 raddr=[::1]:34567
diff --git a/tests/expected/lsfd/option-summary b/tests/expected/lsfd/option-summary
index 4e96f55..058de37 100644
--- a/tests/expected/lsfd/option-summary
+++ b/tests/expected/lsfd/option-summary
@@ -1,3 +1,3 @@
- 10 GROUP
- 3 PASSWD
- 13 PROC
+10 GROUP
+ 3 PASSWD
+13 PROC
diff --git a/tests/expected/lslocks/lslocks-flock-ex b/tests/expected/lslocks/lslocks-flock-ex
new file mode 100644
index 0000000..b7e6ee2
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-flock-ex
@@ -0,0 +1,4 @@
+test_mkfds FLOCK WRITE 0 0
+# flock-ex + COMMAND,TYPE,SIZE,MODE,START,END + --raw --noheadings: 0
+util-linux-lslocks-target-file
+# flock-ex + PATH + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-flock-ex+HOLDERS b/tests/expected/lslocks/lslocks-flock-ex+HOLDERS
new file mode 100644
index 0000000..3a817e2
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-flock-ex+HOLDERS
@@ -0,0 +1,2 @@
+test_mkfds FLOCK WRITE 0 0 1,test_mkfds,17\x0a1,test_mkfds,18
+# flock-ex + COMMAND,TYPE,SIZE,MODE,START,END,HOLDERS + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-flock-sh b/tests/expected/lslocks/lslocks-flock-sh
new file mode 100644
index 0000000..6188cc1
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-flock-sh
@@ -0,0 +1,4 @@
+test_mkfds FLOCK READ 0 0
+# flock-sh + COMMAND,TYPE,SIZE,MODE,START,END + --raw --noheadings: 0
+util-linux-lslocks-target-file
+# flock-sh + PATH + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-flock-sh+HOLDERS b/tests/expected/lslocks/lslocks-flock-sh+HOLDERS
new file mode 100644
index 0000000..37996b1
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-flock-sh+HOLDERS
@@ -0,0 +1,2 @@
+test_mkfds FLOCK READ 0 0 1,test_mkfds,17\x0a1,test_mkfds,18
+# flock-sh + COMMAND,TYPE,SIZE,MODE,START,END,HOLDERS + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-lease-w b/tests/expected/lslocks/lslocks-lease-w
new file mode 100644
index 0000000..78a0a21
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-lease-w
@@ -0,0 +1,4 @@
+test_mkfds LEASE WRITE 0 0
+# lease-w + COMMAND,TYPE,SIZE,MODE,START,END + --raw --noheadings: 0
+util-linux-lslocks-target-file
+# lease-w + PATH + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-lease-w+HOLDERS b/tests/expected/lslocks/lslocks-lease-w+HOLDERS
new file mode 100644
index 0000000..8c6ab5d
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-lease-w+HOLDERS
@@ -0,0 +1,2 @@
+test_mkfds LEASE WRITE 0 0 1,test_mkfds,17\x0a1,test_mkfds,18
+# lease-w + COMMAND,TYPE,SIZE,MODE,START,END,HOLDERS + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-ofd--w b/tests/expected/lslocks/lslocks-ofd--w
new file mode 100644
index 0000000..20b8bc9
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-ofd--w
@@ -0,0 +1,4 @@
+test_mkfds OFDLCK 1B WRITE 0 0
+# ofd--w + COMMAND,TYPE,SIZE,MODE,START,END + --raw --noheadings: 0
+util-linux-lslocks-target-file
+# ofd--w + PATH + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-ofd--w+HOLDERS b/tests/expected/lslocks/lslocks-ofd--w+HOLDERS
new file mode 100644
index 0000000..4ff9158
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-ofd--w+HOLDERS
@@ -0,0 +1,2 @@
+test_mkfds OFDLCK 1B WRITE 0 0 1,test_mkfds,17\x0a1,test_mkfds,18
+# ofd--w + COMMAND,TYPE,SIZE,MODE,START,END,HOLDERS + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-ofd-r- b/tests/expected/lslocks/lslocks-ofd-r-
new file mode 100644
index 0000000..bf9e809
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-ofd-r-
@@ -0,0 +1,4 @@
+test_mkfds OFDLCK 1B READ 0 0
+# ofd-r- + COMMAND,TYPE,SIZE,MODE,START,END + --raw --noheadings: 0
+util-linux-lslocks-target-file
+# ofd-r- + PATH + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-ofd-r-+HOLDERS b/tests/expected/lslocks/lslocks-ofd-r-+HOLDERS
new file mode 100644
index 0000000..1abbf44
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-ofd-r-+HOLDERS
@@ -0,0 +1,2 @@
+test_mkfds OFDLCK 1B READ 0 0 1,test_mkfds,17\x0a1,test_mkfds,18
+# ofd-r- + COMMAND,TYPE,SIZE,MODE,START,END,HOLDERS + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-ofd-rw b/tests/expected/lslocks/lslocks-ofd-rw
new file mode 100644
index 0000000..dd3d71c
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-ofd-rw
@@ -0,0 +1,6 @@
+test_mkfds OFDLCK 3B READ 0 0
+test_mkfds OFDLCK 3B WRITE 2 2
+# ofd-rw + COMMAND,TYPE,SIZE,MODE,START,END + --raw --noheadings: 0
+util-linux-lslocks-target-file
+util-linux-lslocks-target-file
+# ofd-rw + PATH + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-ofd-rw+HOLDERS b/tests/expected/lslocks/lslocks-ofd-rw+HOLDERS
new file mode 100644
index 0000000..a105d32
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-ofd-rw+HOLDERS
@@ -0,0 +1,3 @@
+test_mkfds OFDLCK 3B READ 0 0 1,test_mkfds,17\x0a1,test_mkfds,18
+test_mkfds OFDLCK 3B WRITE 2 2 1,test_mkfds,17\x0a1,test_mkfds,18
+# ofd-rw + COMMAND,TYPE,SIZE,MODE,START,END,HOLDERS + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-posix--w b/tests/expected/lslocks/lslocks-posix--w
new file mode 100644
index 0000000..2668fcd
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-posix--w
@@ -0,0 +1,4 @@
+test_mkfds POSIX 1B WRITE 0 0
+# posix--w + COMMAND,TYPE,SIZE,MODE,START,END + --raw --noheadings: 0
+util-linux-lslocks-target-file
+# posix--w + PATH + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-posix-r- b/tests/expected/lslocks/lslocks-posix-r-
new file mode 100644
index 0000000..5e1113d
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-posix-r-
@@ -0,0 +1,4 @@
+test_mkfds POSIX 1B READ 0 0
+# posix-r- + COMMAND,TYPE,SIZE,MODE,START,END + --raw --noheadings: 0
+util-linux-lslocks-target-file
+# posix-r- + PATH + --raw --noheadings: 0
diff --git a/tests/expected/lslocks/lslocks-posix-rw b/tests/expected/lslocks/lslocks-posix-rw
new file mode 100644
index 0000000..890d96a
--- /dev/null
+++ b/tests/expected/lslocks/lslocks-posix-rw
@@ -0,0 +1,6 @@
+test_mkfds POSIX 3B READ 0 0
+test_mkfds POSIX 3B WRITE 2 2
+# posix-rw + COMMAND,TYPE,SIZE,MODE,START,END + --raw --noheadings: 0
+util-linux-lslocks-target-file
+util-linux-lslocks-target-file
+# posix-rw + PATH + --raw --noheadings: 0
diff --git a/tests/expected/misc/boilerplate-exec b/tests/expected/misc/boilerplate-exec
new file mode 100644
index 0000000..324da67
--- /dev/null
+++ b/tests/expected/misc/boilerplate-exec
@@ -0,0 +1 @@
+ret=0
diff --git a/tests/expected/misc/boilerplate-help b/tests/expected/misc/boilerplate-help
new file mode 100644
index 0000000..549400d
--- /dev/null
+++ b/tests/expected/misc/boilerplate-help
@@ -0,0 +1,24 @@
+
+Usage:
+ test_boilerplate [options] file...
+
+Short program description.
+
+Options:
+ -n, --no-argument option does not use argument
+ --optional[=<arg>] option argument is optional
+ -r, --required <arg> option requires an argument
+ -z no long option
+ --xyzzy a long option only
+ -e, --extremely-long-long-option
+ use next line for description when needed
+ -l, --long-explanation an example of very verbose, and chatty option
+ description on two, or multiple lines, where the
+ consecutive lines are intended by two spaces
+ -f, --foobar next option description resets indent
+
+ -h, --help display this help
+ -V, --version display version
+
+For more details see fixme-command-name(1).
+ret=0
diff --git a/tests/expected/misc/enosys-basic b/tests/expected/misc/enosys-basic
new file mode 100644
index 0000000..6552946
--- /dev/null
+++ b/tests/expected/misc/enosys-basic
@@ -0,0 +1,4 @@
+test_enosys: fallocate r=-1 errno=Bad file descriptor
+test_enosys: fallocate r=-1 errno=Function not implemented
+test_enosys: fallocate r=-1 errno=Function not implemented
+test_enosys: fallocate r=-1 errno=Function not implemented
diff --git a/tests/expected/misc/enosys-exec b/tests/expected/misc/enosys-exec
new file mode 100644
index 0000000..be9e72f
--- /dev/null
+++ b/tests/expected/misc/enosys-exec
@@ -0,0 +1 @@
+test_enosys: exec failed: Function not implemented
diff --git a/tests/expected/misc/enosys-ioctl b/tests/expected/misc/enosys-ioctl
new file mode 100644
index 0000000..7ab1efd
--- /dev/null
+++ b/tests/expected/misc/enosys-ioctl
@@ -0,0 +1,5 @@
+test_enosys: ioctl r=0 errno=Success
+test_enosys: ioctl r=-1 errno=Function not implemented
+test_enosys: ioctl r=-1 errno=Inappropriate ioctl for device
+test_enosys: ioctl r=-1 errno=Inappropriate ioctl for device
+test_enosys: ioctl r=-1 errno=Function not implemented
diff --git a/tests/expected/misc/lsclocks-basic b/tests/expected/misc/lsclocks-basic
new file mode 100644
index 0000000..1b375b8
--- /dev/null
+++ b/tests/expected/misc/lsclocks-basic
@@ -0,0 +1,10 @@
+TYPE ID CLOCK NAME
+sys 0 CLOCK_REALTIME realtime
+sys 1 CLOCK_MONOTONIC monotonic
+sys 4 CLOCK_MONOTONIC_RAW monotonic-raw
+sys 5 CLOCK_REALTIME_COARSE realtime-coarse
+sys 6 CLOCK_MONOTONIC_COARSE monotonic-coarse
+sys 7 CLOCK_BOOTTIME boottime
+sys 8 CLOCK_REALTIME_ALARM realtime-alarm
+sys 9 CLOCK_BOOTTIME_ALARM boottime-alarm
+sys 11 CLOCK_TAI tai
diff --git a/tests/expected/misc/lsclocks-cpu b/tests/expected/misc/lsclocks-cpu
new file mode 100644
index 0000000..8da71a5
--- /dev/null
+++ b/tests/expected/misc/lsclocks-cpu
@@ -0,0 +1 @@
+cpu 1
diff --git a/tests/expected/misc/lsclocks-dynamic b/tests/expected/misc/lsclocks-dynamic
new file mode 100644
index 0000000..156ee3f
--- /dev/null
+++ b/tests/expected/misc/lsclocks-dynamic
@@ -0,0 +1 @@
+ptp /dev/ptp0 /dev/ptp0
diff --git a/tests/expected/misc/lsclocks-rtc b/tests/expected/misc/lsclocks-rtc
new file mode 100644
index 0000000..85615b1
--- /dev/null
+++ b/tests/expected/misc/lsclocks-rtc
@@ -0,0 +1 @@
+rtc /dev/rtc0 /dev/rtc0
diff --git a/tests/expected/misc/lsclocks-time b/tests/expected/misc/lsclocks-time
new file mode 100644
index 0000000..adc6524
--- /dev/null
+++ b/tests/expected/misc/lsclocks-time
@@ -0,0 +1 @@
+X.X
diff --git a/tests/expected/misc/setpgid b/tests/expected/misc/setpgid
new file mode 100644
index 0000000..3e4e055
--- /dev/null
+++ b/tests/expected/misc/setpgid
@@ -0,0 +1,2 @@
+success
+not equal
diff --git a/tests/expected/misc/time_t b/tests/expected/misc/time_t
new file mode 100644
index 0000000..45a4fb7
--- /dev/null
+++ b/tests/expected/misc/time_t
@@ -0,0 +1 @@
+8
diff --git a/tests/expected/mount/special-missing-options b/tests/expected/mount/special-missing-options
new file mode 100644
index 0000000..9ead324
--- /dev/null
+++ b/tests/expected/mount/special-missing-options
@@ -0,0 +1 @@
+SRC=/foo TARGET=/mountpoint ROOT=/ OPTS=x-foo=123,x-bar=BAR
diff --git a/tests/expected/rename/basic b/tests/expected/rename/basic
index 2712ba1..7f1af7c 100644
--- a/tests/expected/rename/basic
+++ b/tests/expected/rename/basic
@@ -17,3 +17,4 @@ what is rename_all* *.? doing here?
`rename_zz_last_zzz.z' -> `rename_zz_last_zAAzzBB.z'
what is rename*last* doing here?
`rename_all_empty' -> `_r_e_n_a_m_e___a_l_l___e_m_p_t_y_'
+`rename_dir' -> `rename_new_dir'
diff --git a/tests/expected/schedutils/chrt-deadline b/tests/expected/schedutils/chrt-deadline
index 33d5527..35066c5 100644
--- a/tests/expected/schedutils/chrt-deadline
+++ b/tests/expected/schedutils/chrt-deadline
@@ -1,9 +1,9 @@
SCHED_DEADLINE
0
-<removed>'s current runtime/deadline/period parameters: 13000/13000/13000
+<removed>'s current runtime/deadline/period parameters: 130000/130000/130000
SCHED_DEADLINE
0
-<removed>'s current runtime/deadline/period parameters: 12000/12000/13000
+<removed>'s current runtime/deadline/period parameters: 120000/120000/130000
SCHED_DEADLINE
0
-<removed>'s current runtime/deadline/period parameters: 10000/12000/13000
+<removed>'s current runtime/deadline/period parameters: 100000/120000/130000
diff --git a/tests/expected/setpriv/landlock-nothing-allowed b/tests/expected/setpriv/landlock-nothing-allowed
new file mode 100644
index 0000000..6a63dbc
--- /dev/null
+++ b/tests/expected/setpriv/landlock-nothing-allowed
@@ -0,0 +1 @@
+setpriv: failed to execute true: Permission denied
diff --git a/tests/expected/setpriv/landlock-partial-access-fail b/tests/expected/setpriv/landlock-partial-access-fail
new file mode 100644
index 0000000..0a9a503
--- /dev/null
+++ b/tests/expected/setpriv/landlock-partial-access-fail
@@ -0,0 +1 @@
+cp: cannot create regular file '/dev/zero': Permission denied
diff --git a/tests/expected/utmp/utmpdump-subsecond b/tests/expected/utmp/utmpdump-subsecond
index 67d2cf8..02990c7 100644
--- a/tests/expected/utmp/utmpdump-subsecond
+++ b/tests/expected/utmp/utmpdump-subsecond
@@ -1,4 +1,4 @@
last 9 is expected to disappear in conversion
[7] [00010] [ipv6] [IPv6 ] [root ] [dns-server ] [2001:503:ba3e::2:30] [2013-08-28T20:30:40,123456+00:00]
[8] [00011] [ipv6] [IPv6 ] [root ] [dns-server ] [2001:503:ba3e::2:30] [2013-08-28T20:40:50,999999+00:00]
-[0] [00000] [ts/0] [nonvalid] [foo ] [zero ] [0.0.0.0 ] [2013-08-28T12:00:00,12345678+00:00]
+[0] [00000] [ts/0] [nonvalid] [foo ] [zero ] [0.0.0.0 ] [2013-08-28T12:00:00,000000+00:00]
diff --git a/tests/expected/wipefs/signatures-bcachefs b/tests/expected/wipefs/signatures-bcachefs
new file mode 100644
index 0000000..0c7e0a3
--- /dev/null
+++ b/tests/expected/wipefs/signatures-bcachefs
@@ -0,0 +1,3 @@
+0x1018,e1cf0710-c3cb-498b-9453-d5f3e7dbf9cc,,bcachefs
+0x200018,e1cf0710-c3cb-498b-9453-d5f3e7dbf9cc,,bcachefs
+0x1300018,e1cf0710-c3cb-498b-9453-d5f3e7dbf9cc,,bcachefs
diff --git a/tests/functions.sh b/tests/functions.sh
index 5a562a3..5fe5ba0 100644
--- a/tests/functions.sh
+++ b/tests/functions.sh
@@ -163,6 +163,18 @@ function ts_skip_nonroot {
fi
}
+# Specify the capability needed in your test case like:
+#
+# ts_skip_capability cap_wake_alarm
+#
+function ts_skip_capability {
+ ts_check_prog "$TS_HELPER_CAP"
+
+ if ! "$TS_HELPER_CAP" "$1"; then
+ ts_skip "no capability: $1"
+ fi
+}
+
function ts_skip_qemu_user {
if [ "$QEMU_USER" == "1" ]; then
ts_skip "running under qemu-user emulation"
@@ -283,10 +295,10 @@ function ts_init_core_subtest_env {
TS_EXPECTED_ERR="$TS_TOPDIR/expected/$TS_NS.err"
TS_MOUNTPOINT="$TS_OUTDIR/${TS_TESTNAME}-${TS_SUBNAME}-mnt"
- rm -f $TS_OUTPUT $TS_ERRLOG $TS_VGDUMP $TS_EXIT_CODE
+ rm -f "$TS_OUTPUT" "$TS_ERRLOG" "$TS_VGDUMP" "$TS_EXIT_CODE"
[ -d "$TS_OUTDIR" ] || mkdir -p "$TS_OUTDIR"
- touch $TS_OUTPUT $TS_ERRLOG $TS_EXIT_CODE
+ touch "$TS_OUTPUT" "$TS_ERRLOG" "$TS_EXIT_CODE"
[ -n "$TS_VALGRIND_CMD" ] && touch $TS_VGDUMP
}
@@ -386,6 +398,7 @@ function ts_init_env {
TS_ENABLE_UBSAN="yes"
fi
+ TS_FSTAB="$TS_OUTDIR/${TS_TESTNAME}.fstab"
BLKID_FILE="$TS_OUTDIR/${TS_TESTNAME}.blkidtab"
declare -a TS_SUID_PROGS
@@ -529,19 +542,19 @@ function ts_gen_diff_from {
local output="$2"
local difffile="$3"
- diff -u $expected $output > $difffile
+ diff -u "$expected" "$output" > "$difffile"
- if [ $? -ne 0 ] || [ -s $difffile ]; then
+ if [ $? -ne 0 ] || [ -s "$difffile" ]; then
res=1
if [ "$TS_SHOWDIFF" == "yes" -a "$TS_KNOWN_FAIL" != "yes" ]; then
echo
echo "diff-{{{"
- cat $difffile
+ cat "$difffile"
echo "}}}-diff"
echo
fi
else
- rm -f $difffile;
+ rm -f "$difffile";
fi
return $res
@@ -556,8 +569,8 @@ function ts_gen_diff {
[ -f "$TS_EXPECTED" ] || TS_EXPECTED=/dev/null
# remove libtool lt- prefixes
- sed --in-place 's/^lt\-\(.*\: \)/\1/g' $TS_OUTPUT
- sed --in-place 's/^lt\-\(.*\: \)/\1/g' $TS_ERRLOG
+ sed --in-place 's/^lt\-\(.*\: \)/\1/g' "$TS_OUTPUT"
+ sed --in-place 's/^lt\-\(.*\: \)/\1/g' "$TS_ERRLOG"
[ -d "$TS_DIFFDIR" ] || mkdir -p "$TS_DIFFDIR"
@@ -566,10 +579,10 @@ function ts_gen_diff {
[ -f "$TS_ERRLOG" ] || TS_ERRLOG=/dev/null
if [ "$TS_COMPONENT" != "fuzzers" ]; then
- ts_gen_diff_from $TS_EXPECTED $TS_OUTPUT $TS_DIFF
+ ts_gen_diff_from "$TS_EXPECTED" "$TS_OUTPUT" "$TS_DIFF"
status_out=$?
- ts_gen_diff_from $TS_EXPECTED_ERR $TS_ERRLOG $TS_DIFF.err
+ ts_gen_diff_from "$TS_EXPECTED_ERR" "$TS_ERRLOG" "$TS_DIFF.err"
status_err=$?
else
# TS_EXIT_CODE is empty when tests aren't run with ts_run: https://github.com/util-linux/util-linux/issues/1072
@@ -580,8 +593,8 @@ function ts_gen_diff {
fi
if [ $exit_code -ne 0 ]; then
- ts_gen_diff_from $TS_EXPECTED $TS_OUTPUT $TS_DIFF
- ts_gen_diff_from $TS_EXPECTED_ERR $TS_ERRLOG $TS_DIFF.err
+ ts_gen_diff_from "$TS_EXPECTED" "$TS_OUTPUT" "$TS_DIFF"
+ ts_gen_diff_from "$TS_EXPECTED_ERR" "$TS_ERRLOG" "$TS_DIFF.err"
fi
fi
@@ -824,12 +837,12 @@ function ts_is_mounted {
}
function ts_fstab_open {
- echo "# <!-- util-linux test entry" >> /etc/fstab
+ echo "# <!-- util-linux test entry" >> "$TS_FSTAB"
}
function ts_fstab_close {
- echo "# -->" >> /etc/fstab
- sync /etc/fstab 2>/dev/null
+ echo "# -->" >> "$TS_FSTAB"
+ sync "$TS_FSTAB" 2>/dev/null
}
function ts_fstab_addline {
@@ -838,7 +851,7 @@ function ts_fstab_addline {
local FS=${3:-"auto"}
local OPT=${4:-"defaults"}
- echo "$SPEC $MNT $FS $OPT 0 0" >> /etc/fstab
+ echo "$SPEC $MNT $FS $OPT 0 0" >> "$TS_FSTAB"
}
function ts_fstab_lock {
@@ -862,9 +875,9 @@ function ts_fstab_clean {
ba
}
s/# <!-- util-linux.*-->//;
-/^$/d" /etc/fstab
+/^$/d" "$TS_FSTAB"
- sync /etc/fstab 2>/dev/null
+ sync "$TS_FSTAB" 2>/dev/null
ts_unlock "fstab"
}
@@ -1159,8 +1172,8 @@ function ts_is_virt {
}
function ts_check_enosys_syscalls {
- ts_check_test_command "$TS_HELPER_ENOSYS"
- "$TS_HELPER_ENOSYS" ${@/#/-s } true 2> /dev/null
+ ts_check_test_command "$TS_CMD_ENOSYS"
+ "$TS_CMD_ENOSYS" ${@/#/-s } true 2> /dev/null
[ $? -ne 0 ] && ts_skip "test_enosys does not work: $*"
}
diff --git a/tests/helpers/Makemodule.am b/tests/helpers/Makemodule.am
index 2b1df3c..67a1d3d 100644
--- a/tests/helpers/Makemodule.am
+++ b/tests/helpers/Makemodule.am
@@ -33,8 +33,16 @@ test_uuid_namespace_SOURCES = tests/helpers/test_uuid_namespace.c \
if LINUX
check_PROGRAMS += test_mkfds
-test_mkfds_SOURCES = tests/helpers/test_mkfds.c
+test_mkfds_SOURCES = tests/helpers/test_mkfds.c tests/helpers/test_mkfds.h \
+ tests/helpers/test_mkfds_ppoll.c
+test_mkfds_LDADD = $(LDADD) $(MQ_LIBS)
check_PROGRAMS += test_enosys
test_enosys_SOURCES = tests/helpers/test_enosys.c
endif
+
+if HAVE_CAP_NG
+check_PROGRAMS += test_cap
+test_cap_SOURCES = tests/helpers/test_cap.c
+test_cap_LDADD = -lcap-ng
+endif
diff --git a/tests/helpers/test_cap.c b/tests/helpers/test_cap.c
new file mode 100644
index 0000000..658e86a
--- /dev/null
+++ b/tests/helpers/test_cap.c
@@ -0,0 +1,33 @@
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2023 Thomas Weißschuh <thomas@t-8ch.de>
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <cap-ng.h>
+
+int main(int argc, char **argv)
+{
+ int cap, r;
+
+ if (argc != 2)
+ return EXIT_FAILURE;
+
+ cap = capng_name_to_capability(argv[1]);
+ if (cap < 0) {
+ fprintf(stderr, "capng_name_to_capability(%s) failed\n", argv[1]);
+ return EXIT_FAILURE;
+ }
+
+ r = capng_get_caps_process();
+ if (r) {
+ fprintf(stderr, "capng_get_caps_process() failed\n");
+ return EXIT_FAILURE;
+ }
+
+ r = capng_have_capability(CAPNG_EFFECTIVE, cap);
+ return r ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/tests/helpers/test_enosys.c b/tests/helpers/test_enosys.c
index 9e93cc2..98f8d15 100644
--- a/tests/helpers/test_enosys.c
+++ b/tests/helpers/test_enosys.c
@@ -16,111 +16,39 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#include <stddef.h>
-#include <stdbool.h>
-#include <getopt.h>
-
-#include <linux/unistd.h>
-#include <linux/filter.h>
-#include <linux/seccomp.h>
-#include <linux/audit.h>
-#include <sys/prctl.h>
-
-#include "c.h"
-#include "audit-arch.h"
-#include "exitcodes.h"
-
-#define syscall_nr (offsetof(struct seccomp_data, nr))
-
-struct syscall {
- const char *const name;
- int number;
-};
-
-const struct syscall syscalls[] = {
-#ifdef __NR_move_mount
- { "move_mount", __NR_move_mount },
-#endif
-#ifdef __NR_open_tree
- { "open_tree", __NR_open_tree },
-#endif
-#ifdef __NR_fsopen
- { "fsopen", __NR_fsopen },
-#endif
-#ifdef __NR_mount_setattr
- { "mount_setattr", __NR_mount_setattr },
-#endif
-
-};
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
int main(int argc, char **argv)
{
- int c;
- size_t i;
- bool found;
- static const struct option longopts[] = {
- { "syscall", required_argument, NULL, 's' },
- { 0 }
- };
+ int r;
- bool blocked_syscalls[ARRAY_SIZE(syscalls)] = {};
-
- while ((c = getopt_long (argc, argv, "s:", longopts, NULL)) != -1) {
- switch (c) {
- case 's':
- found = 0;
- for (i = 0; i < ARRAY_SIZE(syscalls); i++) {
- if (strcmp(optarg, syscalls[i].name) == 0) {
- blocked_syscalls[i] = true;
- found = 1;
- break;
- }
- }
- if (!found)
- errx(EXIT_FAILURE, "Unknown syscall '%s'", optarg);
- break;
- default:
- errx(EXIT_FAILURE, "Unknown option");
- }
+ if (argc != 2) {
+ fprintf(stderr, "invalid options\n");
+ return EXIT_FAILURE;
}
- if (optind >= argc)
- errx(EXIT_FAILURE, "No executable specified");
-
-#define N_FILTERS (ARRAY_SIZE(syscalls) + 3)
-
- struct sock_filter filter[N_FILTERS] = {
- [0] = BPF_STMT(BPF_LD | BPF_W | BPF_ABS, syscall_nr),
-
- [N_FILTERS - 2] = BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW),
- [N_FILTERS - 1] = BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ERRNO | ENOSYS),
- };
-
- const struct sock_filter nop = BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0);
-
- for (i = 0; i < ARRAY_SIZE(syscalls); i++) {
- if (blocked_syscalls[i]) {
- const struct sock_filter block = BPF_JUMP(
- BPF_JMP | BPF_JEQ | BPF_K,
- syscalls[i].number,
- N_FILTERS - 3 - i, 0);
- filter[i + 1] = block;
- } else {
- filter[i + 1] = nop;
- }
+ if (strcmp(argv[1], "fallocate") == 0) {
+ errno = 0;
+ r = fallocate(-1, 0, 0, 0);
+ errx(EXIT_SUCCESS, "fallocate r=%d errno=%s", r, strerror(errno));
+ } else if (strcmp(argv[1], "exec") == 0) {
+ char *const cmd[] = {
+ "/bin/false",
+ NULL
+ };
+ execve(cmd[0], cmd, NULL);
+ err(EXIT_FAILURE, "exec failed");
+ } else if (strcmp(argv[1], "ioctl") == 0) {
+ r = ioctl(0, FIOCLEX);
+ errx(EXIT_SUCCESS, "ioctl r=%d errno=%s", r, strerror(errno));
}
- struct sock_fprog prog = {
- .len = ARRAY_SIZE(filter),
- .filter = filter,
- };
-
- if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0))
- err(EXIT_NOTSUPP, "prctl(PR_SET_NO_NEW_PRIVS)");
-
- if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog))
- err(EXIT_NOTSUPP, "prctl(PR_SET_SECCOMP)");
-
- if (execvp(argv[optind], argv + optind))
- err(EXIT_NOTSUPP, "Could not exec");
+ errx(EXIT_FAILURE, "invalid mode %s", argv[1]);
}
diff --git a/tests/helpers/test_mkfds.c b/tests/helpers/test_mkfds.c
index 194c175..39427ba 100644
--- a/tests/helpers/test_mkfds.c
+++ b/tests/helpers/test_mkfds.c
@@ -17,49 +17,66 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#include "c.h"
+#include "xalloc.h"
+#include "test_mkfds.h"
+#include "exitcodes.h"
+
#include <arpa/inet.h>
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
+#include <sys/file.h>
#include <getopt.h>
+#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
+#include <linux/if_tun.h>
#include <linux/netlink.h>
+#include <linux/sock_diag.h>
+# include <linux/unix_diag.h> /* for UNIX domain sockets */
#include <linux/sockios.h> /* SIOCGSKNS */
+#include <mqueue.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
+#include <poll.h>
#include <sched.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/epoll.h>
+#include <sys/eventfd.h>
#include <sys/inotify.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/prctl.h>
#include <sys/select.h>
+#include <sys/signalfd.h>
#include <sys/socket.h>
+#include <sys/shm.h>
#include <sys/syscall.h>
+#include <sys/timerfd.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/user.h>
+#include <sys/wait.h>
+#include <time.h>
#include <unistd.h>
-#include "c.h"
-#include "xalloc.h"
-
-#define EXIT_ENOSYS 17
#define EXIT_EPERM 18
#define EXIT_ENOPROTOOPT 19
#define EXIT_EPROTONOSUPPORT 20
-#define EXIT_EACCESS 21
+#define EXIT_EACCES 21
+#define EXIT_ENOENT 22
#define _U_ __attribute__((__unused__))
static int pidfd_open(pid_t pid, unsigned int flags);
+static void do_nothing(int signum _U_);
static void __attribute__((__noreturn__)) usage(FILE *out, int status)
{
@@ -67,11 +84,15 @@ static void __attribute__((__noreturn__)) usage(FILE *out, int status)
fprintf(out, " %s [options] FACTORY FD... [PARAM=VAL...]\n", program_invocation_short_name);
fputs("\nOptions:\n", out);
+ fputs(" -a, --is-available <factory> exit 0 if the factory is available\n", out);
fputs(" -l, --list list available file descriptor factories and exit\n", out);
fputs(" -I, --parameters <factory> list parameters the factory takes\n", out);
fputs(" -r, --comm <name> rename self\n", out);
fputs(" -q, --quiet don't print pid(s)\n", out);
+ fputs(" -X, --dont-monitor-stdin don't monitor stdin when pausing\n", out);
fputs(" -c, --dont-pause don't pause after making fd(s)\n", out);
+ fputs(" -w, --wait-with <multiplexer> use MULTIPLEXER for waiting events\n", out);
+ fputs(" -W, --multiplexers list multiplexers\n", out);
fputs("\n", out);
fputs("Examples:\n", out);
@@ -289,7 +310,7 @@ static struct arg decode_arg(const char *pname,
v = NULL;
}
}
- arg.v = ptype_classes [p->type].read (v, &p->defv);
+ arg.v = ptype_classes [p->type].read(v, &p->defv);
arg.free = ptype_classes [p->type].free;
return arg;
}
@@ -299,22 +320,17 @@ static void free_arg(struct arg *arg)
arg->free(arg->v);
}
-struct fdesc {
- int fd;
- void (*close)(int, void *);
- void *data;
-};
-
struct factory {
const char *name; /* [-a-zA-Z0-9_]+ */
const char *desc;
bool priv; /* the root privilege is needed to make fd(s) */
-#define MAX_N 5
+#define MAX_N 13
int N; /* the number of fds this factory makes */
int EX_N; /* fds made optionally */
+ int EX_R; /* the number of extra words printed to stdout. */
void *(*make)(const struct factory *, struct fdesc[], int, char **);
void (*free)(const struct factory *, void *);
- void (*report)(const struct factory *, void *, FILE *);
+ void (*report)(const struct factory *, int, void *, FILE *);
const struct parameter * params;
};
@@ -323,11 +339,20 @@ static void close_fdesc(int fd, void *data _U_)
close(fd);
}
+volatile ssize_t unused_result_ok;
+static void abort_with_child_death_message(int signum _U_)
+{
+ const char msg[] = "the child process exits unexpectedly";
+ unused_result_ok = write(2, msg, sizeof(msg));
+ _exit(EXIT_FAILURE);
+}
+
static void *open_ro_regular_file(const struct factory *factory, struct fdesc fdescs[],
int argc, char ** argv)
{
struct arg file = decode_arg("file", factory->params, argc, argv);
struct arg offset = decode_arg("offset", factory->params, argc, argv);
+ struct arg lease_r = decode_arg("read-lease", factory->params, argc, argv);
int fd = open(ARG_STRING(file), O_RDONLY);
if (fd < 0)
@@ -344,6 +369,16 @@ static void *open_ro_regular_file(const struct factory *factory, struct fdesc fd
}
free_arg(&offset);
+ if (ARG_BOOLEAN(lease_r)) {
+ if (fcntl(fd, F_SETLEASE, F_RDLCK) < 0) {
+ int e = errno;
+ close(fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to take out a read lease");
+ }
+ }
+ free_arg(&lease_r);
+
if (fd != fdescs[0].fd) {
if (dup2(fd, fdescs[0].fd) < 0) {
int e = errno;
@@ -363,6 +398,365 @@ static void *open_ro_regular_file(const struct factory *factory, struct fdesc fd
return NULL;
}
+static void unlink_and_close_fdesc(int fd, void *data)
+{
+ char *fname = data;
+
+ unlink(fname);
+ close(fd);
+}
+
+typedef void (*lockFn)(int fd, const char *fname, int dupfd);
+
+static void lock_fn_none(int fd _U_, const char *fname _U_, int dupfd _U_)
+{
+ /* Do nothing */
+}
+
+static void lock_fn_flock_sh(int fd, const char *fname, int dupfd)
+{
+ if (flock(fd, LOCK_SH) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to lock");
+ }
+}
+
+static void lock_fn_flock_ex(int fd, const char *fname, int dupfd)
+{
+ if (flock(fd, LOCK_EX) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to lock");
+ }
+}
+
+static void lock_fn_posix_r_(int fd, const char *fname, int dupfd)
+{
+ struct flock r = {
+ .l_type = F_RDLCK,
+ .l_whence = SEEK_SET,
+ .l_start = 0,
+ .l_len = 1,
+ };
+ if (fcntl(fd, F_SETLK, &r) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to lock");
+ }
+}
+
+static void lock_fn_posix__w(int fd, const char *fname, int dupfd)
+{
+ struct flock w = {
+ .l_type = F_WRLCK,
+ .l_whence = SEEK_SET,
+ .l_start = 0,
+ .l_len = 1,
+ };
+ if (fcntl(fd, F_SETLK, &w) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to lock");
+ }
+}
+
+static void lock_fn_posix_rw(int fd, const char *fname, int dupfd)
+{
+ struct flock r = {
+ .l_type = F_RDLCK,
+ .l_whence = SEEK_SET,
+ .l_start = 0,
+ .l_len = 1,
+ };
+ struct flock w = {
+ .l_type = F_WRLCK,
+ .l_whence = SEEK_SET,
+ .l_start = 2,
+ .l_len = 1,
+ };
+ if (fcntl(fd, F_SETLK, &r) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to lock(read)");
+ }
+ if (fcntl(fd, F_SETLK, &w) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to lock(write)");
+ }
+}
+
+#ifdef F_OFD_SETLK
+static void lock_fn_ofd_r_(int fd, const char *fname, int dupfd)
+{
+ struct flock r = {
+ .l_type = F_RDLCK,
+ .l_whence = SEEK_SET,
+ .l_start = 0,
+ .l_len = 1,
+ .l_pid = 0,
+ };
+ if (fcntl(fd, F_OFD_SETLK, &r) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to lock");
+ }
+}
+
+static void lock_fn_ofd__w(int fd, const char *fname, int dupfd)
+{
+ struct flock w = {
+ .l_type = F_WRLCK,
+ .l_whence = SEEK_SET,
+ .l_start = 0,
+ .l_len = 1,
+ .l_pid = 0,
+ };
+ if (fcntl(fd, F_OFD_SETLK, &w) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to lock");
+ }
+}
+
+static void lock_fn_ofd_rw(int fd, const char *fname, int dupfd)
+{
+ struct flock r = {
+ .l_type = F_RDLCK,
+ .l_whence = SEEK_SET,
+ .l_start = 0,
+ .l_len = 1,
+ .l_pid = 0,
+ };
+ struct flock w = {
+ .l_type = F_WRLCK,
+ .l_whence = SEEK_SET,
+ .l_start = 2,
+ .l_len = 1,
+ .l_pid = 0,
+ };
+ if (fcntl(fd, F_OFD_SETLK, &r) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to lock(read)");
+ }
+ if (fcntl(fd, F_OFD_SETLK, &w) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to lock(write)");
+ }
+}
+#endif /* F_OFD_SETLK */
+
+static void lock_fn_lease_w(int fd, const char *fname, int dupfd)
+{
+ if (fcntl(fd, F_SETLEASE, F_WRLCK) < 0) {
+ int e = errno;
+ close(fd);
+ close(dupfd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to take out a write lease");
+ }
+}
+
+
+static void *make_w_regular_file(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
+{
+ int fd;
+
+ struct arg file = decode_arg("file", factory->params, argc, argv);
+ char *fname = xstrdup(ARG_STRING(file));
+
+ struct arg delete = decode_arg("delete", factory->params, argc, argv);
+ bool bDelete = ARG_BOOLEAN(delete);
+
+ struct arg write_bytes = decode_arg("write-bytes", factory->params, argc, argv);
+ int iWrite_bytes = ARG_INTEGER(write_bytes);
+
+ struct arg readable = decode_arg("readable", factory->params, argc, argv);
+ bool bReadable = ARG_BOOLEAN(readable);
+
+ struct arg lock = decode_arg("lock", factory->params, argc, argv);
+ const char *sLock = ARG_STRING(lock);
+ lockFn lock_fn;
+
+ struct arg dupfd = decode_arg("dupfd", factory->params, argc, argv);
+ int iDupfd = ARG_INTEGER(dupfd);
+
+ void *data = NULL;
+
+ if (iWrite_bytes < 0)
+ errx(EXIT_FAILURE, "write-bytes must be a positive number or zero.");
+
+ if (strcmp(sLock, "none") == 0)
+ lock_fn = lock_fn_none;
+ else if (strcmp(sLock, "flock-sh") == 0)
+ lock_fn = lock_fn_flock_sh;
+ else if (strcmp(sLock, "flock-ex") == 0)
+ lock_fn = lock_fn_flock_ex;
+ else if (strcmp(sLock, "posix-r-") == 0) {
+ bReadable = true;
+ if (iWrite_bytes < 1)
+ iWrite_bytes = 1;
+ lock_fn = lock_fn_posix_r_;
+ } else if (strcmp(sLock, "posix--w") == 0) {
+ if (iWrite_bytes < 1)
+ iWrite_bytes = 1;
+ lock_fn = lock_fn_posix__w;
+ } else if (strcmp(sLock, "posix-rw") == 0) {
+ bReadable = true;
+ if (iWrite_bytes < 3)
+ iWrite_bytes = 3;
+ lock_fn = lock_fn_posix_rw;
+#ifdef F_OFD_SETLK
+ } else if (strcmp(sLock, "ofd-r-") == 0) {
+ bReadable = true;
+ if (iWrite_bytes < 1)
+ iWrite_bytes = 1;
+ lock_fn = lock_fn_ofd_r_;
+ } else if (strcmp(sLock, "ofd--w") == 0) {
+ if (iWrite_bytes < 1)
+ iWrite_bytes = 1;
+ lock_fn = lock_fn_ofd__w;
+ } else if (strcmp(sLock, "ofd-rw") == 0) {
+ bReadable = true;
+ if (iWrite_bytes < 3)
+ iWrite_bytes = 3;
+ lock_fn = lock_fn_ofd_rw;
+#else
+ } else if (strcmp(sLock, "ofd-r-") == 0
+ || strcmp(sLock, "ofd--w") == 0
+ || strcmp(sLock, "ofd-rw") == 0) {
+ errx(EXIT_ENOSYS, "no availability for ofd lock");
+#endif /* F_OFD_SETLK */
+ } else if (strcmp(sLock, "lease-w") == 0)
+ lock_fn = lock_fn_lease_w;
+ else
+ errx(EXIT_FAILURE, "unexpected value for lock parameter: %s", sLock);
+
+ free_arg(&dupfd);
+ free_arg(&lock);
+ free_arg(&readable);
+ free_arg(&write_bytes);
+ free_arg(&delete);
+ free_arg(&file);
+
+ fd = open(fname, O_CREAT|O_EXCL|(bReadable? O_RDWR: O_WRONLY), S_IWUSR);
+ if (fd < 0)
+ err(EXIT_FAILURE, "failed to make: %s", fname);
+
+ if (fd != fdescs[0].fd) {
+ if (dup2(fd, fdescs[0].fd) < 0) {
+ int e = errno;
+ close(fd);
+ unlink(fname);
+ free(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", fd, fdescs[0].fd);
+ }
+ close(fd);
+ fd = fdescs[0].fd;
+ }
+
+ if (bDelete) {
+ if (unlink(fname) < 0) {
+ int e = errno;
+ close(fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to unlink %s", fname);
+ }
+ free(fname);
+ fname = NULL;
+ }
+
+ for (int i = 0; i < iWrite_bytes; i++) {
+ if (write(fd, "z", 1) != 1) {
+ int e = errno;
+ close(fd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed to write");
+ }
+ }
+
+ if (iDupfd >= 0) {
+ if (dup2(fd, iDupfd) < 0) {
+ int e = errno;
+ close(fd);
+ if (fname)
+ unlink(fname);
+ errno = e;
+ err(EXIT_FAILURE, "failed in dup2");
+ }
+ data = xmalloc(sizeof(iDupfd));
+ *((int *)data) = iDupfd;
+ }
+
+ lock_fn(fd, fname, iDupfd);
+
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = bDelete? close_fdesc: unlink_and_close_fdesc,
+ .data = fname,
+ };
+
+ return data;
+}
+
+static void free_after_closing_duplicated_fd(const struct factory * factory _U_, void *data)
+{
+ if (data) {
+ int *fdp = data;
+ close(*fdp);
+ free(data);
+ }
+}
+
static void *make_pipe(const struct factory *factory, struct fdesc fdescs[],
int argc, char ** argv)
{
@@ -552,6 +946,12 @@ static void *make_socketpair(const struct factory *factory, struct fdesc fdescs[
int sd[2];
struct arg socktype = decode_arg("socktype", factory->params, argc, argv);
int isocktype;
+ struct arg halfclose = decode_arg("halfclose", factory->params, argc, argv);
+ bool bhalfclose;
+
+ bhalfclose = ARG_BOOLEAN(halfclose);
+ free_arg(&halfclose);
+
if (strcmp(ARG_STRING(socktype), "STREAM") == 0)
isocktype = SOCK_STREAM;
else if (strcmp(ARG_STRING(socktype), "DGRAM") == 0)
@@ -567,6 +967,15 @@ static void *make_socketpair(const struct factory *factory, struct fdesc fdescs[
if (socketpair(AF_UNIX, isocktype, 0, sd) < 0)
err(EXIT_FAILURE, "failed to make socket pair");
+ if (bhalfclose) {
+ if (shutdown(sd[0], SHUT_RD) < 0)
+ err(EXIT_FAILURE,
+ "failed to shutdown the read end of the 1st socket");
+ if (shutdown(sd[1], SHUT_WR) < 0)
+ err(EXIT_FAILURE,
+ "failed to shutdown the write end of the 2nd socket");
+ }
+
for (int i = 0; i < 2; i++) {
if (sd[i] != fdescs[i].fd) {
if (dup2(sd[i], fdescs[i].fd) < 0) {
@@ -735,7 +1144,7 @@ static void *make_mmapped_packet_socket(const struct factory *factory, struct fd
"failed to specify a buffer spec to a packet socket");
}
- munmap_data = xmalloc(sizeof (*munmap_data));
+ munmap_data = xmalloc(sizeof(*munmap_data));
munmap_data->len = (size_t) req.tp_block_size * req.tp_block_nr;
munmap_data->ptr = mmap(NULL, munmap_data->len, PROT_WRITE, MAP_SHARED, sd, 0);
if (munmap_data->ptr == MAP_FAILED) {
@@ -775,8 +1184,7 @@ static void *make_pidfd(const struct factory *factory, struct fdesc fdescs[],
int fd = pidfd_open(pid, 0);
if (fd < 0)
- err((errno == ENOSYS? EXIT_ENOSYS: EXIT_FAILURE),
- "failed in pidfd_open(%d)", (int)pid);
+ err_nosys(EXIT_FAILURE, "failed in pidfd_open(%d)", (int)pid);
free_arg(&target_pid);
if (fd != fdescs[0].fd) {
@@ -801,10 +1209,31 @@ static void *make_pidfd(const struct factory *factory, struct fdesc fdescs[],
static void *make_inotify_fd(const struct factory *factory _U_, struct fdesc fdescs[],
int argc _U_, char ** argv _U_)
{
+ struct arg dir = decode_arg("dir", factory->params, argc, argv);
+ const char *sdir = ARG_STRING(dir);
+ struct arg file = decode_arg("file", factory->params, argc, argv);
+ const char *sfile = ARG_STRING(file);
+
int fd = inotify_init();
if (fd < 0)
err(EXIT_FAILURE, "failed in inotify_init()");
+ if (inotify_add_watch(fd, sdir, IN_DELETE) < 0) {
+ int e = errno;
+ close(fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed in inotify_add_watch(\"%s\")", sdir);
+ }
+ free_arg(&dir);
+
+ if (inotify_add_watch(fd, sfile, IN_DELETE) < 0) {
+ int e = errno;
+ close(fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed in inotify_add_watch(\"%s\")", sfile);
+ }
+ free_arg(&file);
+
if (fd != fdescs[0].fd) {
if (dup2(fd, fdescs[0].fd) < 0) {
int e = errno;
@@ -1670,7 +2099,7 @@ static void *make_ping_common(const struct factory *factory, struct fdesc fdescs
sd = socket(family, SOCK_DGRAM, protocol);
if (sd < 0)
- err((errno == EACCES? EXIT_EACCESS: EXIT_FAILURE),
+ err((errno == EACCES? EXIT_EACCES: EXIT_FAILURE),
"failed to make an icmp socket");
if (sd != fdescs[0].fd) {
@@ -1690,7 +2119,7 @@ static void *make_ping_common(const struct factory *factory, struct fdesc fdescs
int e = errno;
close(sd);
errno = e;
- err((errno == EACCES? EXIT_EACCESS: EXIT_FAILURE),
+ err((errno == EACCES? EXIT_EACCES: EXIT_FAILURE),
"failed in bind(2)");
}
}
@@ -1809,6 +2238,7 @@ static void *make_ping6(const struct factory *factory, struct fdesc fdescs[],
(struct sockaddr *)&in6);
}
+#ifdef SIOCGSKNS
static void *make_netns(const struct factory *factory _U_, struct fdesc fdescs[],
int argc _U_, char ** argv _U_)
{
@@ -1818,8 +2248,7 @@ static void *make_netns(const struct factory *factory _U_, struct fdesc fdescs[]
int ns = ioctl(sd, SIOCGSKNS);
if (ns < 0)
- err((errno == ENOSYS? EXIT_ENOSYS: EXIT_FAILURE),
- "failed in ioctl(SIOCGSKNS)");
+ err_nosys(EXIT_FAILURE, "failed in ioctl(SIOCGSKNS)");
close(sd);
if (ns != fdescs[0].fd) {
@@ -1840,6 +2269,7 @@ static void *make_netns(const struct factory *factory _U_, struct fdesc fdescs[]
return NULL;
}
+#endif /* SIOCGSKNS */
static void *make_netlink(const struct factory *factory, struct fdesc fdescs[],
int argc, char ** argv)
@@ -1887,6 +2317,952 @@ static void *make_netlink(const struct factory *factory, struct fdesc fdescs[],
return NULL;
}
+static void *make_eventfd(const struct factory *factory _U_, struct fdesc fdescs[],
+ int argc _U_, char ** argv _U_)
+{
+ int fd;
+ pid_t *pid = xcalloc(1, sizeof(*pid));
+
+ if (fdescs[0].fd == fdescs[1].fd)
+ errx(EXIT_FAILURE, "specify three different numbers as file descriptors");
+
+ fd = eventfd(0, 0);
+ if (fd < 0)
+ err(EXIT_FAILURE, "failed in eventfd(2)");
+
+ if (fd != fdescs[0].fd) {
+ if (dup2(fd, fdescs[0].fd) < 0) {
+ int e = errno;
+ close(fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", fd, fdescs[0].fd);
+ }
+ close(fd);
+ }
+
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+
+ if (dup2(fdescs[0].fd, fdescs[1].fd) < 0) {
+ int e = errno;
+ close(fdescs[0].fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", fdescs[0].fd, fdescs[1].fd);
+ }
+
+ signal(SIGCHLD, abort_with_child_death_message);
+ *pid = fork();
+ if (*pid < -1) {
+ int e = errno;
+ close(fdescs[0].fd);
+ close(fdescs[1].fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed in fork()");
+ } else if (*pid == 0) {
+ uint64_t v = 1;
+
+ free(pid);
+ close(fdescs[0].fd);
+
+ signal(SIGCONT, do_nothing);
+ /* Notify the parent that I'm ready. */
+ if (write(fdescs[1].fd, &v, sizeof(v)) != sizeof(v)) {
+ close(fdescs[1].fd);
+ err(EXIT_FAILURE,
+ "failed in write() to notify the readiness to the prent");
+ }
+ /* Wait till the parent lets me go. */
+ pause();
+
+ close(fdescs[1].fd);
+ exit(0);
+ } else {
+ uint64_t v;
+
+ /* The child owns fdescs[1]. */
+ close(fdescs[1].fd);
+ fdescs[1].fd = -1;
+
+ /* Wait till the child is ready. */
+ if (read(fdescs[0].fd, &v, sizeof(uint64_t)) != sizeof(v)) {
+ free(pid);
+ close(fdescs[0].fd);
+ err(EXIT_FAILURE,
+ "failed in read() the readiness notification from the child");
+ }
+ signal(SIGCHLD, SIG_DFL);
+ }
+
+ return pid;
+}
+
+static void report_eventfd(const struct factory *factory _U_,
+ int nth, void *data, FILE *fp)
+{
+ if (nth == 0) {
+ pid_t *child = data;
+ fprintf(fp, "%d", *child);
+ }
+}
+
+static void free_eventfd(const struct factory * factory _U_, void *data)
+{
+ pid_t child = *(pid_t *)data;
+ int wstatus;
+
+ free(data);
+
+ kill(child, SIGCONT);
+ if (waitpid(child, &wstatus, 0) < 0)
+ err(EXIT_FAILURE, "failed in waitpid()");
+
+ if (WIFEXITED(wstatus)) {
+ int s = WEXITSTATUS(wstatus);
+ if (s != 0)
+ err(EXIT_FAILURE, "the child process got an error: %d", s);
+ } else if (WIFSIGNALED(wstatus)) {
+ int s = WTERMSIG(wstatus);
+ if (WTERMSIG(wstatus) != 0)
+ err(EXIT_FAILURE, "the child process got a signal: %d", s);
+ }
+}
+
+struct mqueue_data {
+ pid_t pid;
+ const char *path;
+ bool created;
+};
+
+static void mqueue_data_free(struct mqueue_data *data)
+{
+ if (data->created)
+ mq_unlink(data->path);
+ free((void *)data->path);
+ free(data);
+}
+
+static void report_mqueue(const struct factory *factory _U_,
+ int nth, void *data, FILE *fp)
+{
+ if (nth == 0) {
+ fprintf(fp, "%d", ((struct mqueue_data *)data)->pid);
+ }
+}
+
+static void close_mqueue(int fd, void *data _U_)
+{
+ mq_close(fd);
+}
+
+static void free_mqueue(const struct factory * factory _U_, void *data)
+{
+ struct mqueue_data *mqueue_data = data;
+ pid_t child = mqueue_data->pid;
+ int wstatus;
+
+ mqueue_data_free(mqueue_data);
+
+ kill(child, SIGCONT);
+ if (waitpid(child, &wstatus, 0) < 0)
+ err(EXIT_FAILURE, "failed in waitpid()");
+
+ if (WIFEXITED(wstatus)) {
+ int s = WEXITSTATUS(wstatus);
+ if (s != 0)
+ err(EXIT_FAILURE, "the child process got an error: %d", s);
+ } else if (WIFSIGNALED(wstatus)) {
+ int s = WTERMSIG(wstatus);
+ if (WTERMSIG(wstatus) != 0)
+ err(EXIT_FAILURE, "the child process got a signal: %d", s);
+ }
+}
+
+static void *make_mqueue(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
+{
+ struct mqueue_data *mqueue_data;
+ struct arg path = decode_arg("path", factory->params, argc, argv);
+ const char *spath = ARG_STRING(path);
+
+ struct mq_attr attr = {
+ .mq_maxmsg = 1,
+ .mq_msgsize = 1,
+ };
+
+ int fd;
+
+ if (spath[0] != '/')
+ errx(EXIT_FAILURE, "the path for mqueue must start with '/': %s", spath);
+
+ if (spath[0] == '\0')
+ err(EXIT_FAILURE, "the path should not be empty");
+
+ if (fdescs[0].fd == fdescs[1].fd)
+ errx(EXIT_FAILURE, "specify three different numbers as file descriptors");
+
+ mqueue_data = xmalloc(sizeof(*mqueue_data));
+ mqueue_data->pid = 0;
+ mqueue_data->path = xstrdup(spath);
+ mqueue_data->created = false;
+
+ free_arg(&path);
+
+ fd = mq_open(mqueue_data->path, O_CREAT|O_EXCL | O_RDONLY, S_IRUSR | S_IWUSR, &attr);
+ if (fd < 0) {
+ mqueue_data_free(mqueue_data);
+ err(EXIT_FAILURE, "failed in mq_open(3) for reading");
+ }
+
+ mqueue_data->created = true;
+ if (fd != fdescs[0].fd) {
+ if (dup2(fd, fdescs[0].fd) < 0) {
+ int e = errno;
+ mq_close(fd);
+ mqueue_data_free(mqueue_data);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", fd, fdescs[0].fd);
+ }
+ mq_close(fd);
+ }
+
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = close_mqueue,
+ .data = NULL
+ };
+
+ fd = mq_open(mqueue_data->path, O_WRONLY, S_IRUSR | S_IWUSR, NULL);
+ if (fd < 0) {
+ int e = errno;
+ mq_close(fdescs[0].fd);
+ mqueue_data_free(mqueue_data);
+ errno = e;
+ err(EXIT_FAILURE, "failed in mq_open(3) for writing");
+ }
+
+ if (fd != fdescs[1].fd) {
+ if (dup2(fd, fdescs[1].fd) < 0) {
+ int e = errno;
+ mq_close(fd);
+ mq_close(fdescs[0].fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", fd, fdescs[1].fd);
+ }
+ mq_close(fd);
+ }
+ fdescs[1] = (struct fdesc){
+ .fd = fdescs[1].fd,
+ .close = close_mqueue,
+ .data = NULL
+ };
+
+ signal(SIGCHLD, abort_with_child_death_message);
+ mqueue_data->pid = fork();
+ if (mqueue_data->pid < -1) {
+ int e = errno;
+ mq_close(fdescs[0].fd);
+ mq_close(fdescs[1].fd);
+ mqueue_data_free(mqueue_data);
+ errno = e;
+ err(EXIT_FAILURE, "failed in fork()");
+ } else if (mqueue_data->pid == 0) {
+ mqueue_data->created = false;
+ mqueue_data_free(mqueue_data);
+ mq_close(fdescs[0].fd);
+
+ signal(SIGCONT, do_nothing);
+ /* Notify the parent that I'm ready. */
+ if (mq_send(fdescs[1].fd, "", 0, 0) < 0)
+ err(EXIT_FAILURE,
+ "failed in mq_send() to notify the readiness to the prent");
+ /* Wait till the parent lets me go. */
+ pause();
+
+ mq_close(fdescs[1].fd);
+ exit(0);
+ } else {
+ char c;
+
+ /* The child owns fdescs[1]. */
+ mq_close(fdescs[1].fd);
+ fdescs[1].fd = -1;
+
+ /* Wait till the child is ready. */
+ if (mq_receive(fdescs[0].fd, &c, 1, NULL) < 0) {
+ mq_close(fdescs[0].fd);
+ mqueue_data_free(mqueue_data);
+ err(EXIT_FAILURE,
+ "failed in mq_receive() the readiness notification from the child");
+ }
+ signal(SIGCHLD, SIG_DFL);
+ }
+
+ return mqueue_data;
+}
+struct sysvshm_data {
+ void *addr;
+ int id;
+};
+
+static void *make_sysvshm(const struct factory *factory _U_, struct fdesc fdescs[] _U_,
+ int argc _U_, char ** argv _U_)
+{
+ size_t pagesize = getpagesize();
+ struct sysvshm_data *sysvshm_data;
+ int id = shmget(IPC_PRIVATE, pagesize, IPC_CREAT | 0600);
+ void *start;
+
+ if (id == -1)
+ err(EXIT_FAILURE, "failed to do shmget(.., %zu, ...)",
+ pagesize);
+
+ start = shmat(id, NULL, SHM_RDONLY);
+ if (start == (void *) -1) {
+ int e = errno;
+ shmctl(id, IPC_RMID, NULL);
+ errno = e;
+ err(EXIT_FAILURE, "failed to do shmat(%d,...)", id);
+ }
+
+ sysvshm_data = xmalloc(sizeof(*sysvshm_data));
+ sysvshm_data->addr = start;
+ sysvshm_data->id = id;
+ return sysvshm_data;
+}
+
+static void free_sysvshm(const struct factory *factory _U_, void *data)
+{
+ struct sysvshm_data *sysvshm_data = data;
+
+ shmdt(sysvshm_data->addr);
+ shmctl(sysvshm_data->id, IPC_RMID, NULL);
+}
+
+static void *make_eventpoll(const struct factory *factory _U_, struct fdesc fdescs[],
+ int argc _U_, char ** argv _U_)
+{
+ int efd;
+ struct spec {
+ const char *file;
+ int flag;
+ uint32_t events;
+ } specs [] = {
+ {
+ .file = "DUMMY, DONT'USE THIS"
+ }, {
+ .file = "/dev/random",
+ .flag = O_RDONLY,
+ .events = EPOLLIN,
+ }, {
+ .file = "/dev/random",
+ .flag = O_WRONLY,
+ .events = EPOLLOUT,
+ },
+ };
+
+ efd = epoll_create(1);
+ if (efd < 0)
+ err(EXIT_FAILURE, "failed in epoll_create(2)");
+ if (efd != fdescs[0].fd) {
+ if (dup2(efd, fdescs[0].fd) < 0) {
+ int e = errno;
+ close(efd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", efd, fdescs[0].fd);
+ }
+ close(efd);
+ efd = fdescs[0].fd;
+ }
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+
+ for (size_t i = 1; i < ARRAY_SIZE(specs); i++) {
+ int fd = open(specs[i].file, specs[i].flag);
+ if (fd < 0) {
+ int e = errno;
+ close(efd);
+ for (size_t j = i - 1; j > 0; j--)
+ close(fdescs[j].fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed in open(\"%s\",...)",
+ specs[i].file);
+ }
+ if (fd != fdescs[i].fd) {
+ if (dup2(fd, fdescs[i].fd) < 0) {
+ int e = errno;
+ close(efd);
+ for (size_t j = i - 1; j > 0; j--)
+ close(fdescs[j].fd);
+ close(fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d",
+ fd, fdescs[i].fd);
+ }
+ close(fd);
+ }
+ fdescs[i] = (struct fdesc) {
+ .fd = fdescs[i].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+ if (epoll_ctl(efd, EPOLL_CTL_ADD, fdescs[i].fd,
+ &(struct epoll_event) {
+ .events = specs[i].events,
+ .data = {.ptr = NULL,}
+ }) < 0) {
+ int e = errno;
+ close(efd);
+ for (size_t j = i; j > 0; j--)
+ close(fdescs[j].fd);
+ errno = e;
+ err(EXIT_FAILURE,
+ "failed to add fd %d to the eventpoll fd with epoll_ctl",
+ fdescs[i].fd);
+ }
+ }
+
+ return NULL;
+}
+
+static bool decode_clockid(const char *sclockid, clockid_t *clockid)
+{
+ if (sclockid == NULL)
+ return false;
+ if (sclockid[0] == '\0')
+ return false;
+
+ if (strcmp(sclockid, "realtime") == 0)
+ *clockid = CLOCK_REALTIME;
+ else if (strcmp(sclockid, "monotonic") == 0)
+ *clockid = CLOCK_MONOTONIC;
+ else if (strcmp(sclockid, "boottime") == 0)
+ *clockid = CLOCK_BOOTTIME;
+ else if (strcmp(sclockid, "realtime-alarm") == 0)
+ *clockid = CLOCK_REALTIME_ALARM;
+ else if (strcmp(sclockid, "boottime-alarm") == 0)
+ *clockid = CLOCK_BOOTTIME_ALARM;
+ else
+ return false;
+ return true;
+}
+
+static void *make_timerfd(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
+{
+ int tfd;
+ struct timespec now;
+ struct itimerspec tspec;
+
+ struct arg abstime = decode_arg("abstime", factory->params, argc, argv);
+ bool babstime = ARG_BOOLEAN(abstime);
+
+ struct arg remaining = decode_arg("remaining", factory->params, argc, argv);
+ unsigned int uremaining = ARG_UINTEGER(remaining);
+
+ struct arg interval = decode_arg("interval", factory->params, argc, argv);
+ unsigned int uinterval = ARG_UINTEGER(interval);
+
+ struct arg interval_frac = decode_arg("interval-nanofrac", factory->params, argc, argv);
+ unsigned int uinterval_frac = ARG_UINTEGER(interval_frac);
+
+ struct arg clockid_ = decode_arg("clockid", factory->params, argc, argv);
+ const char *sclockid = ARG_STRING(clockid_);
+ clockid_t clockid;
+
+ if (decode_clockid (sclockid, &clockid) == false)
+ err(EXIT_FAILURE, "unknown clockid: %s", sclockid);
+
+ free_arg(&clockid_);
+ free_arg(&interval_frac);
+ free_arg(&interval);
+ free_arg(&remaining);
+ free_arg(&abstime);
+
+ if (babstime) {
+ int r = clock_gettime(clockid, &now);
+ if (r == -1)
+ err(EXIT_FAILURE, "failed in clock_gettime(2)");
+ }
+
+ tfd = timerfd_create(clockid, 0);
+ if (tfd < 0)
+ err(EXIT_FAILURE, "failed in timerfd_create(2)");
+
+ tspec.it_value.tv_sec = (babstime? now.tv_sec: 0) + uremaining;
+ tspec.it_value.tv_nsec = (babstime? now.tv_nsec: 0);
+
+ tspec.it_interval.tv_sec = uinterval;
+ tspec.it_interval.tv_nsec = uinterval_frac;
+
+ if (timerfd_settime(tfd, babstime? TFD_TIMER_ABSTIME: 0, &tspec, NULL) < 0) {
+ int e = errno;
+ close(tfd);
+ errno = e;
+ err(EXIT_FAILURE, "failed in timerfd_settime(2)");
+ }
+
+ if (tfd != fdescs[0].fd) {
+ if (dup2(tfd, fdescs[0].fd) < 0) {
+ int e = errno;
+ close(tfd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", tfd, fdescs[0].fd);
+ }
+ close(tfd);
+ }
+
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+
+ return NULL;
+}
+
+static void *make_signalfd(const struct factory *factory _U_, struct fdesc fdescs[],
+ int argc _U_, char ** argv _U_)
+{
+ sigset_t mask;
+ int numsig = 42;
+
+ if (sigemptyset(&mask) < 0)
+ err(EXIT_FAILURE, "failed in sigemptyset()");
+ if (sigaddset(&mask, SIGFPE) < 0)
+ err(EXIT_FAILURE, "failed in sigaddset(FPE)");
+ if (sigaddset(&mask, SIGUSR1) < 0)
+ err(EXIT_FAILURE, "failed in sigaddset(USR1)");
+ if (sigaddset(&mask, numsig) < 0)
+ err(EXIT_FAILURE, "failed in sigaddset(%d)", numsig);
+
+ int sfd= signalfd(-1, &mask, 0);
+ if (sfd < 0)
+ err(EXIT_FAILURE, "failed in signalfd(2)");
+
+ if (sfd != fdescs[0].fd) {
+ if (dup2(sfd, fdescs[0].fd) < 0) {
+ int e = errno;
+ close(sfd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", sfd, fdescs[0].fd);
+ }
+ close(sfd);
+ }
+
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+
+ return NULL;
+}
+
+
+/* ref. linux/Documentation/networking/tuntap.rst */
+static void *make_cdev_tun(const struct factory *factory _U_, struct fdesc fdescs[],
+ int argc _U_, char ** argv _U_)
+{
+ int tfd = open("/dev/net/tun", O_RDWR);
+ struct ifreq ifr;
+
+ if (tfd < 0)
+ err(EXIT_FAILURE, "failed in opening /dev/net/tun");
+
+ memset(&ifr, 0, sizeof(ifr));
+
+ ifr.ifr_flags = IFF_TUN;
+ strcpy(ifr.ifr_name, "mkfds%d");
+
+ if (ioctl(tfd, TUNSETIFF, (void *) &ifr) < 0) {
+ int e = errno;
+ close(tfd);
+ errno = e;
+ err(EXIT_FAILURE, "failed in setting \"lo\" to the tun device");
+ }
+
+ if (tfd != fdescs[0].fd) {
+ if (dup2(tfd, fdescs[0].fd) < 0) {
+ int e = errno;
+ close(tfd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", tfd, fdescs[0].fd);
+ }
+ close(tfd);
+ }
+
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+
+ return xstrdup(ifr.ifr_name);
+}
+
+static void report_cdev_tun(const struct factory *factory _U_,
+ int nth, void *data, FILE *fp)
+{
+ if (nth == 0) {
+ char *devname = data;
+ fprintf(fp, "%s", devname);
+ }
+}
+
+static void free_cdev_tun(const struct factory * factory _U_, void *data)
+{
+ free(data);
+}
+
+static void *make_bpf_prog(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
+{
+ struct arg prog_type_id = decode_arg("prog-type-id", factory->params, argc, argv);
+ int iprog_type_id = ARG_INTEGER(prog_type_id);
+
+ struct arg name = decode_arg("name", factory->params, argc, argv);
+ const char *sname = ARG_STRING(name);
+
+ int bfd;
+ union bpf_attr attr;
+ /* Just doing exit with 0. */
+ struct bpf_insn insns[] = {
+ [0] = {
+ .code = BPF_ALU64 | BPF_MOV | BPF_K,
+ .dst_reg = BPF_REG_0, .src_reg = 0, .off = 0, .imm = 0
+ },
+ [1] = {
+ .code = BPF_JMP | BPF_EXIT,
+ .dst_reg = 0, .src_reg = 0, .off = 0, .imm = 0
+ },
+ };
+
+ memset(&attr, 0, sizeof(attr));
+ attr.prog_type = iprog_type_id;
+ attr.insns = (uint64_t)(unsigned long)insns;
+ attr.insn_cnt = ARRAY_SIZE(insns);
+ attr.license = (int64_t)(unsigned long)"GPL";
+ strncpy(attr.prog_name, sname, sizeof(attr.prog_name) - 1);
+
+ free_arg(&name);
+ free_arg(&prog_type_id);
+
+ bfd = syscall(SYS_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
+ if (bfd < 0)
+ err_nosys(EXIT_FAILURE, "failed in bpf(BPF_PROG_LOAD)");
+
+ if (bfd != fdescs[0].fd) {
+ if (dup2(bfd, fdescs[0].fd) < 0) {
+ int e = errno;
+ close(bfd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", bfd, fdescs[0].fd);
+ }
+ close(bfd);
+ }
+
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+
+ return NULL;
+}
+
+static void *make_some_pipes(const struct factory *factory _U_, struct fdesc fdescs[],
+ int argc _U_, char ** argv _U_)
+{
+ /* Reserver fds before making pipes */
+ for (int i = 0; i < factory->N; i++) {
+ close(fdescs[i].fd);
+ if (dup2(0, fdescs[0].fd) < 0)
+ err(EXIT_FAILURE, "failed to reserve fd %d with dup2", fdescs[0].fd);
+ }
+
+ for (int i = 0; i < (factory->N) / 2; i++) {
+ int pd[2];
+ unsigned int mode;
+ int r = 0, w = 1;
+
+ mode = 1 << (i % 3);
+ if (mode == MX_WRITE) {
+ r = 1;
+ w = 0;
+ }
+
+ if (pipe(pd) < 0)
+ err(EXIT_FAILURE, "failed to make pipe");
+
+ if (dup2(pd[0], fdescs[2 * i + r].fd) < 0)
+ err(EXIT_FAILURE, "failed to dup %d -> %d", pd[0], fdescs[2 * i + r].fd);
+ close(pd[0]);
+ fdescs[2 * 1 + r].close = close_fdesc;
+
+ if (dup2(pd[1], fdescs[2 * i + w].fd) < 0)
+ err(EXIT_FAILURE, "failed to dup %d -> %d", pd[1], fdescs[2 * i + 2].fd);
+ close(pd[1]);
+ fdescs[2 * 1 + w].close = close_fdesc;
+
+ fdescs[2 * i].mx_modes |= mode;
+
+ /* Make the pipe for writing full. */
+ if (fdescs[2 * i].mx_modes & MX_WRITE) {
+ int n = fcntl(fdescs[2 * i].fd, F_GETPIPE_SZ);
+ char *buf;
+
+ if (n < 0)
+ err(EXIT_FAILURE, "failed to get PIPE BUFFER SIZE from %d", fdescs[2 * i].fd);
+
+ buf = xmalloc(n);
+ if (write(fdescs[2 * i].fd, buf, n) != n)
+ err(EXIT_FAILURE, "failed to fill the pipe buffer specified with %d",
+ fdescs[2 * i].fd);
+ free(buf);
+ }
+
+ }
+
+ return NULL;
+}
+
+static void *make_bpf_map(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
+{
+ struct arg map_type_id = decode_arg("map-type-id", factory->params, argc, argv);
+ int imap_type_id = ARG_INTEGER(map_type_id);
+
+ struct arg name = decode_arg("name", factory->params, argc, argv);
+ const char *sname = ARG_STRING(name);
+
+ int bfd;
+ union bpf_attr attr = {
+ .map_type = imap_type_id,
+ .key_size = 4,
+ .value_size = 4,
+ .max_entries = 10,
+ };
+
+ strncpy(attr.map_name, sname, sizeof(attr.map_name) - 1);
+
+ free_arg(&name);
+ free_arg(&map_type_id);
+
+ bfd = syscall(SYS_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
+ if (bfd < 0)
+ err_nosys(EXIT_FAILURE, "failed in bpf(BPF_MAP_CREATE)");
+
+ if (bfd != fdescs[0].fd) {
+ if (dup2(bfd, fdescs[0].fd) < 0) {
+ int e = errno;
+ close(bfd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", bfd, fdescs[0].fd);
+ }
+ close(bfd);
+ }
+
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+
+ return NULL;
+}
+
+static void *make_pty(const struct factory *factory _U_, struct fdesc fdescs[],
+ int argc _U_, char ** argv _U_)
+{
+ int index, *indexp;
+ char *pts;
+ int pts_fd;
+ int ptmx_fd = posix_openpt(O_RDWR);
+ if (ptmx_fd < 0)
+ err(EXIT_FAILURE, "failed in opening /dev/ptmx");
+
+ if (unlockpt(ptmx_fd) < 0) {
+ int e = errno;
+ close(ptmx_fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed in unlockpt()");
+ }
+
+ if (ioctl(ptmx_fd, TIOCGPTN, &index) < 0) {
+ int e = errno;
+ close(ptmx_fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed in ioctl(TIOCGPTN)");
+ }
+
+ pts = ptsname(ptmx_fd);
+ if (pts == NULL) {
+ int e = errno;
+ close(ptmx_fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed in ptsname()");
+ }
+
+ if (ptmx_fd != fdescs[0].fd) {
+ if (dup2(ptmx_fd, fdescs[0].fd) < 0) {
+ int e = errno;
+ close(ptmx_fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", ptmx_fd, fdescs[0].fd);
+ }
+ close(ptmx_fd);
+ ptmx_fd = fdescs[0].fd;
+ }
+
+ pts_fd = open(pts, O_RDONLY);
+ if (pts_fd < 0) {
+ int e = errno;
+ close(ptmx_fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed in opening %s", pts);
+ }
+
+ if (pts_fd != fdescs[1].fd) {
+ if (dup2(pts_fd, fdescs[1].fd) < 0) {
+ int e = errno;
+ close(pts_fd);
+ close(ptmx_fd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", pts_fd, fdescs[1].fd);
+ }
+ close(pts_fd);
+ pts_fd = fdescs[1].fd;
+ }
+
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+ fdescs[1] = (struct fdesc){
+ .fd = fdescs[1].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+
+ indexp = xmalloc(sizeof(index));
+ *indexp = index;
+ return indexp;
+}
+
+static void report_pty(const struct factory *factory _U_,
+ int nth, void *data, FILE *fp)
+{
+ if (nth == 0) {
+ int *index = data;
+ fprintf(fp, "%d", *index);
+ }
+}
+
+static void free_pty(const struct factory * factory _U_, void *data)
+{
+ free(data);
+}
+
+static int send_diag_request(int diagsd, void *req, size_t req_size)
+{
+ struct sockaddr_nl nladdr = {
+ .nl_family = AF_NETLINK,
+ };
+
+ struct nlmsghdr nlh = {
+ .nlmsg_len = sizeof(nlh) + req_size,
+ .nlmsg_type = SOCK_DIAG_BY_FAMILY,
+ .nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP,
+ };
+
+ struct iovec iovecs[] = {
+ { &nlh, sizeof(nlh) },
+ { req, req_size },
+ };
+
+ const struct msghdr mhd = {
+ .msg_namelen = sizeof(nladdr),
+ .msg_name = &nladdr,
+ .msg_iovlen = ARRAY_SIZE(iovecs),
+ .msg_iov = iovecs,
+ };
+
+ if (sendmsg(diagsd, &mhd, 0) < 0)
+ return errno;
+
+ return 0;
+}
+
+static void *make_sockdiag(const struct factory *factory, struct fdesc fdescs[],
+ int argc, char ** argv)
+{
+ struct arg family = decode_arg("family", factory->params, argc, argv);
+ const char *sfamily = ARG_STRING(family);
+ int ifamily;
+
+ if (strcmp(sfamily, "unix") == 0)
+ ifamily = AF_UNIX;
+ else
+ errx(EXIT_FAILURE, "unknown/unsupported family: %s", sfamily);
+ free_arg(&family);
+
+ int diagsd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_SOCK_DIAG);
+ if (diagsd < 0)
+ err(errno == EPROTONOSUPPORT? EXIT_EPROTONOSUPPORT: EXIT_FAILURE,
+ "failed in sendmsg()");
+
+ void *req = NULL;
+ size_t reqlen = 0;
+
+ struct unix_diag_req udr;
+ if (ifamily == AF_UNIX) {
+ udr = (struct unix_diag_req) {
+ .sdiag_family = AF_UNIX,
+ .udiag_states = -1, /* set the all bits. */
+ .udiag_show = UDIAG_SHOW_NAME | UDIAG_SHOW_PEER | UNIX_DIAG_SHUTDOWN,
+ };
+ req = &udr;
+ reqlen = sizeof(udr);
+ }
+
+ int e = send_diag_request(diagsd, req, reqlen);
+ if (e) {
+ close (diagsd);
+ errno = e;
+ if (errno == EACCES)
+ err(EXIT_EACCES, "failed in sendmsg()");
+ if (errno == ENOENT)
+ err(EXIT_ENOENT, "failed in sendmsg()");
+ err(EXIT_FAILURE, "failed in sendmsg()");
+ }
+
+
+ if (diagsd != fdescs[0].fd) {
+ if (dup2(diagsd, fdescs[0].fd) < 0) {
+ int e = errno;
+ close(diagsd);
+ errno = e;
+ err(EXIT_FAILURE, "failed to dup %d -> %d", diagsd, fdescs[0].fd);
+ }
+ close(diagsd);
+ }
+
+ fdescs[0] = (struct fdesc){
+ .fd = fdescs[0].fd,
+ .close = close_fdesc,
+ .data = NULL
+ };
+
+ return NULL;
+}
+
#define PARAM_END { .name = NULL, }
static const struct factory factories[] = {
{
@@ -1909,6 +3285,60 @@ static const struct factory factories[] = {
.desc = "seek bytes after open with SEEK_CUR",
.defv.integer = 0,
},
+ {
+ .name = "read-lease",
+ .type = PTYPE_BOOLEAN,
+ .desc = "taking out read lease for the file",
+ .defv.boolean = false,
+ },
+ PARAM_END
+ },
+ },
+ {
+ .name = "make-regular-file",
+ .desc = "regular file for writing",
+ .priv = false,
+ .N = 1,
+ .EX_N = 0,
+ .make = make_w_regular_file,
+ .free = free_after_closing_duplicated_fd,
+ .params = (struct parameter []) {
+ {
+ .name = "file",
+ .type = PTYPE_STRING,
+ .desc = "file to be made",
+ .defv.string = "./test_mkfds_make_regular_file",
+ },
+ {
+ .name = "delete",
+ .type = PTYPE_BOOLEAN,
+ .desc = "delete the file just after making it",
+ .defv.boolean = false,
+ },
+ {
+ .name = "write-bytes",
+ .type = PTYPE_INTEGER,
+ .desc = "write something (> 0)",
+ .defv.integer = 0,
+ },
+ {
+ .name = "readable",
+ .type = PTYPE_BOOLEAN,
+ .desc = "open the new file readable way",
+ .defv.string = false,
+ },
+ {
+ .name = "lock",
+ .type = PTYPE_STRING,
+ .desc = "the way for file locking: [none]|flock-sh|flock-ex|posix-r-|posix--w|posix-rw|ofd-r-|ofd--w|ofd-rw|lease-w",
+ .defv.string = "none",
+ },
+ {
+ .name = "dupfd",
+ .type = PTYPE_INTEGER,
+ .desc = "the number for the fd duplicated from the original fd",
+ .defv.integer = -1,
+ },
PARAM_END
},
},
@@ -1995,6 +3425,12 @@ static const struct factory factories[] = {
.desc = "STREAM, DGRAM, or SEQPACKET",
.defv.string = "STREAM",
},
+ {
+ .name = "halfclose",
+ .type = PTYPE_BOOLEAN,
+ .desc = "Shutdown the read end of the 1st socket, the write end of the 2nd socket",
+ .defv.boolean = false,
+ },
PARAM_END
},
},
@@ -2080,6 +3516,18 @@ static const struct factory factories[] = {
.EX_N = 0,
.make = make_inotify_fd,
.params = (struct parameter []) {
+ {
+ .name = "dir",
+ .type = PTYPE_STRING,
+ .desc = "the directory that the inotify monitors",
+ .defv.string = "/",
+ },
+ {
+ .name = "file",
+ .type = PTYPE_STRING,
+ .desc = "the file that the inotify monitors",
+ .defv.string = "/etc/fstab",
+ },
PARAM_END
},
},
@@ -2416,6 +3864,7 @@ static const struct factory factories[] = {
PARAM_END
}
},
+#ifdef SIOCGSKNS
{
.name = "netns",
.desc = "open a file specifying a netns",
@@ -2427,6 +3876,7 @@ static const struct factory factories[] = {
PARAM_END
}
},
+#endif
{
.name = "netlink",
.desc = "AF_NETLINK sockets",
@@ -2450,6 +3900,219 @@ static const struct factory factories[] = {
PARAM_END
}
},
+ {
+ .name = "eventfd",
+ .desc = "make an eventfd connecting two processes",
+ .priv = false,
+ .N = 2,
+ .EX_N = 0,
+ .EX_R = 1,
+ .make = make_eventfd,
+ .report = report_eventfd,
+ .free = free_eventfd,
+ .params = (struct parameter []) {
+ PARAM_END
+ }
+ },
+ {
+ .name = "mqueue",
+ .desc = "make a mqueue connecting two processes",
+ .priv = false,
+ .N = 2,
+ .EX_N = 0,
+ .EX_R = 1,
+ .make = make_mqueue,
+ .report = report_mqueue,
+ .free = free_mqueue,
+ .params = (struct parameter []) {
+ {
+ .name = "path",
+ .type = PTYPE_STRING,
+ .desc = "path for mqueue",
+ .defv.string = "/test_mkfds-mqueue",
+ },
+ PARAM_END
+ }
+ },
+ {
+ .name = "sysvshm",
+ .desc = "shared memory mapped with SYSVIPC shmem syscalls",
+ .priv = false,
+ .N = 0,
+ .EX_N = 0,
+ .make = make_sysvshm,
+ .free = free_sysvshm,
+ .params = (struct parameter []) {
+ PARAM_END
+ },
+ },
+ {
+ .name = "eventpoll",
+ .desc = "make eventpoll (epoll) file",
+ .priv = false,
+ .N = 3,
+ .EX_N = 0,
+ .make = make_eventpoll,
+ .params = (struct parameter []) {
+ PARAM_END
+ }
+ },
+ {
+ .name = "timerfd",
+ .desc = "make timerfd",
+ .priv = false,
+ .N = 1,
+ .EX_N = 0,
+ .make = make_timerfd,
+ .params = (struct parameter []) {
+ {
+ .name = "clockid",
+ .type = PTYPE_STRING,
+ .desc = "ID: realtime, monotonic, boottime, realtime-alarm, or boottime-alarm",
+ .defv.string = "realtime",
+ },
+ {
+ .name = "abstime",
+ .type = PTYPE_BOOLEAN,
+ .desc = "use TFD_TIMER_ABSTIME flag",
+ .defv.boolean = false,
+ },
+ {
+ .name = "remaining",
+ .type = PTYPE_UINTEGER,
+ .desc = "remaining seconds for expiration",
+ .defv.uinteger = 99,
+ },
+ {
+ .name = "interval",
+ .type = PTYPE_UINTEGER,
+ .desc = "inteval in seconds",
+ .defv.uinteger = 10,
+ },
+ {
+ .name = "interval-nanofrac",
+ .type = PTYPE_UINTEGER,
+ .desc = "nsec part of inteval",
+ .defv.uinteger = 0,
+ },
+
+ PARAM_END
+ }
+ },
+ {
+ .name = "signalfd",
+ .desc = "make signalfd",
+ .priv = false,
+ .N = 1,
+ .EX_N = 0,
+ .make = make_signalfd,
+ .params = (struct parameter []) {
+ PARAM_END
+ }
+ },
+ {
+ .name = "cdev-tun",
+ .desc = "open /dev/net/tun",
+ .priv = true,
+ .N = 1,
+ .EX_N = 0,
+ .EX_R = 1,
+ .make = make_cdev_tun,
+ .report = report_cdev_tun,
+ .free = free_cdev_tun,
+ .params = (struct parameter []) {
+ PARAM_END
+ }
+ },
+ {
+ .name = "bpf-prog",
+ .desc = "make bpf-prog",
+ .priv = true,
+ .N = 1,
+ .EX_N = 0,
+ .make = make_bpf_prog,
+ .params = (struct parameter []) {
+ {
+ .name = "prog-type-id",
+ .type = PTYPE_INTEGER,
+ .desc = "program type by id",
+ .defv.integer = 1,
+ },
+ {
+ .name = "name",
+ .type = PTYPE_STRING,
+ .desc = "name assigned to bpf prog object",
+ .defv.string = "mkfds_bpf_prog",
+ },
+ PARAM_END
+ }
+ },
+ {
+ .name = "multiplexing",
+ .desc = "making pipes monitored by multiplexers",
+ .priv = false,
+ .N = 12,
+ .EX_N = 0,
+ .make = make_some_pipes,
+ .params = (struct parameter []) {
+ PARAM_END
+ }
+ },
+ {
+ .name = "bpf-map",
+ .desc = "make bpf-map",
+ .priv = true,
+ .N = 1,
+ .EX_N = 0,
+ .make = make_bpf_map,
+ .params = (struct parameter []) {
+ {
+ .name = "map-type-id",
+ .type = PTYPE_INTEGER,
+ .desc = "map type by id",
+ .defv.integer = 1,
+ },
+ {
+ .name = "name",
+ .type = PTYPE_STRING,
+ .desc = "name assigned to the bpf map object",
+ .defv.string = "mkfds_bpf_map",
+ },
+ PARAM_END
+ }
+ },
+ {
+ .name = "pty",
+ .desc = "make a pair of ptmx and pts",
+ .priv = false,
+ .N = 2,
+ .EX_N = 0,
+ .EX_R = 1,
+ .make = make_pty,
+ .report = report_pty,
+ .free = free_pty,
+ .params = (struct parameter []) {
+ PARAM_END
+ }
+ },
+ {
+ .name = "sockdiag",
+ .desc = "make a sockdiag netlink socket",
+ .priv = false,
+ .N = 1,
+ .EX_N = 0,
+ .make = make_sockdiag,
+ .params = (struct parameter []) {
+ {
+ .name = "family",
+ .type = PTYPE_STRING,
+ /* TODO: inet, inet6 */
+ .desc = "name of a protocol family ([unix])",
+ .defv.string = "unix",
+ },
+ PARAM_END
+ }
+ },
};
static int count_parameters(const struct factory *factory)
@@ -2465,17 +4128,18 @@ static int count_parameters(const struct factory *factory)
static void print_factory(const struct factory *factory)
{
- printf("%-20s %4s %5d %6d %s\n",
+ printf("%-20s %4s %5d %7d %6d %s\n",
factory->name,
factory->priv? "yes": "no",
factory->N,
+ factory->EX_R + 1,
count_parameters(factory),
factory->desc);
}
static void list_factories(void)
{
- printf("%-20s PRIV COUNT NPARAM DESCRIPTION\n", "FACTORY");
+ printf("%-20s PRIV COUNT NRETURN NPARAM DESCRIPTION\n", "FACTORY");
for (size_t i = 0; i < ARRAY_SIZE(factories); i++)
print_factory(factories + i);
}
@@ -2533,25 +4197,146 @@ pidfd_open(pid_t pid _U_, unsigned int flags _U_)
}
#endif
-static void wait_event(void)
+/*
+ * Multiplexers
+ */
+struct multiplexer {
+ const char *name;
+ void (*fn)(bool, struct fdesc *fdescs, size_t n_fdescs);
+};
+
+#if defined(__NR_select) || defined(__NR_poll)
+static void sighandler_nop(int si _U_)
{
- fd_set readfds;
- sigset_t sigset;
- int n = 0;
+ /* Do nothing */
+}
+#endif
- FD_ZERO(&readfds);
- /* Monitor the standard input only when the process
- * is in foreground. */
- if (tcgetpgrp(STDIN_FILENO) == getpgrp()) {
- n = 1;
- FD_SET(0, &readfds);
+#define DEFUN_WAIT_EVENT_SELECT(NAME,SYSCALL,XDECLS,SETUP_SIG_HANDLER,SYSCALL_INVOCATION) \
+ static void wait_event_##NAME(bool add_stdin, struct fdesc *fdescs, size_t n_fdescs) \
+ { \
+ fd_set readfds; \
+ fd_set writefds; \
+ fd_set exceptfds; \
+ XDECLS \
+ int n = 0; \
+ \
+ FD_ZERO(&readfds); \
+ FD_ZERO(&writefds); \
+ FD_ZERO(&exceptfds); \
+ /* Monitor the standard input only when the process \
+ * is in foreground. */ \
+ if (add_stdin) { \
+ n = 1; \
+ FD_SET(0, &readfds); \
+ } \
+ \
+ for (size_t i = 0; i < n_fdescs; i++) { \
+ if (fdescs[i].mx_modes & MX_READ) { \
+ n = max(n, fdescs[i].fd + 1); \
+ FD_SET(fdescs[i].fd, &readfds); \
+ } \
+ if (fdescs[i].mx_modes & MX_WRITE) { \
+ n = max(n, fdescs[i].fd + 1); \
+ FD_SET(fdescs[i].fd, &writefds); \
+ } \
+ if (fdescs[i].mx_modes & MX_EXCEPT) { \
+ n = max(n, fdescs[i].fd + 1); \
+ FD_SET(fdescs[i].fd, &exceptfds); \
+ } \
+ } \
+ \
+ SETUP_SIG_HANDLER \
+ \
+ if (SYSCALL_INVOCATION < 0 \
+ && errno != EINTR) \
+ err(EXIT_FAILURE, "failed in " SYSCALL); \
}
- sigemptyset(&sigset);
+DEFUN_WAIT_EVENT_SELECT(default,
+ "pselect",
+ sigset_t sigset;,
+ sigemptyset(&sigset);,
+ pselect(n, &readfds, &writefds, &exceptfds, NULL, &sigset))
+
+#ifdef __NR_pselect6
+DEFUN_WAIT_EVENT_SELECT(pselect6,
+ "pselect6",
+ sigset_t sigset;,
+ sigemptyset(&sigset);,
+ syscall(__NR_pselect6, n, &readfds, &writefds, &exceptfds, NULL, &sigset))
+#endif
- if (pselect(n, &readfds, NULL, NULL, NULL, &sigset) < 0
- && errno != EINTR)
- errx(EXIT_FAILURE, "failed in pselect");
+#ifdef __NR_select
+DEFUN_WAIT_EVENT_SELECT(select,
+ "select",
+ ,
+ signal(SIGCONT,sighandler_nop);,
+ syscall(__NR_select, n, &readfds, &writefds, &exceptfds, NULL))
+#endif
+
+#ifdef __NR_poll
+static DEFUN_WAIT_EVENT_POLL(poll,
+ "poll",
+ ,
+ signal(SIGCONT,sighandler_nop);,
+ syscall(__NR_poll, pfds, n, -1))
+#endif
+
+#define DEFAULT_MULTIPLEXER 0
+static struct multiplexer multiplexers [] = {
+ {
+ .name = "default",
+ .fn = wait_event_default,
+ },
+#ifdef __NR_pselect6
+ {
+ .name = "pselect6",
+ .fn = wait_event_pselect6,
+ },
+#endif
+#ifdef __NR_select
+ {
+ .name = "select",
+ .fn = wait_event_select,
+ },
+#endif
+#ifdef __NR_poll
+ {
+ .name = "poll",
+ .fn = wait_event_poll,
+ },
+#endif
+#ifdef __NR_ppoll
+ {
+ .name = "ppoll",
+ .fn = wait_event_ppoll,
+ },
+#endif
+};
+
+static struct multiplexer *lookup_multiplexer(const char *name)
+{
+ for (size_t i = 0; i < ARRAY_SIZE(multiplexers); i++)
+ if (strcmp(name, multiplexers[i].name) == 0)
+ return multiplexers + i;
+ return NULL;
+}
+
+static void list_multiplexers(void)
+{
+ puts("NAME");
+ for (size_t i = 0; i < ARRAY_SIZE(multiplexers); i++)
+ puts(multiplexers[i].name);
+}
+
+static bool is_available(const char *factory)
+{
+ for (size_t i = 0; i < ARRAY_SIZE(factories); i++)
+ if (strcmp(factories[i].name, factory) == 0)
+ return true;
+
+ return false;
}
int main(int argc, char **argv)
@@ -2562,21 +4347,30 @@ int main(int argc, char **argv)
bool quiet = false;
bool cont = false;
void *data;
+ bool monitor_stdin = true;
+
+ struct multiplexer *wait_event = NULL;
static const struct option longopts[] = {
+ { "is-available",required_argument,NULL, 'a' },
{ "list", no_argument, NULL, 'l' },
{ "parameters", required_argument, NULL, 'I' },
{ "comm", required_argument, NULL, 'r' },
{ "quiet", no_argument, NULL, 'q' },
+ { "dont-monitor-stdin", no_argument, NULL, 'X' },
{ "dont-puase", no_argument, NULL, 'c' },
+ { "wait-with", required_argument, NULL, 'w' },
+ { "multiplexers",no_argument,NULL, 'W' },
{ "help", no_argument, NULL, 'h' },
{ NULL, 0, NULL, 0 },
};
- while ((c = getopt_long(argc, argv, "lhqcI:r:", longopts, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "a:lhqcI:r:w:WX", longopts, NULL)) != -1) {
switch (c) {
case 'h':
usage(stdout, EXIT_SUCCESS);
+ case 'a':
+ exit(is_available(optarg)? 0: 1);
case 'l':
list_factories();
exit(EXIT_SUCCESS);
@@ -2589,9 +4383,20 @@ int main(int argc, char **argv)
case 'c':
cont = true;
break;
+ case 'w':
+ wait_event = lookup_multiplexer(optarg);
+ if (wait_event == NULL)
+ errx(EXIT_FAILURE, "unknown multiplexer: %s", optarg);
+ break;
+ case 'W':
+ list_multiplexers();
+ exit(EXIT_SUCCESS);
case 'r':
rename_self(optarg);
break;
+ case 'X':
+ monitor_stdin = false;
+ break;
default:
usage(stderr, EXIT_FAILURE);
}
@@ -2600,6 +4405,11 @@ int main(int argc, char **argv)
if (optind == argc)
errx(EXIT_FAILURE, "no file descriptor specification given");
+ if (cont && wait_event)
+ errx(EXIT_FAILURE, "don't specify both -c/--dont-puase and -w/--wait-with options");
+ if (wait_event == NULL)
+ wait_event = multiplexers + DEFAULT_MULTIPLEXER;
+
factory = find_factory(argv[optind]);
if (!factory)
errx(EXIT_FAILURE, "no such factory: %s", argv[optind]);
@@ -2615,6 +4425,7 @@ int main(int argc, char **argv)
for (int i = 0; i < MAX_N; i++) {
fdescs[i].fd = -1;
+ fdescs[i].mx_modes = 0;
fdescs[i].close = NULL;
}
@@ -2645,21 +4456,26 @@ int main(int argc, char **argv)
if (!quiet) {
printf("%d", getpid());
+ if (factory->report) {
+ for (int i = 0; i < factory->EX_R; i++) {
+ putchar(' ');
+ factory->report(factory, i, data, stdout);
+ }
+ }
putchar('\n');
- if (factory->report)
- factory->report(factory, data, stdout);
fflush(stdout);
}
if (!cont)
- wait_event();
+ wait_event->fn(monitor_stdin,
+ fdescs, factory->N + factory->EX_N);
for (int i = 0; i < factory->N + factory->EX_N; i++)
if (fdescs[i].fd >= 0 && fdescs[i].close)
fdescs[i].close(fdescs[i].fd, fdescs[i].data);
if (factory->free)
- factory->free (factory, data);
+ factory->free(factory, data);
exit(EXIT_SUCCESS);
}
diff --git a/tests/helpers/test_mkfds.h b/tests/helpers/test_mkfds.h
new file mode 100644
index 0000000..7d679b4
--- /dev/null
+++ b/tests/helpers/test_mkfds.h
@@ -0,0 +1,85 @@
+/*
+ * test_mkfds - make various file descriptors
+ *
+ * Written by Masatake YAMATO <yamato@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef TEST_MKFDS_H
+#define TEST_MKFDS_H
+
+#include <asm/unistd.h>
+#include <stdbool.h>
+#include <stddef.h>
+
+enum multiplexing_mode {
+ MX_READ = 1 << 0,
+ MX_WRITE = 1 << 1,
+ MX_EXCEPT = 1 << 2,
+};
+
+struct fdesc {
+ int fd;
+ void (*close)(int, void *);
+ unsigned int mx_modes;
+ void *data;
+};
+
+#define DEFUN_WAIT_EVENT_POLL(NAME,SYSCALL,XDECLS,SETUP_SIG_HANDLER,SYSCALL_INVOCATION) \
+ void wait_event_##NAME(bool add_stdin, struct fdesc *fdescs, size_t n_fdescs) \
+ { \
+ int n = add_stdin? 1: 0; \
+ int n0 = 0; \
+ struct pollfd *pfds = NULL; \
+ \
+ XDECLS \
+ \
+ for (size_t i = 0; i < n_fdescs; i++) \
+ if (fdescs[i].mx_modes) \
+ n++; \
+ \
+ pfds = xcalloc(n, sizeof(pfds[0])); \
+ \
+ for (size_t i = 0; i < n_fdescs; i++) { \
+ if (!fdescs[i].mx_modes) \
+ continue; \
+ pfds[n0].fd = fdescs[i].fd; \
+ if (fdescs[i].mx_modes & MX_READ) \
+ pfds[n0].events |= POLLIN; \
+ if (fdescs[i].mx_modes & MX_WRITE) \
+ pfds[n0].events |= POLLOUT; \
+ if (fdescs[i].mx_modes & MX_EXCEPT) \
+ pfds[n0].events |= POLLHUP; \
+ n0++; \
+ } \
+ \
+ if (add_stdin) { \
+ pfds[n0].fd = 0; \
+ pfds[n0].events |= POLLIN; \
+ } \
+ \
+ SETUP_SIG_HANDLER \
+ \
+ if (SYSCALL_INVOCATION < 0 \
+ && errno != EINTR) \
+ err(EXIT_FAILURE, "failed in " SYSCALL); \
+ free(pfds); \
+ }
+
+#ifdef __NR_ppoll
+void wait_event_ppoll(bool add_stdin, struct fdesc *fdescs, size_t n_fdescs);
+#endif
+
+#endif /* TEST_MKFDS_H */
diff --git a/tests/helpers/test_mkfds_ppoll.c b/tests/helpers/test_mkfds_ppoll.c
new file mode 100644
index 0000000..33d5aa8
--- /dev/null
+++ b/tests/helpers/test_mkfds_ppoll.c
@@ -0,0 +1,79 @@
+/*
+ * test_mkfds_ppoll.c - call ppoll(2) DIRECTLY
+ *
+ * Written by Masatake YAMATO <yamato@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+/* Why this ppoll multiplexer must be defined here?
+ *
+ * Glibc defines sigset_t its own way. However, it is not what kernel
+ * expects.
+ *
+ * If an applicaiton uses the glibc's sigset_t via ppoll(2) wrapper,
+ * there is no problem; the wrapper function may translate the glibc's
+ * sigset_t to what kernel expects.
+ *
+ * Here, we want to ppoll(2) directly. In this case, the glibc's sigset_t
+ * becomes an issue. To use ppoll(2) directly, we have to include <asm/poll.h>.
+ * Including both <poll.h> provided by glibc and <asm/poll.h> provided by kernel
+ * causes "redefined ***" errors.
+ *
+ * This file is for defining the poll multiplexer only with <asm/poll.h>.
+ *
+ */
+#include "test_mkfds.h"
+
+#include <string.h> /* memset */
+#include <err.h> /* err */
+#include <errno.h> /* EINTR */
+#include <linux/poll.h> /* struct pollfd */
+#include <asm/signal.h> /* sigset_t */
+
+extern long syscall(long number, ...);
+extern void *calloc(size_t nmemb, size_t size);
+extern void free(void *ptr);
+
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+#ifndef XALLOC_EXIT_CODE
+# define XALLOC_EXIT_CODE EXIT_FAILURE
+#endif
+
+/* Copied from include/xalloc.h */
+static void *xcalloc(const size_t nelems, const size_t size)
+{
+ void *ret = calloc(nelems, size);
+
+ if (!ret && size && nelems)
+ err(XALLOC_EXIT_CODE, "cannot allocate %zu bytes", size);
+ return ret;
+}
+
+/* sigemptyset may not be defiend and/or declared in asm/signal.h */
+static void clear_sigset(sigset_t *sigset)
+{
+ memset(sigset, 0, sizeof(*sigset));
+}
+
+#ifdef __NR_ppoll
+DEFUN_WAIT_EVENT_POLL(ppoll,
+ "ppoll",
+ sigset_t sigset;,
+ clear_sigset(&sigset);,
+ syscall(__NR_ppoll, pfds, n, NULL, &sigset, sizeof(sigset)))
+#endif
diff --git a/tests/helpers/test_sysinfo.c b/tests/helpers/test_sysinfo.c
index 81fbdd7..c36aca2 100644
--- a/tests/helpers/test_sysinfo.c
+++ b/tests/helpers/test_sysinfo.c
@@ -25,6 +25,7 @@
#include <inttypes.h>
#include <wchar.h>
#include <errno.h>
+#include <time.h>
#include <sys/ioctl.h>
#include <sys/mount.h>
@@ -125,7 +126,13 @@ static int hlp_fsopen_ok(void)
return 0;
}
-static mntHlpfnc hlps[] =
+static int hlp_sz_time(void)
+{
+ printf("%zu\n", sizeof(time_t));
+ return 0;
+}
+
+static const mntHlpfnc hlps[] =
{
{ "WORDSIZE", hlp_wordsize },
{ "pagesize", hlp_pagesize },
@@ -139,13 +146,14 @@ static mntHlpfnc hlps[] =
{ "wcsspn-ok", hlp_wcsspn_ok },
{ "enotty-ok", hlp_enotty_ok },
{ "fsopen-ok", hlp_fsopen_ok },
+ { "sz(time_t)", hlp_sz_time },
{ NULL, NULL }
};
int main(int argc, char **argv)
{
int re = 0;
- mntHlpfnc *fn;
+ const mntHlpfnc *fn;
if (argc == 1) {
for (fn = hlps; fn->name; fn++) {
diff --git a/tests/ts/blkid/images-fs/swap-luks.img.xz b/tests/ts/blkid/images-fs/swap-luks.img.xz
new file mode 100644
index 0000000..9b5cb65
--- /dev/null
+++ b/tests/ts/blkid/images-fs/swap-luks.img.xz
Binary files differ
diff --git a/tests/ts/blkid/images-fs/vxfs-be.img.xz b/tests/ts/blkid/images-fs/vxfs-be.img.xz
new file mode 100644
index 0000000..61ff461
--- /dev/null
+++ b/tests/ts/blkid/images-fs/vxfs-be.img.xz
Binary files differ
diff --git a/tests/ts/blkid/images-fs/vxfs-le.img.xz b/tests/ts/blkid/images-fs/vxfs-le.img.xz
new file mode 100644
index 0000000..f4643a5
--- /dev/null
+++ b/tests/ts/blkid/images-fs/vxfs-le.img.xz
Binary files differ
diff --git a/tests/ts/column/table b/tests/ts/column/table
index 8b22d83..5d5e131 100755
--- a/tests/ts/column/table
+++ b/tests/ts/column/table
@@ -65,6 +65,13 @@ $TS_CMD_COLUMN --table $TS_SELF/files/mountinfo \
>> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
+ts_init_subtest "noheaders"
+$TS_CMD_COLUMN --table $TS_SELF/files/table \
+ --table-noheadings \
+ --table-columns VERYLONG,COLUMN,NAMES \
+ >> $TS_OUTPUT 2>> $TS_ERRLOG
+ts_finalize_subtest
+
ts_init_subtest "truncate"
$TS_CMD_COLUMN --table $TS_SELF/files/mountinfo \
--table-columns ID,PARENT,MAJMIN,ROOT,TARGET,VFS-OPTS,PROP,SEP,TYPE,SOURCE,FS-OPTS \
diff --git a/tests/ts/dmesg/cid-input b/tests/ts/dmesg/cid-input
new file mode 100644
index 0000000..7dbd89d
--- /dev/null
+++ b/tests/ts/dmesg/cid-input
@@ -0,0 +1,106 @@
+<0>[ 0.000000] [ T0] example[0]
+<1>[ 1.000000] [ T1] example[1]
+<2>[ 8.000000] [ T2] example[2]
+<3>[ 27.000000] [ T3] example[3]
+<4>[ 64.000000] [ T4] example[4]
+<5>[ 125.000000] [ T5] example[5]
+<6>[ 216.000000] [ T6] example[6]
+<7>[ 343.000000] [ T7] example[7]
+<8>[ 512.000000] [ T8] example[8]
+<9>[ 729.000000] [ T9] example[9]
+<10>[ 1000.000000] [ T10] example[10]
+<11>[ 1331.000000] [ T11] example[11]
+<12>[ 1728.000000] [ T12] example[12]
+<13>[ 2197.000000] [ T13] example[13]
+<14>[ 2744.000000] [ T14] example[14]
+<15>[ 3375.000000] [ T15] example[15]
+<16>[ 4096.000000] [ T16] example[16]
+<17>[ 4913.000000] [ T17] example[17]
+<18>[ 5832.000000] [ T18] example[18]
+<19>[ 6859.000000] [ T19] example[19]
+<20>[ 8000.000000] [ T20] example[20]
+<21>[ 9261.000000] [ T21] example[21]
+<22>[10648.000000] [ T22] example[22]
+<23>[12167.000000] [ T23] example[23]
+<24>[13824.000000] [ T24] example[24]
+<25>[15625.000000] [ T25] example[25]
+<26>[17576.000000] [ T26] example[26]
+<27>[19683.000000] [ T27] example[27]
+<28>[21952.000000] [ T28] example[28]
+<29>[24389.000000] [ T29] example[29]
+<30>[27000.000000] [ T10] example[30]
+<31>[29791.000000] [ T31] example[31]
+<32>[32768.000000] [ T32] example[32]
+<33>[35937.000000] [ T33] example[33]
+<34>[39304.000000] [ T34] example[34]
+<35>[42875.000000] [ T35] example[35]
+<36>[46656.000000] [ T36] example[36]
+<37>[50653.000000] [ T37] example[37]
+<38>[54872.000000] [ T38] example[38]
+<39>[59319.000000] [ T39] example[39]
+<40>[64000.000000] [ T40] example[40]
+<41>[68921.000000] [ T41] example[41]
+<42>[74088.000000] [ T42] example[42]
+<43>[79507.000000] [ T43] example[43]
+<44>[85184.000000] [ T44] example[44]
+<45>[91125.000000] [ T45] example[45]
+<46>[97336.000000] [ T46] example[46]
+<47>[103823.000000] [ T47] example[47]
+<48>[110592.000000] [ T48] example[48]
+<49>[117649.000000] [ T49] example[49]
+<50>[125000.000000] [ T50] example[50]
+<51>[132651.000000] [ T51] example[51]
+<52>[140608.000000] [ T52] example[52]
+<53>[148877.000000] [ T53] example[53]
+<54>[157464.000000] [ T54] example[54]
+<55>[166375.000000] [ T55] example[55]
+<56>[175616.000000] [ T56] example[56]
+<57>[185193.000000] [ T57] example[57]
+<58>[195112.000000] [ T58] example[58]
+<59>[205379.000000] [ T59] example[59]
+<60>[216000.000000] [ T60] example[60]
+<61>[226981.000000] [ T61] example[61]
+<62>[238328.000000] [ T62] example[62]
+<63>[250047.000000] [ T63] example[63]
+<64>[262144.000000] [ T64] example[64]
+<65>[274625.000000] [ T65] example[65]
+<66>[287496.000000] [ T66] example[66]
+<67>[300763.000000] [ T67] example[67]
+<68>[314432.000000] [ T68] example[68]
+<69>[328509.000000] [ T69] example[69]
+<70>[343000.000000] [ T70] example[70]
+<71>[357911.000000] [ T71] example[71]
+<72>[373248.000000] [ T72] example[72]
+<73>[389017.000000] [ T73] example[73]
+<74>[405224.000000] [ T74] example[74]
+<75>[421875.000000] [ T75] example[75]
+<76>[438976.000000] [ T76] example[76]
+<77>[456533.000000] [ T77] example[77]
+<78>[474552.000000] [ T78] example[78]
+<79>[493039.000000] [ T79] example[79]
+<80>[512000.000000] [ T80] example[80]
+<81>[531441.000000] [ T81] example[81]
+<82>[551368.000000] [ T82] example[82]
+<83>[571787.000000] [ T83] example[83]
+<84>[592704.000000] [ T84] example[84]
+<85>[614125.000000] [ T85] example[85]
+<86>[636056.000000] [ T86] example[86]
+<87>[658503.000000] [ T87] example[87]
+<88>[681472.000000] [ T88] example[88]
+<89>[704969.000000] [ T89] example[89]
+<90>[729000.000000] [ T90] example[90]
+<91>[753571.000000] [ T91] example[91]
+<92>[778688.000000] [ T92] example[92]
+<93>[804357.000000] [ T93] example[93]
+<94>[830584.000000] [ T94] example[94]
+<95>[857375.000000] [ T95] example[95]
+<96>[884736.000000] [ T96] example[96]
+<97>[912673.000000] [ T97] example[97]
+<98>[941192.000000] [ T98] example[98]
+<99>[970299.000000] [ T99] example[99]
+<100>[1000000.000000] [ T100] example[100]
+<101>[1030301.000000] [ T101] example[101]
+<102>[1061208.000000] [ T102] example[102]
+<103>[1092727.000000] [ T103] example[103]
+<104>[1124864.000000] [ T104] example[104]
+<150>[4557523.000000] [ T105] example[105]
diff --git a/tests/ts/dmesg/cid-json b/tests/ts/dmesg/cid-json
new file mode 100755
index 0000000..7836379
--- /dev/null
+++ b/tests/ts/dmesg/cid-json
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="cid-json"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+$TS_HELPER_DMESG -J -F $TS_SELF/cid-input >> $TS_OUTPUT 2>/dev/null
+
+ts_finalize
diff --git a/tests/ts/dmesg/cid-kmsg-colors b/tests/ts/dmesg/cid-kmsg-colors
new file mode 100755
index 0000000..b94e8a9
--- /dev/null
+++ b/tests/ts/dmesg/cid-kmsg-colors
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="cid-kmsg-colors"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+ts_inhibit_custom_colorscheme
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+$TS_HELPER_DMESG --color=always -K $TS_SELF/cid-kmsg-input -x >> $TS_OUTPUT 2>/dev/null
+
+# dmesg kmsg output can have varying number of caller_id padding spaces
+# normalize caller_id padding by removing leading spaces
+sed -i 's/\[ *T/\[T/g' $TS_OUTPUT
+sed -i 's/\[ *C/\[C/g' $TS_OUTPUT
+
+ts_finalize
diff --git a/tests/ts/dmesg/cid-kmsg-console-levels b/tests/ts/dmesg/cid-kmsg-console-levels
new file mode 100755
index 0000000..19d8004
--- /dev/null
+++ b/tests/ts/dmesg/cid-kmsg-console-levels
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="cid-kmsg-levels"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+for I in {-1..8}; do
+ echo "Display console level: $I" >> $TS_OUTPUT
+ $TS_HELPER_DMESG -K $TS_SELF/cid-kmsg-input -l $I >> $TS_OUTPUT 2>/dev/null
+done
+
+echo "Display console level: err+" >> $TS_OUTPUT
+$TS_HELPER_DMESG -K $TS_SELF/cid-kmsg-input -l err+ >> $TS_OUTPUT 2>/dev/null
+echo "Display console level: emerg+" >> $TS_OUTPUT
+$TS_HELPER_DMESG -K $TS_SELF/cid-kmsg-input -l emerg+ >> $TS_OUTPUT 2>/dev/null
+echo "Display console level: +err" >> $TS_OUTPUT
+$TS_HELPER_DMESG -K $TS_SELF/cid-kmsg-input -l +err >> $TS_OUTPUT 2>/dev/null
+echo "Display console level: +debug" >> $TS_OUTPUT
+$TS_HELPER_DMESG -K $TS_SELF/cid-kmsg-input -l +debug >> $TS_OUTPUT 2>/dev/null
+echo "Display console level: debug" >> $TS_OUTPUT
+$TS_HELPER_DMESG -K $TS_SELF/cid-kmsg-input -l debug >> $TS_OUTPUT 2>/dev/null
+echo "Display console level: + (invalid)" >> $TS_OUTPUT
+$TS_HELPER_DMESG -K $TS_SELF/cid-kmsg-input -l + 2>> $TS_OUTPUT >/dev/null
+
+# dmesg kmsg output can have varying number of caller_id padding spaces
+# normalize caller_id padding by removing leading spaces
+sed -i 's/\[ *T/\[T/g' $TS_OUTPUT
+sed -i 's/\[ *C/\[C/g' $TS_OUTPUT
+
+ts_finalize
diff --git a/tests/ts/dmesg/cid-kmsg-decode b/tests/ts/dmesg/cid-kmsg-decode
new file mode 100755
index 0000000..b920997
--- /dev/null
+++ b/tests/ts/dmesg/cid-kmsg-decode
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="cid-kmsg-decode"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+$TS_HELPER_DMESG -x -K $TS_SELF/cid-kmsg-input >> $TS_OUTPUT 2>/dev/null
+
+# dmesg kmsg output can have varying number of caller_id padding spaces
+# normalize caller_id padding by removing leading spaces
+sed -i 's/\[ *T/\[T/g' $TS_OUTPUT
+sed -i 's/\[ *C/\[C/g' $TS_OUTPUT
+
+ts_finalize
diff --git a/tests/ts/dmesg/cid-kmsg-delta b/tests/ts/dmesg/cid-kmsg-delta
new file mode 100755
index 0000000..1b5f572
--- /dev/null
+++ b/tests/ts/dmesg/cid-kmsg-delta
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="cid-kmsg-delta"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+$TS_HELPER_DMESG -d -K $TS_SELF/cid-kmsg-input >> $TS_OUTPUT 2>/dev/null
+
+# dmesg kmsg output can have varying number of caller_id padding spaces
+# normalize caller_id padding by removing leading spaces
+sed -i 's/\[ *T/\[T/g' $TS_OUTPUT
+sed -i 's/\[ *C/\[C/g' $TS_OUTPUT
+
+ts_finalize
diff --git a/tests/ts/dmesg/cid-kmsg-facilities b/tests/ts/dmesg/cid-kmsg-facilities
new file mode 100755
index 0000000..38ca9c5
--- /dev/null
+++ b/tests/ts/dmesg/cid-kmsg-facilities
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="cid-kmsg-facilities"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+for I in {-1..12}; do
+ echo "Display facility list: $I" >> $TS_OUTPUT
+ $TS_HELPER_DMESG -K $TS_SELF/cid-kmsg-input -f $I -x >> $TS_OUTPUT 2>/dev/null
+done
+
+# dmesg kmsg output can have varying number of caller_id padding spaces
+# normalize caller_id padding by removing leading spaces
+sed -i 's/\[ *T/\[T/g' $TS_OUTPUT
+sed -i 's/\[ *C/\[C/g' $TS_OUTPUT
+
+ts_finalize
diff --git a/tests/ts/dmesg/cid-kmsg-indentation b/tests/ts/dmesg/cid-kmsg-indentation
new file mode 100755
index 0000000..c3f8e06
--- /dev/null
+++ b/tests/ts/dmesg/cid-kmsg-indentation
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="cid-kmsg-indentation"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+$TS_HELPER_DMESG -K $TS_SELF/cid-kmsg-newlines >> $TS_OUTPUT 2>> $TS_ERRLOG
+
+$TS_HELPER_DMESG -K $TS_SELF/cid-kmsg-newlines >> $TS_OUTPUT 2>> $TS_ERRLOG
+
+$TS_HELPER_DMESG --time-format=delta --kmsg-file $TS_SELF/cid-kmsg-newlines >> $TS_OUTPUT 2>> $TS_ERRLOG
+
+$TS_HELPER_DMESG --time-format=notime --kmsg-file $TS_SELF/cid-kmsg-newlines >> $TS_OUTPUT 2>> $TS_ERRLOG
+
+$TS_HELPER_DMESG --time-format=reltime --kmsg-file $TS_SELF/cid-kmsg-newlines >> $TS_OUTPUT 2>> $TS_ERRLOG
+
+$TS_HELPER_DMESG --time-format=ctime --kmsg-file $TS_SELF/cid-kmsg-newlines >> $TS_OUTPUT 2>> $TS_ERRLOG
+
+$TS_HELPER_DMESG --time-format=iso --kmsg-file $TS_SELF/cid-kmsg-newlines >> $TS_OUTPUT 2>> $TS_ERRLOG
+
+# dmesg kmsg output can have varying number of caller_id padding spaces
+# normalize caller_id padding by removing leading spaces
+sed -i 's/\[ *T/\[T/g' $TS_OUTPUT
+sed -i 's/\[ *C/\[C/g' $TS_OUTPUT
+
+ts_finalize
diff --git a/tests/ts/dmesg/cid-kmsg-input b/tests/ts/dmesg/cid-kmsg-input
new file mode 100644
index 0000000..2575be8
--- /dev/null
+++ b/tests/ts/dmesg/cid-kmsg-input
Binary files differ
diff --git a/tests/ts/dmesg/cid-kmsg-json b/tests/ts/dmesg/cid-kmsg-json
new file mode 100755
index 0000000..ad1e3e7
--- /dev/null
+++ b/tests/ts/dmesg/cid-kmsg-json
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="cid-kmsg-json"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+$TS_HELPER_DMESG -J -K $TS_SELF/cid-kmsg-input >> $TS_OUTPUT 2>/dev/null
+
+ts_finalize
diff --git a/tests/ts/dmesg/cid-kmsg-limit b/tests/ts/dmesg/cid-kmsg-limit
new file mode 100755
index 0000000..06f1c8b
--- /dev/null
+++ b/tests/ts/dmesg/cid-kmsg-limit
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="cid-kmsg-limit"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+$TS_HELPER_DMESG --since @1234567890.124 --until @1234567991 -K $TS_SELF/cid-kmsg-input \
+ >> $TS_OUTPUT 2> $TS_ERRLOG
+
+# dmesg kmsg output can have varying number of caller_id padding spaces
+# normalize caller_id padding by removing leading spaces
+sed -i 's/\[ *T/\[T/g' $TS_OUTPUT
+sed -i 's/\[ *C/\[C/g' $TS_OUTPUT
+
+ts_finalize
diff --git a/tests/ts/dmesg/cid-kmsg-newlines b/tests/ts/dmesg/cid-kmsg-newlines
new file mode 100644
index 0000000..574d217
--- /dev/null
+++ b/tests/ts/dmesg/cid-kmsg-newlines
Binary files differ
diff --git a/tests/ts/dmesg/input b/tests/ts/dmesg/input
index 98307df..bcec23e 100644
--- a/tests/ts/dmesg/input
+++ b/tests/ts/dmesg/input
@@ -103,3 +103,4 @@
<102>[1061208.000000] example[102]
<103>[1092727.000000] example[103]
<104>[1124864.000000] example[104]
+<150>[4557523.000000] example[105]
diff --git a/tests/ts/dmesg/json b/tests/ts/dmesg/json
new file mode 100755
index 0000000..09ed2b0
--- /dev/null
+++ b/tests/ts/dmesg/json
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="json"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+$TS_HELPER_DMESG -J -F $TS_SELF/input >> $TS_OUTPUT 2>/dev/null
+
+ts_finalize
diff --git a/tests/ts/dmesg/kmsg-file b/tests/ts/dmesg/kmsg-file
new file mode 100755
index 0000000..a90a91e
--- /dev/null
+++ b/tests/ts/dmesg/kmsg-file
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="kmsg-file"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+$TS_HELPER_DMESG -J -K $TS_SELF/kmsg-input >> $TS_OUTPUT 2>/dev/null
+
+ts_finalize
diff --git a/tests/ts/dmesg/kmsg-input b/tests/ts/dmesg/kmsg-input
new file mode 100644
index 0000000..c08331d
--- /dev/null
+++ b/tests/ts/dmesg/kmsg-input
Binary files differ
diff --git a/tests/ts/dmesg/timestamp-format b/tests/ts/dmesg/timestamp-format
new file mode 100755
index 0000000..feb1ad8
--- /dev/null
+++ b/tests/ts/dmesg/timestamp-format
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="timestamp-format"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_DMESG"
+
+export TZ="GMT"
+export DMESG_TEST_BOOTIME="1234567890.123456"
+
+ts_init_subtest "multiple"
+$TS_HELPER_DMESG --time-format raw --time-format ctime --time-format iso -F $TS_SELF/input >> $TS_OUTPUT 2>/dev/null
+ts_finalize_subtest
+
+ts_init_subtest "delta"
+$TS_HELPER_DMESG --time-format iso --time-format delta -F $TS_SELF/input >> $TS_OUTPUT 2>/dev/null
+ts_finalize_subtest
+
+ts_init_subtest "delta-ctime"
+$TS_HELPER_DMESG --time-format reltime --time-format delta --time-format ctime -F $TS_SELF/input >> $TS_OUTPUT 2>/dev/null
+ts_finalize_subtest
+
+ts_init_subtest "delta-raw"
+$TS_HELPER_DMESG --time-format raw --time-format ctime --time-format delta -F $TS_SELF/input >> $TS_OUTPUT 2>/dev/null
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/eject/umount b/tests/ts/eject/umount
index 838ee9c..af5808f 100755
--- a/tests/ts/eject/umount
+++ b/tests/ts/eject/umount
@@ -83,7 +83,7 @@ init_device
mkfs.ext2 -q -F $TS_DEVICE
udevadm settle
mkdir -p $TS_MOUNTPOINT
-$TS_CMD_MOUNT $TS_DEVICE $TS_MOUNTPOINT
+$TS_CMD_MOUNT $TS_DEVICE $TS_MOUNTPOINT &> /dev/null
udevadm settle
$TS_CMD_EJECT --force $TS_DEVICE && ts_log "Success"
deinit_device
@@ -95,8 +95,8 @@ init_device
init_partitions $TS_DEVICE
mkdir -p ${TS_MOUNTPOINT}1
mkdir -p ${TS_MOUNTPOINT}2
-$TS_CMD_MOUNT ${TS_DEVICE}1 ${TS_MOUNTPOINT}1
-$TS_CMD_MOUNT ${TS_DEVICE}2 ${TS_MOUNTPOINT}2
+$TS_CMD_MOUNT ${TS_DEVICE}1 ${TS_MOUNTPOINT}1 &> /dev/null
+$TS_CMD_MOUNT ${TS_DEVICE}2 ${TS_MOUNTPOINT}2 &> /dev/null
udevadm settle
$TS_CMD_EJECT --force $TS_DEVICE && ts_log "Success"
deinit_device
@@ -116,8 +116,8 @@ init_device
init_partitions $TS_DEVICE
mkdir -p ${TS_MOUNTPOINT}1
mkdir -p ${TS_MOUNTPOINT}2
-$TS_CMD_MOUNT ${TS_DEVICE}1 ${TS_MOUNTPOINT}1
-$TS_CMD_MOUNT ${TS_DEVICE}2 ${TS_MOUNTPOINT}2
+$TS_CMD_MOUNT ${TS_DEVICE}1 ${TS_MOUNTPOINT}1 &> /dev/null
+$TS_CMD_MOUNT ${TS_DEVICE}2 ${TS_MOUNTPOINT}2 &> /dev/null
udevadm settle
$TS_CMD_EJECT --force ${TS_DEVICE}1 && ts_log "Success"
deinit_device
diff --git a/tests/ts/exch/exch b/tests/ts/exch/exch
new file mode 100755
index 0000000..1c6a28e
--- /dev/null
+++ b/tests/ts/exch/exch
@@ -0,0 +1,40 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="exch"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_EXCH"
+
+ts_cd "$TS_OUTDIR"
+
+{
+ echo A > a
+ echo B > b
+
+ cat a
+ cat b
+
+ "$TS_CMD_EXCH" a b
+
+ cat a
+ cat b
+} > "$TS_OUTPUT" 2>&1
+
+ts_finalize
diff --git a/tests/ts/fadvise/drop b/tests/ts/fadvise/drop
index 7c7eee5..45dcb91 100755
--- a/tests/ts/fadvise/drop
+++ b/tests/ts/fadvise/drop
@@ -16,7 +16,7 @@ ts_check_prog "sleep"
ts_cd "$TS_OUTDIR"
FILE="ddtest"
-BS=4k
+BS=65536
COUNT=8
FILE_FS="$("$TS_CMD_FINDMNT" -nr -o FSTYPE -T "$PWD")"
@@ -28,37 +28,41 @@ create_file() {
dd if=/dev/zero of="$FILE" bs=$BS count=$COUNT conv=fsync >& /dev/null
}
+do_fincore() {
+ "$TS_CMD_FINCORE" -o RES,SIZE,FILE "$FILE"
+}
+
{
create_file
- "$TS_CMD_FINCORE" "$FILE"
+ do_fincore
echo
create_file
echo "whole file"
"$TS_CMD_FADVISE" "$FILE"
echo status: $?
- "$TS_CMD_FINCORE" "$FILE"
+ do_fincore
echo
create_file
- echo "offset: 8192"
- "$TS_CMD_FADVISE" -o 8192 "$FILE"
+ echo "offset: $(( 2 * $BS ))"
+ "$TS_CMD_FADVISE" -o $(( 2 * $BS )) "$FILE"
echo status: $?
- "$TS_CMD_FINCORE" "$FILE"
+ do_fincore
echo
create_file
- echo "length: 16384"
- "$TS_CMD_FADVISE" -l 16384 "$FILE"
+ echo "length: $(( 4 * $BS ))"
+ "$TS_CMD_FADVISE" -l $(( 4 * $BS )) "$FILE"
echo status: $?
- "$TS_CMD_FINCORE" "$FILE"
+ do_fincore
echo
create_file
- echo "offset: 8192, length: 16384 fd: 42"
- "$TS_CMD_FADVISE" -o 8192 -l 16384 --fd 42 42<"$FILE"
+ echo "offset: $(( 2 * $BS )), length: $(( 4 * $BS )) fd: 42"
+ "$TS_CMD_FADVISE" -o $(( 2 * $BS )) -l $(( 4 * $BS )) --fd 42 42<"$FILE"
echo status: $?
- "$TS_CMD_FINCORE" "$FILE"
+ do_fincore
echo
rm "$FILE"
diff --git a/tests/ts/fdisk/resize b/tests/ts/fdisk/resize
new file mode 100755
index 0000000..9536cd7
--- /dev/null
+++ b/tests/ts/fdisk/resize
@@ -0,0 +1,66 @@
+#!/bin/bash
+#
+# This file is part of util-linux.
+#
+# Copyright (C) 2023 Thomas Weißschuh <thomas@t-8ch.de>
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="resize"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_FDISK"
+
+TEST_IMAGE_NAME=$(ts_image_init 10)
+
+function print_layout {
+ echo -ne "\n---layout----------\n" >> "$TS_OUTPUT"
+ "$TS_CMD_FDISK" -l "${TEST_IMAGE_NAME}" >> "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+ echo -ne "-------------------\n\n" >> "$TS_OUTPUT"
+
+ ts_fdisk_clean "${TEST_IMAGE_NAME}"
+}
+
+function test_fdisk() {
+ "$TS_CMD_FDISK" --noauto-pt "${TEST_IMAGE_NAME}" &> /dev/null
+}
+
+ts_log "Create initial partitions"
+echo -e "g\nn\n\n\n+1M\nn\n\n8192\n+1M\nw\n" | test_fdisk
+
+print_layout
+
+ts_log "Grow first to max"
+echo -e "e\n1\n\nw\n" | test_fdisk
+
+print_layout
+
+ts_log "Grow second to max"
+echo -e "e\n2\n\nw\n" | test_fdisk
+
+print_layout
+
+ts_log "Resize first to 4096 bytes"
+echo -e "e\n1\n4K\nw\n" | test_fdisk
+
+print_layout
+
+ts_log "Resize second to 8 sectors"
+echo -e "e\n2\n8S\nw\n" | test_fdisk
+
+print_layout
+
+ts_finalize
diff --git a/tests/ts/fincore/count b/tests/ts/fincore/count
index ba5f6cd..caf9c3a 100755
--- a/tests/ts/fincore/count
+++ b/tests/ts/fincore/count
@@ -107,6 +107,7 @@ if test -f "$TS_EXPECTED.$PAGE_SIZE"; then
OUT_COLUMNS="PAGES,SIZE,FILE"
else
TS_EXPECTED+=".nosize"
+ TS_EXPECTED_ERR+=".nosize"
OUT_COLUMNS="PAGES,FILE"
fi
@@ -119,11 +120,11 @@ check_dd_fs_feat
INPUT=
input=
+ts_log_both "[ NO EXCITING FILE ]"
{
input=no_such_file
INPUT="${INPUT} ${input}"
- ts_log_both "[ NO EXCITING FILE ]"
$TS_CMD_FINCORE --output $OUT_COLUMNS --bytes --noheadings $input
footer "$?"
} >> $TS_OUTPUT 2>> $TS_ERRLOG
@@ -220,8 +221,8 @@ input=
"oflag=append seek=$hole_count"
} >> $TS_OUTPUT 2>> $TS_ERRLOG
+ts_log_both "[ MULTIPLE FILES ]"
{
- ts_log_both "[ MULTIPLE FILES ]"
$TS_CMD_FINCORE --output $OUT_COLUMNS --bytes $INPUT
footer "$?"
} >> $TS_OUTPUT 2>> $TS_ERRLOG
diff --git a/tests/ts/hexdump/format-strings b/tests/ts/hexdump/format-strings
index 9f055ba..b971538 100755
--- a/tests/ts/hexdump/format-strings
+++ b/tests/ts/hexdump/format-strings
@@ -43,6 +43,10 @@ ts_init_subtest "1b_octal"
$TS_CMD_HEXDUMP -b $FILES/ascii.in &> $TS_OUTPUT
ts_finalize_subtest
+ts_init_subtest "1b_hex"
+$TS_CMD_HEXDUMP -X $FILES/ascii.in &> $TS_OUTPUT
+ts_finalize_subtest
+
ts_init_subtest "1b_char"
$TS_CMD_HEXDUMP -c $FILES/ascii.in &> $TS_OUTPUT
ts_finalize_subtest
diff --git a/tests/ts/lib/timeutils b/tests/ts/lib/timeutils
index 13ec68b..043b0c0 100755
--- a/tests/ts/lib/timeutils
+++ b/tests/ts/lib/timeutils
@@ -16,9 +16,15 @@ ts_init "$*"
ts_check_test_command "$TS_HELPER_TIMEUTILS"
ts_init_subtest "timestamp"
+"$TS_HELPER_TIMEUTILS" --unittest-timestamp 2> "$TS_ERRLOG" || ts_die "test failed"
+ts_finalize_subtest
-"$TS_HELPER_TIMEUTILS" --unittest-timestamp 2> "$TS_ERRLOG"
+ts_init_subtest "format"
+"$TS_HELPER_TIMEUTILS" --unittest-format 2> "$TS_ERRLOG" || ts_die "test failed"
+ts_finalize_subtest
+ts_init_subtest "format-relative"
+"$TS_HELPER_TIMEUTILS" --unittest-format-relative 2> "$TS_ERRLOG" || ts_die "test failed"
ts_finalize_subtest
ts_finalize
diff --git a/tests/ts/liblastlog2/dlopen b/tests/ts/liblastlog2/dlopen
new file mode 100755
index 0000000..8ce4e17
--- /dev/null
+++ b/tests/ts/liblastlog2/dlopen
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="dlopen"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+# incorrect warning: top_builddir is referenced but not assigned.
+# shellcheck disable=SC2154
+if [ -e "$top_builddir/meson.conf" ]; then
+ #meson build
+ libpath=${top_builddir}/liblastlog2
+else
+ #automake/autoconf build
+ libpath=${top_builddir}/.libs
+fi
+
+ts_check_test_command $TS_HELPER_LIBLASTLOG2_DLOPEN
+
+$TS_HELPER_LIBLASTLOG2_DLOPEN ${libpath}/liblastlog2.so >/dev/null || ts_failed "returned an error"
+
+ts_finalize
diff --git a/tests/ts/liblastlog2/pam_lastlog2_output b/tests/ts/liblastlog2/pam_lastlog2_output
new file mode 100755
index 0000000..c9961f1
--- /dev/null
+++ b/tests/ts/liblastlog2/pam_lastlog2_output
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="pam_lastlog2_output"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command $TS_HELPER_LIBLASTLOG2_PAM_LASTLOG2_OUTPUT
+
+export TZ=UTC
+
+$TS_HELPER_LIBLASTLOG2_PAM_LASTLOG2_OUTPUT || ts_failed "returned an error"
+
+rm pam_lastlog2-output.db
+
+ts_finalize
diff --git a/tests/ts/liblastlog2/remove_entry b/tests/ts/liblastlog2/remove_entry
new file mode 100755
index 0000000..63503d9
--- /dev/null
+++ b/tests/ts/liblastlog2/remove_entry
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="remove_entry"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command $TS_HELPER_LIBLASTLOG2_REMOVE_ENTRY
+
+$TS_HELPER_LIBLASTLOG2_REMOVE_ENTRY || ts_failed "returned an error"
+
+rm tst-delete-user.db
+
+ts_finalize
diff --git a/tests/ts/liblastlog2/rename_user b/tests/ts/liblastlog2/rename_user
new file mode 100755
index 0000000..38f0763
--- /dev/null
+++ b/tests/ts/liblastlog2/rename_user
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="rename_user"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command $TS_HELPER_LIBLASTLOG2_RENAME_USER
+
+$TS_HELPER_LIBLASTLOG2_RENAME_USER || ts_failed "returned an error"
+
+rm tst-rename-user.db
+
+ts_finalize
diff --git a/tests/ts/liblastlog2/sqlite3_time b/tests/ts/liblastlog2/sqlite3_time
new file mode 100755
index 0000000..9ff27fe
--- /dev/null
+++ b/tests/ts/liblastlog2/sqlite3_time
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="sqlite3_time"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command $TS_HELPER_LIBLASTLOG2_Y2038_SQLITE2_TIME
+
+$TS_HELPER_LIBLASTLOG2_Y2038_SQLITE2_TIME >/dev/null || ts_failed "returned an error"
+
+rm y2038-sqlite3-time.db
+
+ts_finalize
diff --git a/tests/ts/liblastlog2/write_read_user b/tests/ts/liblastlog2/write_read_user
new file mode 100755
index 0000000..8a6028a
--- /dev/null
+++ b/tests/ts/liblastlog2/write_read_user
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="write_read_user"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command $TS_HELPER_LIBLASTLOG2_WRITE_READ_USER
+
+$TS_HELPER_LIBLASTLOG2_WRITE_READ_USER || ts_failed "returned an error"
+
+rm tst-write-read-user.db
+
+ts_finalize
diff --git a/tests/ts/liblastlog2/y2038_ll2_read_all b/tests/ts/liblastlog2/y2038_ll2_read_all
new file mode 100755
index 0000000..da779c2
--- /dev/null
+++ b/tests/ts/liblastlog2/y2038_ll2_read_all
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="y2038_ll2_read_all"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command $TS_HELPER_LIBLASTLOG2_Y2038_LL2_READ_ALL
+
+$TS_HELPER_LIBLASTLOG2_Y2038_LL2_READ_ALL >/dev/null || ts_failed "returned an error"
+
+rm y2038-ll2_read_all.db
+
+ts_finalize
diff --git a/tests/ts/libmount/optlist b/tests/ts/libmount/optlist
new file mode 100755
index 0000000..8499496
--- /dev/null
+++ b/tests/ts/libmount/optlist
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+# Copyright (C) 2010 Karel Zak <kzak@redhat.com>
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="options string"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command $TS_HELPER_LIBMOUNT_OPTLIST
+
+TESTPROG="$TS_HELPER_LIBMOUNT_OPTLIST"
+
+ts_init_subtest "append"
+ts_run $TESTPROG --append-str "aaa,bbb=BBB,context=\"foo,bar,gogo\",ccc" "ddd" &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "append-value"
+ts_run $TESTPROG --append-str "aaa,bbb=BBB,ccc" "ddd=DDD" &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "append-empty-value"
+ts_run $TESTPROG --append-str "aaa,bbb=BBB,ccc" "ddd=" &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "prepend"
+ts_run $TESTPROG --prepend-str "aaa,bbb=BBB,ccc" "ddd" &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "prepend-list"
+ts_run $TESTPROG --prepend-str "aaa,bbb=BBB,ccc" "ddd,eee=EEE,fff" &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "prepend-value"
+ts_run $TESTPROG --prepend-str "aaa,bbb=BBB,ccc" "ddd=DDD" &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "prepend-empty-value"
+ts_run $TESTPROG --prepend-str "aaa,bbb=BBB,ccc" "ddd=" &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "set"
+ts_run $TESTPROG --set-str "aaa,bbb=BBB,ccc" "new,data,for,list" &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "get-str"
+ts_run $TESTPROG --get-str "aaa,bbb=BBB,ccc,defaults" &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "get-str-linux"
+ts_run $TESTPROG --get-str "noexec,noauto,user,defaults" linux &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "get-str-user"
+ts_run $TESTPROG --get-str "noexec,noauto,user,defaults" user &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "get-flg-linux"
+ts_run $TESTPROG --get-flg "noexec,noauto,user,defaults" linux &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_init_subtest "get-flg-user"
+ts_run $TESTPROG --get-flg "noexec,noauto,user,defaults" user &> $TS_OUTPUT
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/libmount/optstr b/tests/ts/libmount/optstr
index 26d9b73..979517e 100755
--- a/tests/ts/libmount/optstr
+++ b/tests/ts/libmount/optstr
@@ -8,9 +8,9 @@ TS_DESC="options string"
. "$TS_TOPDIR"/functions.sh
ts_init "$*"
-TESTPROG="$TS_HELPER_LIBMOUNT_OPTSTR"
+ts_check_test_command $TS_HELPER_LIBMOUNT_OPTSTR
-[ -x $TESTPROG ] || ts_skip "test not compiled"
+TESTPROG="$TS_HELPER_LIBMOUNT_OPTSTR"
ts_init_subtest "append"
ts_run $TESTPROG --append "aaa,bbb=BBB,context=\"foo,bar,gogo\",ccc" "ddd" &> $TS_OUTPUT
@@ -28,6 +28,10 @@ ts_init_subtest "prepend"
ts_run $TESTPROG --prepend "aaa,bbb=BBB,ccc" "ddd" &> $TS_OUTPUT
ts_finalize_subtest
+ts_init_subtest "prepend-list"
+ts_run $TESTPROG --prepend "aaa,bbb=BBB,ccc" "ddd,eee=EEE,fff" &> $TS_OUTPUT
+ts_finalize_subtest
+
ts_init_subtest "prepend-value"
ts_run $TESTPROG --prepend "aaa,bbb=BBB,ccc" "ddd" "DDD" &> $TS_OUTPUT
ts_finalize_subtest
diff --git a/tests/ts/libmount/update b/tests/ts/libmount/update
index ba93e0b..b8f7488 100755
--- a/tests/ts/libmount/update
+++ b/tests/ts/libmount/update
@@ -7,7 +7,6 @@ TS_DESC="tab update"
. "$TS_TOPDIR"/functions.sh
ts_init "$*"
-ts_skip_nonroot
TESTPROG="$TS_HELPER_LIBMOUNT_UPDATE"
diff --git a/tests/ts/libmount/update-py b/tests/ts/libmount/update-py
index bfb8441..b4450c4 100755
--- a/tests/ts/libmount/update-py
+++ b/tests/ts/libmount/update-py
@@ -8,7 +8,6 @@ TS_DESC="tab update-py"
. "$TS_TOPDIR"/functions.sh
ts_init "$*"
ts_init_py libmount
-ts_skip_nonroot
if [ "$TS_ENABLE_ASAN" == "yes" -o "$TS_ENABLE_UBSAN" == "yes" ]; then
TS_KNOWN_FAIL="yes"
diff --git a/tests/ts/libsmartcols/continuous-json b/tests/ts/libsmartcols/continuous-json
new file mode 100755
index 0000000..8456d6b
--- /dev/null
+++ b/tests/ts/libsmartcols/continuous-json
@@ -0,0 +1,28 @@
+#!/bin/bash
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="title"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+TESTPROG="$TS_HELPER_LIBSMARTCOLS_CONTINUOUS_JSON"
+ts_check_test_command "$TESTPROG"
+
+ts_run $TESTPROG --width 80 >> $TS_OUTPUT 2>> $TS_ERRLOG
+
+ts_finalize
diff --git a/tests/ts/libsmartcols/files/col-bool b/tests/ts/libsmartcols/files/col-bool
new file mode 100644
index 0000000..c3324e8
--- /dev/null
+++ b/tests/ts/libsmartcols/files/col-bool
@@ -0,0 +1 @@
+name=BOOL,right,type=boolean,json=boolean
diff --git a/tests/ts/libsmartcols/files/col-float b/tests/ts/libsmartcols/files/col-float
new file mode 100644
index 0000000..7069dc7
--- /dev/null
+++ b/tests/ts/libsmartcols/files/col-float
@@ -0,0 +1 @@
+name=NUM,right,type=float,json=float
diff --git a/tests/ts/libsmartcols/files/col-hidden b/tests/ts/libsmartcols/files/col-hidden
index 83182a8..9bbb15f 100644
--- a/tests/ts/libsmartcols/files/col-hidden
+++ b/tests/ts/libsmartcols/files/col-hidden
@@ -1,3 +1 @@
-FOO
-0
-hidden
+name=FOO,hidden
diff --git a/tests/ts/libsmartcols/files/col-id b/tests/ts/libsmartcols/files/col-id
index 0188f42..8a800fc 100644
--- a/tests/ts/libsmartcols/files/col-id
+++ b/tests/ts/libsmartcols/files/col-id
@@ -1,3 +1 @@
-ID
-0
-right
+name=ID,right,type=number,json=number
diff --git a/tests/ts/libsmartcols/files/col-name b/tests/ts/libsmartcols/files/col-name
index 0a98f29..4fed26f 100644
--- a/tests/ts/libsmartcols/files/col-name
+++ b/tests/ts/libsmartcols/files/col-name
@@ -1,3 +1 @@
-NAME
-0
-none
+name=NAME
diff --git a/tests/ts/libsmartcols/files/col-noextremes b/tests/ts/libsmartcols/files/col-noextremes
index 715edce..7df2e2f 100644
--- a/tests/ts/libsmartcols/files/col-noextremes
+++ b/tests/ts/libsmartcols/files/col-noextremes
@@ -1,3 +1 @@
-NOEXTREME
-0
-noextremes
+name=NOEXTREME,noextremes
diff --git a/tests/ts/libsmartcols/files/col-number b/tests/ts/libsmartcols/files/col-number
index 34a70e4..0f880ff 100644
--- a/tests/ts/libsmartcols/files/col-number
+++ b/tests/ts/libsmartcols/files/col-number
@@ -1,3 +1 @@
-NUM
-0
-right
+name=NUM,right,type=number,json=number
diff --git a/tests/ts/libsmartcols/files/col-parent b/tests/ts/libsmartcols/files/col-parent
index 86fe08c..be25a82 100644
--- a/tests/ts/libsmartcols/files/col-parent
+++ b/tests/ts/libsmartcols/files/col-parent
@@ -1,3 +1 @@
-PARENT
-0
-right
+name=PARENT,right,type=number
diff --git a/tests/ts/libsmartcols/files/col-strict b/tests/ts/libsmartcols/files/col-strict
index 62bb96b..8381f92 100644
--- a/tests/ts/libsmartcols/files/col-strict
+++ b/tests/ts/libsmartcols/files/col-strict
@@ -1,3 +1 @@
-STRICT
-20
-strictwidth,right
+name=STRICT,strictwidth,right,width=20
diff --git a/tests/ts/libsmartcols/files/col-string b/tests/ts/libsmartcols/files/col-string
index 7e2904b..e96c37f 100644
--- a/tests/ts/libsmartcols/files/col-string
+++ b/tests/ts/libsmartcols/files/col-string
@@ -1,3 +1 @@
-STRINGS
-0
-none
+name=STRINGS
diff --git a/tests/ts/libsmartcols/files/col-tree b/tests/ts/libsmartcols/files/col-tree
index 5076880..6c69ca0 100644
--- a/tests/ts/libsmartcols/files/col-tree
+++ b/tests/ts/libsmartcols/files/col-tree
@@ -1,3 +1 @@
-TREE
-0
-tree
+name=TREE,tree
diff --git a/tests/ts/libsmartcols/files/col-trunc b/tests/ts/libsmartcols/files/col-trunc
index 2887b43..55c9a70 100644
--- a/tests/ts/libsmartcols/files/col-trunc
+++ b/tests/ts/libsmartcols/files/col-trunc
@@ -1,3 +1 @@
-TRUNC
-0
-trunc
+name=TRUNC,trunc
diff --git a/tests/ts/libsmartcols/files/col-wrap b/tests/ts/libsmartcols/files/col-wrap
index dc4ca34..c8e622d 100644
--- a/tests/ts/libsmartcols/files/col-wrap
+++ b/tests/ts/libsmartcols/files/col-wrap
@@ -1,3 +1 @@
-WRAP
-0
-wrap
+name=WRAP,wrap
diff --git a/tests/ts/libsmartcols/files/col-wrapnl b/tests/ts/libsmartcols/files/col-wrapnl
index 0a18fd1..fcbc217 100644
--- a/tests/ts/libsmartcols/files/col-wrapnl
+++ b/tests/ts/libsmartcols/files/col-wrapnl
@@ -1,3 +1 @@
-WRAPNL
-0
-wrapnl
+name=WRAPNL,wrapnl
diff --git a/tests/ts/libsmartcols/files/col-wrapzero b/tests/ts/libsmartcols/files/col-wrapzero
new file mode 100644
index 0000000..b197014
--- /dev/null
+++ b/tests/ts/libsmartcols/files/col-wrapzero
@@ -0,0 +1 @@
+name=WRAPZERO,wrapzero
diff --git a/tests/ts/libsmartcols/files/data-bool b/tests/ts/libsmartcols/files/data-bool
new file mode 100644
index 0000000..d6bda92
--- /dev/null
+++ b/tests/ts/libsmartcols/files/data-bool
@@ -0,0 +1,10 @@
+0
+1
+
+0
+true
+false
+FALSE
+TRUE
+0
+1
diff --git a/tests/ts/libsmartcols/files/data-float b/tests/ts/libsmartcols/files/data-float
new file mode 100644
index 0000000..ead3d90
--- /dev/null
+++ b/tests/ts/libsmartcols/files/data-float
@@ -0,0 +1,10 @@
+0
+100
+100.5
+99.9
+411
+5111
+678993321
+7666666
+8000
+8000.5
diff --git a/tests/ts/libsmartcols/files/data-string-nl b/tests/ts/libsmartcols/files/data-string-nl
index 7822e57..ef16a72 100644
--- a/tests/ts/libsmartcols/files/data-string-nl
+++ b/tests/ts/libsmartcols/files/data-string-nl
@@ -1,10 +1,10 @@
aaa
bbbbb
-cccc\nCCCC
-dddddddd\nDDDD\nDD
-hello\nbaby
-aaa\nbbb\nccc\nddd
+cccc\x0ACCCC
+dddddddd\x0ADDDD\x0ADD
+hello\x0Ababy
+aaa\x0Abbb\x0Accc\x0Addd
eee
fffff
-g\nhhhhh
+g\x0Ahhhhh
ppppppppp
diff --git a/tests/ts/libsmartcols/files/data-string-zero b/tests/ts/libsmartcols/files/data-string-zero
new file mode 100644
index 0000000..5f936f1
--- /dev/null
+++ b/tests/ts/libsmartcols/files/data-string-zero
@@ -0,0 +1,10 @@
+aaa
+bbbbb
+cccc\x00CCCC
+dddddddd\x00DDDD\x00DD
+hello\x00baby
+aaa\x00bbb\x00ccc\x00ddd
+eee
+fffff
+g\x00hhhhh
+ppppppppp
diff --git a/tests/ts/libsmartcols/filter b/tests/ts/libsmartcols/filter
new file mode 100755
index 0000000..2025ef5
--- /dev/null
+++ b/tests/ts/libsmartcols/filter
@@ -0,0 +1,217 @@
+#!/bin/bash
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+#
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="fromfile"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+TESTPROG="$TS_HELPER_LIBSMARTCOLS_FROMFILE"
+ts_check_test_command "$TESTPROG"
+
+### Number
+#
+prefix="number"
+declare -A FILTERS
+
+FILTERS["is"]='NUM'
+FILTERS["neg"]='!NUM'
+FILTERS["and"]='NUM && NAME'
+FILTERS["or"]='NUM || NAME'
+
+FILTERS["eq"]='NUM == 100'
+FILTERS["ne"]='NUM != 100'
+
+FILTERS["gt"]='NUM > 8000'
+FILTERS["ge"]='NUM >= 100'
+FILTERS["lt"]='NUM < 100'
+FILTERS["le"]='NUM <= 100'
+
+FILTERS["expr-and-expr"]='NUM > 10 && NUM < 8000'
+FILTERS["expr-or-expr"]='NUM == 3 || NUM == 100'
+FILTERS["and-or"]='(NUM >= 3 && NUM <= 100) || NUM == 0'
+
+FILTERS["as-string"]='NUM == "100"'
+
+printf '%s\n' "${!FILTERS[@]}" | sort | while read name; do
+ ts_init_subtest "$prefix-$name"
+ echo "expr: ${FILTERS[$name]}" >> $TS_OUTPUT
+ echo >> $TS_OUTPUT
+ ts_run $TESTPROG --nlines 10 --width 80 \
+ --filter "${FILTERS[$name]}" \
+ --column $TS_SELF/files/col-name \
+ --column $TS_SELF/files/col-number \
+ $TS_SELF/files/data-string \
+ $TS_SELF/files/data-number \
+ >> $TS_OUTPUT 2> /dev/null
+ ts_finalize_subtest
+done
+FILTERS=()
+
+
+### Float
+#
+prefix="float"
+declare -A FILTERS
+
+FILTERS["is"]='NUM'
+FILTERS["neg"]='!NUM'
+FILTERS["and"]='NUM && NAME'
+FILTERS["or"]='NUM || NAME'
+
+FILTERS["eq"]='NUM == 100'
+FILTERS["eq2"]='NUM == 100.5'
+
+FILTERS["ne"]='NUM != 100'
+FILTERS["ne2"]='NUM != 100.5'
+
+FILTERS["gt"]='NUM > 8000'
+FILTERS["gt2"]='NUM > 8000.5'
+
+FILTERS["ge"]='NUM >= 100'
+FILTERS["ge2"]='NUM >= 100.5'
+
+FILTERS["lt"]='NUM < 100'
+FILTERS["lt2"]='NUM < 100.5'
+
+FILTERS["le"]='NUM <= 100'
+FILTERS["le2"]='NUM <= 100.5'
+
+FILTERS["as-string"]='NUM == "100"'
+FILTERS["as-string2"]='NUM == "100.5"'
+
+printf '%s\n' "${!FILTERS[@]}" | sort | while read name; do
+ ts_init_subtest "$prefix-$name"
+ echo "expr: ${FILTERS[$name]}" >> $TS_OUTPUT
+ echo >> $TS_OUTPUT
+ ts_run $TESTPROG --nlines 10 --width 80 \
+ --filter "${FILTERS[$name]}" \
+ --column $TS_SELF/files/col-name \
+ --column $TS_SELF/files/col-float \
+ $TS_SELF/files/data-string \
+ $TS_SELF/files/data-float \
+ >> $TS_OUTPUT 2> /dev/null
+ ts_finalize_subtest
+done
+FILTERS=()
+
+### Boolean
+#
+prefix="bool"
+declare -A FILTERS
+
+FILTERS["is"]='BOOL'
+FILTERS["neg"]='!BOOL'
+FILTERS["and"]='BOOL && NAME'
+FILTERS["or"]='BOOL || NAME'
+
+FILTERS["eq-true"]='BOOL == TRUE'
+FILTERS["eq-true2"]='BOOL == true'
+FILTERS["eq-true3"]='BOOL == 1'
+
+FILTERS["eq-false"]='BOOL == FALSE'
+FILTERS["eq-false2"]='BOOL == false'
+FILTERS["eq-false3"]='BOOL == 0'
+
+FILTERS["ne"]='BOOL != false'
+FILTERS["ne2"]='BOOL != true'
+
+FILTERS["as-string"]='BOOL == "0"'
+FILTERS["as-string2"]='BOOL == "1"'
+
+printf '%s\n' "${!FILTERS[@]}" | sort | while read name; do
+ ts_init_subtest "$prefix-$name"
+ echo "expr: ${FILTERS[$name]}" >> $TS_OUTPUT
+ echo >> $TS_OUTPUT
+ ts_run $TESTPROG --nlines 10 --width 80 \
+ --filter "${FILTERS[$name]}" \
+ --column $TS_SELF/files/col-name \
+ --column $TS_SELF/files/col-bool \
+ $TS_SELF/files/data-string \
+ $TS_SELF/files/data-bool \
+ >> $TS_OUTPUT 2> /dev/null
+ ts_finalize_subtest
+done
+FILTERS=()
+
+
+### Strings
+#
+prefix="string"
+declare -A FILTERS
+
+FILTERS["is"]='NAME'
+FILTERS["neg"]='!NAME'
+
+FILTERS["eq"]='NAME == "bbb"'
+FILTERS["ne"]='NAME != "bbb"'
+
+FILTERS["gt"]='NAME > "bbb"'
+FILTERS["ge"]='NAME >= "bbb"'
+FILTERS["lt"]='NAME < "bbb"'
+FILTERS["le"]='NAME <= "bbb"'
+
+FILTERS["reg"]='NAME =~ "aaa.*"'
+FILTERS["nreg"]='NAME !~ "aaa.*"'
+
+printf '%s\n' "${!FILTERS[@]}" | sort | while read name; do
+ ts_init_subtest "$prefix-$name"
+ echo "expr: ${FILTERS[$name]}" >> $TS_OUTPUT
+ echo >> $TS_OUTPUT
+ ts_run $TESTPROG --nlines 10 --width 80 \
+ --filter "${FILTERS[$name]}" \
+ --column $TS_SELF/files/col-name \
+ $TS_SELF/files/data-string \
+ >> $TS_OUTPUT 2> /dev/null
+ ts_finalize_subtest
+done
+FILTERS=()
+
+
+### Broken
+#
+prefix="broken"
+declare -A FILTERS
+
+FILTERS["no-start"]='NUM == 100)'
+FILTERS["no-close"]='(NUM == 100'
+FILTERS["no-column"]=' == 100'
+FILTERS["no-param"]='NUM == '
+FILTERS["bad-oper"]='NUM ** 100'
+FILTERS["bad-oper2"]='NUM = 100'
+FILTERS["bad-column"]='XXX == 100'
+FILTERS["bad-number"]='NUM == 1y0'
+FILTERS["bad-float"]='NUM == 100 . 5'
+
+printf '%s\n' "${!FILTERS[@]}" | sort | while read name; do
+ ts_init_subtest "$prefix-$name"
+ echo "expr: ${FILTERS[$name]}" >> $TS_OUTPUT
+ echo >> $TS_OUTPUT
+ ts_run $TESTPROG --nlines 10 --width 80 \
+ --filter "${FILTERS[$name]}" \
+ --column $TS_SELF/files/col-number \
+ $TS_SELF/files/data-number \
+ 2>> $TS_OUTPUT 1> /dev/null
+
+ sed -i -e 's/syntax error.*/<bison syntax error message removed>/g' $TS_OUTPUT
+ ts_finalize_subtest
+done
+FILTERS=()
+
+
+ts_log "...done."
+ts_finalize
diff --git a/tests/ts/libsmartcols/fromfile b/tests/ts/libsmartcols/fromfile
index 45b8471..c11140c 100755
--- a/tests/ts/libsmartcols/fromfile
+++ b/tests/ts/libsmartcols/fromfile
@@ -249,6 +249,32 @@ ts_run $TESTPROG --nlines 10 \
>> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
+ts_init_subtest "wrapzero"
+ts_run $TESTPROG --nlines 10 \
+ --column $TS_SELF/files/col-name \
+ --column $TS_SELF/files/col-number \
+ --column $TS_SELF/files/col-wrapzero \
+ $TS_SELF/files/data-string \
+ $TS_SELF/files/data-number \
+ $TS_SELF/files/data-string-zero \
+ >> $TS_OUTPUT 2>> $TS_ERRLOG
+ts_finalize_subtest
+
+ts_init_subtest "wrapzero-tree"
+ts_run $TESTPROG --nlines 10 \
+ --tree-id-column 1 \
+ --tree-parent-column 2 \
+ --column $TS_SELF/files/col-tree \
+ --column $TS_SELF/files/col-id \
+ --column $TS_SELF/files/col-parent \
+ --column $TS_SELF/files/col-wrapzero \
+ $TS_SELF/files/data-string \
+ $TS_SELF/files/data-id \
+ $TS_SELF/files/data-parent \
+ $TS_SELF/files/data-string-zero \
+ >> $TS_OUTPUT 2>> $TS_ERRLOG
+ts_finalize_subtest
+
ts_init_subtest "raw"
ts_run $TESTPROG --nlines 10 --raw \
--column $TS_SELF/files/col-name \
diff --git a/tests/ts/lscpu/dumps/rv64-visionfive2.tar.gz b/tests/ts/lscpu/dumps/rv64-visionfive2.tar.gz
new file mode 100644
index 0000000..23666f1
--- /dev/null
+++ b/tests/ts/lscpu/dumps/rv64-visionfive2.tar.gz
Binary files differ
diff --git a/tests/ts/lsfd/column-ainodeclass b/tests/ts/lsfd/column-ainodeclass
index 6391c48..6829494 100755
--- a/tests/ts/lsfd/column-ainodeclass
+++ b/tests/ts/lsfd/column-ainodeclass
@@ -38,11 +38,11 @@ for C in pidfd inotify; do
${TS_CMD_LSFD} -n -o ASSOC,STTYPE,AINODECLASS -p "${PID}" -Q "${EXPR}"
echo "$C"':ASSOC,STTYPE,AINODECLASS': $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
} > "$TS_OUTPUT" 2>&1
- if [ "$C-$?" == "pidfd-$ENOSYS" ]; then
+ if [ "$C-$?" == "pidfd-$TS_EXIT_NOTSUPP" ]; then
ts_skip_subtest "pidfd_open(2) is not available"
continue
fi
diff --git a/tests/ts/lsfd/column-deleted b/tests/ts/lsfd/column-deleted
new file mode 100755
index 0000000..128cd0e
--- /dev/null
+++ b/tests/ts/lsfd/column-deleted
@@ -0,0 +1,61 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="DELETED column"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD=3
+EXPR=
+
+C=make-regular-file
+ts_init_subtest $C
+{
+ target=util-linux-lsfd-test-make-regular-file
+ coproc MKFDS { "$TS_HELPER_MKFDS" "$C" "$FD" file="$target" delete=1; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(FD == '"$FD"')'
+ ${TS_CMD_LSFD} -p "$PID" -n -o DELETED -Q "${EXPR}"
+ echo "$C: DELETED: " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+wait "${MKFDS_PID}"
+ts_finalize_subtest
+
+C=ro-regular-file
+ts_init_subtest $C
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" "$C" "$FD"; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(FD == '"$FD"')'
+ ${TS_CMD_LSFD} -p "$PID" -n -o DELETED -Q "${EXPR}"
+ echo "$C: DELETED: " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+wait "${MKFDS_PID}"
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/lsfd/column-kthread b/tests/ts/lsfd/column-kthread
index 0b093e9..2238ade 100755
--- a/tests/ts/lsfd/column-kthread
+++ b/tests/ts/lsfd/column-kthread
@@ -31,7 +31,7 @@ ts_check_prog "ps"
ts_cd "$TS_OUTDIR"
{
- "$TS_CMD_LSFD" -o COMMAND,PID,USER,MODE,TYPE,NAME,KTHREAD \
+ "$TS_CMD_LSFD" --threads -o COMMAND,PID,USER,MODE,TYPE,NAME,KTHREAD \
-Q '(PID < 3) and ((ASSOC == "cwd") or (ASSOC == "rtd"))'
echo $?
} > $TS_OUTPUT 2>&1
diff --git a/tests/ts/lsfd/column-name b/tests/ts/lsfd/column-name
index 5dc491a..8bf8f42 100755
--- a/tests/ts/lsfd/column-name
+++ b/tests/ts/lsfd/column-name
@@ -60,15 +60,31 @@ for C in ro-regular-file pidfd socketpair; do
}
echo "$C"':ASSOC,KNAME,NAME': ${PIPESTATUS[0]}
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
} > "$TS_OUTPUT" 2>&1
wait "${MKFDS_PID}"
- if [ "$C-$?" == "pidfd-$ENOSYS" ]; then
+ if [ "$C-$?" == "pidfd-$TS_EXIT_NOTSUPP" ]; then
ts_skip_subtest "pidfd_open(2) is not available"
continue
fi
ts_finalize_subtest
done
+C=make-regular-file
+ts_init_subtest deleted-file
+{
+ target=tmp-column-name
+ coproc MKFDS { "$TS_HELPER_MKFDS" $C $FD file=tmp-column-name delete=1; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ ${TS_CMD_LSFD} -n -o DELETED,NAME -p "${PID}" -Q "${EXPR}" |
+ sed -e 's#.*/\([^/]\+\)#\1#'
+ echo "$C: DELETED,NAME: " ${PIPESTATUS[0]}
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+wait "${MKFDS_PID}"
+ts_finalize_subtest
+
ts_finalize
diff --git a/tests/ts/lsfd/column-source b/tests/ts/lsfd/column-source
new file mode 100755
index 0000000..a74f9de
--- /dev/null
+++ b/tests/ts/lsfd/column-source
@@ -0,0 +1,51 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="SOURCE column"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+. "$TS_SELF/lsfd-functions.bash"
+ts_check_test_command "$TS_CMD_LSFD"
+
+ts_cd "$TS_OUTDIR"
+
+declare -a NAMESPACES=(
+ cgorup
+ ipc
+ mnt
+ net
+ pid
+ pid4c
+ # older kernel doesn't support time namespace.
+ # time
+ # time4c
+ user
+ uts
+)
+ts_init_subtest namespace-ASSOC
+{
+ EXPR="false"
+ for ns in "${NAMESPACES[@]}"; do
+ EXPR=${EXPR}' || (ASSOC == "'"$ns"'")'
+ done
+ ${TS_CMD_LSFD} -p $$ -n -o ASSOC,SOURCE -Q "$EXPR"
+} > "$TS_OUTPUT" 2>&1
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/lsfd/column-source-with-root b/tests/ts/lsfd/column-source-with-root
new file mode 100755
index 0000000..c00ee15
--- /dev/null
+++ b/tests/ts/lsfd/column-source-with-root
@@ -0,0 +1,44 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="SOURCE column (requiring the root privilege)"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+ts_skip_nonroot
+ts_skip_docker
+
+. "$TS_SELF/lsfd-functions.bash"
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+EXPR='(NAME =~ "/SYSV.*")'
+ts_init_subtest SysVIPC-shmem
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" sysvshm; }
+ if read -u ${MKFDS[0]} PID; then
+ ${TS_CMD_LSFD} -p "$PID" -n -o ASSOC,SOURCE -Q "${EXPR}"
+ echo 'ASSOC,SOURCE': $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait ${MKFDS_PID}
+} > "$TS_OUTPUT" 2>&1
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/lsfd/column-type b/tests/ts/lsfd/column-type
index cf6175e..77bc5c9 100755
--- a/tests/ts/lsfd/column-type
+++ b/tests/ts/lsfd/column-type
@@ -46,11 +46,11 @@ for C in ro-regular-file pidfd inotify socketpair; do
${TS_CMD_LSFD} -n -o ASSOC,STTYPE,TYPE -p "${PID}" -Q "${EXPR}"
echo "$C"':ASSOC,STTYPE,TYPE': $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
} > "$TS_OUTPUT" 2>&1
- if [ "$C-$?" == "pidfd-$ENOSYS" ]; then
+ if [ "$C-$?" == "pidfd-$TS_EXIT_NOTSUPP" ]; then
ts_skip_subtest "pidfd_open(2) is not available"
continue
fi
diff --git a/tests/ts/lsfd/column-xmode b/tests/ts/lsfd/column-xmode
new file mode 100755
index 0000000..1e719a4
--- /dev/null
+++ b/tests/ts/lsfd/column-xmode
@@ -0,0 +1,202 @@
+#!/bin/bash
+#
+# Copyright (C) 2022 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="MODE and XMODE columns"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+. "$TS_SELF/lsfd-functions.bash"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_check_prog "stat"
+
+ts_cd "$TS_OUTDIR"
+
+INO=$(stat -c '%i' "$TS_HELPER_MKFDS")
+PID=
+FD=3
+
+
+EXPR="(FD == 3)"
+ts_init_subtest "MODE-r-bit"
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" ro-regular-file $FD; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o MODE -p "${PID}" -Q "${EXPR}"
+ echo "MODE(r-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+wait "${MKFDS_PID}"
+ts_finalize_subtest
+
+ts_init_subtest "XMODE-r-bit"
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" ro-regular-file $FD; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o XMODE -p "${PID}" -Q "${EXPR}"
+ echo "XMODE(r-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+wait "${MKFDS_PID}"
+ts_finalize_subtest
+
+EXPR="(FD == $((FD + 1)))"
+ts_init_subtest "MODE-w-bit"
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" pipe-no-fork $FD $((FD + 1)); }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o MODE -p "${PID}" -Q "${EXPR}"
+ echo "MODE(w-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+wait "${MKFDS_PID}"
+ts_finalize_subtest
+
+ts_init_subtest "XMODE-w-bit"
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" pipe-no-fork $FD $((FD + 1)); }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o XMODE -p "${PID}" -Q "${EXPR}"
+ echo "XMODE(w-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+wait "${MKFDS_PID}"
+ts_finalize_subtest
+
+EXPR='(ASSOC == "mem") and (INODE == '"$INO"') and (MODE != "r--") and (MODE != "rw-") and (MODE != "rwx")'
+ts_init_subtest "MODE-x-bit"
+if [ "$QEMU_USER" == "1" ]; then
+ ts_skip_subtest "running under qemu-user emulation"
+else
+ {
+ coproc MKFDS { "$TS_HELPER_MKFDS" ro-regular-file $FD; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o MODE -p "${PID}" -Q "${EXPR}"
+ echo "MODE(x-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ } > "$TS_OUTPUT" 2>&1
+ wait "${MKFDS_PID}"
+ ts_finalize_subtest
+fi
+
+ts_init_subtest "XMODE-x-bit"
+if [ "$QEMU_USER" == "1" ]; then
+ ts_skip_subtest "running under qemu-user emulation"
+else
+ {
+ coproc MKFDS { "$TS_HELPER_MKFDS" ro-regular-file $FD; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o XMODE -p "${PID}" -Q "${EXPR}"
+ echo "XMODE(x-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ } > "$TS_OUTPUT" 2>&1
+ wait "${MKFDS_PID}"
+ ts_finalize_subtest
+fi
+
+FILE=./test_mkfds_make_regular_file
+EXPR='(FD == '"$FD"')'
+ts_init_subtest "XMODE-D-bit"
+{
+ rm -f "${FILE}"
+ coproc MKFDS { "$TS_HELPER_MKFDS" make-regular-file $FD file="$FILE" delete=1; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o XMODE -p "${PID}" -Q "${EXPR}"
+ echo "XMODE(D-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+wait "${MKFDS_PID}"
+ts_finalize_subtest
+
+for m in flock-sh posix-r- ofd-r-; do
+ ts_init_subtest "XMODE-l-bit-$m"
+ {
+ rm -f "${FILE}"
+ coproc MKFDS { "$TS_HELPER_MKFDS" make-regular-file $FD file="$FILE" lock=$m; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o XMODE -p "${PID}" -Q "${EXPR}"
+ echo "XMODE(l-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ } > "$TS_OUTPUT" 2>&1
+ wait "${MKFDS_PID}"
+ if [ "$?" == "$TS_EXIT_NOTSUPP" ]; then
+ ts_skip_subtest "$m lock is not available"
+ continue
+ fi
+ ts_finalize_subtest
+done
+
+ts_init_subtest "XMODE-l-bit-lease-r"
+f=ro-regular-file-read-lease
+touch "$f"
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" ro-regular-file $FD file=$f read-lease=1; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o XMODE -p "${PID}" -Q "${EXPR}"
+ echo "XMODE(l-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+wait "${MKFDS_PID}"
+rm -f "$f"
+ts_finalize_subtest
+
+for m in flock-ex posix--w posix-rw ofd--w ofd-rw lease-w; do
+ ts_init_subtest "XMODE-L-bit-$m"
+ {
+ rm -f "${FILE}"
+ coproc MKFDS { "$TS_HELPER_MKFDS" make-regular-file $FD file="$FILE" lock=$m; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o XMODE -p "${PID}" -Q "${EXPR}"
+ echo "XMODE(L-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ } > "$TS_OUTPUT" 2>&1
+ wait "${MKFDS_PID}"
+ if [ "$?" == "$TS_EXIT_NOTSUPP" ]; then
+ ts_skip_subtest "$m lock is not available"
+ continue
+ fi
+ ts_finalize_subtest
+done
+
+M0=6
+M1=9
+EXPR="(FD == $M0) or (FD == $M1)"
+ts_init_subtest "XMODE-m-bit"
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" eventpoll $FD $M0 $M1; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -n -o XMODE -p "${PID}" -Q "${EXPR}"
+ echo "XMODE(m-bit): " $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+wait "${MKFDS_PID}"
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/lsfd/option-filter-broken-exp b/tests/ts/lsfd/filter-broken-exp
index bedf439..1854e50 100755
--- a/tests/ts/lsfd/option-filter-broken-exp
+++ b/tests/ts/lsfd/filter-broken-exp
@@ -25,12 +25,13 @@ ts_check_test_command "$TS_CMD_LSFD"
ts_cd "$TS_OUTDIR"
{
- $TS_CMD_LSFD -Q ''
$TS_CMD_LSFD -Q '('
$TS_CMD_LSFD -Q ')'
$TS_CMD_LSFD -Q '(FD == 1)garbage'
- $TS_CMD_LSFD -Q 'FD'
$TS_CMD_LSFD -Q 'NOSUCHCOLUMN'
} > $TS_OUTPUT 2>&1
+sed -i -e 's/syntax error.*/<bison syntax error message removed>/g' \
+ $TS_OUTPUT $TS_ERRLOG
+
ts_finalize
diff --git a/tests/ts/lsfd/filter-floating-point-nums b/tests/ts/lsfd/filter-floating-point-nums
new file mode 100755
index 0000000..7f66dd5
--- /dev/null
+++ b/tests/ts/lsfd/filter-floating-point-nums
@@ -0,0 +1,90 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="timerfd"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD=3
+EXPR=
+
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" timerfd $FD clockid=realtime remaining=0 interval=10 interval-nanofrac=000050000; }
+ if read -u ${MKFDS[0]} PID; then
+
+ PID_1=$((PID -1))
+ EXPR="(PID > ${PID_1}.9) and (PID < ${PID}.1) and (ASSOC == 'exe')"
+ PID_0=$(${TS_CMD_LSFD} -n -r -o PID -Q "$EXPR")
+ echo "pid in a range:" $?
+
+ if [[ "${PID_0}" == "${PID}" ]]; then
+ echo "coparing pids": $?
+ else
+ echo "coparing pids": $? "PID_0:${PID_0} == PID:${PID}"
+ fi
+
+ EXPR='(TIMERFD.INTERVAL < 10.000051) and (TIMERFD.INTERVAL > 10)'
+ ${TS_CMD_LSFD} -n -r -o FD,TIMERFD.INTERVAL -p "$PID" -Q "$EXPR"
+ echo "FD,TIMERFD.INTERVAL: $EXPR": $?
+
+ EXPR='(TIMERFD.INTERVAL <= 10) and (TIMERFD.INTERVAL > 9.99)'
+ ${TS_CMD_LSFD} -n -r -o FD,TIMERFD.INTERVAL -p "$PID" -Q "$EXPR"
+ echo "FD,TIMERFD.INTERVAL: $EXPR": $?
+
+ EXPR='(TIMERFD.INTERVAL >= 10)'
+ ${TS_CMD_LSFD} -n -r -o FD,TIMERFD.INTERVAL -p "$PID" -Q "$EXPR"
+ echo "FD,TIMERFD.INTERVAL: $EXPR": $?
+
+ EXPR='(TIMERFD.INTERVAL >= 10.0)'
+ ${TS_CMD_LSFD} -n -r -o FD,TIMERFD.INTERVAL -p "$PID" -Q "$EXPR"
+ echo "FD,TIMERFD.INTERVAL: $EXPR": $?
+
+
+ EXPR='(TIMERFD.INTERVAL < 10) and (0 < TIMERFD.INTERVAL)'
+ ${TS_CMD_LSFD} -n -r -o FD,TIMERFD.INTERVAL -p "$PID" -Q "$EXPR"
+ echo "FD,TIMERFD.INTERVAL: $EXPR": $?
+
+ EXPR='(TIMERFD.INTERVAL < 10) and (0.0 < TIMERFD.INTERVAL)'
+ ${TS_CMD_LSFD} -n -r -o FD,TIMERFD.INTERVAL -p "$PID" -Q "$EXPR"
+ echo "FD,TIMERFD.INTERVAL: $EXPR": $?
+
+ EXPR='(TIMERFD.INTERVAL > 11)'
+ ${TS_CMD_LSFD} -n -r -o FD,TIMERFD.INTERVAL -p "$PID" -Q "$EXPR"
+ echo "FD,TIMERFD.INTERVAL: $EXPR": $?
+
+ EXPR='(TIMERFD.INTERVAL == 10.00005)'
+ ${TS_CMD_LSFD} -n -r -o FD,TIMERFD.INTERVAL -p "$PID" -Q "$EXPR"
+ echo "FD,TIMERFD.INTERVAL: $EXPR": $?
+
+ EXPR='(TIMERFD.INTERVAL == 10.000051)'
+ ${TS_CMD_LSFD} -n -r -o FD,TIMERFD.INTERVAL -p "$PID" -Q "$EXPR"
+ echo "FD,TIMERFD.INTERVAL: $EXPR": $?
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+
+ wait "${MKFDS_PID}"
+} > "$TS_OUTPUT" 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/lsfd-functions.bash b/tests/ts/lsfd/lsfd-functions.bash
index d9a3595..3a3f58f 100644
--- a/tests/ts/lsfd/lsfd-functions.bash
+++ b/tests/ts/lsfd/lsfd-functions.bash
@@ -16,11 +16,11 @@
#
# The exit-status used in a test target.
-readonly ENOSYS=17
readonly EPERM=18
readonly ENOPROTOOPT=19
readonly EPROTONOSUPPORT=20
-readonly EACCESS=21
+readonly EACCES=21
+readonly ENOENT=22
function lsfd_wait_for_pausing {
ts_check_prog "sleep"
@@ -59,7 +59,7 @@ function lsfd_compare_dev {
fi
}
-lsfd_strip_type_stream()
+function lsfd_strip_type_stream
{
# lsfd changes the output of NAME column for a unix stream socket
# whether the kernel reports it is a "UNIX-STREAM" socket or a
@@ -68,7 +68,7 @@ lsfd_strip_type_stream()
sed -e 's/ type=stream//'
}
-lsfd_make_state_connected()
+function lsfd_make_state_connected
{
# Newer kernels report the states of unix dgram sockets created by
# sockerpair(2) are "connected" via /proc/net/unix though Older
@@ -83,3 +83,39 @@ lsfd_make_state_connected()
# to that on newer kernels.
sed -e 's/state=unconnected/state=connected/'
}
+
+function lsfd_check_mkfds_factory
+{
+ local FACTORY=$1
+
+ ts_check_test_command "$TS_HELPER_MKFDS"
+ if ! "$TS_HELPER_MKFDS" --is-available "$FACTORY"; then
+ ts_skip "test_mkfds has no factory for $FACTORY"
+ fi
+}
+
+function lsfd_check_sockdiag
+{
+ local family=$1
+
+ ts_check_test_command "$TS_HELPER_MKFDS"
+
+ local msg
+ local err
+
+ msg=$("$TS_HELPER_MKFDS" -c sockdiag 9 family=$family 2>&1)
+ err=$?
+
+ case $err in
+ 0)
+ return;;
+ $EPROTONOSUPPORT)
+ ts_skip "NETLINK_SOCK_DIAG protocol is not supported in socket(2)";;
+ $EACCES)
+ ts_skip "sending a msg via a sockdiag netlink socket is not permitted";;
+ $ENOENT)
+ ts_skip "sockdiag netlink socket is not available";;
+ *)
+ ts_failed "failed to create a sockdiag netlink socket $family ($err): $msg";;
+ esac
+}
diff --git a/tests/ts/lsfd/mkfds-bpf-map b/tests/ts/lsfd/mkfds-bpf-map
new file mode 100755
index 0000000..7821fe5
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-bpf-map
@@ -0,0 +1,49 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="bpf-map files"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+ts_skip_nonroot
+ts_skip_docker
+
+. "$TS_SELF/lsfd-functions.bash"
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD=3
+NAME=mkfds_map
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" bpf-map "$FD" map-type-id=2 name="$NAME"; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -r -n -oBPF-MAP.TYPE,BPF-MAP.TYPE.RAW,BPF.NAME -p "${PID}" -Q "(FD == $FD)"
+ echo "BPF-MAP.TYPE,BPF-MAP.TYPE.RAW,BPF.NAME": $?
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait "${MKFDS_PID}"
+} > "$TS_OUTPUT" 2>&1
+
+if [ "$?" == "$TS_EXIT_NOTSUPP" ]; then
+ ts_skip "bpf(2) is not available"
+fi
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-bpf-prog b/tests/ts/lsfd/mkfds-bpf-prog
new file mode 100755
index 0000000..b2a7275
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-bpf-prog
@@ -0,0 +1,49 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="bpf-prog files"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+ts_skip_nonroot
+ts_skip_docker
+
+. "$TS_SELF/lsfd-functions.bash"
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD=3
+NAME=mkdfs_prog
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" bpf-prog "$FD" prog-type-id=2 name="$NAME"; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ "${TS_CMD_LSFD}" -r -n -oBPF-PROG.TYPE,BPF-PROG.TYPE.RAW,BPF.NAME -p "${PID}" -Q "(FD == $FD)"
+ echo "BPF-PROG.TYPE,BPF-PROG.TYPE.RAW,BPF.NAME": $?
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait "${MKFDS_PID}"
+} > "$TS_OUTPUT" 2>&1
+
+if [ "$?" == "$TS_EXIT_NOTSUPP" ]; then
+ ts_skip "bpf(2) is not available"
+fi
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-cdev-tun b/tests/ts/lsfd/mkfds-cdev-tun
new file mode 100755
index 0000000..7354509
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-cdev-tun
@@ -0,0 +1,65 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="tun device and interface behind the device"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+ts_skip_nonroot
+
+[[ -e /dev/net/tun ]] || ts_skip "/dev/net/tun doest not exist"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD=3
+IFNAME=
+
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" cdev-tun $FD ; }
+ if read -u ${MKFDS[0]} PID IFNAME; then
+ EXPR='(FD == '"$FD"')'
+ ${TS_CMD_LSFD} -p "${PID}" -n -o ASSOC,MODE,TYPE,SOURCE -Q "${EXPR}"
+ echo 'ASSOC,MODE,TYPE,SOURCE': $?
+
+ output=$(${TS_CMD_LSFD} -p "${PID}" -n --raw -o NAME -Q "${EXPR}")
+ if [[ "$output" == "iface=$IFNAME" ]]; then
+ echo 'NAME': $?
+ else
+ echo 'NAME': $?
+ echo "expected NAME: iface=$IFNAME"
+ echo "output NAME: $output"
+ fi
+
+ output=$(${TS_CMD_LSFD} -p "${PID}" -n --raw -o TUN.IFACE -Q "${EXPR}")
+ if [[ "$output" == "$IFNAME" ]]; then
+ echo 'TUN.IFACE': $?
+ else
+ echo 'TUN.IFAEC': $?
+ echo "expected TUN.IFACE: $IFNAME"
+ echo "output TUN.IFACE: $output"
+ fi
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait ${MKFDS_PID}
+} > $TS_OUTPUT 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-directory b/tests/ts/lsfd/mkfds-directory
index ef769c9..738cb86 100755
--- a/tests/ts/lsfd/mkfds-directory
+++ b/tests/ts/lsfd/mkfds-directory
@@ -101,7 +101,7 @@ esac
echo 'stat reports:' "$(stat -c %h /)"
fi
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
fi
wait ${MKFDS_PID}
} > $TS_OUTPUT 2>&1
diff --git a/tests/ts/lsfd/mkfds-eventfd b/tests/ts/lsfd/mkfds-eventfd
new file mode 100755
index 0000000..02c86a6
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-eventfd
@@ -0,0 +1,104 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="eventfd with fork"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID0=
+PID1=
+FD0=3
+FD1=4
+EXPR=
+ID0=
+ID1=
+NAME0=
+NAME1=
+ENDPOINTS=
+
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" eventfd $FD0 $FD1 ; }
+ if read -u ${MKFDS[0]} PID0 PID1; then
+ EXPR='(FD == '"$FD0"') or (FD =='"$FD1"')'
+ ${TS_CMD_LSFD} -p "${PID0}" -n -o ASSOC,MODE,TYPE,SOURCE -Q "${EXPR}"
+ echo 'parent: ASSOC,MODE,TYPE,SOURCE': $?
+
+ NAME0=$(${TS_CMD_LSFD} -p "${PID0}" --raw -n -o NAME -Q "${EXPR}")
+ echo 'parent: NAME': $?
+
+ ID0=$(${TS_CMD_LSFD} -p "${PID0}" --raw -n -o EVENTFD.ID -Q "${EXPR}")
+ echo 'parent: ID': $?
+
+ EXPR='(FD == '"$FD0"') or (FD =='"$FD1"')'
+ ${TS_CMD_LSFD} -p "${PID1}" -n -o ASSOC,MODE,TYPE,SOURCE -Q "${EXPR}"
+ echo 'child: ASSOC,MODE,TYPE,SOURCE': $?
+
+ NAME1=$(${TS_CMD_LSFD} -p "${PID1}" --raw -n -o NAME -Q "${EXPR}")
+ echo 'child: NAME': $?
+
+ ID1=$(${TS_CMD_LSFD} -p "${PID1}" --raw -n -o EVENTFD.ID -Q "${EXPR}")
+ echo 'child: ID': $?
+
+ if [ "${NAME0}" == "${NAME1}" ]; then
+ echo 'NAME[STR]:' $?
+ else
+ echo 'NAME[STR]:' $?
+ echo NAME0: "${NAME0}"
+ echo NAME1: "${NAME1}"
+ fi
+
+ if [ "${ID0}" == "${ID1}" ]; then
+ echo 'ID[STR]:' $?
+ else
+ echo 'ID[STR]:' $?
+ echo ID0: "${ID0}"
+ echo ID0: "${ID1}"
+ fi
+
+ if [ "${NAME0}" == "id=${ID1}" ]; then
+ echo 'NAMExID[STR]:' $?
+ else
+ echo 'NAMExID[STR]:' $?
+ echo NAME0: "${NAME0}"
+ echo ID0: "${ID0}"
+ fi
+
+ EXPR='(EVENTFD.ID == '"${ID0}"')'
+ ENDPOINTS=$(${TS_CMD_LSFD} --raw -n -o PID,ASSOC,ENDPOINTS -Q "${EXPR}")
+ tmp=$(printf "%d %d %d,test_mkfds,%d\n%d %d %d,test_mkfds,%d" \
+ "$PID0" "$FD0" "$PID1" "$FD1" \
+ "$PID1" "$FD1" "$PID0" "$FD0")
+ if [ "$ENDPOINTS" == "$tmp" ]; then
+ echo 'ENDPOINTS[STR]:' $?
+ else
+ echo 'ENDPOINTS[STR]:' $?
+ echo 'ENDPOINTS:' "$ENDPOINTS"
+ echo 'lsfd:' "$tmp"
+ fi
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait ${MKFDS_PID}
+} > $TS_OUTPUT 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-eventpoll b/tests/ts/lsfd/mkfds-eventpoll
new file mode 100755
index 0000000..230d6c4
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-eventpoll
@@ -0,0 +1,46 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="eventpoll targets"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD0=3
+FD1=5
+FD2=7
+
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" eventpoll $FD0 $FD1 $FD2 ; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(FD == '"$FD0"')'
+ ${TS_CMD_LSFD} -p "${PID}" -n -o ASSOC,TYPE,NAME,EVENTPOLL.TFDS -Q "${EXPR}"
+ echo 'ASSOC,TYPE,NAME,EVENTPOLL.TFDS': $?
+ ${TS_CMD_LSFD} -J -p "${PID}" -n -o ASSOC,TYPE,NAME,EVENTPOLL.TFDS -Q "${EXPR}"
+ echo 'ASSOC,TYPE,NAME,EVENTPOLL.TFDS (JSON)': $?
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait ${MKFDS_PID}
+} > $TS_OUTPUT 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-inotify b/tests/ts/lsfd/mkfds-inotify
new file mode 100755
index 0000000..a44fd77
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-inotify
@@ -0,0 +1,74 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="inotify"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_CMD_FINDMNT"
+ts_check_prog "stat"
+ts_check_prog "sed"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD=3
+dir=/proc
+file=/proc/cmdline
+PROC="$(stat -c %i $dir)"@"$($TS_CMD_FINDMNT --raw --noheadings -oMAJ:MIN --target $dir)"
+CMDLINE="$(stat -c %i $file)"@"$($TS_CMD_FINDMNT --raw --noheadings -oMAJ:MIN --target $file)"
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" inotify $FD dir=$dir file=$file ; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(PID == '"${PID}"') and (FD == '"$FD"')'
+ INODES_RAW=$(${TS_CMD_LSFD} --raw -n -o INOTIFY.INODES.RAW -Q "${EXPR}")
+ echo "INOTIFY.INODES.RAW": $?
+ if [[ "$INODES_RAW" == "${CMDLINE}"'\x0a'"${PROC}" ]]; then
+ echo "INOTIFY.INODES.RAW" == CMDLINE'\x0a'PROC
+ else
+ echo "INOTIFY.INODES.RAW": "$INODES_RAW"
+ echo "CMDLINE": "$CMDLINE"
+ echo "PROC": "$PROC"
+ fi
+ INODES_RAW_JSON=$(${TS_CMD_LSFD} -J --raw -n -o INOTIFY.INODES.RAW -Q "${EXPR}")
+ echo "INOTIFY.INODES.RAW (JSON)": $?
+ EXPECTED_JSON=$(cat<<EOF
+{
+ "lsfd": [
+ {
+ "inotify.inodes.raw": [
+ "$CMDLINE", "$PROC"
+ ]
+ }
+ ]
+}
+EOF
+ )
+ if [[ "$INODES_RAW_JSON" == "${EXPECTED_JSON}" ]]; then
+ echo "INOTIFY.INODES.RAW" == EXPECTED_JSON
+ else
+ echo "INOTIFY.INODES.RAW": "$INODES_RAW_JSON"
+ fi
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait "${MKFDS_PID}"
+} > "$TS_OUTPUT" 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-inotify-btrfs b/tests/ts/lsfd/mkfds-inotify-btrfs
new file mode 100755
index 0000000..5dc8e97
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-inotify-btrfs
@@ -0,0 +1,91 @@
+#!/bin/bash
+#
+# Copyright (C) 2024 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="inotify on btrfs"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+ts_skip_nonroot
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_CMD_FINDMNT"
+ts_check_prog "stat"
+ts_check_prog "sed"
+ts_check_prog "mkfs.btrfs"
+ts_check_prog "dd"
+
+ts_cd "$TS_OUTDIR"
+
+IMG=img.btrfs
+MNTPNT=mntpnt
+mkdir -p $MNTPNT
+dd if=/dev/zero of=$IMG bs=114294784 count=1 status=none
+if ! mkfs.btrfs -q $IMG; then
+ ts_skip "failed to make a btrfs image: $IMG"
+fi
+if ! mount $IMG $MNTPNT; then
+ ts_skip "failed to mount a btrfs image, $IMG to $MNTPNT"
+fi
+trap "umount $MNTPNT; rm -f $IMG" EXIT
+
+if ! touch $MNTPNT/fstab; then
+ ts_skip "failed to touch a file on a btrfs filesystem: $MNTPNT/fstab"
+fi
+
+PID=
+FD=3
+ROOT="$(stat -c %i $MNTPNT)"@"$($TS_CMD_FINDMNT --raw --noheadings -oMAJ:MIN --target $MNTPNT)"
+FSTAB="$(stat -c %i $MNTPNT/fstab)"@"$($TS_CMD_FINDMNT --raw --noheadings -oMAJ:MIN --target $MNTPNT/fstab)"
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" inotify $FD dir=$MNTPNT file=$MNTPNT/fstab; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(PID == '"${PID}"') and (FD == '"$FD"')'
+ INODES_RAW=$(${TS_CMD_LSFD} --raw -n -o INOTIFY.INODES.RAW -Q "${EXPR}")
+ echo "INOTIFY.INODES.RAW": $?
+ if [[ "$INODES_RAW" == "${FSTAB}"'\x0a'"${ROOT}" ]]; then
+ echo "INOTIFY.INODES.RAW" == FSTAB'\x0a'ROOT
+ else
+ echo "INOTIFY.INODES.RAW": "$INODES_RAW"
+ echo "FSTAB": "$FSTAB"
+ echo "ROOT": "$ROOT"
+ fi
+ INODES_RAW_JSON=$(${TS_CMD_LSFD} -J --raw -n -o INOTIFY.INODES.RAW -Q "${EXPR}")
+ echo "INOTIFY.INODES.RAW (JSON)": $?
+ EXPECTED_JSON=$(cat<<EOF
+{
+ "lsfd": [
+ {
+ "inotify.inodes.raw": [
+ "$FSTAB", "$ROOT"
+ ]
+ }
+ ]
+}
+EOF
+ )
+ if [[ "$INODES_RAW_JSON" == "${EXPECTED_JSON}" ]]; then
+ echo "INOTIFY.INODES.RAW" == EXPECTED_JSON
+ else
+ echo "INOTIFY.INODES.RAW": "$INODES_RAW_JSON"
+ fi
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait "${MKFDS_PID}"
+} > "$TS_OUTPUT" 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-mapped-packet-socket b/tests/ts/lsfd/mkfds-mapped-packet-socket
index a1fb68f..12c5ef6 100755
--- a/tests/ts/lsfd/mkfds-mapped-packet-socket
+++ b/tests/ts/lsfd/mkfds-mapped-packet-socket
@@ -49,7 +49,7 @@ for SOCKTYPE in RAW DGRAM; do
${TS_CMD_LSFD} -p "$PID" -n -o NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL -Q "${EXPR}"
echo 'NAME,SOCK.TYPE,SOCK.PROTONAME,PACKET.IFACE,PACKET.PROTOCOL': $?
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
fi
wait ${MKFDS_PID}
ERR=$?
diff --git a/tests/ts/lsfd/mkfds-mqueue b/tests/ts/lsfd/mkfds-mqueue
new file mode 100755
index 0000000..bd22132
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-mqueue
@@ -0,0 +1,83 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="mqueue with fork"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+ts_check_native_byteorder
+
+ts_cd "$TS_OUTDIR"
+
+MQUEUE=/mkfds-mqueue
+PID0=
+PID1=
+FD0=3
+FD1=4
+EXPR=
+INODE0=
+INODE1=
+ENDPOINTS=
+
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" mqueue $FD0 $FD1 path=${MQUEUE}; }
+ if read -u ${MKFDS[0]} PID0 PID1; then
+ EXPR='(FD == '"$FD0"') or (FD =='"$FD1"')'
+ ${TS_CMD_LSFD} -p "${PID0}" -n -o ASSOC,MODE,TYPE,SOURCE,NAME -Q "${EXPR}"
+ echo 'parent: ASSOC,MODE,TYPE,SOURCE,NAME': $?
+
+ INODE0=$(${TS_CMD_LSFD} -p "${PID0}" --raw -n -o INODE -Q "${EXPR}")
+ echo 'parent: INODE': $?
+
+ EXPR='(FD == '"$FD0"') or (FD =='"$FD1"')'
+ ${TS_CMD_LSFD} -p "${PID1}" -n -o ASSOC,MODE,TYPE,SOURCE -Q "${EXPR}"
+ echo 'child: ASSOC,MODE,TYPE,SOURCE': $?
+
+ INODE1=$(${TS_CMD_LSFD} -p "${PID1}" --raw -n -o INODE -Q "${EXPR}")
+ echo 'child: INODE': $?
+
+ if [ "${INODE0}" == "${INODE1}" ]; then
+ echo 'INODE[STR]:' $?
+ else
+ echo 'INODE[STR]:' $?
+ echo INODE0: "${INODE0}"
+ echo INODE1: "${INODE1}"
+ fi
+
+ EXPR='(INODE == '"${INODE0}"') and (TYPE == "mqueue")'
+ ENDPOINTS=$(${TS_CMD_LSFD} --raw -n -o PID,ASSOC,ENDPOINTS -Q "${EXPR}")
+ tmp=$(printf "%d %d %d,test_mkfds,%d-w\n%d %d %d,test_mkfds,%dr-" \
+ "$PID0" "$FD0" "$PID1" "$FD1" \
+ "$PID1" "$FD1" "$PID0" "$FD0")
+ if [ "$ENDPOINTS" == "$tmp" ]; then
+ echo 'ENDPOINTS[STR]:' $?
+ else
+ echo 'ENDPOINTS[STR]:' $?
+ echo 'ENDPOINTS:' "$ENDPOINTS"
+ echo 'lsfd:' "$tmp"
+ grep mqueue /proc/self/mountinfo
+ fi
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait ${MKFDS_PID}
+} > $TS_OUTPUT 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-multiplexing b/tests/ts/lsfd/mkfds-multiplexing
new file mode 100755
index 0000000..8cc7f31
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-multiplexing
@@ -0,0 +1,70 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="XMODE.m for classical system calls for multiplexing"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+# /proc/${PID}/syscall is rendered in the host side byteorder.
+ts_skip_qemu_user
+
+ts_check_prog "grep"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+
+for multiplexer in pselect6 select poll ppoll; do
+ ts_init_subtest "${multiplexer}"
+ if ! "$TS_HELPER_MKFDS" -W | grep -q "^$multiplexer\$"; then
+ ts_skip_subtest "the multiplexer ${multiplexer} is not available"
+ continue
+ fi
+
+ {
+ coproc MKFDS { "$TS_HELPER_MKFDS" -w "$multiplexer" multiplexing {10..22}; }
+ } > "$TS_OUTPUT" 2>&1
+
+ if read -r -u "${MKFDS[0]}" PID; then
+ if ! cat /proc/"${PID}"/syscall > /dev/null 2>&1; then
+ kill -CONT "${PID}"
+ wait "${MKFDS_PID}"
+ ts_skip_subtest "cannot open /proc/${PID}/syscall"
+ continue
+ fi
+ {
+ "${TS_CMD_LSFD}" -n -o ASSOC,XMODE -p "${PID}" -Q '(FD >= 10) && (FD <= 22)'
+ echo "[$multiplexer] ASSOC,XMODE: $?"
+
+ # For debugging
+ if [[ $("${TS_CMD_LSFD}" -n -o XMODE -p "${PID}" -Q '(FD == 10)') != "r----m" ]]; then
+ cat /proc/"${PID}"/syscall
+ fi
+
+ echo DONE >&"${MKFDS[1]}"
+ } >> "$TS_OUTPUT" 2>&1
+ fi
+
+ wait "${MKFDS_PID}"
+ ts_finalize_subtest
+done
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-netlink-groups b/tests/ts/lsfd/mkfds-netlink-groups
index 896b50c..b7646c2 100755
--- a/tests/ts/lsfd/mkfds-netlink-groups
+++ b/tests/ts/lsfd/mkfds-netlink-groups
@@ -47,7 +47,7 @@ NETLINK_GROUPS=5
else
printf "LPORT: FAILED (PID: %d != NETLINK.LPORT: %d)\n" "${PID}" "${NETLINK_LPORT}"
fi
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
} > "$TS_OUTPUT" 2>&1
diff --git a/tests/ts/lsfd/mkfds-netlink-protocol b/tests/ts/lsfd/mkfds-netlink-protocol
index c1a5ffc..abf2eb2 100755
--- a/tests/ts/lsfd/mkfds-netlink-protocol
+++ b/tests/ts/lsfd/mkfds-netlink-protocol
@@ -46,7 +46,7 @@ NETLINK_GROUPS=5
else
printf "LPORT: FAILED (PID: %d != NETLINK.LPORT: %d)\n" "${PID}" "${NETLINK_LPORT}"
fi
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
} > "$TS_OUTPUT" 2>&1
diff --git a/tests/ts/lsfd/mkfds-netns b/tests/ts/lsfd/mkfds-netns
index cd110f6..0fbaec8 100755
--- a/tests/ts/lsfd/mkfds-netns
+++ b/tests/ts/lsfd/mkfds-netns
@@ -25,6 +25,7 @@ ts_skip_docker
. "$TS_SELF/lsfd-functions.bash"
ts_check_test_command "$TS_CMD_LSFD"
ts_check_test_command "$TS_HELPER_MKFDS"
+lsfd_check_mkfds_factory netns
ts_cd "$TS_OUTDIR"
@@ -61,11 +62,11 @@ INO_NS=
echo "NAME_FD: $NAME_FD" == "net:[INO_NS: $INO_NS]": $?
fi
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
} > "$TS_OUTPUT" 2>&1
-if [ "$?" == "$ENOSYS" ]; then
+if [ "$?" == "$TS_EXIT_NOTSUPP" ]; then
ts_skip "ioctl(fd, SIOCGSKNS) is not available"
fi
diff --git a/tests/ts/lsfd/mkfds-pidfd b/tests/ts/lsfd/mkfds-pidfd
index aad693f..c0fae4f 100755
--- a/tests/ts/lsfd/mkfds-pidfd
+++ b/tests/ts/lsfd/mkfds-pidfd
@@ -40,11 +40,11 @@ EXPR="(PID != ${TARGET}) and (FD == 3) and (PIDFD.PID == ${TARGET})"
${TS_CMD_LSFD} -n -o ASSOC,STTYPE,SOURCE,NAME,PIDFD.COMM,PIDFD.PID -p "${PID}" -p ${TARGET} -Q "${EXPR}"
echo 'ASSOC,STTYPE,SOURCE,NAME,PIDFD.COMM,PIDFD.PID': $?
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
fi
wait ${MKFDS_PID}
} > $TS_OUTPUT 2>&1
-if [ "$?" == "$ENOSYS" ]; then
+if [ "$?" == "$TS_EXIT_NOTSUPP" ]; then
ts_skip "pidfd_open(2) is not available"
fi
diff --git a/tests/ts/lsfd/mkfds-ping b/tests/ts/lsfd/mkfds-ping
index c2ca049..2baafde 100755
--- a/tests/ts/lsfd/mkfds-ping
+++ b/tests/ts/lsfd/mkfds-ping
@@ -90,7 +90,7 @@ ERRMSG=
for i in 0 1; do
ERRMSG=$("$TS_HELPER_MKFDS" -c -q "${FACTORY[$i]}" 3 id=$ID 2>&1)
ERR="$?"
- if [[ "$ERR" == "$EACCESS" ]]; then
+ if [[ "$ERR" == "$EACCES" ]]; then
case "$ERRMSG" in
*bind*)
MSG="making ${TYPE[$i]} socket with specifying id is not allowed (blocked by SELinux?)"
@@ -122,7 +122,7 @@ for i in 0 1; do
-o ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,${COLNS[$i]}.LADDR,${COLNS[$i]}.RADDR,PING.ID \
-p "${PID}" -Q "${EXPR[$i]}"
echo "ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,${COLNS[$i]}.LADDR,${COLNS[$i]}.RADDR,PING.ID": $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
@@ -132,7 +132,7 @@ for i in 0 1; do
-o ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,${COLNS[$i]}.LADDR,${COLNS[$i]}.RADDR,PING.ID \
-p "${PID}" -Q "${EXPR[$i]}"
echo "ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,${COLNS[$i]}.LADDR,${COLNS[$i]}.RADDR,PING.ID": $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
} > "$TS_OUTPUT" 2>&1
wait "${MKFDS_PID}"
diff --git a/tests/ts/lsfd/mkfds-pipe-no-fork b/tests/ts/lsfd/mkfds-pipe-no-fork
index e28aa9d..f2f950a 100755
--- a/tests/ts/lsfd/mkfds-pipe-no-fork
+++ b/tests/ts/lsfd/mkfds-pipe-no-fork
@@ -116,7 +116,7 @@ EOF
echo EXPECTED_LSFD_ENDPOINTS_JSON: "${EXPECTED_LSFD_ENDPOINTS_JSON}"
fi
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
fi
wait ${MKFDS_PID}
} > $TS_OUTPUT 2>&1
diff --git a/tests/ts/lsfd/mkfds-pty b/tests/ts/lsfd/mkfds-pty
new file mode 100755
index 0000000..cc781eb
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-pty
@@ -0,0 +1,73 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="ptmx and associated pts"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD0=5
+FD1=6
+INDEX=
+
+col_test()
+{
+ local col=$1
+ local expected=$2
+ local output
+
+ output=$(${TS_CMD_LSFD} -p "${PID}" -n --raw -o "$col" -Q "${EXPR}")
+ echo "$col": $?
+ if [[ "$output" != "$expected" ]]; then
+ echo "expected ${col} -Q ${EXPR}: ${expected}"
+ echo "output ${col} -Q ${EXPR}: ${output}"
+ fi
+}
+
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" pty $FD0 $FD1 ; }
+ if read -u ${MKFDS[0]} PID INDEX; then
+ EXPR='(FD == '$FD0')'
+ columns=ASSOC,MODE,TYPE,SOURCE
+ ${TS_CMD_LSFD} -p "${PID}" -n -r -o "$columns" -Q "${EXPR}"
+ echo "$columns": $?
+
+ col_test NAME "tty-index=${INDEX}"
+ col_test ENDPOINTS "${PID},test_mkfds,${FD1}r-"
+ col_test PTMX.TTY-INDEX "$INDEX"
+
+ EXPR='(FD == '$FD1')'
+ columns=ASSOC,MODE,TYPE
+ ${TS_CMD_LSFD} -p "${PID}" -n -r -o "$columns" -Q "${EXPR}"
+ echo "$columns": $?
+
+ col_test SOURCE "pts:${INDEX}"
+ col_test NAME "/dev/pts/${INDEX}"
+ col_test ENDPOINTS "${PID},test_mkfds,${FD0}rw"
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait ${MKFDS_PID}
+} > $TS_OUTPUT 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-raw b/tests/ts/lsfd/mkfds-raw
index 0260ba1..5770340 100755
--- a/tests/ts/lsfd/mkfds-raw
+++ b/tests/ts/lsfd/mkfds-raw
@@ -40,7 +40,7 @@ PROTOCOL=5
-o ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,INET.LADDR,INET.RADDR,RAW.PROTOCOL \
-p "${PID}" -Q "${EXPR}"
echo 'ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,INET.LADDR,INET.RADDR,RAW.PROTOCOL': $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
diff --git a/tests/ts/lsfd/mkfds-raw6 b/tests/ts/lsfd/mkfds-raw6
index 0b82fff..1eddea2 100755
--- a/tests/ts/lsfd/mkfds-raw6
+++ b/tests/ts/lsfd/mkfds-raw6
@@ -41,7 +41,7 @@ PROTOCOL=5
-o ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,INET6.LADDR,INET6.RADDR,RAW.PROTOCOL \
-p "${PID}" -Q "${EXPR}"
echo 'ASSOC,TYPE,NAME,SOCK.STATE,SOCK.TYPE,INET6.LADDR,INET6.RADDR,RAW.PROTOCOL': $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
diff --git a/tests/ts/lsfd/mkfds-ro-block-device b/tests/ts/lsfd/mkfds-ro-block-device
index ad5a492..7b14630 100755
--- a/tests/ts/lsfd/mkfds-ro-block-device
+++ b/tests/ts/lsfd/mkfds-ro-block-device
@@ -72,7 +72,7 @@ EXPR=
lsfd_compare_dev "${TS_CMD_LSFD}" "${LSFD_LOOP_BDEV}" "${EXPR}"
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
fi
wait ${MKFDS_PID}
} > $TS_OUTPUT 2>&1
diff --git a/tests/ts/lsfd/mkfds-ro-regular-file b/tests/ts/lsfd/mkfds-ro-regular-file
index a2c4c26..367a07d 100755
--- a/tests/ts/lsfd/mkfds-ro-regular-file
+++ b/tests/ts/lsfd/mkfds-ro-regular-file
@@ -70,7 +70,7 @@ EXPR=
lsfd_compare_dev "${TS_CMD_LSFD}" $target "${EXPR}"
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
fi
wait ${MKFDS_PID}
} > $TS_OUTPUT 2>&1
diff --git a/tests/ts/lsfd/mkfds-rw-character-device b/tests/ts/lsfd/mkfds-rw-character-device
index 85dd29c..3df2944 100755
--- a/tests/ts/lsfd/mkfds-rw-character-device
+++ b/tests/ts/lsfd/mkfds-rw-character-device
@@ -42,7 +42,7 @@ EXPR=
lsfd_compare_dev "${TS_CMD_LSFD}" $target "${EXPR}"
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
fi
wait ${MKFDS_PID}
} > $TS_OUTPUT 2>&1
diff --git a/tests/ts/lsfd/mkfds-signalfd b/tests/ts/lsfd/mkfds-signalfd
new file mode 100755
index 0000000..ecc7379
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-signalfd
@@ -0,0 +1,64 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="signalfd"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+# s390x and riscv64 reported the same error:
+#
+# lsfd: signalfd ...
+# diff-{{{
+# --- /home/runner/work/util-linux/util-linux/tests/expected/lsfd/mkfds-signalfd 2023-06-08 10:20:13.520555037 +0000
+# +++ /home/runner/work/util-linux/util-linux/tests/output/lsfd/mkfds-signalfd 2023-06-08 11:12:21.150054369 +0000
+# @@ -1,2 +1,2 @@
+# - 3 signalfd mask=FPE,USR1,42 FPE,USR1,42
+# + 3 signalfd mask=FPE,USR1,44 FPE,USR1,44
+# ASSOC,TYPE,NAME,SIGNALFD.MASK: 0
+# }}}-diff
+#
+# FAILED (lsfd/mkfds-signalfd)
+#
+# The error is nothing to do with endianness; the endian s390x is
+# big-endian. riscv64 is little-endian.
+#
+# So Qemu's user emulation is suspicious.
+ts_skip_qemu_user
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD=3
+
+COL=ASSOC,TYPE,NAME,SIGNALFD.MASK
+EXPR='(FD == '"$FD"')'
+
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" signalfd $FD; }
+ if read -u ${MKFDS[0]} PID; then
+ ${TS_CMD_LSFD} -p "${PID}" -n -o "${COL}" -Q "${EXPR}"
+ echo "${COL}": $?
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait "${MKFDS_PID}"
+} > "$TS_OUTPUT" 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-socketpair b/tests/ts/lsfd/mkfds-socketpair
index 3ffd088..3ef60c7 100755
--- a/tests/ts/lsfd/mkfds-socketpair
+++ b/tests/ts/lsfd/mkfds-socketpair
@@ -20,6 +20,7 @@ TS_DESC="AF_UNIX socket pair created with socketpair(2)"
. "$TS_TOPDIR"/functions.sh
ts_init "$*"
+. "$TS_SELF/lsfd-functions.bash"
ts_check_test_command "$TS_CMD_LSFD"
ts_check_test_command "$TS_HELPER_MKFDS"
@@ -28,11 +29,14 @@ ts_check_prog "sed"
ts_cd "$TS_OUTDIR"
+lsfd_check_sockdiag "unix"
+
PID=
FD0=3
FD1=4
EXPR=
+ts_init_subtest "DGRAM"
{
coproc MKFDS { "$TS_HELPER_MKFDS" socketpair $FD0 $FD1 socktype=DGRAM; }
if read -u ${MKFDS[0]} PID; then
@@ -40,9 +44,96 @@ EXPR=
${TS_CMD_LSFD} -n -o ASSOC,MODE,STTYPE,SOURCE,SOCK.PROTONAME -Q "${EXPR}" | sed -e 's/UNIX-DGRAM/UNIX/'
echo 'ASSOC,MODE,STTYPE,SOURCE,SOCK.PROTONAME': ${PIPESTATUS[0]}
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+
+wait ${MKFDS_PID}
+ts_finalize_subtest
+
+ts_init_subtest "STREAM"
+{
+ coproc MKFDS { "$TS_HELPER_MKFDS" socketpair $FD0 $FD1 socktype=STREAM; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(PID == '"${PID}"') and ((FD == '"$FD0"') or (FD == '"$FD1"'))'
+ ${TS_CMD_LSFD} -n -o ASSOC,MODE,STTYPE,SOURCE,SOCK.PROTONAME -Q "${EXPR}" | sed -e 's/UNIX-STREAM/UNIX/'
+ echo 'ASSOC,MODE,STTYPE,SOURCE,SOCK.PROTONAME': ${PIPESTATUS[0]}
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+} > "$TS_OUTPUT" 2>&1
+
+wait ${MKFDS_PID}
+ts_finalize_subtest
+
+mkfds_socketpair_stream_endpoint()
+{
+ ts_init_subtest "STREAM-ENDPOINT"
+ if [ "$QEMU_USER" == "1" ]; then
+ ts_skip_subtest "running under qemu-user emulation"
+ return
+ fi
+ {
+ coproc MKFDS { "$TS_HELPER_MKFDS" socketpair $FD0 $FD1 socktype=STREAM; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(FD == '"$FD0"') or (FD == '"$FD1"')'
+ ${TS_CMD_LSFD} -p "${PID}" -n -o ASSOC,MODE,STTYPE,SOURCE,ENDPOINTS -Q "${EXPR}" | sed -e "s/${PID}/1/g"
+ echo 'ASSOC,MODE,STTYPE,SOURCE,ENDPOINTS': ${PIPESTATUS[0]}
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ } > "$TS_OUTPUT" 2>&1
+
+ wait ${MKFDS_PID}
+ ts_finalize_subtest
+}
+
+mkfds_socketpair_stream_shutdown_state()
+{
+ ts_init_subtest "STREAM-SHUTDOWN-STATE"
+ if [ "$QEMU_USER" == "1" ]; then
+ ts_skip_subtest "running under qemu-user emulation"
+ return
+ fi
+ {
+ coproc MKFDS { "$TS_HELPER_MKFDS" socketpair $FD0 $FD1 socktype=STREAM halfclose=1; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(FD == '"$FD0"') or (FD == '"$FD1"')'
+ ${TS_CMD_LSFD} -p "${PID}" -n -o ASSOC,MODE,STTYPE,SOURCE,SOCK.SHUTDOWN -Q "${EXPR}"
+ echo 'ASSOC,MODE,STTYPE,SOURCE,SOCK.SHUTDOWN': ${PIPESTATUS[0]}
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ } > "$TS_OUTPUT" 2>&1
+
+ wait ${MKFDS_PID}
+ ts_finalize_subtest
+}
+
+mkfds_socketpair_stream_endpoint_halfclose()
+{
+ ts_init_subtest "STREAM-ENDPOINT-halfclose"
+ if [ "$QEMU_USER" == "1" ]; then
+ ts_skip_subtest "running under qemu-user emulation"
+ return
fi
+ {
+ coproc MKFDS { "$TS_HELPER_MKFDS" socketpair $FD0 $FD1 socktype=STREAM halfclose=1; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(FD == '"$FD0"') or (FD == '"$FD1"')'
+ ${TS_CMD_LSFD} -p "${PID}" -n -o ASSOC,MODE,STTYPE,SOURCE,ENDPOINTS -Q "${EXPR}" | sed -e "s/${PID}/1/g"
+ echo 'ASSOC,MODE,STTYPE,SOURCE,ENDPOINTS': ${PIPESTATUS[0]}
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ } > "$TS_OUTPUT" 2>&1
+
wait ${MKFDS_PID}
-} > $TS_OUTPUT 2>&1
+ ts_finalize_subtest
+}
+
+mkfds_socketpair_stream_endpoint
+mkfds_socketpair_stream_shutdown_state
+mkfds_socketpair_stream_endpoint_halfclose
ts_finalize
diff --git a/tests/ts/lsfd/mkfds-symlink b/tests/ts/lsfd/mkfds-symlink
index 4825645..56eccca 100755
--- a/tests/ts/lsfd/mkfds-symlink
+++ b/tests/ts/lsfd/mkfds-symlink
@@ -37,7 +37,7 @@ EXPR=
${TS_CMD_LSFD} -n -o ASSOC,MODE,TYPE,NAME,FLAGS -Q "${EXPR}"
echo 'ASSOC,MODE,TYPE,NAME,FLAGS': $?
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
fi
wait ${MKFDS_PID}
} > $TS_OUTPUT 2>&1
diff --git a/tests/ts/lsfd/mkfds-tcp b/tests/ts/lsfd/mkfds-tcp
index e531a7b..666cf6a 100755
--- a/tests/ts/lsfd/mkfds-tcp
+++ b/tests/ts/lsfd/mkfds-tcp
@@ -34,15 +34,15 @@ EXPR='(TYPE == "TCP") and (FD >= 3) and (FD <= 5)'
{
coproc MKFDS { "$TS_HELPER_MKFDS" tcp $FDS $FDC $FDA \
- server-port=34567 \
- client-port=23456 ; }
+ server-port=56789 \
+ client-port=45678 ; }
if read -r -u "${MKFDS[0]}" PID; then
${TS_CMD_LSFD} -n \
-o ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,TCP.LADDR,TCP.LPORT,TCP.RADDR,TCP.RPORT \
-p "${PID}" -Q "${EXPR}"
echo 'ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,TCP.LADDR,TCP.LPORT,TCP.RADDR,TCP.RPORT': $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
} > "$TS_OUTPUT" 2>&1
diff --git a/tests/ts/lsfd/mkfds-tcp6 b/tests/ts/lsfd/mkfds-tcp6
index 7368bfa..bffa630 100755
--- a/tests/ts/lsfd/mkfds-tcp6
+++ b/tests/ts/lsfd/mkfds-tcp6
@@ -35,15 +35,15 @@ EXPR='(TYPE == "TCPv6") and (FD >= 3) and (FD <= 5)'
{
coproc MKFDS { "$TS_HELPER_MKFDS" tcp6 $FDS $FDC $FDA \
- server-port=34567 \
- client-port=23456 ; }
+ server-port=56789 \
+ client-port=45678 ; }
if read -r -u "${MKFDS[0]}" PID; then
${TS_CMD_LSFD} -n \
-o ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,TCP.LADDR,TCP.LPORT,TCP.RADDR,TCP.RPORT \
-p "${PID}" -Q "${EXPR}"
echo 'ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,TCP.LADDR,TCP.LPORT,TCP.RADDR,TCP.RPORT': $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
} > "$TS_OUTPUT" 2>&1
diff --git a/tests/ts/lsfd/mkfds-timerfd b/tests/ts/lsfd/mkfds-timerfd
new file mode 100755
index 0000000..d2e0b8a
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-timerfd
@@ -0,0 +1,109 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="timerfd"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_check_prog "sed"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD=3
+EXPR='(FD == '"$FD"')'
+
+ts_init_subtest "realtime-remaining-and-interval"
+{
+ clock=realtime
+ coproc MKFDS { "$TS_HELPER_MKFDS" timerfd $FD clockid=$clock remaining=99 interval=5 interval-nanofrac=123456789; }
+ if read -u ${MKFDS[0]} PID; then
+ ${TS_CMD_LSFD} -p "${PID}" -n -o ASSOC,TYPE,NAME -Q "${EXPR}" | \
+ sed -e 's/remaining=[0-9][0-9]\.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/remaining=100.987654321/'
+ echo 'ASSOC,TYPE,NAME': ${PIPESTATUS[0]}
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.CLOCKID -Q "${EXPR}"
+ echo 'CLOCKID': $?
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.REMAINING -Q "${EXPR}" | \
+ sed -e 's/^ *[0-9][0-9]\.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/100.987654321/'
+ echo 'TIMERFD.REMAINING': ${PIPESTATUS[0]}
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.INTERVAL -Q "${EXPR}"
+ echo 'TIMERFD.INTERVAL': $?
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait "${MKFDS_PID}"
+} > "$TS_OUTPUT" 2>&1
+ts_finalize_subtest
+
+ts_init_subtest "monotonic-remaining-only"
+{
+ clock=monotonic
+ coproc MKFDS { "$TS_HELPER_MKFDS" timerfd $FD clockid=$clock remaining=99 interval=0 interval-nanofrac=0; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(FD == '"$FD"')'
+ ${TS_CMD_LSFD} -p "${PID}" -n -o ASSOC,TYPE,NAME -Q "${EXPR}" | \
+ sed -e 's/remaining=[0-9][0-9]\.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/remaining=100.987654321/'
+ echo 'ASSOC,TYPE,NAME': ${PIPESTATUS[0]}
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.CLOCKID -Q "${EXPR}"
+ echo 'CLOCKID': $?
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.REMAINING -Q "${EXPR}" | \
+ sed -e 's/^ *[0-9][0-9]\.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/100.987654321/'
+ echo 'TIMERFD.REMAINING': ${PIPESTATUS[0]}
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.INTERVAL -Q "${EXPR}"
+ echo 'TIMERFD.INTERVAL': $?
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait "${MKFDS_PID}"
+} > "$TS_OUTPUT" 2>&1
+ts_finalize_subtest
+
+ts_init_subtest "boottime-interval-only"
+{
+ clock=boottime
+ coproc MKFDS { "$TS_HELPER_MKFDS" timerfd $FD clockid=$clock remaining=0 interval=10 interval-nanofrac=123456789; }
+ if read -u ${MKFDS[0]} PID; then
+ EXPR='(FD == '"$FD"')'
+ ${TS_CMD_LSFD} -p "${PID}" -n -o ASSOC,TYPE,NAME -Q "${EXPR}"
+ echo 'ASSOC,TYPE,NAME': $?
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.CLOCKID -Q "${EXPR}"
+ echo 'CLOCKID': $?
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.REMAINING -Q "${EXPR}"
+ echo 'TIMERFD.REMAINING': $?
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.INTERVAL -Q "${EXPR}"
+ echo 'TIMERFD.INTERVAL': $?
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait "${MKFDS_PID}"
+} > "$TS_OUTPUT" 2>&1
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-timerfd-alarm b/tests/ts/lsfd/mkfds-timerfd-alarm
new file mode 100755
index 0000000..c7e6650
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-timerfd-alarm
@@ -0,0 +1,56 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="timerfd associating alarm"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_skip_capability WAKE_ALARM
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+PID=
+FD=3
+EXPR='(FD == '"$FD"')'
+
+{
+ for clock in realtime-alarm boottime-alarm; do
+ coproc MKFDS { "$TS_HELPER_MKFDS" timerfd $FD clockid=$clock remaining=0 interval=0 interval-nanofrac=0; }
+ if read -u ${MKFDS[0]} PID; then
+ ${TS_CMD_LSFD} -p "${PID}" -n -o ASSOC,TYPE,NAME -Q "${EXPR}"
+ echo 'ASSOC,TYPE,NAME': $?
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.CLOCKID -Q "${EXPR}"
+ echo 'CLOCKID': $?
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.REMAINING -Q "${EXPR}"
+ echo 'TIMERFD.REMAINING': $?
+
+ ${TS_CMD_LSFD} -p "${PID}" -n -o TIMERFD.INTERVAL -Q "${EXPR}"
+ echo 'TIMERFD.INTERVAL': $?
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait "${MKFDS_PID}"
+ done
+} > "$TS_OUTPUT" 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/mkfds-udp b/tests/ts/lsfd/mkfds-udp
index e6e1f1c..3d1b272 100755
--- a/tests/ts/lsfd/mkfds-udp
+++ b/tests/ts/lsfd/mkfds-udp
@@ -51,8 +51,8 @@ LPORT=
for lite in 0 1; do
coproc MKFDS { "$TS_HELPER_MKFDS" udp $FDS $FDC \
- server-port=34567 \
- client-port=23456 \
+ server-port=56789 \
+ client-port=45678 \
lite=$lite; }
if read -r -u "${MKFDS[0]}" PID; then
${TS_CMD_LSFD} -n \
@@ -60,13 +60,13 @@ for lite in 0 1; do
-p "${PID}" -Q "${EXPR[$lite]}"
echo "ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,${COLNS[$lite]}.LADDR,${COLNS[$lite]}.LPORT,${COLNS[$lite]}.RADDR,${COLNS[$lite]}.RPORT": $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
coproc MKFDS { "$TS_HELPER_MKFDS" udp $FDS $FDC \
- server-port=34567 \
- client-port=23456 \
+ server-port=56789 \
+ client-port=45678 \
server-do-bind=no \
lite=$lite; }
if read -r -u "${MKFDS[0]}" PID; then
@@ -85,13 +85,13 @@ for lite in 0 1; do
echo "NAME pattern match: FAILED (NAME=$NAME)"
fi
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
coproc MKFDS { "$TS_HELPER_MKFDS" udp $FDS $FDC \
- server-port=34567 \
- client-port=23456 \
+ server-port=56789 \
+ client-port=45678 \
client-do-bind=no \
lite=$lite; }
if read -r -u "${MKFDS[0]}" PID; then
@@ -115,13 +115,13 @@ for lite in 0 1; do
echo "LADDR/LPORT pattern match: FAILED (LADDR=$LADDR, LPORT=$LPORT)"
fi
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
coproc MKFDS { "$TS_HELPER_MKFDS" udp $FDS $FDC \
- server-port=34567 \
- client-port=23456 \
+ server-port=56789 \
+ client-port=45678 \
client-do-connect=no \
lite=$lite; }
if read -r -u "${MKFDS[0]}" PID; then
@@ -130,7 +130,7 @@ for lite in 0 1; do
-p "${PID}" -Q "${EXPR[$lite]}"
echo 'ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET.LADDR,INET.RADDR,UDP.LADDR,UDP.LPORT,UDP.RADDR,UDP.RPORT': $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
done > "$TS_OUTPUT" 2>&1
diff --git a/tests/ts/lsfd/mkfds-udp6 b/tests/ts/lsfd/mkfds-udp6
index 75381ba..26bdacd 100755
--- a/tests/ts/lsfd/mkfds-udp6
+++ b/tests/ts/lsfd/mkfds-udp6
@@ -52,8 +52,8 @@ LPORT=
for lite in 0 1; do
coproc MKFDS { "$TS_HELPER_MKFDS" udp6 $FDS $FDC \
- server-port=34567 \
- client-port=23456 \
+ server-port=56789 \
+ client-port=45678 \
lite=$lite; }
if read -r -u "${MKFDS[0]}" PID; then
${TS_CMD_LSFD} -n \
@@ -61,13 +61,13 @@ for lite in 0 1; do
-p "${PID}" -Q "${EXPR[$lite]}"
echo "ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,${COLNS[$lite]}.LADDR,${COLNS[$lite]}.LPORT,${COLNS[$lite]}.RADDR,${COLNS[$lite]}.RPORT": $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
coproc MKFDS { "$TS_HELPER_MKFDS" udp6 $FDS $FDC \
- server-port=34567 \
- client-port=23456 \
+ server-port=56789 \
+ client-port=45678 \
server-do-bind=no \
lite=$lite; }
if read -r -u "${MKFDS[0]}" PID; then
@@ -86,13 +86,13 @@ for lite in 0 1; do
echo "NAME pattern match: FAILED (NAME=$NAME)"
fi
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
coproc MKFDS { "$TS_HELPER_MKFDS" udp6 $FDS $FDC \
- server-port=34567 \
- client-port=23456 \
+ server-port=56789 \
+ client-port=45678 \
client-do-bind=no \
lite=$lite; }
if read -r -u "${MKFDS[0]}" PID; then
@@ -116,13 +116,13 @@ for lite in 0 1; do
echo "LADDR/LPORT pattern match: FAILED (LADDR=$LADDR, LPORT=$LPORT)"
fi
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
coproc MKFDS { "$TS_HELPER_MKFDS" udp6 $FDS $FDC \
- server-port=34567 \
- client-port=23456 \
+ server-port=56789 \
+ client-port=45678 \
client-do-connect=no \
lite=$lite; }
if read -r -u "${MKFDS[0]}" PID; then
@@ -131,7 +131,7 @@ for lite in 0 1; do
-p "${PID}" -Q "${EXPR[$lite]}"
echo "ASSOC,TYPE,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,INET6.LADDR,INET6.RADDR,${COLNS[$lite]}.LADDR,${COLNS[$lite]}.LPORT,${COLNS[$lite]}.RADDR,${COLNS[$lite]}.RPORT": $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
done > "$TS_OUTPUT" 2>&1
diff --git a/tests/ts/lsfd/mkfds-unix-dgram b/tests/ts/lsfd/mkfds-unix-dgram
index c8b40eb..45a0b2d 100755
--- a/tests/ts/lsfd/mkfds-unix-dgram
+++ b/tests/ts/lsfd/mkfds-unix-dgram
@@ -35,7 +35,7 @@ make_state_connected()
{
# The first one is for rewriting NAME column.
# The second one is for rewriting STATE column.
- lsfd_make_state_connected | sed -e 's/unconnected/ connected/'
+ lsfd_make_state_connected | sed -e 's/unconnected/connected/'
}
{
@@ -43,11 +43,12 @@ make_state_connected()
path=test_mkfds-unix-dgram ; }
if read -r -u "${MKFDS[0]}" PID; then
${TS_CMD_LSFD} -n \
+ -r \
-o ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH \
-p "${PID}" -Q "${EXPR}" | make_state_connected
echo 'ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH': ${PIPESTATUS[0]}
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
@@ -56,11 +57,12 @@ make_state_connected()
abstract=true ; }
if read -r -u "${MKFDS[0]}" PID; then
${TS_CMD_LSFD} -n \
+ -r \
-o ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH \
-p "${PID}" -Q "${EXPR}" | make_state_connected
echo 'ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH': $?
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
} > "$TS_OUTPUT" 2>&1
diff --git a/tests/ts/lsfd/mkfds-unix-in-netns b/tests/ts/lsfd/mkfds-unix-in-netns
index cfca087..9ed4567 100755
--- a/tests/ts/lsfd/mkfds-unix-in-netns
+++ b/tests/ts/lsfd/mkfds-unix-in-netns
@@ -78,7 +78,7 @@ for t in stream dgram seqpacket; do
compare_net_namespaces "$t" "${PID}"
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
@@ -94,7 +94,7 @@ for t in stream dgram seqpacket; do
compare_net_namespaces "abstract $t" "${PID}"
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
} > "$TS_OUTPUT" 2>&1
diff --git a/tests/ts/lsfd/mkfds-unix-stream b/tests/ts/lsfd/mkfds-unix-stream
index fe08e72..3c31443 100755
--- a/tests/ts/lsfd/mkfds-unix-stream
+++ b/tests/ts/lsfd/mkfds-unix-stream
@@ -46,7 +46,7 @@ EXPR='(((TYPE == "UNIX-STREAM") or (TYPE == "UNIX")) and (FD >= 3) and (FD <= 5)
-p "${PID}" -Q "${EXPR}" | lsfd_strip_type_stream
echo 'ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH': ${PIPESTATUS[0]}
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
@@ -59,7 +59,7 @@ EXPR='(((TYPE == "UNIX-STREAM") or (TYPE == "UNIX")) and (FD >= 3) and (FD <= 5)
-p "${PID}" -Q "${EXPR}" | lsfd_strip_type_stream
echo '(abs) ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH': ${PIPESTATUS[0]}
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
@@ -75,7 +75,7 @@ EXPR='(((TYPE == "UNIX-STREAM") or (TYPE == "UNIX")) and (FD >= 3) and (FD <= 5)
echo '(shutdown) ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH': ${PIPESTATUS[0]}
# Surprisingly, the socket status doesn't change at all.
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
@@ -88,7 +88,7 @@ EXPR='(((TYPE == "UNIX-STREAM") or (TYPE == "UNIX")) and (FD >= 3) and (FD <= 5)
-p "${PID}" -Q "${EXPR}" | lsfd_strip_type_stream
echo 'ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH': ${PIPESTATUS[0]}
- kill -CONT "${PID}"
+ echo DONE >&"${MKFDS[1]}"
fi
wait "${MKFDS_PID}"
diff --git a/tests/ts/lsfd/mkfds-unix-stream-requiring-sockdiag b/tests/ts/lsfd/mkfds-unix-stream-requiring-sockdiag
new file mode 100755
index 0000000..6189d0d
--- /dev/null
+++ b/tests/ts/lsfd/mkfds-unix-stream-requiring-sockdiag
@@ -0,0 +1,58 @@
+#!/bin/bash
+#
+# Copyright (C) 2022 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="UNIX stream sockets"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+ts_skip_qemu_user
+
+. "$TS_SELF/lsfd-functions.bash"
+
+ts_check_test_command "$TS_CMD_LSFD"
+ts_check_test_command "$TS_HELPER_MKFDS"
+
+ts_cd "$TS_OUTDIR"
+
+lsfd_check_sockdiag "unix"
+
+PID=
+FDS=3
+FDC=4
+FDA=5
+EXPR='(((TYPE == "UNIX-STREAM") or (TYPE == "UNIX")) and (FD >= 3) and (FD <= 5))'
+
+{
+ for t in stream seqpacket; do
+
+ coproc MKFDS { "$TS_HELPER_MKFDS" unix-stream $FDS $FDC $FDA \
+ path="test_mkfds-unix with newline ${t} $(printf 'a\nb\nc')" \
+ type=$t ; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ ${TS_CMD_LSFD} -n \
+ -o ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH \
+ -p "${PID}" -Q "${EXPR}" | lsfd_strip_type_stream
+ echo 'ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH': ${PIPESTATUS[0]}
+
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ wait "${MKFDS_PID}"
+
+ done
+} > "$TS_OUTPUT" 2>&1
+
+ts_finalize
diff --git a/tests/ts/lsfd/option-inet b/tests/ts/lsfd/option-inet
index 011a9b3..7ca8837 100755
--- a/tests/ts/lsfd/option-inet
+++ b/tests/ts/lsfd/option-inet
@@ -25,23 +25,54 @@ ts_skip_docker
ts_check_test_command "$TS_CMD_LSFD"
ts_check_test_command "$TS_HELPER_MKFDS"
+ts_check_prog "mkfifo"
+
ts_cd "$TS_OUTDIR"
+FIFO=./test_mkfds-option-inet.fifo
{
- "$TS_HELPER_MKFDS" -q tcp 3 4 5 server-port=34567 client-port=23456 &
- PID0=$!
-
- "$TS_HELPER_MKFDS" -q tcp6 3 4 5 server-port=34567 client-port=23456 &
- PID1=$!
-
- "$TS_HELPER_MKFDS" -q ro-regular-file 3 file=/etc/passwd &
- PID2=$!
-
- "$TS_HELPER_MKFDS" -q udp 3 4 server-port=34567 client-port=23456 server-do-bind=1 client-do-bind=1 client-do-connect=1&
- PID3=$!
-
- "$TS_HELPER_MKFDS" -q udp6 3 4 lite=1 server-port=34567 client-port=23456 server-do-bind=1 client-do-bind=1 client-do-connect=1&
- PID4=$!
+ rm -f "${FIFO}"
+ if ! mkfifo "${FIFO}"; then
+ ts_finalize "failed in creating a fifo"
+ fi
+
+ "$TS_HELPER_MKFDS" -X tcp 3 4 5 server-port=34567 client-port=23456 > "${FIFO}" &
+ if ! read PID0 < "${FIFO}"; then
+ rm "${FIFO}"
+ ts_finalize "$TS_HELPER_MKFDS tcp...doesn't report its pid"
+ fi
+
+ "$TS_HELPER_MKFDS" -X tcp6 3 4 5 server-port=34567 client-port=23456 > "${FIFO}" &
+ if ! read PID1 < "${FIFO}"; then
+ kill -CONT "${PID0}"
+ wait "${PID0}"
+ rm "${FIFO}"
+ ts_finalize "$TS_HELPER_MKFDS tcp6...doesn't report its pid"
+ fi
+
+ "$TS_HELPER_MKFDS" -X ro-regular-file 3 file=/etc/passwd > "${FIFO}" &
+ if ! read PID2 < "${FIFO}"; then
+ kill -CONT "${PID0}" "${PID1}"
+ wait "${PID0}" "${PID1}"
+ rm "${FIFO}"
+ ts_finalize "$TS_HELPER_MKFDS ro-regular-file...doesn't report its pid"
+ fi
+
+ "$TS_HELPER_MKFDS" -X udp 3 4 server-port=34567 client-port=23456 server-do-bind=1 client-do-bind=1 client-do-connect=1 > "${FIFO}" &
+ if ! read PID3 < "${FIFO}"; then
+ kill -CONT "${PID0}" "${PID1}" "${PID2}"
+ wait "${PID0}" "${PID1}" "${PID2}"
+ rm "${FIFO}"
+ ts_finalize "$TS_HELPER_MKFDS udp...doesn't report its pid"
+ fi
+
+ "$TS_HELPER_MKFDS" -X udp6 3 4 lite=1 server-port=34567 client-port=23456 server-do-bind=1 client-do-bind=1 client-do-connect=1 > "${FIFO}" &
+ if ! read PID4 < "${FIFO}"; then
+ kill -CONT "${PID0}" "${PID1}" "${PID2}" "${PID3}"
+ wait "${PID0}" "${PID1}" "${PID2}" "${PID3}"
+ rm "${FIFO}"
+ ts_finalize "$TS_HELPER_MKFDS udp6 lite=1...doesn't report its pid"
+ fi
OPT='--inet'
echo "# $OPT"
@@ -85,14 +116,9 @@ ts_cd "$TS_OUTDIR"
-o ASSOC,TYPE,NAME \
-Q "(PID == $PID0) or (PID == $PID1) or (PID == $PID2) or (PID == $PID3) or (PID == $PID4)"
- kill -CONT "${PID0}"
- wait "${PID0}"
-
- kill -CONT "${PID1}"
- wait "${PID1}"
-
- kill -CONT "${PID2}"
- wait "${PID2}"
+ kill -CONT "${PID0}" "${PID1}" "${PID2}" "${PID3}" "${PID4}"
+ wait "${PID0}" "${PID1}" "${PID2}" "${PID3}" "${PID4}"
+ rm "${FIFO}"
} > "$TS_OUTPUT" 2>&1
ts_finalize
diff --git a/tests/ts/lsfd/option-pid b/tests/ts/lsfd/option-pid
index 0ea4353..003b624 100755
--- a/tests/ts/lsfd/option-pid
+++ b/tests/ts/lsfd/option-pid
@@ -72,7 +72,7 @@ POUT=
[ "${QOUT}" = "${POUT}" ]
echo "EQ[-p PID --pid=1]:" $?
- kill -CONT ${PID}
+ echo DONE >&"${MKFDS[1]}"
fi
wait ${MKFDS_PID}
} > $TS_OUTPUT 2>&1
diff --git a/tests/ts/lsfd/option-summary b/tests/ts/lsfd/option-summary
index 64bf54b..9813901 100755
--- a/tests/ts/lsfd/option-summary
+++ b/tests/ts/lsfd/option-summary
@@ -35,14 +35,14 @@ PIDS=
PID=
for i in {1..10}; do
- "$TS_HELPER_MKFDS" -q ro-regular-file $FD file=$F_GROUP &
+ "$TS_HELPER_MKFDS" -X -q ro-regular-file $FD file=$F_GROUP &
PID=$!
PIDS="${PIDS} ${PID} "
lsfd_wait_for_pausing "${PID}"
done
for i in {1..3}; do
- "$TS_HELPER_MKFDS" -q ro-regular-file $FD file=$F_PASSWD &
+ "$TS_HELPER_MKFDS" -X -q ro-regular-file $FD file=$F_PASSWD &
PID=$!
PIDS="${PIDS} ${PID} "
lsfd_wait_for_pausing "${PID}"
diff --git a/tests/ts/lslocks/lslocks b/tests/ts/lslocks/lslocks
new file mode 100755
index 0000000..912fac8
--- /dev/null
+++ b/tests/ts/lslocks/lslocks
@@ -0,0 +1,117 @@
+#!/bin/bash
+#
+# Copyright (C) 2023 Masatake YAMATO <yamato@redhat.com>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="flock"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSLOCKS"
+ts_check_test_command "$TS_HELPER_MKFDS"
+ts_check_prog "sed"
+
+ts_cd "$TS_OUTDIR"
+
+FILE0=util-linux-lslocks-target-file
+FILE=${FILE0}--$$
+FD=17
+DFD=18
+COLS=COMMAND,TYPE,SIZE,MODE,START,END
+OPTS="--raw --noheadings"
+METHODS=(
+ flock-sh
+ flock-ex
+ posix-r-
+ posix--w
+ posix-rw
+ ofd-r-
+ ofd--w
+ ofd-rw
+ lease-w
+)
+
+OFD_METHODS=(
+ flock-sh
+ flock-ex
+ ofd-r-
+ ofd--w
+ ofd-rw
+ lease-w
+)
+
+SLEEP()
+{
+ # It appears that there is a time lag between locking and its
+ # visibility in /proc/locks. See the unstbale results of errors I
+ # observed in https://github.com/util-linux/util-linux/pull/2629.
+ sleep 1
+}
+
+DFD=18
+COLS_WITH_HOLDERS=COMMAND,TYPE,SIZE,MODE,START,END,HOLDERS
+run_lslocks()
+{
+ local m=$1
+
+ {
+ rm -f "${FILE}"
+ coproc MKFDS { "$TS_HELPER_MKFDS" make-regular-file $FD file="$FILE" lock=$m; }
+ if read -r -u "${MKFDS[0]}" PID; then
+ SLEEP
+
+ "$TS_CMD_LSLOCKS" ${OPTS} --pid "${PID}" -o "${COLS}"
+ echo "# $m + ${COLS} + ${OPTS}": $?
+ "$TS_CMD_LSLOCKS" ${OPTS} --pid "${PID}" -o PATH | sed -e 's#.*\('"$FILE0"'\)--[0-9]\+ *$#\1#'
+ echo "# $m + PATH + ${OPTS}": ${PIPESTATUS[0]}
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ } > "$TS_OUTPUT" 2>&1
+
+ wait "${MKFDS_PID}"
+}
+
+run_lslocks_with_co_holders()
+{
+ local m=$1
+
+ {
+ rm -f "${FILE}"
+ coproc MKFDS { "$TS_HELPER_MKFDS" make-regular-file $FD file="$FILE" lock=$m dupfd=$DFD; }
+ SLEEP
+ if read -r -u "${MKFDS[0]}" PID; then
+ "$TS_CMD_LSLOCKS" ${OPTS} --pid "${PID}" -o "${COLS_WITH_HOLDERS}" | sed -e "s/${PID},/1,/g"
+ echo "# $m + ${COLS_WITH_HOLDERS} + ${OPTS}": ${PIPESTATUS[0]}
+ echo DONE >&"${MKFDS[1]}"
+ fi
+ } > "$TS_OUTPUT" 2>&1
+
+ wait "${MKFDS_PID}"
+}
+
+for m in "${METHODS[@]}"; do
+ ts_init_subtest "$m"
+ run_lslocks "$m"
+ ts_finalize_subtest
+done
+
+for m in "${OFD_METHODS[@]}"; do
+ ts_init_subtest "$m+HOLDERS"
+ run_lslocks_with_co_holders "$m"
+ ts_finalize_subtest
+done
+
+ts_finalize
diff --git a/tests/ts/misc/boilerplate b/tests/ts/misc/boilerplate
new file mode 100755
index 0000000..d795ec2
--- /dev/null
+++ b/tests/ts/misc/boilerplate
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+# Copyright (C) 2023 Thomas Weißschuh <thomas@t-8ch.de>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="Documentation/boilerplate"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_BOILERPLATE"
+
+ts_init_subtest exec
+
+"$TS_HELPER_BOILERPLATE" >> "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+echo "ret=$?" >> "$TS_OUTPUT"
+
+ts_finalize_subtest
+
+ts_init_subtest help
+
+"$TS_HELPER_BOILERPLATE" --help >> "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+echo "ret=$?" >> "$TS_OUTPUT"
+
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/misc/enosys b/tests/ts/misc/enosys
new file mode 100755
index 0000000..ae93c63
--- /dev/null
+++ b/tests/ts/misc/enosys
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+# Copyright (C) 2022 Thomas Weißschuh <thomas@t-8ch.de>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="enosys"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_ENOSYS"
+ts_check_enosys_syscalls fallocate fsopen execve
+
+ts_init_subtest basic
+
+FALLOCATE_TEST="$TS_HELPER_ENOSYS fallocate"
+
+$FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+"$TS_CMD_ENOSYS" -s fallocate $FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+"$TS_CMD_ENOSYS" -s fsopen -s fallocate $FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+"$TS_CMD_ENOSYS" -s fallocate -s fsopen $FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+
+ts_finalize_subtest
+
+ts_init_subtest exec
+
+FALLOCATE_TEST="$TS_HELPER_ENOSYS exec"
+
+$FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+"$TS_CMD_ENOSYS" -s execve $FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+
+ts_finalize_subtest
+
+ts_init_subtest ioctl
+
+FALLOCATE_TEST="$TS_HELPER_ENOSYS ioctl"
+
+$FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+"$TS_CMD_ENOSYS" -s ioctl $FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+"$TS_CMD_ENOSYS" -i FIOCLEX $FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+"$TS_CMD_ENOSYS" -i "$("$TS_CMD_ENOSYS" -m | grep FIOCLEX | awk '{ print $1 }')" $FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+"$TS_CMD_ENOSYS" -s ioctl -i FIOCLEX $FALLOCATE_TEST > /dev/null 2>> "$TS_OUTPUT"
+
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/misc/lsclocks b/tests/ts/misc/lsclocks
new file mode 100755
index 0000000..71fefaa
--- /dev/null
+++ b/tests/ts/misc/lsclocks
@@ -0,0 +1,70 @@
+#!/bin/bash
+
+# Copyright (C) 2023 Thomas Weißschuh <thomas@t-8ch.de>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="lsclocks"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_LSCLOCKS"
+ts_check_prog sed
+
+mask_timestamps() {
+ sed 's/[0-9]\+\.[0-9]\+/X.X/g'
+}
+
+NO_DISCOVER="--no-discover-dynamic --no-discover-rtc"
+
+ts_init_subtest basic
+
+"$TS_CMD_LSCLOCKS" $NO_DISCOVER -o TYPE,ID,CLOCK,NAME > "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+
+ts_finalize_subtest
+
+ts_init_subtest time
+
+"$TS_CMD_LSCLOCKS" --time monotonic | mask_timestamps > "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+
+ts_finalize_subtest
+
+ts_init_subtest dynamic
+
+if [ -c /dev/ptp0 ] && [ -r /dev/ptp0 ]; then
+ "$TS_CMD_LSCLOCKS" $NO_DISCOVER --dynamic-clock /dev/ptp0 --output TYPE,ID,CLOCK,NAME \
+ | tail -1 > "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+ ts_finalize_subtest
+else
+ ts_skip_subtest "/dev/ptp0 not usable"
+fi
+
+ts_init_subtest rtc
+
+if [ -c /dev/rtc0 ] && [ -r /dev/rtc0 ]; then
+ "$TS_CMD_LSCLOCKS" $NO_DISCOVER --rtc /dev/rtc0 --output TYPE,ID,CLOCK,NAME \
+ | tail -1 > "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+ ts_finalize_subtest
+else
+ ts_skip_subtest "/dev/rtc0 not usable"
+fi
+
+ts_init_subtest cpu
+
+"$TS_CMD_LSCLOCKS" --cpu 1 --output TYPE,ID,NAME | tail -1 > "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/misc/setpgid b/tests/ts/misc/setpgid
new file mode 100755
index 0000000..40c4754
--- /dev/null
+++ b/tests/ts/misc/setpgid
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="setpgid"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_SETPGID"
+
+$TS_CMD_SETPGID echo "success" >> $TS_OUTPUT 2>> $TS_ERRLOG
+
+# qemu-user always reports '0' for the pgid field which prevents the test from
+# working so we skip it.
+ts_skip_qemu_user
+
+PGID1="$(awk '{print $5}' /proc/self/stat)"
+PGID2="$($TS_CMD_SETPGID awk '{print $5}' /proc/self/stat)"
+test ! "$PGID1" = "$PGID2" && echo "not equal" >> $TS_OUTPUT
+
+ts_finalize
diff --git a/tests/ts/misc/time_t b/tests/ts/misc/time_t
new file mode 100755
index 0000000..b0ced51
--- /dev/null
+++ b/tests/ts/misc/time_t
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# Copyright (C) 2023 Thomas Weißschuh <thomas@t-8ch.de>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="time_t size"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_SYSINFO"
+[ -n "$UL_ALLOW_32BIT_TIME" ] && ts_skip "32bit time allowed"
+
+"$TS_HELPER_SYSINFO" 'sz(time_t)' >> "$TS_OUTPUT"
+
+ts_finalize
diff --git a/tests/ts/misc/waitpid b/tests/ts/misc/waitpid
index ae5ab6f..904222c 100755
--- a/tests/ts/misc/waitpid
+++ b/tests/ts/misc/waitpid
@@ -24,7 +24,7 @@ ts_check_test_command "$TS_CMD_WAITPID"
ts_init_subtest normal
-(sleep 0.2; echo 1 >> "$TS_OUTPUT") &
+(sleep 0.5; echo 1 >> "$TS_OUTPUT") &
BG1="$!"
(sleep 0.1; echo 2 >> "$TS_OUTPUT") &
@@ -44,7 +44,7 @@ echo $? >> "$TS_OUTPUT"
ts_finalize_subtest
ts_init_subtest exited
-"$TS_CMD_WAITPID" -e 2147483647 >> "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+"$TS_CMD_WAITPID" -v -e 2147483647 >> "$TS_OUTPUT" 2>> "$TS_ERRLOG"
echo $? >> "$TS_ERRLOG"
ts_finalize_subtest
diff --git a/tests/ts/mkswap/mkswap b/tests/ts/mkswap/mkswap
index fa4856b..39b8723 100755
--- a/tests/ts/mkswap/mkswap
+++ b/tests/ts/mkswap/mkswap
@@ -27,6 +27,7 @@ ts_check_test_command "$TS_CMD_MKSWAP"
ts_check_test_command "$TS_HELPER_SYSINFO"
ts_check_prog "xz"
ts_check_prog "cmp"
+ts_check_prog "truncate"
UUID=4c08e1cd-3c82-46bf-a55b-0c3270d6dfeb
@@ -49,17 +50,54 @@ for PAGESIZE in 4096 8192; do
ts_init_subtest $name
rm -f "$outimg"
- truncate -s $(( PAGESIZE * 10 )) "$outimg" > $TS_ERRLOG 2>&1
+ truncate -s $(( PAGESIZE * 10 )) "$outimg" >> $TS_ERRLOG 2>&1
"$TS_CMD_MKSWAP" -q -L label -U "$UUID" -e "$ENDIANNESS" -p "$PAGESIZE" "$outimg" \
- > "$TS_OUTPUT" 2>/dev/null \
+ >> "$TS_OUTPUT" 2>/dev/null \
|| ts_log "mkswap failed"
xz -dc "$TS_SELF/${BYTE_ORDER}-${PAGESIZE}.img.xz" > "$origimg"
- cmp "$origimg" "$outimg" > "$TS_ERRLOG" 2>&1
+ cmp "$origimg" "$outimg" >> "$TS_ERRLOG" 2>&1
+
+ ts_finalize_subtest
+
+ ts_init_subtest "$name-file"
+
+ rm -f "$outimg"
+
+ "$TS_CMD_MKSWAP" -q -L label -U "$UUID" -e "$ENDIANNESS" -p "$PAGESIZE" -F -s $(( PAGESIZE * 10 )) "$outimg" \
+ >> "$TS_OUTPUT" 2>/dev/null \
+ || ts_log "mkswap failed"
+ xz -dc "$TS_SELF/${BYTE_ORDER}-${PAGESIZE}.img.xz" > "$origimg"
+
+ cmp "$origimg" "$outimg" >> "$TS_ERRLOG" 2>&1
ts_finalize_subtest
done
done
+ts_init_subtest offset
+
+offset=10000
+outimg="$TS_OUTDIR/offset.img"
+
+rm -f "$outimg"
+truncate -s $(( 4096 * 10 )) "$outimg" > $TS_ERRLOG 2>&1
+
+rm -f "$outimg.offset"
+truncate -s $(( 4096 * 10 + $offset )) "$outimg.offset" > $TS_ERRLOG 2>&1
+
+"$TS_CMD_MKSWAP" -q -U "$UUID" -p 4096 "$outimg" \
+ >> "$TS_OUTPUT" 2>/dev/null \
+ || ts_log "mkswap failed"
+
+"$TS_CMD_MKSWAP" -q -U "$UUID" -p 4096 -o "$offset" "$outimg.offset" \
+ >> "$TS_OUTPUT" 2>/dev/null \
+ || ts_log "mkswap -o failed"
+
+cmp -n "$offset" "$outimg.offset" /dev/zero >> "$TS_ERRLOG" 2>&1
+cmp "$outimg" "$outimg.offset" 0 "$offset" >> "$TS_ERRLOG" 2>&1
+
+ts_finalize_subtest
+
ts_finalize
diff --git a/tests/ts/mount/fallback b/tests/ts/mount/fallback
index e2a1de7..cbdf449 100755
--- a/tests/ts/mount/fallback
+++ b/tests/ts/mount/fallback
@@ -22,7 +22,7 @@ test_mount_fallback() {
mkdir -p "$MY_SOURCE"
mkdir -p "$TS_MOUNTPOINT"
- "$TS_HELPER_ENOSYS" $2 -- "$TS_CMD_MOUNT" --bind "$MY_SOURCE" "$TS_MOUNTPOINT" \
+ "$TS_CMD_ENOSYS" $2 -- "$TS_CMD_MOUNT" --bind "$MY_SOURCE" "$TS_MOUNTPOINT" \
>> "$TS_OUTPUT" 2>> "$TS_ERRLOG"
[ "$?" = "0" ] || ts_log "error: mount $TS_MOUNTPOINT"
@@ -49,7 +49,7 @@ mkdir -p "$MOUNTPOINT"
ts_init_subtest "later-fsopen"
-$TS_HELPER_ENOSYS -s fsopen -- "$TS_CMD_MOUNT" -t foo,bar,ext2 "$DEVICE" "$MOUNTPOINT" \
+$TS_CMD_ENOSYS -s fsopen -- "$TS_CMD_MOUNT" -t foo,bar,ext2 "$DEVICE" "$MOUNTPOINT" \
>> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
mkdir -p ${MOUNTPOINT}/subdir
@@ -58,7 +58,7 @@ ts_finalize_subtest
ts_init_subtest "subdir"
-$TS_HELPER_ENOSYS -s fsopen -s open_tree -- \
+$TS_CMD_ENOSYS -s fsopen -s open_tree -- \
"$TS_CMD_MOUNT" -o X-mount.subdir=subdir "$DEVICE" "$MOUNTPOINT" \
>> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
@@ -69,12 +69,12 @@ ts_finalize_subtest
ts_init_subtest "mount_setattr"
"$TS_CMD_MOUNT" "$DEVICE" "$MOUNTPOINT" >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
-$TS_HELPER_ENOSYS -s mount_setattr -- \
+$TS_CMD_ENOSYS -s mount_setattr -- \
"$TS_CMD_MOUNT" -o remount,ro "$MOUNTPOINT" \
>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_FINDMNT --kernel --mountpoint "$MOUNTPOINT" --options "ro" &> /dev/null
[ "$?" == "0" ] || ts_die "Cannot find read-only in $MOUNTPOINT in /proc/self/mountinfo"
-$TS_HELPER_ENOSYS -s mount_setattr -- \
+$TS_CMD_ENOSYS -s mount_setattr -- \
"$TS_CMD_MOUNT" --make-slave "$MOUNTPOINT" \
>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_FINDMNT -n --kernel --mountpoint "$MOUNTPOINT" -o PROPAGATION >> $TS_OUTPUT
diff --git a/tests/ts/mount/fslists b/tests/ts/mount/fslists
index 230186a..6ac72c3 100755
--- a/tests/ts/mount/fslists
+++ b/tests/ts/mount/fslists
@@ -61,7 +61,7 @@ ts_finalize_subtest
ts_init_subtest "more-types-fstab"
[ -d "$TS_MOUNTPOINT" ] || mkdir -p $TS_MOUNTPOINT
ts_fstab_add $DEVICE $TS_MOUNTPOINT "foo,bar,ext2"
-$TS_CMD_MOUNT $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fstab_clean
ts_is_mounted $DEVICE || ts_die "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $TS_MOUNTPOINT
diff --git a/tests/ts/mount/fstab-all b/tests/ts/mount/fstab-all
index 83e1b63..ad9a7d0 100755
--- a/tests/ts/mount/fstab-all
+++ b/tests/ts/mount/fstab-all
@@ -68,16 +68,15 @@ MOUNTPOINT=$TS_MOUNTPOINT
[ -d "${MOUNTPOINT}D" ] || mkdir -p ${MOUNTPOINT}D
# generic fstab
-MY_FSTAB="$TS_OUTDIR/${TS_TESTNAME}.fstab"
-rm -rf $MY_FSTAB
-echo "${TS_DEVICE}1 ${MOUNTPOINT}A ext2 rw,defaults 0 0" >> $MY_FSTAB
-echo "${TS_DEVICE}2 ${MOUNTPOINT}B ext2 rw,defaults 0 0" >> $MY_FSTAB
-echo "${TS_DEVICE}3 ${MOUNTPOINT}C ext2 ro,defaults 0 0" >> $MY_FSTAB
-echo "${TS_DEVICE}4 ${MOUNTPOINT}D ext4 rw,defaults 0 0" >> $MY_FSTAB
+rm -rf "${TS_FSTAB}"
+echo "${TS_DEVICE}1 ${MOUNTPOINT}A ext2 rw,defaults 0 0" >> "${TS_FSTAB}"
+echo "${TS_DEVICE}2 ${MOUNTPOINT}B ext2 rw,defaults 0 0" >> "${TS_FSTAB}"
+echo "${TS_DEVICE}3 ${MOUNTPOINT}C ext2 ro,defaults 0 0" >> "${TS_FSTAB}"
+echo "${TS_DEVICE}4 ${MOUNTPOINT}D ext4 rw,defaults 0 0" >> "${TS_FSTAB}"
ts_init_subtest "basic"
-$TS_CMD_MOUNT --all --fstab $MY_FSTAB >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT --all --fstab "${TS_FSTAB}" >> $TS_OUTPUT 2>> $TS_ERRLOG
[ $? == 0 ] || ts_log "mount failed"
udevadm settle
$TS_CMD_UMOUNT ${MOUNTPOINT}{A,B,C,D}
@@ -86,7 +85,7 @@ ts_finalize_subtest
ts_init_subtest "filter-type"
-$TS_CMD_MOUNT --all --fstab $MY_FSTAB -t ext4 >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT --all --fstab "${TS_FSTAB}" -t ext4 >> $TS_OUTPUT 2>> $TS_ERRLOG
[ $? == 0 ] || ts_log "mount failed"
udevadm settle
$TS_CMD_UMOUNT ${MOUNTPOINT}D
@@ -95,7 +94,7 @@ ts_finalize_subtest
ts_init_subtest "filter-notype"
-$TS_CMD_MOUNT --all --fstab $MY_FSTAB -t noext4 >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT --all --fstab "${TS_FSTAB}" -t noext4 >> $TS_OUTPUT 2>> $TS_ERRLOG
[ $? == 0 ] || ts_log "mount failed"
udevadm settle
$TS_CMD_UMOUNT ${MOUNTPOINT}{A,B,C}
@@ -104,7 +103,7 @@ ts_finalize_subtest
ts_init_subtest "filter-option"
-$TS_CMD_MOUNT --all --fstab $MY_FSTAB -O ro >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT --all --fstab "${TS_FSTAB}" -O ro >> $TS_OUTPUT 2>> $TS_ERRLOG
[ $? == 0 ] || ts_log "mount failed"
udevadm settle
$TS_CMD_UMOUNT ${MOUNTPOINT}C
@@ -113,7 +112,7 @@ ts_finalize_subtest
ts_init_subtest "override-option"
-$TS_CMD_MOUNT --all --fstab $MY_FSTAB -o ro >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT --all --fstab "${TS_FSTAB}" -o ro >> $TS_OUTPUT 2>> $TS_ERRLOG
[ $? == 0 ] || ts_log "mount failed"
udevadm settle
$TS_CMD_UMOUNT ${MOUNTPOINT}{A,B,C,D}
@@ -123,7 +122,7 @@ ts_finalize_subtest
ts_init_subtest "relative-path"
cd "$TS_OUTDIR" > /dev/null
-$TS_CMD_MOUNT --all --fstab $(basename "$MY_FSTAB") >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT --all --fstab $(basename "${TS_FSTAB}") >> $TS_OUTPUT 2>> $TS_ERRLOG
[ $? == 0 ] || ts_log "mount failed"
udevadm settle
$TS_CMD_UMOUNT ${MOUNTPOINT}{A,B,C,D}
@@ -135,16 +134,14 @@ ts_finalize_subtest
ts_init_subtest "prefix"
MY_ROOT="$TS_OUTDIR/${TS_TESTNAME}-rootdir"
[ -d "${MY_ROOT}" ] || mkdir -p ${MY_ROOT}
-# sub-test specific fstab
-MY_FSTAB="$TS_OUTDIR/${TS_TESTNAME}.fstab"
-rm -rf $MY_FSTAB
-echo "${TS_DEVICE}1 /foo/A ext2 rw,defaults 0 0" >> $MY_FSTAB
-echo "${TS_DEVICE}2 /foo/B ext2 rw,defaults 0 0" >> $MY_FSTAB
-echo "${TS_DEVICE}3 /foo/C ext2 rw,defaults 0 0" >> $MY_FSTAB
-echo "${TS_DEVICE}4 /foo/D ext4 rw,defaults 0 0" >> $MY_FSTAB
+rm -rf "${TS_FSTAB}"
+echo "${TS_DEVICE}1 /foo/A ext2 rw,defaults 0 0" >> "${TS_FSTAB}"
+echo "${TS_DEVICE}2 /foo/B ext2 rw,defaults 0 0" >> "${TS_FSTAB}"
+echo "${TS_DEVICE}3 /foo/C ext2 rw,defaults 0 0" >> "${TS_FSTAB}"
+echo "${TS_DEVICE}4 /foo/D ext4 rw,defaults 0 0" >> "${TS_FSTAB}"
# mount all to prefix
$TS_CMD_MOUNT --all \
- --fstab $MY_FSTAB \
+ --fstab "${TS_FSTAB}" \
--target-prefix $MY_ROOT \
-o X-mount.mkdir >> $TS_OUTPUT 2>> $TS_ERRLOG
[ $? == 0 ] || ts_log "mount failed"
diff --git a/tests/ts/mount/fstab-bind b/tests/ts/mount/fstab-bind
index 2c799df..cae016d 100755
--- a/tests/ts/mount/fstab-bind
+++ b/tests/ts/mount/fstab-bind
@@ -20,7 +20,7 @@ ts_fstab_add $MY_SOURCE "$TS_MOUNTPOINT" "none" "bind,default,noauto"
mkdir -p $MY_SOURCE
mkdir -p $TS_MOUNTPOINT
-$TS_CMD_MOUNT $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
[ "$?" = "0" ] || ts_log "error: mount $TS_MOUNTPOINT"
$TS_CMD_FINDMNT --mountpoint "$TS_MOUNTPOINT" &> /dev/null
diff --git a/tests/ts/mount/fstab-broken b/tests/ts/mount/fstab-broken
index 19edc5f..ec4c342 100755
--- a/tests/ts/mount/fstab-broken
+++ b/tests/ts/mount/fstab-broken
@@ -34,11 +34,11 @@ mkdir -p $MNT
ts_fstab_lock
ts_fstab_open
-echo "tmpd $MNT tmpfs" >> /etc/fstab
+echo "tmpd $MNT tmpfs" >> "$TS_FSTAB"
ts_fstab_close
ts_init_subtest "mount"
-$TS_CMD_MOUNT $MNT &> /dev/null
+$TS_CMD_MOUNT -T "$TS_FSTAB" $MNT &> /dev/null
[ "$?" = "0" ] || ts_log "error: mount $MNT"
$TS_CMD_FINDMNT --kernel --mountpoint "$MNT" &> /dev/null
if [ "$?" != "0" ]; then
@@ -57,7 +57,7 @@ ts_finalize_subtest
ts_init_subtest "mount-all"
-$TS_CMD_MOUNT -a &> /dev/null
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a &> /dev/null
[ "$?" = "0" ] || ts_log "error: mount -a"
$TS_CMD_FINDMNT --kernel --mountpoint "$MNT" &> /dev/null
if [ "$?" != "0" ]; then
diff --git a/tests/ts/mount/fstab-btrfs b/tests/ts/mount/fstab-btrfs
index a1003ab..8e76dbb 100755
--- a/tests/ts/mount/fstab-btrfs
+++ b/tests/ts/mount/fstab-btrfs
@@ -94,8 +94,8 @@ ts_fstab_addline "$DEVICE" "$TS_MOUNTPOINT_SUBVOLID" "btrfs" "subvolid=$NON_DEFA
ts_fstab_addline "$TS_MOUNTPOINT_SUBVOLID" "$TS_MOUNTPOINT_BIND" "auto" "bind"
ts_fstab_close
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_UMOUNT "$TS_MOUNTPOINT_BIND" >> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_UMOUNT "$TS_MOUNTPOINT_DEFAULT" >> $TS_OUTPUT 2>> $TS_ERRLOG
@@ -124,8 +124,8 @@ ts_fstab_addline "$DEVICE" "$TS_MOUNTPOINT_SUBVOLID" "auto" "subvolid=$NON_DEFAU
ts_fstab_addline "$TS_MOUNTPOINT_SUBVOL/bind-mnt" "$TS_MOUNTPOINT_BIND" "auto" "bind"
ts_fstab_close
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_UMOUNT "$TS_MOUNTPOINT_BIND" >> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_UMOUNT "$TS_MOUNTPOINT_DEFAULT" >> $TS_OUTPUT 2>> $TS_ERRLOG
diff --git a/tests/ts/mount/fstab-devname b/tests/ts/mount/fstab-devname
index 5b64a32..6ac03b5 100755
--- a/tests/ts/mount/fstab-devname
+++ b/tests/ts/mount/fstab-devname
@@ -42,13 +42,13 @@ MOUNTPOINT=$TS_MOUNTPOINT
ts_fstab_add $DEVICE
ts_init_subtest "mountpoint"
-$TS_CMD_MOUNT $MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" $MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE || >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
ts_init_subtest "device-name"
-$TS_CMD_MOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
diff --git a/tests/ts/mount/fstab-devname2label b/tests/ts/mount/fstab-devname2label
index 1d85621..44066e1 100755
--- a/tests/ts/mount/fstab-devname2label
+++ b/tests/ts/mount/fstab-devname2label
@@ -41,7 +41,7 @@ ts_device_has "LABEL" $LABEL $DEVICE \
ts_fstab_add "LABEL=$LABEL"
ts_udevadm_settle "$DEVICE" "LABEL"
-$TS_CMD_MOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_die "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE || ts_die "Cannot umount $DEVICE"
diff --git a/tests/ts/mount/fstab-devname2uuid b/tests/ts/mount/fstab-devname2uuid
index 8105fa0..5039591 100755
--- a/tests/ts/mount/fstab-devname2uuid
+++ b/tests/ts/mount/fstab-devname2uuid
@@ -39,7 +39,7 @@ UUID=$(ts_uuid_by_devname "$DEVICE") || ts_die "Cannot find UUID on $DEVICE"
ts_fstab_add "UUID=$UUID"
ts_udevadm_settle "$DEVICE" "UUID"
-$TS_CMD_MOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_die "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE || ts_die "Cannot umount $DEVICE"
diff --git a/tests/ts/mount/fstab-label b/tests/ts/mount/fstab-label
index 4b23e7f..a3cc06d 100755
--- a/tests/ts/mount/fstab-label
+++ b/tests/ts/mount/fstab-label
@@ -42,19 +42,19 @@ ts_fstab_add "LABEL=$LABEL"
ts_udevadm_settle "$DEVICE" "LABEL"
ts_init_subtest "no-option"
-$TS_CMD_MOUNT $MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" $MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
ts_init_subtest "L-option"
-$TS_CMD_MOUNT -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
ts_init_subtest "LABEL-option"
-$TS_CMD_MOUNT LABEL=$LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" LABEL=$LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
diff --git a/tests/ts/mount/fstab-label2devname b/tests/ts/mount/fstab-label2devname
index 75ca05e..fddbfa0 100755
--- a/tests/ts/mount/fstab-label2devname
+++ b/tests/ts/mount/fstab-label2devname
@@ -44,13 +44,13 @@ ts_udevadm_settle "$DEVICE" "LABEL"
[ -d "$TS_MOUNTPOINT" ] || mkdir -p $TS_MOUNTPOINT
ts_init_subtest "L-option"
-$TS_CMD_MOUNT -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
ts_init_subtest "LABEL-option"
-$TS_CMD_MOUNT "LABEL=$LABEL" >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" "LABEL=$LABEL" >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
diff --git a/tests/ts/mount/fstab-label2uuid b/tests/ts/mount/fstab-label2uuid
index 4bfcae4..927cde9 100755
--- a/tests/ts/mount/fstab-label2uuid
+++ b/tests/ts/mount/fstab-label2uuid
@@ -46,13 +46,13 @@ ts_udevadm_settle "$DEVICE" "LABEL" "UUID"
[ -d "$TS_MOUNTPOINT" ] || mkdir -p $TS_MOUNTPOINT
ts_init_subtest "L-option"
-$TS_CMD_MOUNT -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
ts_init_subtest "LABEL-option"
-$TS_CMD_MOUNT "LABEL=$LABEL" >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" "LABEL=$LABEL" >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
diff --git a/tests/ts/mount/fstab-loop b/tests/ts/mount/fstab-loop
index 7cc589f..0541e3a 100755
--- a/tests/ts/mount/fstab-loop
+++ b/tests/ts/mount/fstab-loop
@@ -39,10 +39,10 @@ ts_fstab_lock
ts_fstab_open
ts_fstab_addline "$IMG" "$TS_MOUNTPOINT-1" "ext2" "loop"
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fstab_addline "$IMG" "$TS_MOUNTPOINT-2" "ext2" "loop"
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fstab_close
diff --git a/tests/ts/mount/fstab-none b/tests/ts/mount/fstab-none
index 6a4d05b..95daa6c 100755
--- a/tests/ts/mount/fstab-none
+++ b/tests/ts/mount/fstab-none
@@ -17,7 +17,7 @@ ts_fstab_add "none" "$TS_MOUNTPOINT" "tmpfs" "rw,nosuid,nodev,relatime"
mkdir -p $TS_MOUNTPOINT
-$TS_CMD_MOUNT $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
[ "$?" = "0" ] || ts_log "error: mount $TS_MOUNTPOINT"
$TS_CMD_FINDMNT --mountpoint "$TS_MOUNTPOINT" &> /dev/null
diff --git a/tests/ts/mount/fstab-symlink b/tests/ts/mount/fstab-symlink
index 4d3e37b..6d419f9 100755
--- a/tests/ts/mount/fstab-symlink
+++ b/tests/ts/mount/fstab-symlink
@@ -46,7 +46,7 @@ ln -s $DEVICE $LINKNAME
ts_fstab_add $LINKNAME $TS_MOUNTPOINT "auto" "defaults,user"
# variant A) -- UID=0
-$TS_CMD_MOUNT $LINKNAME >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" $LINKNAME >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_die "A) Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $LINKNAME || ts_die "A) Cannot umount $LINKNAME"
diff --git a/tests/ts/mount/fstab-uuid b/tests/ts/mount/fstab-uuid
index 03917b7..f51bb29 100755
--- a/tests/ts/mount/fstab-uuid
+++ b/tests/ts/mount/fstab-uuid
@@ -42,19 +42,19 @@ ts_fstab_add "UUID=$UUID"
ts_udevadm_settle "$DEVICE" "UUID"
ts_init_subtest "no-option"
-$TS_CMD_MOUNT $MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" $MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
ts_init_subtest "U-option"
-$TS_CMD_MOUNT -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
ts_init_subtest "UUID-option"
-$TS_CMD_MOUNT UUID=$UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" UUID=$UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
diff --git a/tests/ts/mount/fstab-uuid2devname b/tests/ts/mount/fstab-uuid2devname
index 9bf165e..2b338ac 100755
--- a/tests/ts/mount/fstab-uuid2devname
+++ b/tests/ts/mount/fstab-uuid2devname
@@ -42,13 +42,13 @@ ts_udevadm_settle "$DEVICE" "UUID"
[ -d "$TS_MOUNTPOINT" ] || mkdir -p $TS_MOUNTPOINT
ts_init_subtest "U-option"
-$TS_CMD_MOUNT -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
ts_init_subtest "UUID-option"
-$TS_CMD_MOUNT "UUID=$UUID" >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" "UUID=$UUID" >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
diff --git a/tests/ts/mount/fstab-uuid2label b/tests/ts/mount/fstab-uuid2label
index de10ff0..02eb6b9 100755
--- a/tests/ts/mount/fstab-uuid2label
+++ b/tests/ts/mount/fstab-uuid2label
@@ -45,13 +45,13 @@ ts_udevadm_settle "$DEVICE" "LABEL" "UUID"
[ -d "$TS_MOUNTPOINT" ] || mkdir -p $TS_MOUNTPOINT
ts_init_subtest "U-option"
-$TS_CMD_MOUNT -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_finalize_subtest
ts_init_subtest "UUID-option"
-$TS_CMD_MOUNT "UUID=$UUID" >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_MOUNT -T "$TS_FSTAB" "UUID=$UUID" >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_is_mounted $DEVICE || ts_log "Cannot find $DEVICE in /proc/mounts"
$TS_CMD_UMOUNT $DEVICE >> $TS_OUTPUT 2>>$TS_ERRLOG
ts_finalize_subtest
diff --git a/tests/ts/mount/special b/tests/ts/mount/special
index 359d8aa..1771f5a 100755
--- a/tests/ts/mount/special
+++ b/tests/ts/mount/special
@@ -23,6 +23,7 @@ MOUNTER="/sbin/mount.mytest"
ts_init "$*"
ts_check_test_command "$TS_CMD_MOUNT"
+ts_check_test_command "$TS_CMD_UMOUNT"
ts_skip_nonroot
@@ -55,7 +56,45 @@ ts_init_subtest "username"
$TS_CMD_MOUNT -t mytest -ouser=name,abc /foo /bar &> $TS_OUTPUT
ts_finalize_subtest
-rm -f $MOUNTER
-ts_finalize
+ts_init_subtest "missing-options"
+grep -q 'nodev[[:space:]]*tmpfs' /proc/filesystems
+if [ "$?" == "0" ]; then
+cat > $MOUNTER <<EOF
+#!/bin/bash
+# This util-linux regression test component
+# It's safe to remove me...
+#
+exec $TS_CMD_MOUNT -t tmpfs -i "\$1" "\$2" -o x-foo=123
+EOF
+ chmod +x $MOUNTER
+
+ mountpoint="$TS_OUTDIR/mnt"
+ mkdir -p "$mountpoint"
+ export LIBMOUNT_UTAB=$TS_OUTDIR/utab
+ rm -f $LIBMOUNT_UTAB
+ echo -n "" > $LIBMOUNT_UTAB
+
+ $TS_CMD_MOUNT -t mytest -o x-bar=BAR /foo "$mountpoint" &> $TS_OUTPUT
+ udevadm settle
+
+ grep -q "$mountpoint" /proc/mounts
+ if [ "$?" == "0" ]; then
+ cat "$LIBMOUNT_UTAB" \
+ | grep "$mountpoint" \
+ | sed -e "s|$mountpoint|/mountpoint|g" \
+ -e 's/ID=[[:digit:]]* //g' \
+ &> $TS_OUTPUT
+ $TS_CMD_UMOUNT "$mountpoint"
+ unset LIBMOUNT_UTAB
+ rm -f $MOUNTER
+ ts_finalize_subtest
+ else
+ ts_skip_subtest "tmpfs not mounted"
+ fi
+else
+ ts_skip_subtest "tmpfs unsupported"
+fi
+
+ts_finalize
diff --git a/tests/ts/mount/umount-recursive b/tests/ts/mount/umount-recursive
index 8b1fd47..94e3680 100755
--- a/tests/ts/mount/umount-recursive
+++ b/tests/ts/mount/umount-recursive
@@ -86,7 +86,7 @@ $TS_CMD_MOUNT ${TS_DEVICE}4 $TS_MOUNTPOINT/mntB/mntD >> $TS_OUTPUT 2>> $TS_ERRLO
ts_log "E) Mount child-bind"
mkdir -p $TS_MOUNTPOINT/bindC
-$TS_CMD_MOUNT --bind $TS_MOUNTPOINT/mntB/mntC $TS_MOUNTPOINT/bindC &> /dev/nul
+$TS_CMD_MOUNT --bind $TS_MOUNTPOINT/mntB/mntC $TS_MOUNTPOINT/bindC &> /dev/null
ts_log "F) Mount mountpoint-bind"
$TS_CMD_MOUNT --bind $TS_MOUNTPOINT $TS_MOUNTPOINT &> /dev/null
diff --git a/tests/ts/rename/basic b/tests/ts/rename/basic
index 786b092..28d1a57 100755
--- a/tests/ts/rename/basic
+++ b/tests/ts/rename/basic
@@ -72,4 +72,8 @@ touch rename_all_empty
$TS_CMD_RENAME -v -a '' _ rename_all_empty >> $TS_OUTPUT 2>> $TS_ERRLOG
rm -f _r_e_n_a_m_e___a_l_l___e_m_p_t_y_
+mkdir rename_dir
+$TS_CMD_RENAME -v dir new_dir rename_dir/ >> $TS_OUTPUT 2>> $TS_ERRLOG
+rmdir rename_new_dir
+
ts_finalize
diff --git a/tests/ts/schedutils/chrt b/tests/ts/schedutils/chrt
index aca735f..fd5f7af 100755
--- a/tests/ts/schedutils/chrt
+++ b/tests/ts/schedutils/chrt
@@ -21,9 +21,8 @@ ts_init "$*"
ts_check_test_command "$TS_CMD_CHRT"
ts_skip_nonroot
-
-# TODO: drone.io does not like FIFO and RR (container restriction?)
-TS_KNOWN_FAIL="yes"
+ts_skip_docker
+ts_skip_qemu_user
function do_chrt {
$TS_CMD_CHRT $* $TS_CMD_CHRT --pid 0 | sed 's/.* policy: //; s/.* priority: //' >> $TS_OUTPUT 2>> $TS_ERRLOG
@@ -93,9 +92,9 @@ fi
ts_init_subtest "deadline"
skip_policy SCHED_DEADLINE
if [ $? == 0 ]; then
- do_chrt --deadline --sched-period 13000 0
- do_chrt --deadline --sched-period 13000 --sched-deadline 12000 0
- do_chrt --deadline --sched-period 13000 --sched-deadline 12000 --sched-runtime 10000 0
+ do_chrt --deadline --sched-period 130000 0
+ do_chrt --deadline --sched-period 130000 --sched-deadline 120000 0
+ do_chrt --deadline --sched-period 130000 --sched-deadline 120000 --sched-runtime 100000 0
cleanup_output
ts_finalize_subtest
fi
diff --git a/tests/ts/setpriv/landlock b/tests/ts/setpriv/landlock
new file mode 100755
index 0000000..d4ce5d1
--- /dev/null
+++ b/tests/ts/setpriv/landlock
@@ -0,0 +1,64 @@
+#!/bin/bash
+
+# Copyright (C) 2023 Thomas Weißschuh <thomas@t-8ch.de>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="setpriv landlock"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+[[ "$COVERAGE" = yes ]] && ts_skip "does not work with coverage"
+
+ts_check_test_command "$TS_CMD_SETPRIV"
+
+"$TS_CMD_SETPRIV" --landlock-access fs \
+ --landlock-rule path-beneath:execute:/ \
+ --landlock-rule path-beneath:read-file:/ \
+ true \
+ || ts_skip "no landlock support in setpriv"
+
+ts_init_subtest "nothing-allowed"
+"$TS_CMD_SETPRIV" --landlock-access fs true &> "$TS_OUTPUT"
+ts_finalize_subtest
+
+ts_init_subtest "partial-access-fail"
+"$TS_CMD_SETPRIV" --landlock-access \
+ fs:write cp /dev/null /dev/zero \
+ &> "$TS_OUTPUT"
+ts_finalize_subtest
+
+ts_init_subtest "partial-access-success"
+"$TS_CMD_SETPRIV" \
+ --landlock-access fs:write --landlock-rule path-beneath:write:/dev/zero \
+ cp /dev/null /dev/zero \
+ &> "$TS_OUTPUT"
+ts_finalize_subtest
+
+ts_init_subtest "combined-access"
+"$TS_CMD_SETPRIV" --landlock-access fs:execute,read-file \
+ --landlock-rule path-beneath:execute,read-file:/ \
+ true \
+ &> "$TS_OUTPUT"
+ts_finalize_subtest
+
+ts_init_subtest "wildcard-access"
+"$TS_CMD_SETPRIV" --landlock-access fs \
+ --landlock-rule path-beneath::/ \
+ true \
+ &> "$TS_OUTPUT"
+ts_finalize_subtest
+
+ts_finalize
diff --git a/tests/ts/swapon/devname b/tests/ts/swapon/devname
index d62b9d9..f4f9c16 100755
--- a/tests/ts/swapon/devname
+++ b/tests/ts/swapon/devname
@@ -36,11 +36,11 @@ $TS_CMD_MKSWAP $DEVICE > /dev/null 2>> $TS_OUTPUT \
ts_device_has "TYPE" "swap" $DEVICE || ts_die "Cannot find swap on $DEVICE"
-$TS_CMD_SWAPON $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
+$TS_CMD_SWAPON $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG || ts_die "Swapon failed"
grep -q "^$DEVICE\b" /proc/swaps || ts_die "Cannot find $DEVICE in /proc/swaps"
-$TS_CMD_SWAPOFF $DEVICE
+$TS_CMD_SWAPOFF $DEVICE || ts_die "Swapoff failed"
# swapon/mkswap warns if system sets different permissions for loop devices
sed --in-place '/insecure permissions .*, 0660 suggested/d' $TS_OUTPUT
diff --git a/tests/ts/wipefs/images/bcachefs.img.xz b/tests/ts/wipefs/images/bcachefs.img.xz
new file mode 100644
index 0000000..2c74b96
--- /dev/null
+++ b/tests/ts/wipefs/images/bcachefs.img.xz
Binary files differ
diff --git a/tests/ts/wipefs/signatures b/tests/ts/wipefs/signatures
new file mode 100755
index 0000000..7749588
--- /dev/null
+++ b/tests/ts/wipefs/signatures
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+#
+# Copyright (C) 2023 Thomas Weißschuh <thomas@t-8ch.de>
+#
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="signatures"
+
+. "$TS_TOPDIR"/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_WIPEFS"
+ts_check_prog "xz"
+
+mkdir -p "${TS_OUTDIR}/images"
+
+for img in $(ls "${TS_SELF}"/images/*.img.xz | sort); do
+ name="$(basename "$img" .img.xz)"
+ outimg="${TS_OUTDIR}/images/${name}.img"
+
+ xz -dc "$img" > "$outimg"
+
+ ts_init_subtest "$name"
+ "$TS_CMD_WIPEFS" --parsable --no-act "$outimg" 2> "$TS_ERRLOG" > "$TS_OUTPUT"
+ ts_finalize_subtest
+done
+
+ts_finalize
diff --git a/tests/ts/wipefs/wipefs b/tests/ts/wipefs/wipefs
index c79be0c..0f0f8d8 100755
--- a/tests/ts/wipefs/wipefs
+++ b/tests/ts/wipefs/wipefs
@@ -7,25 +7,27 @@ TS_DESC="wipefs"
ts_init "$*"
ts_check_test_command "$TS_CMD_WIPEFS"
+ts_check_test_command "$TS_CMD_MKMINIX"
-ts_skip_nonroot
+img="$(ts_image_init 50)"
+backups="$TS_OUTDIR/backups"
-# set global variable TS_DEVICE
-ts_scsi_debug_init dev_size_mb=50 num_parts=2
+"$TS_CMD_MKMINIX" "$img" &>/dev/null
# remove old backups
-rm -rf $HOME/wipefs-$(basename ${TS_DEVICE})-*.bak
+rm -rf "$backups"
+mkdir -p "$backups"
#remove the magic byte, back it up
-$TS_CMD_WIPEFS --all --backup ${TS_DEVICE} &>/dev/null || ts_die "wipefs failed"
+$TS_CMD_WIPEFS --all --backup="${backups}" ${img} &>/dev/null || ts_die "wipefs failed"
#there should be just one magic string/backup file in this case
-INFILE=$(ls $HOME/wipefs-$(basename ${TS_DEVICE})-*.bak)
+INFILE=$(ls $backups/wipefs-$(basename ${img})-*.bak)
OFFT=$(echo $INFILE | sed 's/^.*-\(.*\).bak$/\1/')
-dd if=$INFILE of=$TS_DEVICE bs=1 conv=notrunc seek=$(($OFFT)) &>/dev/null
+dd if=$INFILE of=$img bs=1 conv=notrunc seek=$(($OFFT)) &>/dev/null
#the bytes should be copied back, check if wipefs can recognize it
-$TS_CMD_WIPEFS -a ${TS_DEVICE} > $TS_OUTDIR/out 2>/dev/null
+$TS_CMD_WIPEFS -a ${img} > $TS_OUTDIR/out 2>/dev/null
# check for output
[ -s $TS_OUTDIR/out ] && echo "OK" &> $TS_OUTPUT || exit 1