summaryrefslogtreecommitdiff
path: root/src/defs.h
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@strace.io>2021-05-09 10:00:00 +0000
committerDmitry V. Levin <ldv@strace.io>2021-05-09 10:00:00 +0000
commit05c835d85eb9655bb304ea146f0bca7255b33eb2 (patch)
treebd3b7e5d481d161652b81251f232786e1402ec7b /src/defs.h
parentaeab8d228e308ed44afab0ef6754282c32cc3c0a (diff)
downloadstrace-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.h23
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