The basic means that all the arguments are simply wrapped in
a string value even for those complicated arguments printed by
specific functions such as printflags(). We need to do more work
to change those functions to be more like JSON-style.

* io.c(sys_read, sys_write, sys_readv, sys_writev,
sys_pread, sys_pwrite, sys_preadv, sys_pwritev,
sys_sendfile, sys_sendfile64, sys_tee, sys_splice,
sys_vmsplice, sys_ioctl): Modified to use the hook
framework to support printing in JSON format. Note: The
support of ioctl() is very limited and need to be improved.
---
 io.c | 205 +++++++++++++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 150 insertions(+), 55 deletions(-)

diff --git a/io.c b/io.c
index fea1218..204fa7b 100644
--- a/io.c
+++ b/io.c
@@ -37,15 +37,27 @@
 int
 sys_read(struct tcb *tcp)
 {
+       JSON_BEGIN_META_MODE;
+
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
+
+               json_event(1, EVENT_ARG | SEPARATOR);
        } else {
-               if (syserror(tcp))
+               json_type_event first;
+
+               if (syserror(tcp)) {
                        tprintf("%#lx", tcp->u_arg[1]);
-               else
-                       printstr(tcp, tcp->u_arg[1], tcp->u_rval);
+                       first = EVENT_ERROR;
+               }
+               else {
+                       JSON_META( printstr(tcp, tcp->u_arg[1], tcp->u_rval) );
+                       first = EVENT_ARG;
+               }
                tprintf(", %lu", tcp->u_arg[2]);
+
+               json_event(2, first | SEPARATOR, EVENT_ARG);
        }
        return 0;
 }
@@ -54,10 +66,14 @@ int
 sys_write(struct tcb *tcp)
 {
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_BEGIN_META_MODE;
+
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
-               printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
+               JSON_META( printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); );
                tprintf(", %lu", tcp->u_arg[2]);
+
+               json_event(3, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG);
        }
        return 0;
 }
@@ -148,17 +164,23 @@ tprint_iov(struct tcb *tcp, unsigned long len, unsigned 
long addr, int decode_io
 int
 sys_readv(struct tcb *tcp)
 {
+       JSON_BEGIN_META_MODE;
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
+
+               json_event(1, EVENT_ARG | SEPARATOR);
        } else {
                if (syserror(tcp)) {
-                       tprintf("%#lx, %lu",
-                                       tcp->u_arg[1], tcp->u_arg[2]);
+                       tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
+
+                       json_event(2, EVENT_ARG | SEPARATOR, EVENT_ARG);
                        return 0;
                }
-               tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
+               JSON_META( tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1); );
                tprintf(", %lu", tcp->u_arg[2]);
+
+               json_event(2, EVENT_ARG | SEPARATOR, EVENT_ARG);
        }
        return 0;
 }
@@ -167,10 +189,14 @@ int
 sys_writev(struct tcb *tcp)
 {
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_BEGIN_META_MODE;
+
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
-               tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
+               JSON_META( tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1); );
                tprintf(", %lu", tcp->u_arg[2]);
+
+               json_event(3, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG);
        }
        return 0;
 }
@@ -190,16 +216,24 @@ sys_writev(struct tcb *tcp)
 int
 sys_pread(struct tcb *tcp)
 {
+       JSON_BEGIN_META_MODE;
+
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_META(printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
+
+               json_event(1, EVENT_ARG | SEPARATOR);
        } else {
-               if (syserror(tcp))
+               if (syserror(tcp)) {
                        tprintf("%#lx", tcp->u_arg[1]);
-               else
-                       printstr(tcp, tcp->u_arg[1], tcp->u_rval);
+               }
+               else {
+                       JSON_META( printstr(tcp, tcp->u_arg[1], tcp->u_rval); );
+               }
                tprintf(", %lu, ", tcp->u_arg[2]);
-               printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG);
+               JSON_META( printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG); );
+
+               json_event(3, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG);
        }
        return 0;
 }
