]> granicus.if.org Git - strace/blobdiff - sendfile.c
mem: decode hugetlb page size in mmap flags
[strace] / sendfile.c
index 91c16e2aefcf95d838230a15bd427c493b7d3df7..a7766884d85a128fc0bb8de1342f0ace46f6d854 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 
 SYS_FUNC(sendfile64)
 {
-       printfd(tcp, tcp->u_arg[0]);
-       tprints(", ");
-       printfd(tcp, tcp->u_arg[1]);
-       tprints(", ");
-       printnum_int64(tcp, tcp->u_arg[2], "%" PRIu64);
-       tprintf(", %lu", tcp->u_arg[3]);
+       if (entering(tcp)) {
+               printfd(tcp, tcp->u_arg[0]);
+               tprints(", ");
+               printfd(tcp, tcp->u_arg[1]);
+               tprints(", ");
+               if (!printnum_int64(tcp, tcp->u_arg[2], "%" PRIu64)) {
+                       tprintf(", %" PRI_klu, tcp->u_arg[3]);
+                       return RVAL_DECODED;
+               }
+       } else {
+               if (!syserror(tcp) && tcp->u_rval) {
+                       tprints(" => ");
+                       printnum_int64(tcp, tcp->u_arg[2], "%" PRIu64);
+               }
+               tprintf(", %" PRI_klu, tcp->u_arg[3]);
+       }
 
-       return RVAL_DECODED;
+       return 0;
 }
 
 SYS_FUNC(sendfile)
 {
-       printfd(tcp, tcp->u_arg[0]);
-       tprints(", ");
-       printfd(tcp, tcp->u_arg[1]);
-       tprints(", ");
-       printnum_ulong(tcp, tcp->u_arg[2]);
-       tprintf(", %lu", tcp->u_arg[3]);
+       if (entering(tcp)) {
+               printfd(tcp, tcp->u_arg[0]);
+               tprints(", ");
+               printfd(tcp, tcp->u_arg[1]);
+               tprints(", ");
+               if (!printnum_ulong(tcp, tcp->u_arg[2])
+                   || !tcp->u_arg[3]) {
+                       tprintf(", %" PRI_klu, tcp->u_arg[3]);
+                       return RVAL_DECODED;
+               }
+       } else {
+               if (!syserror(tcp) && tcp->u_rval) {
+                       tprints(" => ");
+                       printnum_ulong(tcp, tcp->u_arg[2]);
+               }
+               tprintf(", %" PRI_klu, tcp->u_arg[3]);
+       }
 
-       return RVAL_DECODED;
+       return 0;
 }