diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:32:55 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:32:55 -0800 |
commit | dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0 (patch) | |
tree | 2ba8d1a0846d69b18f623515e8d9b5d9fe38b590 /toolbox/netstat.c | |
parent | e54eebbf1a908d65ee8cf80bab62821c05666d70 (diff) | |
download | system_core-dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0.zip system_core-dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0.tar.gz system_core-dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'toolbox/netstat.c')
-rw-r--r-- | toolbox/netstat.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/toolbox/netstat.c b/toolbox/netstat.c new file mode 100644 index 0000000..6404309 --- /dev/null +++ b/toolbox/netstat.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2008, The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google, Inc. nor the names of its contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> + +typedef union iaddr iaddr; + +union iaddr { + unsigned u; + unsigned char b[4]; +}; + +static const char *state2str(unsigned state) +{ + switch(state){ + case 0x1: return "ESTABLISHED"; + case 0x2: return "SYN_SENT"; + case 0x3: return "SYN_RECV"; + case 0x4: return "FIN_WAIT1"; + case 0x5: return "FIN_WAIT2"; + case 0x6: return "TIME_WAIT"; + case 0x7: return "CLOSE"; + case 0x8: return "CLOSE_WAIT"; + case 0x9: return "LAST_ACK"; + case 0xA: return "LISTEN"; + case 0xB: return "CLOSING"; + default: return "UNKNOWN"; + } +} + +void addr2str(iaddr addr, unsigned port, char *buf) +{ + if(port) { + snprintf(buf, 64, "%d.%d.%d.%d:%d", + addr.b[0], addr.b[1], addr.b[2], addr.b[3], port); + } else { + snprintf(buf, 64, "%d.%d.%d.%d:*", + addr.b[0], addr.b[1], addr.b[2], addr.b[3]); + } +} + +int netstat_main(int argc, char *argv[]) +{ + char buf[512]; + char lip[64]; + char rip[64]; + iaddr laddr, raddr; + unsigned lport, rport, state, txq, rxq, num; + int n; + FILE *fp; + + printf("Proto Recv-Q Send-Q Local Address Foreign Address State\n"); + + fp = fopen("/proc/net/tcp", "r"); + if(fp != 0) { + fgets(buf, 512, fp); + while(fgets(buf, 512, fp)){ + n = sscanf(buf, " %d: %x:%x %x:%x %x %x:%x", + &num, &laddr.u, &lport, &raddr.u, &rport, + &state, &txq, &rxq); + if(n == 8) { + addr2str(laddr, lport, lip); + addr2str(raddr, rport, rip); + + printf("tcp %6d %6d %-22s %-22s %s\n", + txq, rxq, lip, rip, + state2str(state)); + } + } + fclose(fp); + } + fp = fopen("/proc/net/udp", "r"); + if(fp != 0) { + fgets(buf, 512, fp); + while(fgets(buf, 512, fp)){ + n = sscanf(buf, " %d: %x:%x %x:%x %x %x:%x", + &num, &laddr.u, &lport, &raddr.u, &rport, + &state, &txq, &rxq); + if(n == 8) { + addr2str(laddr, lport, lip); + addr2str(raddr, rport, rip); + + printf("udp %6d %6d %-22s %-22s\n", + txq, rxq, lip, rip); + } + } + fclose(fp); + } + + return 0; +} |