summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2009-04-29 19:17:34 -0300
committerArnaldo Carvalho de Melo <acme@redhat.com>2009-04-29 19:17:34 -0300
commit97b937546b6e9c9a9fb5e33565ff4edcabc26293 (patch)
tree5e49b8b504db91a04f74b5699e804f44f9dcac70
parentc2f3a5945bd4e2950f5c18c92c82034866a8252c (diff)
downloadpython-inet_diag-97b937546b6e9c9a9fb5e33565ff4edcabc26293.tar.gz
inet_diag_socket: timer_expiration, retransmissions & uid methods
timer_expiration: get expiration time (in ms) for running timer retransmissions: get connection retransmissions timer uid: get connection owner user id And use it in psk: $ psk firefox xchat 14562: /usr/lib64/firefox-3.0.9/firefox State Recv-Q Send-Q Local Address:Port Peer Address:Port Owner Timer (ms) Rtm ESTAB 0 0 192.168.1.120:7344 192.168.1.1:20480 acme off 0 0 ESTAB 0 0 192.168.1.120:10172 192.168.1.1:20480 acme off 0 0 ESTAB 0 0 192.168.1.120:10428 192.168.1.1:20480 acme off 0 0 16046: xchat State Recv-Q Send-Q Local Address:Port Peer Address:Port Owner Timer (ms) Rtm ESTAB 0 0 192.168.1.120:25546 195.92.253.2:57859 acme keepalive 6360395 0 ESTAB 0 0 10.11.12.210:32721 10.10.36.184:2842 acme keepalive 6439886 0 ESTAB 0 0 192.168.1.120:41655 154.35.200.44:2842 acme keepalive 6360715 0 $ Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rwxr-xr-xpsk.py16
-rw-r--r--python-inet_diag/inet_diag.c14
2 files changed, 27 insertions, 3 deletions
diff --git a/psk.py b/psk.py
index dbe2d9b..8d4aa99 100755
--- a/psk.py
+++ b/psk.py
@@ -13,13 +13,14 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
-import getopt, inet_diag, os, re, sys, procfs
+import getopt, inet_diag, os, re, procfs, pwd, sys
version="0.1"
state_width = 10
addr_width = 15
timer_width = 7
+owner_width = 8
def load_sockets():
idiag = inet_diag.create()
@@ -75,14 +76,23 @@ def print_sockets(pid, indent = 0):
procfs.process_cmdline(ps[pid]))
except:
return
+ print " %-*s %-6s %-6s %*s:%-5s %*s:%-5s %-*s %-*s %-5s %-3s" % \
+ (state_width, "State", "Recv-Q", "Send-Q",
+ addr_width, "Local Address", "Port",
+ addr_width, "Peer Address", "Port",
+ owner_width, "Owner",
+ timer_width, "Timer", "(ms)", "Rtm")
header_printed = True
s = inodes[inode]
- print " %-*s %-6d %-6d %*s:%-5d %*s:%-5d %-*s" % \
+ owner = pwd.getpwuid(s.uid())[0]
+ print " %-*s %-6d %-6d %*s:%-5d %*s:%-5d %-*s %-*s %-5d %-3d" % \
(state_width, s.state(),
s.receive_queue(), s.write_queue(),
addr_width, s.saddr(), s.sport(),
addr_width, s.daddr(), s.dport(),
- timer_width, s.timer())
+ owner_width, owner,
+ timer_width, s.timer(), s.timer_expiration(),
+ s.retransmissions())
def usage():
print '''Usage: psk [ OPTIONS ]
diff --git a/python-inet_diag/inet_diag.c b/python-inet_diag/inet_diag.c
index b08acb1..5d80b66 100644
--- a/python-inet_diag/inet_diag.c
+++ b/python-inet_diag/inet_diag.c
@@ -27,6 +27,7 @@
#ifndef __unused
#define __unused __attribute__ ((unused))
#endif
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
enum {
TCP_DB,
@@ -172,6 +173,12 @@ INET_SOCK__STR_METHOD(state, idiag_state, sstate_name,
"get internet socket state");
INET_SOCK__STR_METHOD(timer, idiag_timer, tmr_name,
"get internet socket running timer");
+INET_SOCK__INT_METHOD(timer_expiration, idiag_expires,
+ "get expiration time (in ms) for running timer");
+INET_SOCK__INT_METHOD(retransmissions, idiag_retrans,
+ "get connection retransmissions timer");
+INET_SOCK__INT_METHOD(uid, idiag_uid,
+ "get connection owner user id");
#define INET_SOCK__METHOD(name) { \
.ml_name = #name, \
@@ -191,6 +198,9 @@ static struct PyMethodDef inet_socket__methods[] = {
INET_SOCK__METHOD(inode),
INET_SOCK__METHOD(state),
INET_SOCK__METHOD(timer),
+ INET_SOCK__METHOD(timer_expiration),
+ INET_SOCK__METHOD(retransmissions),
+ INET_SOCK__METHOD(uid),
{ .ml_name = NULL, }
};
@@ -227,6 +237,10 @@ static PyObject *inet_socket__new(struct inet_diag_msg *r)
return NULL;
self->msg = *r;
+ if (self->msg.idiag_timer >= ARRAY_SIZE(tmr_name) - 1) {
+ /* Unknown timer */
+ self->msg.idiag_timer = ARRAY_SIZE(tmr_name) - 1;
+ }
return (PyObject *)self;
}