Module: wine Branch: master Commit: c25c7f804988a782b2eb7f515f322b51b5557f67 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c25c7f804988a782b2eb7f515f...
Author: André Hentschel nerv@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