[PATCH v5 1/4] Add a enum for decoding to tprint_iov() and tprint_iov_upto().

Fabien Siron fabien.siron at epita.fr
Mon Jun 20 16:06:42 UTC 2016


This commit introduces a new type iov_decode which will be used instead
of the integer "decode" as a parameter.

* defs.h (iov_decode): New enum.
(tprint_iov, tprint_iov_upto): Change type of "decode_iov" to enum iov_decode.
* aio.c (print_iocb): Change type of "decode_iov" to enum iov_decode in
tprint_iov() call.
* keyctl.c (keyctl_instantiate_key_iov): Likewise.
* process.c (ptrace): Likewise.
* process_vm.c (process_vm_readv, process_vm_writev): Likewise.
* io.c (writev, do_pwritev, vmsplice): Likewise.
(print_iovec): Replace the condition with a switch.
(tprint_iov_upto): Change type of "decode_iov" to enum iov_decode.
(readv, do_preadv): Change type of "decode_iov" to enum iov_decode in
tprint_iov_upto() call.
* scsi.c (print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): Likewise.
---
 aio.c        |  4 +++-
 defs.h       | 10 ++++++++--
 io.c         | 42 +++++++++++++++++++++++++-----------------
 keyctl.c     |  2 +-
 net.c        |  3 ++-
 process.c    |  4 ++--
 process_vm.c | 10 ++++++----
 scsi.c       | 10 ++++++----
 8 files changed, 53 insertions(+), 32 deletions(-)

diff --git a/aio.c b/aio.c
index e02af7d..29562d2 100644
--- a/aio.c
+++ b/aio.c
@@ -140,7 +140,9 @@ print_iocb(struct tcb *tcp, const struct iocb *cb)
 		if (iocb_is_valid(cb)) {
 			tprints(", iovec=");
 			tprint_iov(tcp, cb->aio_nbytes, cb->aio_buf,
-				   cb->aio_lio_opcode == 8);
+				   cb->aio_lio_opcode == 8
+				   ? IOV_DECODE_STR
+				   : IOV_DECODE_ADDR);
 		} else {
 			tprintf(", buf=%#" PRIx64 ", nbytes=%" PRIu64,
 				(uint64_t) cb->aio_buf,
diff --git a/defs.h b/defs.h
index f40842d..ee9f3ec 100644
--- a/defs.h
+++ b/defs.h
@@ -448,6 +448,11 @@ enum sock_proto {
 };
 extern enum sock_proto get_proto_by_name(const char *);
 
+enum iov_decode {
+	IOV_DECODE_ADDR,
+	IOV_DECODE_STR
+};
+
 typedef enum {
 	CFLAG_NONE = 0,
 	CFLAG_ONLY_STATS,
@@ -665,8 +670,9 @@ extern const char *sprintsigmask_n(const char *, const void *, unsigned int);
 #define tprintsigmask_addr(prefix, mask) \
 	tprints(sprintsigmask_n((prefix), (mask), sizeof(mask)))
 extern void printsignal(int);
-extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov);
-extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long, int decode_iov, unsigned long);
+extern void tprint_iov(struct tcb *, unsigned long, unsigned long, enum iov_decode);
+extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long,
+			    enum iov_decode, unsigned long);
 extern void tprint_open_modes(unsigned int);
 extern const char *sprint_open_modes(unsigned int);
 extern void print_seccomp_filter(struct tcb *, unsigned long);
diff --git a/io.c b/io.c
index 3025486..01624ee 100644
--- a/io.c
+++ b/io.c
@@ -58,7 +58,7 @@ SYS_FUNC(write)
 }
 
 struct print_iovec_config {
-	int decode_iov;
+	enum iov_decode decode_iov;
 	unsigned long data_size;
 };
 
@@ -79,14 +79,21 @@ print_iovec(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
 
 	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]);
+	switch (c->decode_iov) {
+		case IOV_DECODE_STR:
+		{
+			unsigned long len = iov[1];
+			if (len > c->data_size)
+				len = c->data_size;
+			c->data_size -= len;
+			printstr(tcp, iov[0], len);
+			break;
+		}
+		default:
+		{
+			printaddr(iov[0]);
+			break;
+		}
 	}
 
 	tprintf(", %lu}", iov[1]);