@@ -208,11 +242,15 @@ int
 sys_pwrite(struct tcb *tcp)
 {
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_BEGIN_META_MODE;
+
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
-               printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
+               JSON_META( printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); );
                tprintf(", %lu, ", tcp->u_arg[2]);
-               printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG);
+               JSON_META( printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG); );
+
+               json_event(4, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG | SEPARATOR, EVENT_ARG);
        }
        return 0;
 }
@@ -221,17 +259,25 @@ sys_pwrite(struct tcb *tcp)
 int
 sys_preadv(struct tcb *tcp)
 {
+       JSON_BEGIN_META_MODE;
+
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
+
+               json_event(1, EVENT_ARG | SEPARATOR);
        } else {
                if (syserror(tcp)) {
                        tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
+
+                       json_event(2, EVENT_ARG | SEPARATOR, EVENT_ARG);
                        return 0;
                }
-               tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
+               JSON_META( tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1); );
                tprintf(", %lu, ", tcp->u_arg[2]);
-               printllval_unaligned(tcp, "%llu", 3);
+               JSON_META( printllval_unaligned(tcp, "%llu", 3); );
+
+               json_event(3, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG);
        }
        return 0;
 }
@@ -240,11 +286,15 @@ int
 sys_pwritev(struct tcb *tcp)
 {
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_BEGIN_META_MODE;
+
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
-               tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
+               JSON_META( tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1); );
                tprintf(", %lu, ", tcp->u_arg[2]);
-               printllval_unaligned(tcp, "%llu", 3);
+               JSON_META( printllval_unaligned(tcp, "%llu", 3); );
+
+               json_event(4, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG | SEPARATOR, EVENT_ARG);
        }
        return 0;
 }
@@ -280,12 +330,16 @@ int
 sys_sendfile(struct tcb *tcp)
 {
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_BEGIN_META_MODE;
+
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
-               printfd(tcp, tcp->u_arg[1]);
+               JSON_META( printfd(tcp, tcp->u_arg[1]); );
                tprints(", ");
-               print_off_t(tcp, tcp->u_arg[2]);
+               JSON_META(print_off_t(tcp, tcp->u_arg[2]); );
                tprintf(", %lu", tcp->u_arg[3]);
+
+               json_event(4, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG | SEPARATOR, EVENT_ARG);
        }
        return 0;
 }
@@ -307,12 +361,16 @@ int
 sys_sendfile64(struct tcb *tcp)
 {
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_BEGIN_META_MODE;
+
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
-               printfd(tcp, tcp->u_arg[1]);
+               JSON_META(printfd(tcp, tcp->u_arg[1]); );
                tprints(", ");
-               print_loff_t(tcp, tcp->u_arg[2]);
+               JSON_META(print_loff_t(tcp, tcp->u_arg[2]); );
                tprintf(", %lu", tcp->u_arg[3]);
+
+               json_event(4, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG | SEPARATOR, EVENT_ARG);
        }
        return 0;
 }
