]> sourceware.org Git - systemtap.git/commitdiff
tapset: add decoded sockaddr field vars to socket-related syscalls
authorRobin Hack <rhack@redhat.com>
Thu, 9 Jan 2014 21:52:55 +0000 (16:52 -0500)
committerFrank Ch. Eigler <fche@redhat.com>
Thu, 9 Jan 2014 21:52:55 +0000 (16:52 -0500)
* tapset/linux/aux_syscalls.stp (_struct_sockaddr_u_impl): New pretty-printer
  with a bitfieldful of options.
* tapset/linux/syscalls.stpm (@_af_inet_info_u): New macro to pull call it.
* tapset/linux/*syscalls*: Lots of calls to it.
* testsuite/systemtap.examples/network/connect_stat.stp: New sample script.

runtime/common_probe_context.h
tapset/linux/aux_syscalls.stp
tapset/linux/nd_syscalls.stp
tapset/linux/syscalls.stp
tapset/linux/syscalls.stpm
testsuite/buildok/aux_syscalls-embedded.stp
testsuite/buildok/nd_syscalls-detailed.stp
testsuite/buildok/syscalls-detailed.stp
testsuite/systemtap.examples/network/connect_stat.stp [new file with mode: 0644]

index 96499d85c7f17a97dd71e81d27388e07a17f3c3a..1d491739125223534bd3314aa793e84f6844075b 100644 (file)
@@ -74,6 +74,15 @@ char *tok_start;
 char *tok_end;
 #endif
 
+/* Only used in file tapset/linux/aux_syscalls.stp
+ * function: _struct_sockaddr_u_impl.
+ * We need bigger buffers than is frame limit of function.
+ */
+#ifdef STAP_NEED_CONTEXT_SOCKADDR_BIG_BUFFERS
+char buf[128];
+string_t out_str;
+#endif
+
 /* Only used when stap script needs regexp subexpressions. */
 #ifdef STAP_NEED_CONTEXT_SUBEXPRESSION
 struct stapregex_match {
index 1433cb30a6d16293ff101cbbfcc1eec6c3406f25..c66f6168651f9598c88a1f8e84eb564f3a7de173 100644 (file)
@@ -318,7 +318,7 @@ function _struct_compat_itimerval_u:string(uaddr:long)
 %}
 
 %{
-// Needed for function _struct_sockaddr_u. Unfortunately cannot be
+// Needed for function _struct_sockaddr_u_impl. Unfortunately cannot be
 // inlined into the function since these header files define static
 // functions themselves.
 #include <linux/socket.h>
@@ -326,27 +326,91 @@ function _struct_compat_itimerval_u:string(uaddr:long)
 #include <linux/netlink.h>
 %}
 
+%{
+// Enum for _struct_sockaddr_u_* functions.
+typedef enum {
+    SA_PRETTY           = 1,
+    SA_IP_ADDR          = 2,
+    SA_TCP_PORT         = 4,
+    SA_FAMILY           = 8,
+    SA_IPV6_FLOWINFO    = 16,
+    SA_IPV6_SCOPE_ID    = 32,
+} sa_dispatch;
+%}
+
+function _struct_sockaddr_u_ip_addr:string(uaddr:long, len:long)
+{
+    return _struct_sockaddr_u_impl(uaddr, len, %{ SA_IP_ADDR %});
+}
+
+function _struct_sockaddr_u_tcp_port:string(uaddr:long, len:long)
+{
+    return _struct_sockaddr_u_impl(uaddr, len, %{ SA_TCP_PORT %});
+}
+
+function _struct_sockaddr_u_ip_addr_tcp_port:string(uaddr:long, len:long)
+{
+    return _struct_sockaddr_u_impl(uaddr, len, %{ SA_IP_ADDR | SA_TCP_PORT %});
+}
+
+function _struct_sockaddr_u_sa_family:string(uaddr:long, len:long)
+{
+    return _struct_sockaddr_u_impl(uaddr, len, %{ SA_FAMILY %});
+}
+
+function _struct_sockaddr_u_ipv6_flowinfo:string(uaddr:long, len:long)
+{
+    return _struct_sockaddr_u_impl(uaddr, len, %{ SA_IPV6_FLOWINFO %});
+}
+
+function _struct_sockaddr_u_ipv6_scope_id:string(uaddr:long, len:long)
+{
+    return _struct_sockaddr_u_impl(uaddr, len, %{ SA_IPV6_SCOPE_ID %});
+}
+
 function _struct_sockaddr_u:string(uaddr:long, len:long)
