=?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: netstat: Parse command line arguments.

Alexandre Julliard julliard at winehq.org
Thu Jan 3 13:31:12 CST 2013


Module: wine
Branch: master
Commit: c25c7f804988a782b2eb7f515f322b51b5557f67
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c25c7f804988a782b2eb7f515f322b51b5557f67

Author: André Hentschel <nerv at dawncrow.de>
Date:   Wed Jan  2 21:37:45 2013 +0100

netstat: Parse command line arguments.

---

 programs/netstat/netstat.c |   60 ++++++++++++++++++++++++++++++++++++-------
 programs/netstat/netstat.h |   12 +++++++++
 2 files changed, 62 insertions(+), 10 deletions(-)

diff --git a/programs/netstat/netstat.c b/programs/netstat/netstat.c
index 999e409..dede96d 100644
--- a/programs/netstat/netstat.c
+++ b/programs/netstat/netstat.c
@@ -24,7 +24,15 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(netstat);
 
+static const WCHAR ipW[] = {'I', 'P', 0};
+static const WCHAR ipv6W[] = {'I', 'P', 'v', '6', 0};
+static const WCHAR icmpW[] = {'I', 'C', 'M', 'P', 0};
+static const WCHAR icmpv6W[] = {'I', 'C', 'M', 'P', 'v', '6', 0};
 static const WCHAR tcpW[] = {'T', 'C', 'P', 0};
+static const WCHAR tcpv6W[] = {'T', 'C', 'P', 'v', '6', 0};
+static const WCHAR udpW[] = {'U', 'D', 'P', 0};
+static const WCHAR udpv6W[] = {'U', 'D', 'P', 'v', '6', 0};
+
 static const WCHAR fmtport[] = {'%', 'd', 0};
 static const WCHAR fmtip[] = {'%', 'd', '.', '%', 'd', '.', '%', 'd', '.', '%', 'd', 0};
 static const WCHAR fmtn[] = {'\n', 0};
@@ -181,26 +189,58 @@ static void NETSTAT_tcp_table(void)
     HeapFree(GetProcessHeap(), 0, table);
 }
 
+static NETSTATPROTOCOLS NETSTAT_get_protocol(WCHAR name[])
+{
+    if (!strcmpiW(name, ipW)) return PROT_IP;
+    if (!strcmpiW(name, ipv6W)) return PROT_IPV6;
+    if (!strcmpiW(name, icmpW)) return PROT_ICMP;
+    if (!strcmpiW(name, icmpv6W)) return PROT_ICMPV6;
+    if (!strcmpiW(name, tcpW)) return PROT_TCP;
+    if (!strcmpiW(name, tcpv6W)) return PROT_TCPV6;
+    if (!strcmpiW(name, udpW)) return PROT_UDP;
+    if (!strcmpiW(name, udpv6W)) return PROT_UDPV6;
+    return PROT_UNKNOWN;
+}
+
 int wmain(int argc, WCHAR *argv[])
 {
     WSADATA wsa_data;
 
-    if (argc > 1)
-    {
-        int i;
-        WINE_FIXME("stub:");
-        for (i = 0; i < argc; i++)
-            WINE_FIXME(" %s", wine_dbgstr_w(argv[i]));
-        WINE_FIXME("\n");
-    }
-
     if (WSAStartup(MAKEWORD(2, 2), &wsa_data))
     {
         WINE_ERR("WSAStartup failed: %d\n", WSAGetLastError());
         return 1;
     }
 
-    NETSTAT_tcp_table();
+    if (argc == 1)
+    {
+        /* No options */
+        NETSTAT_tcp_table();
+        return 0;
+    }
+
+    while (argv[1] && argv[1][0] == '-')
+    {
+        switch (argv[1][1])
+        {
+        case 'p':
+            argv++; argc--;
+            if (argc == 1) return 1;
+            switch (NETSTAT_get_protocol(argv[1]))
+            {
+                case PROT_TCP:
+                    NETSTAT_tcp_table();
+                    break;
+                default:
+                    WINE_FIXME("Protocol not yet implemented: %s\n", debugstr_w(argv[1]));
+            }
+            break;
+        default:
+            WINE_FIXME("Unknown option: %s\n", debugstr_w(argv[1]));
+            return 1;
+        }
+        argv++; argc--;
+    }
 
     return 0;
 }
diff --git a/programs/netstat/netstat.h b/programs/netstat/netstat.h
index b51a81f..dc4fb1e 100644
--- a/programs/netstat/netstat.h
+++ b/programs/netstat/netstat.h
@@ -18,6 +18,18 @@
 
 #include <windows.h>
 
+typedef enum _NETSTATPROTOCOLS {
+  PROT_UNKNOWN,
+  PROT_IP,
+  PROT_IPV6,
+  PROT_ICMP,
+  PROT_ICMPV6,
+  PROT_TCP,
+  PROT_TCPV6,
+  PROT_UDP,
+  PROT_UDPV6,
+} NETSTATPROTOCOLS;
+
 #define IDS_TCP_CLOSED      1
 #define IDS_TCP_LISTENING   2
 #define IDS_TCP_SYN_SENT    3




More information about the wine-cvs mailing list