msvcp110: Add tr2_sys__Equivalent implementation and test.
[wine/multimedia.git] / programs / hostname / hostname.c
blob8bf8676a9710b851ad9ff9ed1d3bcbe536ba6ba6
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 "config.h"
23 #include "wine/port.h"
25 #include <stdarg.h>
26 #if defined(__MINGW32__) || defined (_MSC_VER)
27 #include <winsock2.h>
28 #elif defined(HAVE_UNISTD_H)
29 #include <unistd.h>
30 #endif
32 #include <windef.h>
33 #include <winbase.h>
34 #include <wincon.h>
35 #include <winnls.h>
36 #include <winuser.h>
38 #include <wine/unicode.h>
40 #include "hostname.h"
42 static int hostname_vprintfW(const WCHAR *msg, va_list va_args)
44 int wlen;
45 DWORD count, ret;
46 WCHAR msg_buffer[8192];
48 wlen = vsprintfW(msg_buffer, msg, va_args);
50 ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), msg_buffer, wlen, &count, NULL);
51 if (!ret)
53 DWORD len;
54 char *msgA;
56 /* On Windows WriteConsoleW() fails if the output is redirected. So fall
57 * back to WriteFile(), assuming the console encoding is still the right
58 * one in that case.
60 len = WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen,
61 NULL, 0, NULL, NULL);
62 msgA = HeapAlloc(GetProcessHeap(), 0, len);
63 if (!msgA)
64 return 0;
66 WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen, msgA, len,
67 NULL, NULL);
68 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), msgA, len, &count, FALSE);
69 HeapFree(GetProcessHeap(), 0, msgA);
72 return count;
75 static int hostname_printfW(const WCHAR *msg, ...)
77 va_list va_args;
78 int len;
80 va_start(va_args, msg);
81 len = hostname_vprintfW(msg, va_args);
82 va_end(va_args);
84 return len;
87 static int hostname_message_printfW(int msg, ...)
89 va_list va_args;
90 WCHAR msg_buffer[8192];
91 int len;
93 LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer,
94 sizeof(msg_buffer)/sizeof(WCHAR));
96 va_start(va_args, msg);
97 len = hostname_vprintfW(msg_buffer, va_args);
98 va_end(va_args);
100 return len;
103 static int hostname_message(int msg)
105 static const WCHAR formatW[] = {'%','s',0};
106 WCHAR msg_buffer[8192];
108 LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer,
109 sizeof(msg_buffer)/sizeof(WCHAR));
111 return hostname_printfW(formatW, msg_buffer);
114 static void display_computer_name(void)
116 static const WCHAR fmtW[] = {'%','s','\r','\n',0};
118 char nameA[256];
119 WCHAR nameW[256];
121 gethostname(nameA, sizeof(nameA));
122 MultiByteToWideChar(CP_UNIXCP, 0, nameA, sizeof(nameA), nameW, sizeof(nameW)/sizeof(WCHAR));
124 hostname_printfW(fmtW, nameW);
127 int wmain(int argc, WCHAR *argv[])
129 if (argc > 1)
131 static const WCHAR slashHelpW[] = {'/','?',0};
133 unsigned int i;
135 if (!strncmpW(argv[1], slashHelpW, sizeof(slashHelpW)/sizeof(WCHAR) - 1))
137 hostname_message(STRING_USAGE);
138 return 1;
141 for (i = 1; i < argc; i++)
143 if (argv[i][0] == '-')
145 switch (argv[i][1])
147 case 's':
148 /* Ignore the option and continue processing. */
149 break;
150 case '?':
151 hostname_message(STRING_USAGE);
152 return 1;
153 default:
154 hostname_message_printfW(STRING_INVALID_OPTION, argv[i][1]);
155 hostname_message(STRING_USAGE);
156 return 1;
159 else
161 hostname_message(STRING_CANNOT_SET_HOSTNAME);
162 hostname_message(STRING_USAGE);
163 return 1;
168 display_computer_name();
170 return 0;