diff options
author | Dmitry V. Levin <ldv@strace.io> | 2021-05-09 10:00:00 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@strace.io> | 2021-05-09 10:00:00 +0000 |
commit | 05c835d85eb9655bb304ea146f0bca7255b33eb2 (patch) | |
tree | bd3b7e5d481d161652b81251f232786e1402ec7b /src/defs.h | |
parent | aeab8d228e308ed44afab0ef6754282c32cc3c0a (diff) | |
download | strace-05c835d85eb9655bb304ea146f0bca7255b33eb2.tar.gz |
tprint_iov, tprint_iov_upto: replace enum iov_decode with a function pointer
This paves the way for custom printers of struct iovec.
* src/defs.h (enum iov_decode): Remove.
(print_obj_by_addr_size_fn): New typedef.
(iov_decode_addr, iov_decode_str): New function prototypes.
(tprint_iov_upto): Remove enum iov_decode argument, add
print_obj_by_addr_size_fn and void *opaque_data arguments.
All users updated.
(tprint_iov): Replace enum iov_decode argument with
print_obj_by_addr_size_fn. All users updated.
* src/io.c (iov_decode_addr, iov_decode_str): New functions.
(struct print_iovec_config): Replace decode_iov field with
print_func and opaque_data.
(print_iovec_klong): Use them.
(tprint_iov_upto): Likewise. Remove enum iov_decode argument,
add print_obj_by_addr_size_fn and void *opaque_data arguments.
* src/msghdr.c (iov_decode_netlink): New function.
(print_struct_msghdr): Use it.
Diffstat (limited to 'src/defs.h')
-rw-r--r-- | src/defs.h | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/defs.h b/src/defs.h index 01801738e..c9bb108da 100644 --- a/src/defs.h +++ b/src/defs.h @@ -490,12 +490,6 @@ enum sock_proto { extern enum sock_proto get_proto_by_name(const char *); extern int get_family_by_proto(enum sock_proto proto); -enum iov_decode { - IOV_DECODE_ADDR, - IOV_DECODE_STR, - IOV_DECODE_NETLINK -}; - typedef enum { CFLAG_NONE = 0, CFLAG_ONLY_STATS, @@ -965,6 +959,10 @@ typedef bool (*print_fn)(struct tcb *, void *elem_buf, size_t elem_size, void *opaque_data); typedef int (*print_obj_by_addr_fn)(struct tcb *, kernel_ulong_t); typedef const char * (*sprint_obj_by_addr_fn)(struct tcb *, kernel_ulong_t); +typedef void (*print_obj_by_addr_size_fn)(struct tcb *, + kernel_ulong_t addr, + kernel_ulong_t size, + void *opaque_data); /** @@ -1194,7 +1192,14 @@ extern void printsignal(int); extern void tprint_iov_upto(struct tcb *, kernel_ulong_t len, kernel_ulong_t addr, - enum iov_decode, kernel_ulong_t data_size); + kernel_ulong_t data_size, print_obj_by_addr_size_fn, + void *opaque_data); +extern void +iov_decode_addr(struct tcb *, kernel_ulong_t addr, kernel_ulong_t size, + void *opaque_data); +extern void +iov_decode_str(struct tcb *, kernel_ulong_t addr, kernel_ulong_t size, + void *opaque_data); extern void decode_netlink(struct tcb *, int fd, kernel_ulong_t addr, kernel_ulong_t len); @@ -1457,9 +1462,9 @@ printxval_d(const struct xlat *x, const int val, const char *dflt) static inline void tprint_iov(struct tcb *tcp, kernel_ulong_t len, kernel_ulong_t addr, - enum iov_decode decode_iov) + print_obj_by_addr_size_fn print_func) { - tprint_iov_upto(tcp, len, addr, decode_iov, -1); + tprint_iov_upto(tcp, len, addr, -1, print_func, NULL); } # if HAVE_ARCH_TIME32_SYSCALLS || HAVE_ARCH_TIMESPEC32 |