[3/3] netstat: Implement -e option

André Hentschel nerv at dawncrow.de
Mon Jan 7 16:30:37 CST 2013


---
 programs/netstat/netstat.c  | 63 +++++++++++++++++++++++++++++++++++++++++++++
 programs/netstat/netstat.h  |  9 +++++++
 programs/netstat/netstat.rc |  9 +++++++
 3 files changed, 81 insertions(+)

diff --git a/programs/netstat/netstat.c b/programs/netstat/netstat.c
index 206e58c..258f9d4 100644
--- a/programs/netstat/netstat.c
+++ b/programs/netstat/netstat.c
@@ -41,6 +41,11 @@ static const WCHAR fmtnn[] = {'\n', '%', 's', '\n', 0};
 static const WCHAR fmtcolon[] = {'%', 's', ':', '%', 's', 0};
 static const WCHAR fmttcpout[] = {' ', ' ', '%', '-', '6', 's', ' ', '%', '-', '2', '2', 's', ' ', '%', '-', '2', '2', 's', ' ', '%', 's', '\n', 0};
 static const WCHAR fmtudpout[] = {' ', ' ', '%', '-', '6', 's', ' ', '%', '-', '2', '2', 's', ' ', '*', ':', '*', '\n', 0};
+static const WCHAR fmtethout[] = {'%', '-', '2', '0', 's', ' ', '%', '1', '4', 'l', 'u', ' ', '%', '1', '5', 'l', 'u', '\n', 0};
+static const WCHAR fmtethoutu[] = {'%', '-', '2', '0', 's', ' ', '%', '1', '4', 'l', 'u', '\n', '\n', 0};
+static const WCHAR fmtethheader[] = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
+                                     ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
+                                     ' ', '%', '-', '1', '9', 's', ' ', '%', 's', '\n', '\n', 0};
 
 static const WCHAR tcpstatesW[][16] = {
     {'?', '?', '?', 0},
@@ -172,6 +177,61 @@ static void NETSTAT_conn_header(void)
     NETSTAT_wprintf(fmttcpout, NETSTAT_load_message(IDS_TCP_PROTO), local, remote, state);
 }
 
