Annotation of embedaddon/smartmontools/os_win32/hostname_win32.cpp, revision 1.1
1.1 ! misho 1: /*
! 2: * os_win32/hostname_win32.cpp
! 3: *
! 4: * Home page of code is: http://smartmontools.sourceforge.net
! 5: *
! 6: * Copyright (C) 2004-8 Christian Franke <smartmontools-support@lists.sourceforge.net>
! 7: *
! 8: * This program is free software; you can redistribute it and/or modify
! 9: * it under the terms of the GNU General Public License as published by
! 10: * the Free Software Foundation; either version 2, or (at your option)
! 11: * any later version.
! 12: *
! 13: * You should have received a copy of the GNU General Public License
! 14: * (for example COPYING); if not, write to the Free
! 15: * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
! 16: *
! 17: */
! 18:
! 19: #include "hostname_win32.h"
! 20:
! 21: const char * hostname_win32_c_cvsid = "$Id: hostname_win32.cpp,v 1.6 2008/03/04 22:09:48 ballen4705 Exp $" HOSTNAME_WIN32_H_CVSID;
! 22:
! 23: #define WIN32_LEAN_AND_MEAN
! 24: #include <windows.h>
! 25: #include <string.h>
! 26:
! 27: #ifndef MAX_HOSTNAME_LEN
! 28:
! 29: // From IPHlpApi.dll:
! 30:
! 31: #define MAX_HOSTNAME_LEN 132
! 32: #define MAX_DOMAIN_NAME_LEN 132
! 33: #define MAX_SCOPE_ID_LEN 260
! 34:
! 35: typedef struct {
! 36: char String[4 * 4];
! 37: } IP_ADDRESS_STRING,
! 38: *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
! 39:
! 40: typedef struct _IP_ADDR_STRING {
! 41: struct _IP_ADDR_STRING* Next;
! 42: IP_ADDRESS_STRING IpAddress;
! 43: IP_MASK_STRING IpMask;
! 44: DWORD Context;
! 45: } IP_ADDR_STRING,
! 46: *PIP_ADDR_STRING;
! 47:
! 48: typedef struct {
! 49: char HostName[MAX_HOSTNAME_LEN];
! 50: char DomainName[MAX_DOMAIN_NAME_LEN];
! 51: PIP_ADDR_STRING CurrentDnsServer;
! 52: IP_ADDR_STRING DnsServerList;
! 53: UINT NodeType;
! 54: char ScopeId[MAX_SCOPE_ID_LEN];
! 55: UINT EnableRouting;
! 56: UINT EnableProxy;
! 57: UINT EnableDns;
! 58: } FIXED_INFO,
! 59: *PFIXED_INFO;
! 60:
! 61: DWORD WINAPI GetNetworkParams(PFIXED_INFO info, PULONG size);
! 62:
! 63: #endif // MAX_HOSTNAME_LEN
! 64:
! 65:
! 66: // Call GetComputerNameEx() if available (Win2000/XP)
! 67:
! 68: static BOOL CallGetComputerNameExA(int type, LPSTR name, LPDWORD size)
! 69: {
! 70: HINSTANCE hdll;
! 71: BOOL (WINAPI * GetComputerNameExA_p)(int/*enum COMPUTER_NAME_FORMAT*/, LPSTR, LPDWORD);
! 72: BOOL ret;
! 73: if (!(hdll = LoadLibraryA("KERNEL32.DLL")))
! 74: return FALSE;
! 75: if (!(GetComputerNameExA_p = (BOOL (WINAPI *)(int, LPSTR, LPDWORD))GetProcAddress(hdll, "GetComputerNameExA")))
! 76: ret = FALSE;
! 77: else
! 78: ret = GetComputerNameExA_p(type, name, size);
! 79: FreeLibrary(hdll);
! 80: return ret;
! 81: }
! 82:
! 83:
! 84: // Call GetNetworkParams() if available (Win98/ME/2000/XP)
! 85:
! 86: static DWORD CallGetNetworkParams(PFIXED_INFO info, PULONG size)
! 87: {
! 88: HINSTANCE hdll;
! 89: DWORD (WINAPI * GetNetworkParams_p)(PFIXED_INFO, PULONG);
! 90: DWORD ret;
! 91: if (!(hdll = LoadLibraryA("IPHlpApi.dll")))
! 92: return ERROR_NOT_SUPPORTED;
! 93: if (!(GetNetworkParams_p = (DWORD (WINAPI *)(PFIXED_INFO, PULONG))GetProcAddress(hdll, "GetNetworkParams")))
! 94: ret = ERROR_NOT_SUPPORTED;
! 95: else
! 96: ret = GetNetworkParams_p(info, size);
! 97: FreeLibrary(hdll);
! 98: return ret;
! 99: }
! 100:
! 101:
! 102: // Get host/domainname from registry (Win98/ME/NT4/2000/XP)
! 103:
! 104: static DWORD GetNamesFromRegistry(BOOL domain, char * name, int len)
! 105: {
! 106: HKEY hk; DWORD size, type;
! 107: if (RegOpenKeyExA(HKEY_LOCAL_MACHINE,
! 108: (GetVersion() & 0x80000000
! 109: ? "System\\CurrentControlSet\\Services\\VxD\\MSTCP" //Win9x/ME
! 110: : "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"),
! 111: 0, KEY_READ, &hk) != ERROR_SUCCESS)
! 112: return 0;
! 113: size = len-1;
! 114: if (!(RegQueryValueExA(hk, (!domain?"HostName":"Domain"), 0, &type, (unsigned char *)name, &size) == ERROR_SUCCESS && type == REG_SZ))
! 115: size = 0;
! 116: if (size == 0 && domain) {
! 117: size = len-1;
! 118: if (!(RegQueryValueExA(hk, "DhcpDomain", 0, &type, (unsigned char *)name, &size) == ERROR_SUCCESS && type == REG_SZ))
! 119: size = 0;
! 120: }
! 121: RegCloseKey(hk);
! 122: return size;
! 123: }
! 124:
! 125:
! 126: static int gethostdomname(int domain, char * name, int len)
! 127: {
! 128: DWORD size; FIXED_INFO info;
! 129:
! 130: // try KERNEL32.dll::GetComputerNameEx()
! 131: size = len - 1;
! 132: if (CallGetComputerNameExA((!domain ? 1:2/*ComputerNameDnsHost:Domain*/), name, &size))
! 133: return 0;
! 134:
! 135: // try IPHlpApi.dll::GetNetworkParams()
! 136: size = sizeof(info);
! 137: if (CallGetNetworkParams(&info, &size) == ERROR_SUCCESS) {
! 138: strncpy(name, (!domain?info.HostName:info.DomainName), len-1); name[len-1] = 0;
! 139: return 0;
! 140: }
! 141:
! 142: // try registry
! 143: if (GetNamesFromRegistry(domain, name, len))
! 144: return 0;
! 145:
! 146: if (domain)
! 147: return -1;
! 148:
! 149: // last resort: get NETBIOS name
! 150: size = len - 1;
! 151: if (GetComputerNameA(name, &size))
! 152: return 0;
! 153:
! 154: return -1;
! 155: }
! 156:
! 157:
! 158: int gethostname(char * name, int len)
! 159: {
! 160: return gethostdomname(0, name, len);
! 161: }
! 162:
! 163:
! 164: int getdomainname(char * name, int len)
! 165: {
! 166: return gethostdomname(1, name, len);
! 167: }
! 168:
! 169:
! 170: #ifdef TEST
! 171:
! 172: #include <stdio.h>
! 173:
! 174: main()
! 175: {
! 176: char name[256];
! 177: if (gethostname(name, sizeof(name)))
! 178: strcpy(name, "Error");
! 179: printf("hostname=\"%s\"\n", name);
! 180: if (getdomainname(name, sizeof(name)))
! 181: strcpy(name, "Error");
! 182: printf("domainname=\"%s\"\n", name);
! 183: return 0;
! 184: }
! 185:
! 186: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>