cryptdlg: Update Italian translation.
[wine/multimedia.git] / programs / ipconfig / ipconfig.c
blob84b0ace5e5e042e7ae2ec0b8b2609fadf9b05d60
1 /*
2 * IP configuration utility
4 * Copyright 2008 Andrew Riedi
5 * Copyright 2010 Andrew Nguyen
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include <windows.h>
23 #include <iphlpapi.h>
24 #include <wine/unicode.h>
26 #include "ipconfig.h"
28 static int ipconfig_vprintfW(const WCHAR *msg, va_list va_args)
30 int wlen;
31 DWORD count, ret;
32 WCHAR msg_buffer[8192];
34 wlen = vsprintfW(msg_buffer, msg, va_args);
36 ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), msg_buffer, wlen, &count, NULL);
37 if (!ret)
39 DWORD len;
40 char *msgA;
42 len = WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen,
43 NULL, 0, NULL, NULL);
44 msgA = HeapAlloc(GetProcessHeap(), 0, len);
45 if (!msgA)
46 return 0;
48 WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen, msgA, len,
49 NULL, NULL);
50 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), msgA, len, &count, FALSE);
51 HeapFree(GetProcessHeap(), 0, msgA);
54 return count;
57 static int ipconfig_printfW(const WCHAR *msg, ...)
59 va_list va_args;
60 int len;
62 va_start(va_args, msg);
63 len = ipconfig_vprintfW(msg, va_args);
64 va_end(va_args);
66 return len;
69 static int ipconfig_message_printfW(int msg, ...)
71 va_list va_args;
72 WCHAR msg_buffer[8192];
73 int len;
75 LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer,
76 sizeof(msg_buffer)/sizeof(WCHAR));
78 va_start(va_args, msg);
79 len = ipconfig_vprintfW(msg_buffer, va_args);
80 va_end(va_args);
82 return len;
85 static int ipconfig_message(int msg)
87 static const WCHAR formatW[] = {'%','s',0};
88 WCHAR msg_buffer[8192];
90 LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer,
91 sizeof(msg_buffer)/sizeof(WCHAR));
93 return ipconfig_printfW(formatW, msg_buffer);
96 static const WCHAR *iftype_to_string(DWORD type)
98 static WCHAR msg_buffer[50];
100 int msg;
102 switch (type)
104 case IF_TYPE_ETHERNET_CSMACD:
105 /* The loopback adapter appears as an Ethernet device. */
106 case IF_TYPE_SOFTWARE_LOOPBACK:
107 msg = STRING_ETHERNET;
108 break;
109 default:
110 msg = STRING_UNKNOWN;
113 LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer,
114 sizeof(msg_buffer)/sizeof(WCHAR));
116 return msg_buffer;
119 static void print_field(int msg, const WCHAR *value)
121 static const WCHAR formatW[] = {' ',' ',' ',' ','%','s',':',' ','%','s','\n',0};
123 WCHAR field[] = {'.',' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',
124 ' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',' ',0};
125 WCHAR name_buffer[sizeof(field)/sizeof(WCHAR)];
127 LoadStringW(GetModuleHandleW(NULL), msg, name_buffer, sizeof(name_buffer)/sizeof(WCHAR));
128 memcpy(field, name_buffer, sizeof(WCHAR) * min(strlenW(name_buffer), sizeof(field)/sizeof(WCHAR) - 1));
130 ipconfig_printfW(formatW, field, value);
133 static void print_basic_information(void)
135 IP_ADAPTER_ADDRESSES *adapters;
136 ULONG out = 0;
138 if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &out) == ERROR_BUFFER_OVERFLOW)
140 adapters = HeapAlloc(GetProcessHeap(), 0, out);
141 if (!adapters)
142 exit(1);
144 if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapters, &out) == ERROR_SUCCESS)
146 IP_ADAPTER_ADDRESSES *p;
148 for (p = adapters; p; p = p->Next)
150 static const WCHAR newlineW[] = {'\n',0};
152 IP_ADAPTER_UNICAST_ADDRESS *addr;
154 ipconfig_message_printfW(STRING_ADAPTER_FRIENDLY, iftype_to_string(p->IfType), p->FriendlyName);
155 ipconfig_printfW(newlineW);
156 print_field(STRING_CONN_DNS_SUFFIX, p->DnsSuffix);
158 for (addr = p->FirstUnicastAddress; addr; addr = addr->Next)
160 WCHAR addr_buf[54];
161 DWORD len = sizeof(addr_buf)/sizeof(WCHAR);
163 if (WSAAddressToStringW(addr->Address.lpSockaddr,
164 addr->Address.iSockaddrLength, NULL,
165 addr_buf, &len) == 0)
166 print_field(STRING_IP_ADDRESS, addr_buf);
167 /* FIXME: Output corresponding subnet mask. */
170 /* FIXME: Output default gateway address. */
171 ipconfig_printfW(newlineW);
175 HeapFree(GetProcessHeap(), 0, adapters);
179 static const WCHAR *nodetype_to_string(DWORD type)
181 static WCHAR msg_buffer[50];
183 int msg;
185 switch (type)
187 case BROADCAST_NODETYPE:
188 msg = STRING_BROADCAST;
189 break;
190 case PEER_TO_PEER_NODETYPE:
191 msg = STRING_PEER_TO_PEER;
192 break;
193 case MIXED_NODETYPE:
194 msg = STRING_MIXED;
195 break;
196 case HYBRID_NODETYPE:
197 msg = STRING_HYBRID;
198 break;
199 default:
200 msg = STRING_UNKNOWN;
203 LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer,
204 sizeof(msg_buffer)/sizeof(WCHAR));
206 return msg_buffer;
209 static WCHAR *physaddr_to_string(WCHAR *buf, BYTE *addr, DWORD len)
211 static const WCHAR fmtW[] = {'%','0','2','X','-',0};
212 static const WCHAR fmt2W[] = {'%','0','2','X',0};
214 if (!len)
215 *buf = '\0';
216 else
218 WCHAR *p = buf;
219 DWORD i;
221 for (i = 0; i < len - 1; i++)
223 sprintfW(p, fmtW, addr[i]);
224 p += 3;
226 sprintfW(p, fmt2W, addr[i]);
229 return buf;
232 static const WCHAR *boolean_to_string(int value)
234 static WCHAR msg_buffer[15];
236 LoadStringW(GetModuleHandleW(NULL), value ? STRING_YES : STRING_NO,
237 msg_buffer, sizeof(msg_buffer)/sizeof(WCHAR));
239 return msg_buffer;
242 static void print_full_information(void)
244 static const WCHAR newlineW[] = {'\n',0};
246 FIXED_INFO *info;
247 IP_ADAPTER_ADDRESSES *adapters;
248 ULONG out = 0;
250 if (GetNetworkParams(NULL, &out) == ERROR_BUFFER_OVERFLOW)
252 info = HeapAlloc(GetProcessHeap(), 0, out);
253 if (!info)
254 exit(1);
256 if (GetNetworkParams(info, &out) == ERROR_SUCCESS)
258 WCHAR hostnameW[MAX_HOSTNAME_LEN + 4];
260 MultiByteToWideChar(CP_ACP, 0, info->HostName, -1, hostnameW, sizeof(hostnameW));
261 print_field(STRING_HOSTNAME, hostnameW);
263 /* FIXME: Output primary DNS suffix. */
265 print_field(STRING_NODE_TYPE, nodetype_to_string(info->NodeType));
266 print_field(STRING_IP_ROUTING, boolean_to_string(info->EnableRouting));
268 /* FIXME: Output WINS proxy status and DNS suffix search list. */
270 ipconfig_printfW(newlineW);
273 HeapFree(GetProcessHeap(), 0, info);
276 if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &out) == ERROR_BUFFER_OVERFLOW)
278 adapters = HeapAlloc(GetProcessHeap(), 0, out);
279 if (!adapters)
280 exit(1);
282 if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapters, &out) == ERROR_SUCCESS)
284 IP_ADAPTER_ADDRESSES *p;
286 for (p = adapters; p; p = p->Next)
288 IP_ADAPTER_UNICAST_ADDRESS *addr;
289 WCHAR physaddr_buf[3 * MAX_ADAPTER_ADDRESS_LENGTH];
291 ipconfig_message_printfW(STRING_ADAPTER_FRIENDLY, iftype_to_string(p->IfType), p->FriendlyName);
292 ipconfig_printfW(newlineW);
293 print_field(STRING_CONN_DNS_SUFFIX, p->DnsSuffix);
294 print_field(STRING_DESCRIPTION, p->Description);
295 print_field(STRING_PHYS_ADDR, physaddr_to_string(physaddr_buf, p->PhysicalAddress, p->PhysicalAddressLength));
296 print_field(STRING_DHCP_ENABLED, boolean_to_string(p->Flags & IP_ADAPTER_DHCP_ENABLED));
298 /* FIXME: Output autoconfiguration status. */
300 for (addr = p->FirstUnicastAddress; addr; addr = addr->Next)
302 WCHAR addr_buf[54];
303 DWORD len = sizeof(addr_buf)/sizeof(WCHAR);
305 if (WSAAddressToStringW(addr->Address.lpSockaddr,
306 addr->Address.iSockaddrLength, NULL,
307 addr_buf, &len) == 0)
308 print_field(STRING_IP_ADDRESS, addr_buf);
309 /* FIXME: Output corresponding subnet mask. */
312 /* FIXME: Output default gateway address. */
314 ipconfig_printfW(newlineW);
318 HeapFree(GetProcessHeap(), 0, adapters);
322 int wmain(int argc, WCHAR *argv[])
324 static const WCHAR slashHelp[] = {'/','?',0};
325 static const WCHAR slashAll[] = {'/','a','l','l',0};
327 WSADATA data;
329 if (WSAStartup(MAKEWORD(2, 2), &data))
330 return 1;
332 if (argc > 1)
334 if (!strcmpW(slashHelp, argv[1]))
336 ipconfig_message(STRING_USAGE);
337 WSACleanup();
338 return 1;
340 else if (!strcmpiW(slashAll, argv[1]))
342 if (argv[2])
344 ipconfig_message(STRING_INVALID_CMDLINE);
345 ipconfig_message(STRING_USAGE);
346 WSACleanup();
347 return 1;
350 print_full_information();
352 else
354 ipconfig_message(STRING_INVALID_CMDLINE);
355 ipconfig_message(STRING_USAGE);
356 WSACleanup();
357 return 1;
360 else
361 print_basic_information();
363 WSACleanup();
364 return 0;