+struct print_iovec_config {
+ int decode_iov;
+ unsigned long data_size;
+};
+
+static bool
+print_iovec(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
+{
+ const unsigned long *iov;
+ unsigned long iov_buf[2];
+ struct print_iovec_config *c = data;
+
+ if (elem_size < sizeof(iov_buf)) {
+ iov_buf[0] = ((unsigned int *) elem_buf)[0];
+ iov_buf[1] = ((unsigned int *) elem_buf)[1];
+ iov = iov_buf;
+ } else {
+ iov = elem_buf;
+ }
+
+ tprints("{");
+
+ if (c->decode_iov) {
+ unsigned long len = iov[1];
+ if (len > c->data_size)
+ len = c->data_size;
+ c->data_size -= len;
+ printstr(tcp, iov[0], len);
+ } else {
+ printaddr(iov[0]);
+ }
+
+ tprintf(", %lu}", iov[1]);
+
+ return true;
+}
+