+{
+    return _struct_sockaddr_u_impl(uaddr, len, %{ SA_PRETTY %});
+}
+
+%{
+#define STAP_NEED_CONTEXT_SOCKADDR_BIG_BUFFERS 1
+%}
+
+function _struct_sockaddr_u_impl:string(uaddr:long, len:long, what:long)
 %{ /* pure */
+
+
 #include <linux/version.h>
 #include <linux/in6.h>
 #include <linux/un.h>
 #include <linux/if_packet.h>
 
-       char *ptr = (char *)(unsigned long)STAP_ARG_uaddr;
-       char buf[128];
-       size_t len = STAP_ARG_len < 128 ? STAP_ARG_len : 128;
-       struct sockaddr *sa = (struct sockaddr *)buf;
+    sa_dispatch what = (sa_dispatch)STAP_ARG_what;
+
+    char *ptr = (char *)(unsigned long)STAP_ARG_uaddr;
+    size_t len = STAP_ARG_len < 128 ? STAP_ARG_len: 128;
+    struct sockaddr *sa = (struct sockaddr *)CONTEXT->buf;
+
+    char *stap_retvalue = (char *)(unsigned long)STAP_RETVALUE;
+    int maxstringlen = MAXSTRINGLEN;
+    size_t n;
 
        if (ptr == NULL)
        {
-               strlcpy (STAP_RETVALUE, "NULL", MAXSTRINGLEN);
+               strlcpy(STAP_RETVALUE, "NULL", MAXSTRINGLEN);
                return;
        }
 
-       if (_stp_copy_from_user(buf, ptr, len))
+    // This helps handle variable lenght sockaddr_un.
+    // Some application - like systemd - sends path string
+    // without ending null character. Kernel will handle this
+    // but we need pretty output without random memory stuff.
+    memset(CONTEXT->buf, 0, 128);
+
+    if (_stp_copy_from_user(CONTEXT->buf, ptr, len))
        {
-               strlcpy (STAP_RETVALUE, "[...]", MAXSTRINGLEN);
+               strlcpy(STAP_RETVALUE, "[...]", MAXSTRINGLEN);
                return;
        }
 
@@ -363,55 +427,198 @@ function _struct_sockaddr_u:string(uaddr:long, len:long)
 
        if ((sa->sa_family == AF_INET) && (len == sizeof(struct sockaddr_in)))
        {
-               struct sockaddr_in *sin = (struct sockaddr_in *)buf;
-#ifndef NIPQUAD_FMT                    // kver >= 2.6.36
-               snprintf(STAP_RETVALUE, MAXSTRINGLEN, "{AF_INET, %pI4, %d}",
-                        &sin->sin_addr, _stp_ntohs(sin->sin_port));
+               struct sockaddr_in *sin = (struct sockaddr_in *)CONTEXT->buf;
+
+        if (what & SA_PRETTY)
+        {
+#ifndef NIPQUAD_FMT                     // kver >= 2.6.36
+            snprintf(STAP_RETVALUE, MAXSTRINGLEN, "{AF_INET, %pI4, %d}",
+                &sin->sin_addr, _stp_ntohs(sin->sin_port));
 #else
-               snprintf(STAP_RETVALUE, MAXSTRINGLEN,
-                        "{AF_INET, " NIPQUAD_FMT ", %d}",
-                        NIPQUAD(sin->sin_addr), _stp_ntohs(sin->sin_port));
-#endif
+            snprintf(STAP_RETVALUE, MAXSTRINGLEN,
+                "{AF_INET, " NIPQUAD_FMT ", %d}",
+                NIPQUAD(sin->sin_addr), _stp_ntohs(sin->sin_port));
+#endif
+            return;
+        }
+
+        if (what & SA_FAMILY)
+        {
+            n = strlcpy(stap_retvalue, "AF_INET", maxstringlen);
+                       // (n - 1) mean: cut of null char
+                       stap_retvalue += (n);
+                       maxstringlen -= (n - 1);
+        }
+
+        if (what & SA_IP_ADDR)
+        {
+#ifndef NIPQUAD_FMT                     // kver >= 2.6.36
+            n = snprintf(stap_retvalue, maxstringlen, "%pI4", &sin->sin_addr);
+#else
+            n = snprintf(stap_retvalue, maxstringlen, NIPQUAD_FMT,
+                    NIPQUAD(sin->sin_addr));
+#endif
+            // (n - 1) mean: cut of null char
+            stap_retvalue += (n);
+            maxstringlen -= (n - 1);
+        }
+
+        if (what & SA_TCP_PORT)
+        {
+            n = snprintf(stap_retvalue, maxstringlen, "%d",
+            _stp_ntohs(sin->sin_port));
+            // (n - 1) mean: cut of null char
+            stap_retvalue += (n);
+            maxstringlen -= (n - 1);
+        }
        }
+    // Why 2 * sizeof (char) here?
+    // Because I want to support abstract sockets with
+    // at least one usable byte after initial \0 char.
+    // Unnamed sockets aren't supported yet.
        else if ((sa->sa_family == AF_UNIX)
-                && (len == sizeof(struct sockaddr_un)))
-       {       
-               struct sockaddr_un *sun = (struct sockaddr_un *)buf;    
-               snprintf(STAP_RETVALUE, MAXSTRINGLEN, "{AF_UNIX, %s}",
-                        sun->sun_path); 
+            && ((len == sizeof(struct sockaddr_un))
+            || (len >= ((sizeof(sa_family_t)) + (2 * sizeof(char))))))
+       {
+               struct sockaddr_un *sun = (struct sockaddr_un *)CONTEXT->buf;
+               if (what & SA_PRETTY)
+               {
+
+                       // Support for abstract sockets
+                       if (sun->sun_path[0] == '\0')
+                       {
+                // Abstract sockets aren't string oriented.
+                // We need conversion on this place.
+                // No check of ret value, because _stp_text_str returns
+                // "<unknown>" if bad things happen.
+                //
+                // Well. There can be NUL chars inside sun_path.
+                // We just stop at first NUL char. 
+                // TODO: We need byte oriented conversion function.
+                _stp_text_str(CONTEXT->out_str, &sun->sun_path[1],
+                    len - sizeof(sa_family_t), MAXSTRINGLEN - 1, 0, 0);
+                snprintf(STAP_RETVALUE, MAXSTRINGLEN, "{AF_UNIX, \\000%s}",
+                    CONTEXT->out_str);
+            } else
+                       {
+                // Just cut path if is too long
+                CONTEXT->buf[127] = '\0';
+                snprintf(STAP_RETVALUE, MAXSTRINGLEN, "{AF_UNIX, %s}",
+                    sun->sun_path);
+                       }
+               } else if (what & SA_FAMILY)
+               {
+            strlcpy(STAP_RETVALUE, "AF_UNIX", MAXSTRINGLEN);
+               } else
+               {
+                       strlcpy(STAP_RETVALUE, "", MAXSTRINGLEN);
+               }
        }
        else if ((sa->sa_family == AF_NETLINK)
                 && (len == sizeof(struct sockaddr_nl)))
        {
-               struct sockaddr_nl *nl = (struct sockaddr_nl *)buf;
-               snprintf(STAP_RETVALUE, MAXSTRINGLEN,
-                        "{AF_NETLINK, pid=%d, groups=%08x}",
-                        nl->nl_pid, nl->nl_groups);
-       }
+               struct sockaddr_nl *nl = (struct sockaddr_nl *)CONTEXT->buf;
+
+        if (what & SA_PRETTY) {
+            snprintf(STAP_RETVALUE, MAXSTRINGLEN,
+                "{AF_NETLINK, pid=%d, groups=%08x}",
+                nl->nl_pid, nl->nl_groups);
+        } else if (what & SA_FAMILY)
+        {
+            strlcpy(STAP_RETVALUE, "AF_NETLINK", MAXSTRINGLEN);
+        } else
+        {
+            strlcpy(STAP_RETVALUE, "", MAXSTRINGLEN);
+        }
+    }
        else if ((sa->sa_family == AF_INET6)
                 && (len == sizeof(struct sockaddr_in6)))
        {
-               struct sockaddr_in6 *sin = (struct sockaddr_in6 *)buf;
+               struct sockaddr_in6 *sin = (struct sockaddr_in6 *)CONTEXT->buf;
+
+        if (what & SA_PRETTY)
+        {
 #ifndef NIP6_FMT                       // kver >= 2.6.36
-               snprintf(STAP_RETVALUE, MAXSTRINGLEN,
-                        "{AF_INET6, %pI6, %d}", &sin->sin6_addr,
-                        _stp_ntohs(sin->sin6_port));
+            snprintf(STAP_RETVALUE, MAXSTRINGLEN,
+                 "{AF_INET6, %pI6, %d}", &sin->sin6_addr,
+                 _stp_ntohs(sin->sin6_port));
 #else
-               snprintf(STAP_RETVALUE, MAXSTRINGLEN,
-                        "{AF_INET6, " NIP6_FMT ", %d}", NIP6(sin->sin6_addr),
-                        _stp_ntohs(sin->sin6_port));
-#endif
+            snprintf(STAP_RETVALUE, MAXSTRINGLEN,
+                 "{AF_INET6, " NIP6_FMT ", %d}", NIP6(sin->sin6_addr),
+                 _stp_ntohs(sin->sin6_port));
+#endif
+            return;
+        }
+
+        if (what & SA_FAMILY)
+        {
+            n = strlcpy(stap_retvalue, "AF_INET6", maxstringlen);
+                       // (n - 1) mean: cut of null char
+                       stap_retvalue += (n);
+                       maxstringlen -= (n - 1);
+        }
+
+        if (what & SA_IP_ADDR)
+        {
+#ifndef NIP6_FMT                       // kver >= 2.6.36
+            n = snprintf(stap_retvalue, maxstringlen,
+                 "%pI6", &sin->sin6_addr);
+#else
+            n = snprintf(stap_retvalue, maxstringlen,
+                 NIP6_FMT, NIP6(sin->sin6_addr));
+#endif
+                       // (n - 1) mean: cut of null char
+                       stap_retvalue += (n);
+                       maxstringlen -= (n - 1);
+        }
+
+        if (what & SA_TCP_PORT)
+        {
+            n = snprintf(stap_retvalue, maxstringlen,
+                "%d", _stp_ntohs(sin->sin6_port));
+            // (n - 1) mean: cut of null char
+            stap_retvalue += (n);
+            maxstringlen -= (n - 1);
+        }
+
+        if (what & SA_IPV6_FLOWINFO)
+        {
+            n = snprintf(stap_retvalue, maxstringlen,
+                 "%d", sin->sin6_flowinfo);
+                       // (n - 1) mean: cut of null char
+                       stap_retvalue += (n);
+                       maxstringlen -= (n - 1);
+        }
+
+        if (what & SA_IPV6_SCOPE_ID)
+        {
+            n = snprintf(stap_retvalue, maxstringlen,
+                 "%d", sin->sin6_flowinfo);
+                       // (n - 1) mean: cut of null char
+                       stap_retvalue += (n);
+                       maxstringlen -= (n - 1);
+        }
        }
        else if ((sa->sa_family == AF_PACKET)
-                && (len == sizeof(struct sockaddr_ll))) 
+                && (len == sizeof(struct sockaddr_ll)))
        {
-               struct sockaddr_ll *sll = (struct sockaddr_ll *)buf;
-               snprintf(STAP_RETVALUE, MAXSTRINGLEN,
-                        "{AF_PACKET, proto=%d, ind=%d, hatype=%d, pkttype=%d, halen=%d, addr=0x%llx}",
-                        (int)sll->sll_protocol, sll->sll_ifindex,
-                        (int)sll->sll_hatype, (int)sll->sll_pkttype,
-                        (int)sll->sll_halen,
-                        (long long)(*(uint64_t *)sll->sll_addr));
+               struct sockaddr_ll *sll = (struct sockaddr_ll *)CONTEXT->buf;
+
+        if (what & SA_PRETTY)
+        {
+            snprintf(STAP_RETVALUE, MAXSTRINGLEN,
+                 "{AF_PACKET, proto=%d, ind=%d, hatype=%d, pkttype=%d, halen=%d, addr=0x%llx}",
+                 (int)sll->sll_protocol, sll->sll_ifindex,
+                 (int)sll->sll_hatype, (int)sll->sll_pkttype,
+                 (int)sll->sll_halen,
+                 (long long)(*(uint64_t *)sll->sll_addr));
+        } else if (what & SA_FAMILY)
+        { 
+            strlcpy(STAP_RETVALUE, "AF_PACKET", MAXSTRINGLEN);
+        } else
+        {
+            strlcpy(STAP_RETVALUE, "", MAXSTRINGLEN);
+        }
        }
        else
        {
index c5176cadae35d50b3f57bd0c1b11b6f46c41955d..5df794db439838442391bb375a4380512c4124bd 100644 (file)
@@ -252,6 +252,7 @@ probe nd_syscall.bind = kprobe.function("sys_bind") ?
        sockfd = int_arg(1)
        my_addr_uaddr = pointer_arg(2)
        addrlen = int_arg(3)
+       @_af_inet_info_u(my_addr_uaddr, addrlen)
        argstr = sprintf("%d, %s, %d", sockfd, _struct_sockaddr_u(my_addr_uaddr, addrlen), addrlen)
 }
 probe nd_syscall.bind.return = kprobe.function("sys_bind").return ?
