netstat.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (c) 2008, The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * All rights reserved. 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met: 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Redistributions of source code must retain the above copyright 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer in 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * the documentation and/or other materials provided with the 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distribution. 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Neither the name of Google, Inc. nor the names of its contributors 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * may be used to endorse or promote products derived from this 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * software without specific prior written permission. 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE. 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef union iaddr iaddr; 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectunion iaddr { 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned u; 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned char b[4]; 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const char *state2str(unsigned state) 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch(state){ 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0x1: return "ESTABLISHED"; 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0x2: return "SYN_SENT"; 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0x3: return "SYN_RECV"; 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0x4: return "FIN_WAIT1"; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0x5: return "FIN_WAIT2"; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0x6: return "TIME_WAIT"; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0x7: return "CLOSE"; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0x8: return "CLOSE_WAIT"; 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0x9: return "LAST_ACK"; 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0xA: return "LISTEN"; 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 0xB: return "CLOSING"; 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: return "UNKNOWN"; 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid addr2str(iaddr addr, unsigned port, char *buf) 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(port) { 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, 64, "%d.%d.%d.%d:%d", 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project addr.b[0], addr.b[1], addr.b[2], addr.b[3], port); 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf(buf, 64, "%d.%d.%d.%d:*", 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project addr.b[0], addr.b[1], addr.b[2], addr.b[3]); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint netstat_main(int argc, char *argv[]) 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[512]; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char lip[64]; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char rip[64]; 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iaddr laddr, raddr; 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned lport, rport, state, txq, rxq, num; 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int n; 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FILE *fp; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Proto Recv-Q Send-Q Local Address Foreign Address State\n"); 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fp = fopen("/proc/net/tcp", "r"); 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fp != 0) { 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fgets(buf, 512, fp); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(fgets(buf, 512, fp)){ 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n = sscanf(buf, " %d: %x:%x %x:%x %x %x:%x", 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &num, &laddr.u, &lport, &raddr.u, &rport, 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &state, &txq, &rxq); 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(n == 8) { 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project addr2str(laddr, lport, lip); 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project addr2str(raddr, rport, rip); 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("tcp %6d %6d %-22s %-22s %s\n", 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project txq, rxq, lip, rip, 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state2str(state)); 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fclose(fp); 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fp = fopen("/proc/net/udp", "r"); 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fp != 0) { 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fgets(buf, 512, fp); 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(fgets(buf, 512, fp)){ 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n = sscanf(buf, " %d: %x:%x %x:%x %x %x:%x", 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &num, &laddr.u, &lport, &raddr.u, &rport, 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &state, &txq, &rxq); 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(n == 8) { 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project addr2str(laddr, lport, lip); 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project addr2str(raddr, rport, rip); 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("udp %6d %6d %-22s %-22s\n", 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project txq, rxq, lip, rip); 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fclose(fp); 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 121