// Copyright (c) 1998-1999 Matra Datavision // Copyright (c) 1999-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #ifndef _WIN32 #include #include #include #include #include #include const OSD_WhoAmI Iam = OSD_WHost; #include #include // For 'uname' #include // This is for 'gethostbyname' #include #include #if defined(__osf__) || defined(DECOSF1) #include #include // For 'getsysinfo' #include // To get ethernet address #include #include extern "C" { int gethostname(char* address, int len); } #endif extern "C" { int sysinfo(int, char*, long); } // ========================================================================= OSD_Host::OSD_Host() {} // ========================================================================= TCollection_AsciiString OSD_Host::SystemVersion() { struct utsname info; TCollection_AsciiString result; uname(&info); result = info.sysname; result += " "; result += info.release; return (result); } // ========================================================================= OSD_SysType OSD_Host::SystemId() const { struct utsname info; uname(&info); if (!strcmp(info.sysname, "SunOS")) return (OSD_UnixBSD); if (!strcmp(info.sysname, "ULTRIX")) return (OSD_UnixBSD); if (!strcmp(info.sysname, "FreeBSD")) return (OSD_UnixBSD); if (!strncmp(info.sysname, "Linux", 5)) return (OSD_LinuxREDHAT); if (!strncmp(info.sysname, "IRIX", 4)) return (OSD_UnixSystemV); if (!strncmp(info.sysname, "OSF", 3)) return (OSD_OSF); if (!strcmp(info.sysname, "AIX")) return (OSD_Aix); if (!strcmp(info.sysname, "UNIX_System_V")) return (OSD_UnixSystemV); if (!strcmp(info.sysname, "VMS_POSIX")) return (OSD_VMS); if (!strcmp(info.sysname, "Darwin")) return (OSD_MacOs); return (OSD_Unknown); } // ========================================================================= TCollection_AsciiString OSD_Host::HostName() { TCollection_AsciiString result; char value[65]; int status; status = gethostname(value, 64); if (status == -1) myError.SetValue(errno, Iam, "Host Name"); result = value; return (result); } // ========================================================================= Standard_Integer OSD_Host::AvailableMemory() { Standard_Integer result; #if defined(__osf__) || defined(DECOSF1) char buffer[16]; //// result = getsysinfo(GSI_PHYSMEM,buffer, 16,0,NULL); if (result != -1) result *= 1024; #else result = 0; //@@ A faire #endif return (result); } // ========================================================================= TCollection_AsciiString OSD_Host::InternetAddress() { struct hostent internet_address; int a, b, c, d; char buffer[16]; TCollection_AsciiString result, host; host = HostName(); const auto* aHostByName = gethostbyname(host.ToCString()); if (aHostByName == nullptr) { aHostByName = gethostbyname("localhost"); } memcpy(&internet_address, aHostByName, sizeof(struct hostent)); // Gets each bytes into integers a = (unsigned char)internet_address.h_addr_list[0][0]; b = (unsigned char)internet_address.h_addr_list[0][1]; c = (unsigned char)internet_address.h_addr_list[0][2]; d = (unsigned char)internet_address.h_addr_list[0][3]; sprintf(buffer, "%d.%d.%d.%d", a, b, c, d); result = buffer; return (result); } // ========================================================================= OSD_OEMType OSD_Host::MachineType() { struct utsname info; uname(&info); if (!strcmp(info.sysname, "SunOS")) return (OSD_SUN); if (!strcmp(info.sysname, "ULTRIX")) return (OSD_DEC); if (!strncmp(info.sysname, "IRIX", 4)) return (OSD_SGI); if (!strcmp(info.sysname, "HP-UX")) return (OSD_HP); if (!strcmp(info.sysname, "UNIX_System_V")) return (OSD_NEC); if (!strcmp(info.sysname, "VMS_POSIX")) return (OSD_VAX); if (!strncmp(info.sysname, "OSF", 3)) return (OSD_DEC); if (!strncmp(info.sysname, "Linux", 5)) return (OSD_LIN); if (!strcmp(info.sysname, "FreeBSD")) return (OSD_LIN); if (!strncmp(info.sysname, "AIX", 3)) return (OSD_AIX); if (!strcmp(info.sysname, "Darwin")) return (OSD_MAC); return (OSD_Unavailable); } void OSD_Host::Reset() { myError.Reset(); } Standard_Boolean OSD_Host::Failed() const { return (myError.Failed()); } void OSD_Host::Perror() { myError.Perror(); } Standard_Integer OSD_Host::Error() const { return (myError.Error()); } #else //------------------------------------------------------------------------ //------------------- WNT Sources of OSD_Host --------------------------- //------------------------------------------------------------------------ #include #include #if defined(_MSC_VER) #pragma comment(lib, "WSOCK32.LIB") #endif void _osd_wnt_set_error(OSD_Error&, Standard_Integer, ...); static BOOL fInit = FALSE; static TCollection_AsciiString hostName; static TCollection_AsciiString version; static TCollection_AsciiString interAddr; static Standard_Integer memSize; OSD_Host ::OSD_Host() { #ifndef OCCT_UWP DWORD nSize; char szHostName[MAX_COMPUTERNAME_LENGTH + 1]; char* hostAddr = 0; MEMORYSTATUS ms; WSADATA wd; PHOSTENT phe; IN_ADDR inAddr; OSVERSIONINFOW osVerInfo; if (!fInit) { nSize = MAX_COMPUTERNAME_LENGTH + 1; ZeroMemory(&osVerInfo, sizeof(OSVERSIONINFOW)); osVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); ZeroMemory(&ms, sizeof(ms)); ZeroMemory(szHostName, sizeof(char) * (MAX_COMPUTERNAME_LENGTH + 1)); // suppress GetVersionEx() deprecation warning Standard_DISABLE_DEPRECATION_WARNINGS if (!GetVersionExW(&osVerInfo)) { _osd_wnt_set_error(myError, OSD_WHost); } else if (!GetComputerNameA(szHostName, &nSize)) { _osd_wnt_set_error(myError, OSD_WHost); } else { ms.dwLength = sizeof(MEMORYSTATUS); GlobalMemoryStatus(&ms); } // end else Standard_ENABLE_DEPRECATION_WARNINGS if (!Failed()) { memSize = (Standard_Integer)ms.dwAvailPageFile; if (WSAStartup(MAKEWORD(1, 1), &wd)) { _osd_wnt_set_error(myError, OSD_WHost); } else if ((phe = gethostbyname(szHostName)) == NULL) { _osd_wnt_set_error(myError, OSD_WHost); } else { CopyMemory(&inAddr, *phe->h_addr_list, sizeof(IN_ADDR)); hostAddr = inet_ntoa(inAddr); } // end else } // end if if (!Failed()) { hostName = szHostName; interAddr = Standard_CString(hostAddr); TCollection_AsciiString aVersion = TCollection_AsciiString("Windows NT Version ") + (int)osVerInfo.dwMajorVersion + "." + (int)osVerInfo.dwMinorVersion; if (*osVerInfo.szCSDVersion != L'\0') { aVersion += TCollection_AsciiString(" ") + TCollection_AsciiString(osVerInfo.szCSDVersion); } version = aVersion; fInit = TRUE; } // end if } // end if if (fInit) myName = hostName; #endif } // end constructor TCollection_AsciiString OSD_Host ::SystemVersion() { return version; } // end OSD_Host :: SystemVersion OSD_SysType OSD_Host ::SystemId() const { return OSD_WindowsNT; } // end OSD_Host :: SystemId TCollection_AsciiString OSD_Host ::HostName() { return hostName; } // end OSD_Host :: HostName Standard_Integer OSD_Host ::AvailableMemory() { return memSize; } // end OSD_Host :: AvailableMemory TCollection_AsciiString OSD_Host ::InternetAddress() { return interAddr; } // end OSD_Host :: InternetAddress OSD_OEMType OSD_Host ::MachineType() { return OSD_PC; } // end OSD_Host :: MachineTYpe Standard_Boolean OSD_Host ::Failed() const { return myError.Failed(); } // end OSD_Host :: Failed void OSD_Host ::Reset() { myError.Reset(); } // end OSD_Host :: Reset void OSD_Host ::Perror() { myError.Perror(); } // end OSD_Host :: Perror Standard_Integer OSD_Host ::Error() const { return myError.Error(); } // end OSD_Host :: Error #endif