[HOSTNAME] Retrieve the DNS *host name* of the computer, and not the computer name.
[reactos.git] / base / applications / cmdutils / hostname / hostname.c
1 /*
2 * PROJECT: ReactOS Hostname Command
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: Retrieves the current DNS host name of the computer.
5 * COPYRIGHT: Copyright 2005-2019 Emanuele Aliberti (ea@reactos.com)
6 * Copyright 2019 Hermes Belusca-Maito
7 */
8
9 #include <stdlib.h>
10 #include <conio.h>
11
12 #include <windef.h>
13 #include <winbase.h>
14 #include <winuser.h>
15
16 #include "resource.h"
17
18 int wmain(int argc, WCHAR* argv[])
19 {
20 WCHAR Msg[100];
21
22 if (argc == 1)
23 {
24 BOOL bSuccess;
25 WCHAR LocalHostName[256] = L""; // MAX_COMPUTERNAME_LENGTH + 1 for NetBIOS name.
26 DWORD HostNameSize = _countof(LocalHostName);
27 PWSTR HostName = LocalHostName;
28
29 /* Try to retrieve the host name using the local buffer */
30 bSuccess = GetComputerNameExW(ComputerNameDnsHostname, HostName, &HostNameSize);
31 if (!bSuccess && (GetLastError() == ERROR_MORE_DATA))
32 {
33 /* Retry with a larger buffer since the local buffer was too small */
34 HostName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, HostNameSize * sizeof(WCHAR));
35 if (HostName)
36 bSuccess = GetComputerNameExW(ComputerNameDnsHostname, HostName, &HostNameSize);
37 }
38
39 if (bSuccess)
40 {
41 /* Print out the host name */
42 _cwprintf(L"%s\n", HostName);
43 }
44
45 /* If a larger buffer has been allocated, free it */
46 if (HostName && (HostName != LocalHostName))
47 HeapFree(GetProcessHeap(), 0, HostName);
48
49 if (!bSuccess)
50 {
51 /* Fail in case of error */
52 LoadStringW(GetModuleHandle(NULL), IDS_ERROR, Msg, _countof(Msg));
53 _cwprintf(L"%s %lu.\n", Msg, GetLastError());
54 return 1;
55 }
56 }
57 else
58 {
59 if ((wcsicmp(argv[1], L"-s") == 0) || (wcsicmp(argv[1], L"/s") == 0))
60 {
61 /* The program doesn't allow the user to set the host name */
62 LoadStringW(GetModuleHandle(NULL), IDS_NOSET, Msg, _countof(Msg));
63 _cwprintf(L"%s\n", Msg);
64 return 1;
65 }
66 else
67 {
68 /* Let the user know what the program does */
69 LoadStringW(GetModuleHandle(NULL), IDS_USAGE, Msg, _countof(Msg));
70 _cwprintf(L"\n%s\n\n", Msg);
71 }
72 }
73
74 return 0;
75 }
76
77 /* EOF */