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 */
78