ntdll/tests: Fix a couple of test failures on older Windows versions.
[wine.git] / programs / hostname / hostname.c
blob812703d909d860aa39fda7b311b4083442f0fbec
1 /*
2 * Hostname display utility
4 * Copyright 2008 Andrew Riedi
5 * Copyright 2010-2011 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 <stdarg.h>
23 #include <stdio.h>
24 #include <windef.h>
25 #include <winbase.h>
26 #include <wincon.h>
27 #include <winnls.h>
28 #include <winuser.h>
30 #include "hostname.h"
32 static int hostname_vprintfW(const WCHAR *msg, __ms_va_list va_args)
34 int wlen;
35 DWORD count, ret;
36 WCHAR msg_buffer[8192];
38 wlen = vswprintf(msg_buffer, ARRAY_SIZE(msg_buffer), msg, va_args);
40 ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), msg_buffer, wlen, &count, NULL);
41 if (!ret)
43 DWORD len;
44 char *msgA;
46 /* On Windows WriteConsoleW() fails if the output is redirected. So fall
47 * back to WriteFile(), assuming the console encoding is still the right
48 * one in that case.
50 len = WideCharToMultiByte(CP_ACP, 0, msg_buffer, wlen,
51 NULL, 0, NULL, NULL);
52 msgA = HeapAlloc(GetProcessHeap(), 0, len);
53 if (!msgA)
54 return 0;
56 WideCharToMultiByte(CP_ACP, 0, msg_buffer, wlen, msgA, len, NULL, NULL);
57 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), msgA, len, &count, FALSE);
58 HeapFree(GetProcessHeap(), 0, msgA);
61 return count;
64 static int WINAPIV hostname_printfW(const WCHAR *msg, ...)
66 __ms_va_list va_args;
67 int len;
69 __ms_va_start(va_args, msg);
70 len = hostname_vprintfW(msg, va_args);
71 __ms_va_end(va_args);
73 return len;
76 static int WINAPIV hostname_message_printfW(int msg, ...)
78 __ms_va_list va_args;
79 WCHAR msg_buffer[8192];
80 int len;
82 LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer, ARRAY_SIZE(msg_buffer));
84 __ms_va_start(va_args, msg);
85 len = hostname_vprintfW(msg_buffer, va_args);
86 __ms_va_end(va_args);
88 return len;
91 static int hostname_message(int msg)
93 WCHAR msg_buffer[8192];
95 LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer, ARRAY_SIZE(msg_buffer));
97 return hostname_printfW(L"%s", msg_buffer);
100 static int display_computer_name(void)
102 WCHAR name[MAX_COMPUTERNAME_LENGTH + 1];
103 DWORD size = ARRAY_SIZE(name);
104 BOOL ret;
106 ret = GetComputerNameW(name, &size);
107 if (!ret)
109 hostname_message_printfW(STRING_CANNOT_GET_HOSTNAME, GetLastError());
110 return 1;
113 hostname_printfW(L"%s\r\n", name);
114 return 0;
117 int __cdecl wmain(int argc, WCHAR *argv[])
119 if (argc > 1)
121 unsigned int i;
123 if (!wcsncmp(argv[1], L"/?", ARRAY_SIZE(L"/?") - 1))
125 hostname_message(STRING_USAGE);
126 return 1;
129 for (i = 1; i < argc; i++)
131 if (argv[i][0] == '-')
133 switch (argv[i][1])
135 case 's':
136 /* Ignore the option and continue processing. */
137 break;
138 case '?':
139 hostname_message(STRING_USAGE);
140 return 1;
141 default:
142 hostname_message_printfW(STRING_INVALID_OPTION, argv[i][1]);
143 hostname_message(STRING_USAGE);
144 return 1;
147 else
149 hostname_message(STRING_CANNOT_SET_HOSTNAME);
150 hostname_message(STRING_USAGE);
151 return 1;
156 return display_computer_name();