From: Zubin Mithra <zubin.mit...@gmail.com>

* defs.h: Add header files netinet/in.h, sys/socket.h and
  arpa/inet.h.
(init): change type of show_fd_path to unsigned int.
* util.c (print_remote_ipport): New function.
(printsockdetails): New function.
(printfd): Modify to use printsockdetails.

Signed-off-by: Zubin Mithra <zubin.mit...@gmail.com>
---
 defs.h   |  5 +++-
 strace.c |  4 ++--
 util.c   | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 86 insertions(+), 4 deletions(-)

diff --git a/defs.h b/defs.h
index 1a3b483..f0fb79a 100644
--- a/defs.h
+++ b/defs.h
@@ -67,6 +67,9 @@
 #include <time.h>
 #include <sys/time.h>
 #include <sys/syscall.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
 
 #ifndef HAVE_STRERROR
 const char *strerror(int);
@@ -562,7 +565,7 @@ extern bool iflag;
 extern bool count_wallclock;
 extern unsigned int qflag;
 extern bool not_failing_only;
-extern bool show_fd_path;
+extern unsigned int show_fd_path;
 extern bool hide_log_until_execve;
 /* are we filtering traces based on paths? */
 extern const char **paths_selected;
diff --git a/strace.c b/strace.c
index 4154cde..2bc5c67 100644
--- a/strace.c
+++ b/strace.c
@@ -129,7 +129,7 @@ static int post_attach_sigstop = TCB_IGNORE_ONE_SIGSTOP;
 bool not_failing_only = 0;
 
 /* Show path associated with fd arguments */
-bool show_fd_path = 0;
+unsigned int show_fd_path = 0;
 
 static bool detach_on_execve = 0;
 /* Are we "strace PROG" and need to skip detach on first execve? */
@@ -1734,7 +1734,7 @@ init(int argc, char *argv[])
                        xflag++;
                        break;
                case 'y':
-                       show_fd_path = 1;
+                       show_fd_path++;
                        break;
                case 'v':
                        qualify("abbrev=none");
diff --git a/util.c b/util.c
index 33482d5..502f572 100644
--- a/util.c
+++ b/util.c
@@ -404,13 +404,92 @@ printnum_int(struct tcb *tcp, long addr, const char *fmt)
        tprints("]");
 }
 
+static bool
+print_remote_ipport(int linenr, const char *line, int inodenr)
+{
+       unsigned long rxq, txq, time_len, retr, inode;
+       int local_port, rem_port, d, state, uid, timer_run, timeout;
+       char rem_addr[128], local_addr[128], more[512];
+       struct sockaddr_in remaddr;
+       if (linenr == 0)
+               return 1;
+
+       sscanf(line,
+       "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d 
%ld %512s\n",
+       &d, local_addr, &local_port, rem_addr, &rem_port, &state,
+       &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more);
+
+       if (inodenr != inode)
+               return 1;
+
+       if (strlen(rem_addr) > 8) {
+               // We have an ipv6 address
+               struct in6_addr in6;
+               sscanf(rem_addr, "%08X%08X%08X%08X",
+                       &in6.s6_addr32[0], &in6.s6_addr32[1],
+                       &in6.s6_addr32[2], &in6.s6_addr32[3]);
+               tprintf("%s:%d", inet_ntoa(remaddr.sin_addr),
+                       rem_port);
+         }
+         else {
+               // We have an ipv4 address
+               sscanf(rem_addr, "%X", &((struct sockaddr_in *) 
&remaddr)->sin_addr.s_addr);
+               tprintf("%s:%d", inet_ntoa(remaddr.sin_addr), rem_port);
+         }
+         return 0;
+}
+
+/* Given an inode number of a socket, print out the details
+ * of the remote ip address and remote port */
+int
+printsockdetails(int inodenr)
+{
+       FILE *fp;
+       char buffer[8192];
+       int linenr = 0;
+       bool flag = 1;
+
+       fp = fopen("/proc/net/tcp", "r");
+       if (fp == NULL) {
+               return -1;
+       }
+
+       do {
+               if (fgets(buffer, sizeof(buffer), fp))
+                       flag = print_remote_ipport(linenr++, buffer, inodenr);
+               if (!flag) break;
+       } while (!feof(fp));
+       fclose(fp);
+       if (flag)
+               return -1;
+       return 0;
+}
+
 void
 printfd(struct tcb *tcp, int fd)
 {
        char path[PATH_MAX + 1];
 
-       if (show_fd_path && getfdpath(tcp, fd, path, sizeof(path)) >= 0)
+       if (show_fd_path == 1 && getfdpath(tcp, fd, path, sizeof(path)) >= 0)
                tprintf("%d<%s>", fd, path);
+       else if (show_fd_path > 1 && getfdpath(tcp, fd, path, sizeof(path)) >= 
0) {
+               char *ptr = NULL;
+               int inodenr;
+               ptr = strstr(path, "socket:[");
+               if (ptr != path) {
+                       tprintf("%d<%s>", fd, path);
+               }
+               else {
+                       int retval;
+                       ptr = path + 8;
+                       path[strlen(path)-1] = '\0';
+                       inodenr = strtol(ptr, NULL, 10);
+                       tprintf("%d<", fd);
+                       retval = printsockdetails(inodenr);
+                       if (retval == -1) tprintf("socket:[%d]",inodenr);
+                       tprints(">");
+               }
+       }
        else
                tprintf("%d", fd);
 }
-- 
1.8.4


------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls. 
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to