@@ -100,7 +107,7 @@ print_iovec(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
  */
 void
 tprint_iov_upto(struct tcb *tcp, unsigned long len, unsigned long addr,
-		int decode_iov, unsigned long data_size)
+		enum iov_decode decode_iov, unsigned long data_size)
 {
 	unsigned long iov[2];
 	struct print_iovec_config config =
@@ -111,7 +118,8 @@ tprint_iov_upto(struct tcb *tcp, unsigned long len, unsigned long addr,
 }
 
 void
-tprint_iov(struct tcb *tcp, unsigned long len, unsigned long addr, int decode_iov)
+tprint_iov(struct tcb *tcp, unsigned long len, unsigned long addr,
+	   enum iov_decode decode_iov)
 {
 	tprint_iov_upto(tcp, len, addr, decode_iov, (unsigned long) -1L);
 }
@@ -122,8 +130,8 @@ SYS_FUNC(readv)
 		printfd(tcp, tcp->u_arg[0]);
 		tprints(", ");
 	} else {
-		tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1], 1,
-				tcp->u_rval);
+		tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1],
+				IOV_DECODE_STR, tcp->u_rval);
 		tprintf(", %lu", tcp->u_arg[2]);
 	}
 	return 0;
@@ -133,7 +141,7 @@ SYS_FUNC(writev)
 {
 	printfd(tcp, tcp->u_arg[0]);
 	tprints(", ");
-	tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
+	tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], IOV_DECODE_STR);
 	tprintf(", %lu", tcp->u_arg[2]);
 
 	return RVAL_DECODED;
@@ -224,7 +232,7 @@ do_preadv(struct tcb *tcp, const int flags_arg)
 		printfd(tcp, tcp->u_arg[0]);
 		tprints(", ");
 	} else {
-		tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1], 1,
+		tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1], IOV_DECODE_STR,
 				tcp->u_rval);
 		tprintf(", %lu, ", tcp->u_arg[2]);
 		print_lld_from_low_high_val(tcp, 3);
@@ -251,7 +259,7 @@ do_pwritev(struct tcb *tcp, const int flags_arg)
 {
 	printfd(tcp, tcp->u_arg[0]);
 	tprints(", ");
-	tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
+	tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], IOV_DECODE_STR);
 	tprintf(", %lu, ", tcp->u_arg[2]);
 	print_lld_from_low_high_val(tcp, 3);
 	if (flags_arg >= 0) {
@@ -318,7 +326,7 @@ SYS_FUNC(vmsplice)
 	printfd(tcp, tcp->u_arg[0]);
 	tprints(", ");
 	/* const struct iovec *iov, unsigned long nr_segs */
-	tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
+	tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], IOV_DECODE_STR);
 	tprintf(", %lu, ", tcp->u_arg[2]);
 	/* unsigned int flags */
 	printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
diff --git a/keyctl.c b/keyctl.c
index 50d6fb4..456649e 100644
--- a/keyctl.c
+++ b/keyctl.c
@@ -156,7 +156,7 @@ keyctl_instantiate_key_iov(struct tcb *tcp, key_serial_t id1,
 {
 	print_keyring_serial_number(id1);
 	tprints(", ");
-	tprint_iov(tcp, len, addr, 1);
+	tprint_iov(tcp, len, addr, IOV_DECODE_STR);
 	tprintf(", %lu, ", len);
 	print_keyring_serial_number(id2);
 }
diff --git a/net.c b/net.c
index 124ac8d..6f55431 100644
--- a/net.c
+++ b/net.c
@@ -580,8 +580,9 @@ do_msghdr(struct tcb *tcp, struct msghdr *msg, unsigned long data_size)
 	printsock(tcp, (long)msg->msg_name, msg->msg_namelen);
 
 	tprintf(", msg_iov(%lu)=", (unsigned long)msg->msg_iovlen);
+
 	tprint_iov_upto(tcp, (unsigned long)msg->msg_iovlen,
-		   (unsigned long)msg->msg_iov, 1, data_size);
+			(unsigned long)msg->msg_iov, IOV_DECODE_STR, data_size);
 
 #ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
 	tprintf(", msg_controllen=%lu", (unsigned long)msg->msg_controllen);
diff --git a/process.c b/process.c
index 3aecf08..32dcfe2 100644
--- a/process.c
+++ b/process.c
@@ -201,7 +201,7 @@ SYS_FUNC(ptrace)
 			print_sigset_addr_len(tcp, data, addr);
 			break;
 		case PTRACE_SETREGSET:
-			tprint_iov(tcp, /*len:*/ 1, data, /*as string:*/ 0);
+			tprint_iov(tcp, /*len:*/ 1, data, IOV_DECODE_ADDR);
 			break;
 #ifndef IA64
 		case PTRACE_PEEKDATA:
@@ -238,7 +238,7 @@ SYS_FUNC(ptrace)
 			printnum_ulong(tcp, data);
 			break;
 		case PTRACE_GETREGSET:
