diff options
author | Eugene Syromyatnikov <evgsyr@gmail.com> | 2018-10-24 21:44:45 +0200 |
---|---|---|
committer | Eugene Syromyatnikov <evgsyr@gmail.com> | 2022-09-02 17:55:13 +0200 |
commit | bdcfc9bdf7418063bc6c9744221ff85fe1c776ba (patch) | |
tree | c64e7072ed892fd1c01f4bf4ff3ca420f475cc1b | |
parent | 8ba28faed4cba6ecfb6e9044068836466d35cb1e (diff) | |
download | strace-bdcfc9bdf7418063bc6c9744221ff85fe1c776ba.tar.gz |
fcntl: decode read/write hints commands
Introduced by Linux commit v4.13-rc1~212^2~51.
* xlat/fcntl_rw_hints.in: New file.
* fcntl.c: Include "xlat/fcntl_rw_hints.h".
(print_rwhint): New function.
(print_fcntl) <case F_SET_RW_HINT, case F_SET_FILE_RW_HINT, case
F_GET_RW_HINT, case F_GET_FILE_RW_HINT>: New fcntl command handlers.
* xlat/fcntlcmds.in (F_GET_RW_HINT, F_SET_RW_HINT, F_GET_FILE_RW_HINT,
F_SET_FILE_RW_HINT): New constants.
-rw-r--r-- | src/fcntl.c | 27 | ||||
-rw-r--r-- | src/xlat/fcntl_rw_hints.in | 7 | ||||
-rw-r--r-- | src/xlat/fcntlcmds.in | 4 |
3 files changed, 38 insertions, 0 deletions
diff --git a/src/fcntl.c b/src/fcntl.c index 333a6b598..4f12d3982 100644 --- a/src/fcntl.c +++ b/src/fcntl.c @@ -27,6 +27,7 @@ #include "xlat/f_owner_types.h" #include "xlat/f_seals.h" +#include "xlat/fcntl_rw_hints.h" #include "xlat/fcntlcmds.h" #include "xlat/fdflags.h" #include "xlat/lockfcmds.h" @@ -113,6 +114,19 @@ print_owner_uids(struct tcb *const tcp, const kernel_ulong_t addr) tprint_array_end(); } +static void +print_rwhint(struct tcb *const tcp, const kernel_ulong_t addr) +{ + uint64_t hint; + + if (umove_or_printaddr(tcp, addr, &hint)) + return; + + tprint_indirect_begin(); + printxval(fcntl_rw_hints, hint, "RWH_WRITE_LIFE_???"); + tprint_indirect_end(); +} + static int print_fcntl(struct tcb *tcp) { @@ -170,6 +184,11 @@ print_fcntl(struct tcb *tcp) tprint_arg_next(); printsignal(tcp->u_arg[2]); break; + case F_SET_RW_HINT: + case F_SET_FILE_RW_HINT: + tprint_arg_next(); + print_rwhint(tcp, tcp->u_arg[2]); + break; case F_GETOWN: return RVAL_DECODED | ((int) tcp->u_rval < 0 ? RVAL_PGID : RVAL_TGID); @@ -215,6 +234,14 @@ print_fcntl(struct tcb *tcp) tcp->auxstr = sprintflags("seals ", f_seals, (kernel_ulong_t) tcp->u_rval); return RVAL_HEX | RVAL_STR; + case F_GET_RW_HINT: + case F_GET_FILE_RW_HINT: + if (entering(tcp)) { + tprint_arg_next(); + return 0; + } + print_rwhint(tcp, tcp->u_arg[2]); + break; case F_GETSIG: if (entering(tcp) || syserror(tcp) || tcp->u_rval == 0) return 0; diff --git a/src/xlat/fcntl_rw_hints.in b/src/xlat/fcntl_rw_hints.in new file mode 100644 index 000000000..a70d24cd0 --- /dev/null +++ b/src/xlat/fcntl_rw_hints.in @@ -0,0 +1,7 @@ +#value_indexed +RWH_WRITE_LIFE_NOT_SET 0 +RWH_WRITE_LIFE_NONE 1 +RWH_WRITE_LIFE_SHORT 2 +RWH_WRITE_LIFE_MEDIUM 3 +RWH_WRITE_LIFE_LONG 4 +RWH_WRITE_LIFE_EXTREME 5 diff --git a/src/xlat/fcntlcmds.in b/src/xlat/fcntlcmds.in index e2305b00f..c5e6f690e 100644 --- a/src/xlat/fcntlcmds.in +++ b/src/xlat/fcntlcmds.in @@ -29,3 +29,7 @@ F_SETPIPE_SZ F_GETPIPE_SZ F_ADD_SEALS F_GET_SEALS +F_GET_RW_HINT +F_SET_RW_HINT +F_GET_FILE_RW_HINT +F_SET_FILE_RW_HINT |