netstat.c revision 4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53
163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey/*
263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Copyright (c) 2008, The Android Open Source Project
363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * All rights reserved.
463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *
563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Redistribution and use in source and binary forms, with or without
663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * modification, are permitted provided that the following conditions
763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * are met:
863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *  * Redistributions of source code must retain the above copyright
963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *    notice, this list of conditions and the following disclaimer.
1063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *  * Redistributions in binary form must reproduce the above copyright
1163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *    notice, this list of conditions and the following disclaimer in
1263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *    the documentation and/or other materials provided with the
1363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *    distribution.
1463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *  * Neither the name of Google, Inc. nor the names of its contributors
1563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *    may be used to endorse or promote products derived from this
1663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *    software without specific prior written permission.
1763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey *
1863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
2263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
2563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
2863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * SUCH DAMAGE.
3063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey */
3163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
3263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey#include <stdio.h>
3363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey#include <stdlib.h>
3463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
3563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeytypedef union iaddr iaddr;
3663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
3763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyunion iaddr {
3863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    unsigned u;
3963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    unsigned char b[4];
4063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey};
4163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
4263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeystatic const char *state2str(unsigned state)
4363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey{
4463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    switch(state){
4563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    case 0x1: return "ESTABLISHED";
4663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    case 0x2: return "SYN_SENT";
4763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    case 0x3: return "SYN_RECV";
4863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    case 0x4: return "FIN_WAIT1";
4963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    case 0x5: return "FIN_WAIT2";
500cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey    case 0x6: return "TIME_WAIT";
5163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    case 0x7: return "CLOSE";
5263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    case 0x8: return "CLOSE_WAIT";
5363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    case 0x9: return "LAST_ACK";
5470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    case 0xA: return "LISTEN";
5570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    case 0xB: return "CLOSING";
5670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    default: return "UNKNOWN";
5770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
5870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey}
5970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
6070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkeyvoid addr2str(iaddr addr, unsigned port, char *buf)
6170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey{
6263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    if(port) {
6363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        snprintf(buf, 64, "%d.%d.%d.%d:%d",
6463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                 addr.b[0], addr.b[1], addr.b[2], addr.b[3], port);
6563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    } else {
6663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        snprintf(buf, 64, "%d.%d.%d.%d:*",
6763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                 addr.b[0], addr.b[1], addr.b[2], addr.b[3]);
680cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey    }
6963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey}
7063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
710cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkeyint netstat_main(int argc, char *argv[])
7263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey{
7363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    char buf[512];
7463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    char lip[64];
7563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    char rip[64];
7663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    iaddr laddr, raddr;
7763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    unsigned lport, rport, state, txq, rxq, num;
7863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    int n;
7963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    FILE *fp;
8063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
8163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    printf("Proto Recv-Q Send-Q Local Address          Foreign Address        State\n");
8263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
8363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    fp = fopen("/proc/net/tcp", "r");
8463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    if(fp != 0) {
850cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey        fgets(buf, 512, fp);
8663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        while(fgets(buf, 512, fp)){
8763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            n = sscanf(buf, " %d: %x:%x %x:%x %x %x:%x",
8863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                       &num, &laddr.u, &lport, &raddr.u, &rport,
8963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                       &state, &txq, &rxq);
9063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            if(n == 8) {
9163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                addr2str(laddr, lport, lip);
9263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                addr2str(raddr, rport, rip);
9363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
9463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                printf("tcp   %6d %6d %-22s %-22s %s\n",
9563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                       txq, rxq, lip, rip,
9663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                       state2str(state));
970cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey            }
9863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        }
9963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        fclose(fp);
10063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
10163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    fp = fopen("/proc/net/udp", "r");
10263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    if(fp != 0) {
10363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        fgets(buf, 512, fp);
10463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        while(fgets(buf, 512, fp)){
10563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            n = sscanf(buf, " %d: %x:%x %x:%x %x %x:%x",
10663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                       &num, &laddr.u, &lport, &raddr.u, &rport,
10763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                       &state, &txq, &rxq);
10863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            if(n == 8) {
10963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                addr2str(laddr, lport, lip);
11063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                addr2str(raddr, rport, rip);
1110cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey
11263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                printf("udp   %6d %6d %-22s %-22s\n",
11363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                       txq, rxq, lip, rip);
11463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            }
11563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        }
11663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        fclose(fp);
11763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
11863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
11963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    return 0;
12063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey}
12163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey