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
32 static int hostname_vprintfW(const WCHAR
*msg
, va_list va_args
)
36 WCHAR msg_buffer
[8192];
38 wlen
= vswprintf(msg_buffer
, ARRAY_SIZE(msg_buffer
), msg
, va_args
);
40 if (!WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE
), msg_buffer
, wlen
, &count
, NULL
))
45 /* On Windows WriteConsoleW() fails if the output is redirected. So fall
46 * back to WriteFile() with OEM code page.
48 len
= WideCharToMultiByte(GetOEMCP(), 0, msg_buffer
, wlen
,
50 msgA
= HeapAlloc(GetProcessHeap(), 0, len
);
54 WideCharToMultiByte(GetOEMCP(), 0, msg_buffer
, wlen
, msgA
, len
, NULL
, NULL
);
55 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE
), msgA
, len
, &count
, FALSE
);
56 HeapFree(GetProcessHeap(), 0, msgA
);
62 static int WINAPIV
hostname_printfW(const WCHAR
*msg
, ...)
67 va_start(va_args
, msg
);
68 len
= hostname_vprintfW(msg
, va_args
);
74 static int WINAPIV
hostname_message_printfW(int msg
, ...)
77 WCHAR msg_buffer
[8192];
80 LoadStringW(GetModuleHandleW(NULL
), msg
, msg_buffer
, ARRAY_SIZE(msg_buffer
));
82 va_start(va_args
, msg
);
83 len
= hostname_vprintfW(msg_buffer
, va_args
);
89 static int hostname_message(int msg
)
91 WCHAR msg_buffer
[8192];
93 LoadStringW(GetModuleHandleW(NULL
), msg
, msg_buffer
, ARRAY_SIZE(msg_buffer
));
95 return hostname_printfW(L
"%s", msg_buffer
);
98 static int display_computer_name(void)
100 WCHAR name
[MAX_COMPUTERNAME_LENGTH
+ 1];
101 DWORD size
= ARRAY_SIZE(name
);
104 ret
= GetComputerNameW(name
, &size
);
107 hostname_message_printfW(STRING_CANNOT_GET_HOSTNAME
, GetLastError());
111 hostname_printfW(L
"%s\r\n", name
);
115 int __cdecl
wmain(int argc
, WCHAR
*argv
[])
121 if (!wcsncmp(argv
[1], L
"/?", ARRAY_SIZE(L
"/?") - 1))
123 hostname_message(STRING_USAGE
);
127 for (i
= 1; i
< argc
; i
++)
129 if (argv
[i
][0] == '-')
134 /* Ignore the option and continue processing. */
137 hostname_message(STRING_USAGE
);
140 hostname_message_printfW(STRING_INVALID_OPTION
, argv
[i
][1]);
141 hostname_message(STRING_USAGE
);
147 hostname_message(STRING_CANNOT_SET_HOSTNAME
);
148 hostname_message(STRING_USAGE
);
154 return display_computer_name();