diff --git a/bazaar/SysInfo/SysInfo.cpp b/bazaar/SysInfo/SysInfo.cpp index b4d17189f..6780c0aca 100644 --- a/bazaar/SysInfo/SysInfo.cpp +++ b/bazaar/SysInfo/SysInfo.cpp @@ -16,13 +16,15 @@ NAMESPACE_UPP #define TFILE #include +#ifdef PLATFORM_WIN32 +#pragma comment(lib, "ws2_32.lib") +#endif ///////////////////////////////////////////////////////////////////// // Hardware Info #if defined(PLATFORM_WIN32) -bool GetWMIInfo(String system, Array &data, Array *ret[], String nameSpace = "root\\cimv2") -{ +bool GetWMIInfo(String system, Array &data, Array *ret[], String nameSpace = "root\\cimv2") { HRESULT hRes; hRes = CoInitialize(NULL); @@ -104,6 +106,7 @@ bool GetWMIInfo(String system, Array &data, Array *ret[], Strin } for (int col = 0; col < data.GetCount(); ++col) { VARIANT vProp; + VariantInit(&vProp); BSTR strClassProp = SysAllocString(data[col].ToWString()); hRes = pClassObject->Get(strClassProp, 0, &vProp, 0, 0); if(hRes != S_OK){ @@ -116,6 +119,7 @@ bool GetWMIInfo(String system, Array &data, Array *ret[], Strin } SysFreeString(strClassProp); ret[col]->Add(GetVARIANT(vProp)); + VariantClear(&vProp); rt = true; } row++; @@ -213,7 +217,6 @@ String GetMacAddressWMI() { return Null; } */ -#include #include Array GetAdapterInfo() { @@ -249,17 +252,27 @@ Array GetAdapterInfo() { if (pUnicast != NULL) { for (int i = 0; pUnicast != NULL; i++) { if (pUnicast->Address.lpSockaddr->sa_family == AF_INET) { - sockaddr_in *sa_in = (sockaddr_in *)pUnicast->Address.lpSockaddr; + sockaddr_in *sa_in = (sockaddr_in *)pUnicast->Address.lpSockaddr; +#ifdef COMPILER_MINGW adapter.ip4 = inet_ntoa(sa_in->sin_addr); - } /*else if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6) { - char buff[100]; - DWORD bufflen = 100; - sockaddr_in6 *sa_in6 = (sockaddr_in6 *)pUnicast->Address.lpSockaddr; - adapter.ip6 = inet_ntop(AF_INET6, &(sa_in6->sin6_addr), buff, bufflen); - } */ +#else + Buffer str(INET_ADDRSTRLEN); + inet_ntop(AF_INET, &(sa_in->sin_addr), str, INET_ADDRSTRLEN); + adapter.ip4 = str; +#endif + } else if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6) { + sockaddr_in6 *sa_in6 = (sockaddr_in6 *)pUnicast->Address.lpSockaddr; +#ifdef COMPILER_MINGW + adapter.ip6 = ""; +#else + Buffer str(INET6_ADDRSTRLEN); + inet_ntop(AF_INET6, &(sa_in6->sin6_addr), str, INET6_ADDRSTRLEN); + adapter.ip6 = str; +#endif + } pUnicast = pUnicast->Next; } - } + } switch (pAdd->IfType) { case IF_TYPE_ETHERNET_CSMACD: adapter.type = "ETHERNET"; break; case IF_TYPE_ISO88025_TOKENRING: adapter.type = "TOKENRING"; break; @@ -277,7 +290,7 @@ Array GetAdapterInfo() { return ret; } -bool GetNetworkInfo(String &name, String &domain) +/*bool GetNetworkInfo(String &name, String &domain) { LPWKSTA_INFO_100 pBuf = NULL; @@ -304,7 +317,7 @@ bool GetNetworkInfo(String &name, String &domain) ret = true; } return ret; -} +}*/ String GetHDSerial() { Value vmbSerial; @@ -408,6 +421,45 @@ void NetAdapter::Serialize(Stream &stream) { stream % description % fullname % mac % type; } +bool GetNetworkInfo(String &name, String &domain, String &ip4, String &ip6) { + Buffer sname(255); + + bool close = false; + if (0 != gethostname(sname, 255)) { +#ifdef _WIN32 + WSADATA wsa; + if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) + return false; + if (0 != gethostname(sname, 255)) + return false; + close = true; +#else + return false; +#endif + } + name = sname; + + struct hostent *host = gethostbyname(sname); + domain = host->h_name; + +#ifdef COMPILER_MINGW + ip4 = inet_ntoa(*(struct in_addr *)*host->h_addr_list); + ip6.Clear(); +#else + Buffer str(max(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)); + inet_ntop(AF_INET, (void *)(struct in_addr *)*host->h_addr_list, str, INET_ADDRSTRLEN); + ip4 = str; + inet_ntop(AF_INET6, (void *)(struct in_addr *)*host->h_addr_list, str, INET6_ADDRSTRLEN); + ip6 = str; +#endif + +#ifdef _WIN32 + if (close) + WSACleanup(); +#endif + return true; +} + #if defined (PLATFORM_POSIX) void GetSystemInfo(String &manufacturer, String &productName, String &version, int &numberOfProcessors, String &mbSerial) @@ -571,8 +623,6 @@ Array GetAdapterInfo() { } */ -#include - Array GetAdapterInfo() { Array res; @@ -704,15 +754,19 @@ Array GetAdapterInfo() else adapter.type = "OTHER"; - adapter.description = adapter.fullname; + adapter.description = adapter.fullname; + + struct sock_addr *addr = (struct sock_addr *)&(iface->ifr_addr); + Buffer str(max(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)); + inet_ntop(AF_INET, &(((struct sockaddr_in *)addr)->sin_addr), str, INET_ADDRSTRLEN); + adapter.ip4 = str; + inet_ntop(AF_INET6, &(((struct sockaddr_in *)addr)->sin_addr), str, INET6_ADDRSTRLEN); + adapter.ip6 = str; if (ioctl(sck, SIOCGIFADDR, iface) < 0) { iface++; continue; } - - adapter.ip4 = inet_ntoa(((struct sockaddr_in *)&(iface->ifr_addr))->sin_addr); - iface++; } close(sck); @@ -720,21 +774,6 @@ Array GetAdapterInfo() return res; } -bool GetNetworkInfo(String &name, String &domain) -{ - Buffer sname(255), sdomain(255); - - bool ret = true; - if (0 == gethostname(sname, 255)) - name = sname; - else - ret = false; - if (0 == getdomainname(sdomain, 255)) - domain = sdomain; - else - ret = false; - return ret; -} // Not implemented yet in Linux String GetHDSerial() { @@ -1572,8 +1611,7 @@ bool Shutdown(String action) { #endif #ifdef PLATFORM_POSIX -bool Shutdown(String action) -{ +bool Shutdown(String action) { if (action == "logoff") { kill(1, SIGTSTP); sync(); @@ -1587,17 +1625,25 @@ bool Shutdown(String action) sync(); sleep(1); } else if (action == "shutdown") { + sync(); + sleep(1); #if __GNU_LIBRARY__ > 5 reboot(0xCDEF0123); #else reboot(0xfee1dead, 672274793, 0xCDEF0123); #endif + sync(); + sleep(1); } else if (action == "reboot") { // LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2 + sync(); + sleep(1); #if __GNU_LIBRARY__ > 5 reboot(0x01234567); #else reboot(0xfee1dead, 672274793, 0x01234567); #endif + sync(); + sleep(1); } exit(0); return true; diff --git a/bazaar/SysInfo/SysInfo.h b/bazaar/SysInfo/SysInfo.h index 77dfce509..c87482fcb 100644 --- a/bazaar/SysInfo/SysInfo.h +++ b/bazaar/SysInfo/SysInfo.h @@ -31,7 +31,7 @@ struct NetAdapter : DeepCopyOption { Upp::Array GetAdapterInfo(); -bool GetNetworkInfo(String &name, String &domain); +bool GetNetworkInfo(String &name, String &domain, String &ip4, String &ip6); #if defined(PLATFORM_WIN32) bool GetVideoInfo(Upp::Array &name, Upp::Array &description, Upp::Array &videoProcessor, @@ -120,7 +120,7 @@ bool CloseCDTray(String drive); ///////////////////////////////////////////////////////////////////// // Key and mouse keys bool Mouse_GetPos(long &x, long &y); -bool Mouse_SetPos(long x, long y, int64 windowId); +bool Mouse_SetPos(long x, long y, int64 windowId = 0); void Mouse_LeftClick(); void Mouse_LeftDown(); diff --git a/bazaar/SysInfo/SysInfo.upp b/bazaar/SysInfo/SysInfo.upp index 0409deedf..e00c5c9e6 100644 --- a/bazaar/SysInfo/SysInfo.upp +++ b/bazaar/SysInfo/SysInfo.upp @@ -4,7 +4,7 @@ uses Core, Functions4U; -library(WIN32) "psapi gdi32 vfw32 oleaut32 iphlpapi PowrProf netapi32 wbemuuid"; +library(WIN32) "ws2_32 psapi gdi32 vfw32 oleaut32 iphlpapi PowrProf netapi32 wbemuuid"; library(POSIX | LINUX | FREEBSD) "Xtst X11"; diff --git a/bazaar/SysInfo/SysInfo_in.h b/bazaar/SysInfo/SysInfo_in.h index a0a461a1d..701a24d1c 100644 --- a/bazaar/SysInfo/SysInfo_in.h +++ b/bazaar/SysInfo/SysInfo_in.h @@ -19,6 +19,8 @@ typedef ACCESS_MASK REGSAM; #include #include + #include + #include #ifndef PROCESS_QUERY_LIMITED_INFORMATION #define PROCESS_QUERY_LIMITED_INFORMATION 0x1000 #endif @@ -48,6 +50,8 @@ #include #include #include + + #include #ifdef flagGUI #define SetX11ErrorHandler(); #define SetSysInfoX11ErrorHandler(); diff --git a/bazaar/SysInfo/src.tpp/SysInfo$en-us.tpp b/bazaar/SysInfo/src.tpp/SysInfo$en-us.tpp index 647a779ea..8ac3eb8a9 100644 --- a/bazaar/SysInfo/src.tpp/SysInfo$en-us.tpp +++ b/bazaar/SysInfo/src.tpp/SysInfo$en-us.tpp @@ -89,6 +89,13 @@ Array__`&[*@3 state])&] [s6; It does not work in all computers.&] [s3;%- &] [s4;%- &] +[s5;:GetNetworkInfo`(String`&`,String`&`,String`&`,String`&`):%- [@(0.0.255) bool]_[* Get +NetworkInfo]([_^String^ String]_`&[*@3 name], [_^String^ String]_`&[*@3 domain], +[_^String^ String]_`&[*@3 ip4], [_^String^ String]_`&[*@3 ip6])&] +[s2; Returns the local computer network [%-*@3 name], [%-*@3 domain], +[%-*@3 ip4] and [%-*@3 ip6].&] +[s3; &] +[s4;%- &] [s5;:GetMacAddress`(`):%- [@(0.0.255) String]_[* GetMacAddress]()&] [s2; Returns the [%-@3 MAC ]address in uppercase hexadecimal formated like `"0A:0B:0C:0C:0D:0E`" or Null.&]