-			tprint_iov(tcp, /*len:*/ 1, data, /*as string:*/ 0);
+			tprint_iov(tcp, /*len:*/ 1, data, IOV_DECODE_ADDR);
 			break;
 		case PTRACE_GETSIGINFO:
 			printsiginfo_at(tcp, data);
diff --git a/process_vm.c b/process_vm.c
index 82e1e16..0a9dcd2 100644
--- a/process_vm.c
+++ b/process_vm.c
@@ -38,7 +38,8 @@ SYS_FUNC(process_vm_readv)
 		if (syserror(tcp)) {
 			printaddr(tcp->u_arg[1]);
 		} else {
-			tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
+			tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1],
+				   IOV_DECODE_STR);
 		}
 		/* arg 3: local iovcnt */
 		tprintf(", %lu, ", tcp->u_arg[2]);
@@ -46,7 +47,8 @@ SYS_FUNC(process_vm_readv)
 		if (syserror(tcp)) {
 			printaddr(tcp->u_arg[3]);
 		} else {
-			tprint_iov(tcp, tcp->u_arg[4], tcp->u_arg[3], 0);
+			tprint_iov(tcp, tcp->u_arg[4], tcp->u_arg[3],
+				   IOV_DECODE_ADDR);
 		}
 		/* arg 5: remote iovcnt */
 		/* arg 6: flags */
@@ -60,11 +62,11 @@ SYS_FUNC(process_vm_writev)
 	/* arg 1: pid */
 	tprintf("%ld, ", tcp->u_arg[0]);
 	/* arg 2: local iov */
-	tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
+	tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], IOV_DECODE_STR);
 	/* arg 3: local iovcnt */
 	tprintf(", %lu, ", tcp->u_arg[2]);
 	/* arg 4: remote iov */
-	tprint_iov(tcp, tcp->u_arg[4], tcp->u_arg[3], 0);
+	tprint_iov(tcp, tcp->u_arg[4], tcp->u_arg[3], IOV_DECODE_ADDR);
 	/* arg 5: remote iovcnt */
 	/* arg 6: flags */
 	tprintf(", %lu, %lu", tcp->u_arg[4], tcp->u_arg[5]);
diff --git a/scsi.c b/scsi.c
index 83ff8fe..dc51dd5 100644
--- a/scsi.c
+++ b/scsi.c
@@ -84,7 +84,8 @@ print_sg_io_v3_req(struct tcb *tcp, const long arg)
 		tprintf(", data[%u]=", sg_io.dxfer_len);
 		if (sg_io.iovec_count)
 			tprint_iov_upto(tcp, sg_io.iovec_count,
-					(unsigned long) sg_io.dxferp, 1,
+					(unsigned long) sg_io.dxferp,
+					IOV_DECODE_STR,
 					sg_io.dxfer_len);
 		else
 			print_sg_io_buffer(tcp, (unsigned long) sg_io.dxferp,
@@ -112,7 +113,8 @@ print_sg_io_v3_res(struct tcb *tcp, const long arg)
 		tprintf(", data[%u]=", din_len);
 		if (sg_io.iovec_count)
 			tprint_iov_upto(tcp, sg_io.iovec_count,
-					(unsigned long) sg_io.dxferp, 1,
+					(unsigned long) sg_io.dxferp,
+					IOV_DECODE_STR,
 					din_len);
 		else
 			print_sg_io_buffer(tcp, (unsigned long) sg_io.dxferp,
@@ -163,7 +165,7 @@ print_sg_io_v4_req(struct tcb *tcp, const long arg)
 	tprintf(", dout[%u]=", sg_io.dout_xfer_len);
 	if (sg_io.dout_iovec_count)
 		tprint_iov_upto(tcp, sg_io.dout_iovec_count, sg_io.dout_xferp,
-				1, sg_io.dout_xfer_len);
+				IOV_DECODE_STR, sg_io.dout_xfer_len);
 	else
 		print_sg_io_buffer(tcp, sg_io.dout_xferp, sg_io.dout_xfer_len);
 	return 1;
@@ -188,7 +190,7 @@ print_sg_io_v4_res(struct tcb *tcp, const long arg)
 	tprintf(", din[%u]=", din_len);
 	if (sg_io.din_iovec_count)
 		tprint_iov_upto(tcp, sg_io.din_iovec_count, sg_io.din_xferp,
-				1, din_len);
+				IOV_DECODE_STR, din_len);
 	else
 		print_sg_io_buffer(tcp, sg_io.din_xferp, din_len);
 	tprintf(", driver_status=%u", sg_io.driver_status);
-- 
2.8.3





More information about the Strace-devel mailing list