@@ -323,16 +381,22 @@ int
 sys_tee(struct tcb *tcp)
 {
        if (entering(tcp)) {
+               JSON_BEGIN_META_MODE;
+
                /* int fd_in */
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_META(printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
+
                /* int fd_out */
-               printfd(tcp, tcp->u_arg[1]);
-               tprints(", ");
+               JSON_META(printfd(tcp, tcp->u_arg[1]); );
+
                /* size_t len */
-               tprintf("%lu, ", tcp->u_arg[2]);
+               tprintf(", %lu, ", tcp->u_arg[2]);
+
                /* unsigned int flags */
-               printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
+               JSON_META( printflags(splice_flags, tcp->u_arg[3], 
"SPLICE_F_???"); );
+
+               json_event(4, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG | SEPARATOR, EVENT_ARG);
        }
        return 0;
 }
@@ -341,22 +405,35 @@ int
 sys_splice(struct tcb *tcp)
 {
        if (entering(tcp)) {
+               JSON_BEGIN_META_MODE;
+
                /* int fd_in */
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
+
                /* loff_t *off_in */
-               print_loff_t(tcp, tcp->u_arg[1]);
+               JSON_META(print_loff_t(tcp, tcp->u_arg[1]); );
                tprints(", ");
+
                /* int fd_out */
-               printfd(tcp, tcp->u_arg[2]);
+               JSON_META(printfd(tcp, tcp->u_arg[2]); );
                tprints(", ");
+
                /* loff_t *off_out */
-               print_loff_t(tcp, tcp->u_arg[3]);
-               tprints(", ");
+               JSON_META(print_loff_t(tcp, tcp->u_arg[3]); );
+
                /* size_t len */
-               tprintf("%lu, ", tcp->u_arg[4]);
+               tprintf(", %lu, ", tcp->u_arg[4]);
+
                /* unsigned int flags */
-               printflags(splice_flags, tcp->u_arg[5], "SPLICE_F_???");
+               JSON_META( printflags(splice_flags, tcp->u_arg[5], 
"SPLICE_F_???"); );
+
+               json_event(6, EVENT_ARG | SEPARATOR,
+                                         EVENT_ARG | SEPARATOR,
+                                         EVENT_ARG | SEPARATOR,
+                                         EVENT_ARG | SEPARATOR,
+                                         EVENT_ARG | SEPARATOR,
+                                         EVENT_ARG);
        }
        return 0;
 }
@@ -365,14 +442,20 @@ int
 sys_vmsplice(struct tcb *tcp)
 {
        if (entering(tcp)) {
+               JSON_BEGIN_META_MODE;
+
                /* int fd */
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_META( 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);
+               JSON_META( tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1); );
                tprintf(", %lu, ", tcp->u_arg[2]);
+
                /* unsigned int flags */
-               printflags(splice_flags, tcp->u_arg[3], "SPLICE_F_???");
+               JSON_META( printflags(splice_flags, tcp->u_arg[3], 
"SPLICE_F_???"); );
+
+               json_event(4, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG | SEPARATOR, EVENT_ARG);
        }
        return 0;
 }
@@ -381,23 +464,35 @@ int
 sys_ioctl(struct tcb *tcp)
 {
        const struct_ioctlent *iop;
+       JSON_BEGIN_META_MODE;
 
        if (entering(tcp)) {
-               printfd(tcp, tcp->u_arg[0]);
+               JSON_META( printfd(tcp, tcp->u_arg[0]); );
                tprints(", ");
                iop = ioctl_lookup(tcp->u_arg[1]);
                if (iop) {
-                       tprints(iop->symbol);
-                       while ((iop = ioctl_next_match(iop)))
-                               tprintf(" or %s", iop->symbol);
-               } else
+                       JSON_META_BEGIN;
+                               tprints(iop->symbol);
+                               while ((iop = ioctl_next_match(iop)))
+                                       tprintf(" or %s", iop->symbol);
+                       JSON_META_END;
+               } else {
                        tprintf("%#lx", tcp->u_arg[1]);
-               ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]);
+               }
+               JSON_META( ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]); );
+
+               json_event(3, EVENT_ARG | SEPARATOR, EVENT_ARG | SEPARATOR, 
EVENT_ARG);
        }
        else {
-               int ret = ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]);
-               if (!ret)
+               int ret;
+               JSON_META( ret = ioctl_decode(tcp, tcp->u_arg[1], 
tcp->u_arg[2]); );
+               json_event(1, BEF_SEPRATOR | EVENT_ARG);
+
+               if (!ret) {
+                       JSON_BEGIN_META_MODE;
                        tprintf(", %#lx", tcp->u_arg[2]);
+                       json_event(1, BEF_SEPRATOR | EVENT_ARG);
+               }
                else
                        return ret - 1;
        }
-- 
1.9.1


------------------------------------------------------------------------------
HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
Find What Matters Most in Your Big Data with HPCC Systems
Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
Leverages Graph Analysis for Fast Processing & Easy Data Exploration
http://p.sf.net/sfu/hpccsystems
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to