@@ -626,6 +627,7 @@ probe nd_syscall.connect = kprobe.function("sys_connect") ?
        sockfd = int_arg(1)
        serv_addr_uaddr = pointer_arg(2)
        addrlen = int_arg(3)
+       @_af_inet_info_u(serv_addr_uaddr, addrlen)
        argstr = sprintf("%d, %s, %d", sockfd, _struct_sockaddr_u(serv_addr_uaddr, addrlen), addrlen)
 }
 probe nd_syscall.connect.return = kprobe.function("sys_connect").return ?
index aae5dd3eb2dcc982881c55c41285457fb2fb0b3a..4f45e22e5cfc018c0afa05964078975e1c8a7183 100644 (file)
@@ -201,6 +201,7 @@ probe syscall.bind = kernel.function("sys_bind").call ?
        sockfd = $fd
        my_addr_uaddr = $umyaddr
        addrlen = $addrlen
+       @_af_inet_info_u(my_addr_uaddr, addrlen)
        argstr = sprintf("%d, %s, %d", $fd, _struct_sockaddr_u($umyaddr, $addrlen), $addrlen)
 }
 probe syscall.bind.return = kernel.function("sys_bind").return ?
@@ -503,6 +504,7 @@ probe syscall.connect = kernel.function("sys_connect").call ?
        sockfd = $fd
        serv_addr_uaddr = $uservaddr
        addrlen = $addrlen