+static void NETSTAT_eth_stats()
+{
+    PMIB_IFTABLE table;
+    DWORD err, size, i;
+    DWORD octets[2], ucastpkts[2], nucastpkts[2], discards[2], errors[2], unknown;
+    WCHAR recv[19];
+
+    size = sizeof(MIB_IFTABLE);
+    do
+    {
+        table = (PMIB_IFTABLE)HeapAlloc(GetProcessHeap(), 0, size);
+        err = GetIfTable(table, &size, FALSE);
+        if (err != NO_ERROR) HeapFree(GetProcessHeap(), 0, table);
+    } while (err == ERROR_INSUFFICIENT_BUFFER);
+
+    if (err) return;
+
+    NETSTAT_wprintf(NETSTAT_load_message(IDS_ETH_STAT));
+    NETSTAT_wprintf(fmtn);
+    NETSTAT_wprintf(fmtn);
+    strcpyW(recv, NETSTAT_load_message(IDS_ETH_RECV));
+    NETSTAT_wprintf(fmtethheader, recv, NETSTAT_load_message(IDS_ETH_SENT));
+
+    octets[0] = octets[1] = 0;
+    ucastpkts[0] = ucastpkts[1] = 0;
+    nucastpkts[0] = nucastpkts[1] = 0;
+    discards[0] = discards[1] = 0;
+    errors[0] = errors[1] = 0;
+    unknown = 0;
+
+    for (i = 0; i < table->dwNumEntries; i++)
+    {
+        octets[0] += table->table[i].dwInOctets;
+        octets[1] += table->table[i].dwOutOctets;
+        ucastpkts[0] += table->table[i].dwInUcastPkts;
+        ucastpkts[1] += table->table[i].dwOutUcastPkts;
+        nucastpkts[0] += table->table[i].dwInNUcastPkts;
+        nucastpkts[1] += table->table[i].dwOutNUcastPkts;
+        discards[0] += table->table[i].dwInDiscards;
+        discards[1] += table->table[i].dwOutDiscards;
+        errors[0] += table->table[i].dwInErrors;
+        errors[1] += table->table[i].dwOutErrors;
+        unknown += table->table[i].dwInUnknownProtos;
+    }
+
+    NETSTAT_wprintf(fmtethout, NETSTAT_load_message(IDS_ETH_BYTES), octets[0], octets[1]);
+    NETSTAT_wprintf(fmtethout, NETSTAT_load_message(IDS_ETH_UNICAST), ucastpkts[0], ucastpkts[1]);
+    NETSTAT_wprintf(fmtethout, NETSTAT_load_message(IDS_ETH_NUNICAST), nucastpkts[0], nucastpkts[1]);
+    NETSTAT_wprintf(fmtethout, NETSTAT_load_message(IDS_ETH_DISCARDS), discards[0], discards[1]);
+    NETSTAT_wprintf(fmtethout, NETSTAT_load_message(IDS_ETH_ERRORS), errors[0], errors[1]);
+    NETSTAT_wprintf(fmtethoutu, NETSTAT_load_message(IDS_ETH_UNKNOWN), unknown);
+
+    HeapFree(GetProcessHeap(), 0, table);
+}
+
 static void NETSTAT_tcp_table(void)
 {
     PMIB_TCPTABLE table;
@@ -278,6 +338,9 @@ int wmain(int argc, WCHAR *argv[])
             NETSTAT_tcp_table();
             NETSTAT_udp_table();
             return 0;
+        case 'e':
+            NETSTAT_eth_stats();
+            return 0;
         case 'p':
             argv++; argc--;
             if (argc == 1) return 1;
diff --git a/programs/netstat/netstat.h b/programs/netstat/netstat.h
index 0f7c545..3176939 100644
--- a/programs/netstat/netstat.h
+++ b/programs/netstat/netstat.h
@@ -35,3 +35,12 @@ typedef enum _NETSTATPROTOCOLS {
 #define IDS_TCP_LOCAL_ADDR  3
 #define IDS_TCP_REMOTE_ADDR 4
 #define IDS_TCP_STATE       5
+#define IDS_ETH_STAT        6
+#define IDS_ETH_SENT        7
+#define IDS_ETH_RECV        8
+#define IDS_ETH_BYTES       9
+#define IDS_ETH_UNICAST     10
+#define IDS_ETH_NUNICAST    11
+#define IDS_ETH_DISCARDS    12
+#define IDS_ETH_ERRORS      13
+#define IDS_ETH_UNKNOWN     14
diff --git a/programs/netstat/netstat.rc b/programs/netstat/netstat.rc
index 0ad36b7..d27fe1b 100644
--- a/programs/netstat/netstat.rc
+++ b/programs/netstat/netstat.rc
@@ -29,4 +29,13 @@ STRINGTABLE
   IDS_TCP_LOCAL_ADDR,  "Local Address"
   IDS_TCP_REMOTE_ADDR, "Foreign Address"
   IDS_TCP_STATE,       "State"
+  IDS_ETH_STAT,        "Interface Statistics"
+  IDS_ETH_SENT,        "Sent"
+  IDS_ETH_RECV,        "Received"
+  IDS_ETH_BYTES,       "Bytes"
+  IDS_ETH_UNICAST,     "Unicast packets"
+  IDS_ETH_NUNICAST,    "Non-unicast packets"
+  IDS_ETH_DISCARDS,    "Discards"
+  IDS_ETH_ERRORS,      "Errors"
+  IDS_ETH_UNKNOWN,     "Unknown protocols"
 }
-- 
1.8.0


-- 

Best Regards, André Hentschel


More information about the wine-patches mailing list