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