+       @_af_inet_info_u(serv_addr_uaddr, addrlen)
        argstr = sprintf("%d, %s, %d", $fd, _struct_sockaddr_u($uservaddr, $addrlen), $addrlen)
 }
 probe syscall.connect.return = kernel.function("sys_connect").return ?
index bbd90f22c9f3efb23f780eecf56d41d82a7ca87b..36e6f18d3b306ce52fe2adc9eb7c9ad13df9e953 100644 (file)
@@ -1,5 +1,5 @@
 // syscalls tapset macros
-// Copyright (C) 2013 Red Hat Inc.
+// Copyright (C) 2013-2014 Red Hat Inc.
 //
 // This file is part of systemtap, and is free software.  You can
 // redistribute it and/or modify it under the terms of the GNU General
        if (_stp_syscall_nr() != @syscall_nr) next
     %)
 %)
+
+
+@define _af_inet_info_u(my_addr_uaddr, addrlen)
+%(
+  %( systemtap_v >= "2.5" %?
+     uaddr_af = _struct_sockaddr_u_sa_family(@my_addr_uaddr, @addrlen)
+     if (_struct_sockaddr_u_sa_family(@my_addr_uaddr, @addrlen) =~ "AF_INET.*") {
+       uaddr_ip = _struct_sockaddr_u_ip_addr(@my_addr_uaddr, @addrlen)
+       uaddr_ip_port = _struct_sockaddr_u_tcp_port(@my_addr_uaddr, @addrlen)
+       if (_struct_sockaddr_u_sa_family(@my_addr_uaddr, @addrlen) == "AF_INET6") {
+         uaddr_ipv6_flowinfo =  _struct_sockaddr_u_ipv6_flowinfo(@my_addr_uaddr, @addrlen)
+         uaddr_ipv6_scope_id =  _struct_sockaddr_u_ipv6_scope_id(@my_addr_uaddr, @addrlen)
+       }
+     }
+  %)
+%)
index 1fb5114b35a3de04786d596c0bcfab866463fd3a..51b02c1ec107768b4674a38f232a465cd35bd888 100755 (executable)
@@ -14,6 +14,14 @@ probe begin {
        print (_struct_itimerval_u(0))
        print (_struct_compat_itimerval_u(0))
        print (_struct_sockaddr_u(0,0))
+%( systemtap_v >= "2.5" %?
+       print (_struct_sockaddr_u_ip_addr(0,0))
+       print (_struct_sockaddr_u_tcp_port(0,0))
+       print (_struct_sockaddr_u_sa_family(0,0))
+       print (_struct_sockaddr_u_ipv6_flowinfo(0,0))
+       print (_struct_sockaddr_u_ipv6_scope_id(0,0))
+       print (_struct_sockaddr_u_impl(0,0,0))
+%)
        print (_struct_rlimit_u(0))
        print (_fildes_index_u(0, 0))
 
index b3489e16ea17da0613d6bac1087659e78a665e38..64d7f42a36e1c4c6764d6e6812ed1046efa20caf 100755 (executable)
@@ -74,8 +74,13 @@ probe nd_syscall.bdflush.return ?
 probe nd_syscall.bind
 {
        printf("%s, %s\n", name, argstr)
+%( systemtap_v >= "2.5" %?
+       printf("%d, %p, %d, %s\n", sockfd, my_addr_uaddr, addrlen, uaddr_af)
+%:
        printf("%d, %p, %d\n", sockfd, my_addr_uaddr, addrlen)
+%)
 }
+
 probe nd_syscall.bind.return
 {
        printf("%s, %s\n", name, retstr)
@@ -194,7 +199,11 @@ probe nd_syscall.close.return
 probe nd_syscall.connect
 {
        printf("%s, %s\n", name, argstr)
+%( systemtap_v >= "2.5" %?
+       printf("%d, %p, %d, %s\n", sockfd, serv_addr_uaddr, addrlen, uaddr_af)
+%:
        printf("%d, %p, %d\n", sockfd, serv_addr_uaddr, addrlen)
+%)
 }
 probe nd_syscall.connect.return
 {
index 1d47d623d7f676ab8ac7f7853c6418dcc6bd44c0..44e6a273934fc46bdc22e08af3007e16ef21ada1 100755 (executable)
@@ -74,7 +74,12 @@ probe syscall.bdflush.return ?
 probe syscall.bind
 {
        printf("%s, %s\n", name, argstr)
+
+%( systemtap_v >= "2.5" %?
+       printf("%d, %p, %d, %s\n", sockfd, my_addr_uaddr, addrlen, uaddr_af)
+%:
        printf("%d, %p, %d\n", sockfd, my_addr_uaddr, addrlen)
+%)
 }
 probe syscall.bind.return
 {
@@ -194,7 +199,11 @@ probe syscall.close.return
 probe syscall.connect
 {
        printf("%s, %s\n", name, argstr)
+%( systemtap_v >= "2.5" %?
+       printf("%d, %p, %d, %s\n", sockfd, serv_addr_uaddr, addrlen, uaddr_af)
+%:
        printf("%d, %p, %d\n", sockfd, serv_addr_uaddr, addrlen)
+%)
 }
 probe syscall.connect.return
 {
diff --git a/testsuite/systemtap.examples/network/connect_stat.stp b/testsuite/systemtap.examples/network/connect_stat.stp
new file mode 100644 (file)
index 0000000..e0b59d0
--- /dev/null
@@ -0,0 +1,31 @@
+#! /usr/bin/env stap
+
+############################################################
+# connect_stat.stp
+# Author: Robin Hack <rhack@redhat.com>
+# An example script show process tree of process
+# which tried to call connect with specific ip address
+############################################################
+
+function process_tree (ip:string) {
+    cur_proc = task_current();
+    parent_pid = task_pid(task_parent (cur_proc));
+
+    printf ("%s: ", ip);
+    while (parent_pid != 0) {
+        printf ("%s (%d),%d,%d -> ", task_execname(cur_proc), task_pid(cur_proc), task_uid(cur_proc),task_gid (cur_proc));
+        cur_proc = task_parent(cur_proc);
+        parent_pid = task_pid(task_parent (cur_proc));
+    }
+    # init process
+    if (task_pid (cur_proc) == 1) {
+        printf ("%s (%d),%d,%d\n", task_execname(cur_proc), task_pid(cur_proc), task_uid(cur_proc),task_gid (cur_proc));
+    }
+}
+
+probe syscall.connect {
+    if ((uaddr_af !~ "AF_INET*") || (uaddr_ip != @1)) {
+        next;
+    }
+    process_tree (uaddr_ip);
+}
This page took 0.051645 seconds and 5 git commands to generate.