diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-04-29 19:17:34 -0300 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-04-29 19:17:34 -0300 |
commit | 97b937546b6e9c9a9fb5e33565ff4edcabc26293 (patch) | |
tree | 5e49b8b504db91a04f74b5699e804f44f9dcac70 | |
parent | c2f3a5945bd4e2950f5c18c92c82034866a8252c (diff) | |
download | python-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-x | psk.py | 16 | ||||
-rw-r--r-- | python-inet_diag/inet_diag.c | 14 |
2 files changed, 27 insertions, 3 deletions
@@ -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; } |