| 1 | // Copyright (c) 1998-1999 Matra Datavision |
| 2 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
| 3 | // |
| 4 | // This file is part of Open CASCADE Technology software library. |
| 5 | // |
| 6 | // This library is free software; you can redistribute it and/or modify it under |
| 7 | // the terms of the GNU Lesser General Public License version 2.1 as published |
| 8 | // by the Free Software Foundation, with special exception defined in the file |
| 9 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
| 10 | // distribution for complete text of the license and disclaimer of any warranty. |
| 11 | // |
| 12 | // Alternatively, this file may be used under the terms of Open CASCADE |
| 13 | // commercial license or contractual agreement. |
| 14 | |
| 15 | #ifndef _WIN32 |
| 16 | |
| 17 | #include <OSD_Host.hxx> |
| 18 | #include <OSD_OSDError.hxx> |
| 19 | #include <OSD_WhoAmI.hxx> |
| 20 | #include <Standard_ConstructionError.hxx> |
| 21 | #include <Standard_NullObject.hxx> |
| 22 | #include <TCollection_AsciiString.hxx> |
| 23 | |
| 24 | const OSD_WhoAmI Iam = OSD_WHost; |
| 25 | |
| 26 | #include <errno.h> |
| 27 | |
| 28 | #include <sys/utsname.h> // For 'uname' |
| 29 | #include <netdb.h> // This is for 'gethostbyname' |
| 30 | #include <unistd.h> |
| 31 | #include <stdio.h> |
| 32 | |
| 33 | #if defined(__osf__) || defined(DECOSF1) |
| 34 | #include <sys/types.h> |
| 35 | #include <sys/sysinfo.h> // For 'getsysinfo' |
| 36 | #include <sys/socket.h> // To get ethernet address |
| 37 | #include <sys/ioctl.h> |
| 38 | #include <net/if.h> |
| 39 | extern "C" { |
| 40 | int gethostname(char* address, int len); |
| 41 | } |
| 42 | #endif |
| 43 | |
| 44 | extern "C" {int sysinfo(int, char *, long);} |
| 45 | |
| 46 | |
| 47 | // ========================================================================= |
| 48 | |
| 49 | OSD_Host::OSD_Host(){} |
| 50 | |
| 51 | // ========================================================================= |
| 52 | |
| 53 | TCollection_AsciiString OSD_Host::SystemVersion(){ |
| 54 | struct utsname info; |
| 55 | TCollection_AsciiString result; |
| 56 | |
| 57 | uname (&info); |
| 58 | result = info.sysname; |
| 59 | result += " "; |
| 60 | result += info.release; |
| 61 | return(result); |
| 62 | } |
| 63 | |
| 64 | // ========================================================================= |
| 65 | |
| 66 | OSD_SysType OSD_Host::SystemId()const{ |
| 67 | struct utsname info; |
| 68 | |
| 69 | uname (&info); |
| 70 | |
| 71 | if (!strcmp(info.sysname,"SunOS")) return (OSD_UnixBSD); |
| 72 | if (!strcmp(info.sysname,"ULTRIX")) return (OSD_UnixBSD); |
| 73 | if (!strcmp(info.sysname,"FreeBSD")) return (OSD_UnixBSD); |
| 74 | if (!strncmp(info.sysname,"Linux",5)) return (OSD_LinuxREDHAT); |
| 75 | if (!strncmp(info.sysname,"IRIX", 4)) return (OSD_UnixSystemV); |
| 76 | if (!strncmp(info.sysname,"OSF", 3)) return (OSD_OSF); |
| 77 | if (!strcmp(info.sysname,"AIX")) return (OSD_Aix); |
| 78 | if (!strcmp(info.sysname,"UNIX_System_V")) return (OSD_UnixSystemV); |
| 79 | if (!strcmp(info.sysname,"VMS_POSIX")) return (OSD_VMS); |
| 80 | if (!strcmp(info.sysname,"Darwin")) return (OSD_MacOs); |
| 81 | return (OSD_Unknown); |
| 82 | } |
| 83 | |
| 84 | // ========================================================================= |
| 85 | |
| 86 | TCollection_AsciiString OSD_Host::HostName(){ |
| 87 | TCollection_AsciiString result; |
| 88 | char value[65]; |
| 89 | int status; |
| 90 | |
| 91 | status = gethostname(value, 64); |
| 92 | if (status == -1) myError.SetValue(errno, Iam, "Host Name"); |
| 93 | |
| 94 | result = value; |
| 95 | return(result); |
| 96 | } |
| 97 | |
| 98 | |
| 99 | // ========================================================================= |
| 100 | |
| 101 | |
| 102 | Standard_Integer OSD_Host::AvailableMemory(){ |
| 103 | Standard_Integer result; |
| 104 | |
| 105 | #if defined(__osf__) || defined(DECOSF1) |
| 106 | char buffer[16]; |
| 107 | //// result = getsysinfo(GSI_PHYSMEM,buffer, 16,0,NULL); |
| 108 | if (result != -1) |
| 109 | result *= 1024; |
| 110 | #else |
| 111 | result = 0; |
| 112 | //@@ A faire |
| 113 | #endif |
| 114 | return (result); |
| 115 | } |
| 116 | |
| 117 | // ========================================================================= |
| 118 | |
| 119 | TCollection_AsciiString OSD_Host::InternetAddress(){ |
| 120 | struct hostent internet_address; |
| 121 | int a,b,c,d; |
| 122 | char buffer[16]; |
| 123 | TCollection_AsciiString result,host; |
| 124 | |
| 125 | host = HostName(); |
| 126 | memcpy(&internet_address, |
| 127 | gethostbyname(host.ToCString()), |
| 128 | sizeof(struct hostent)); |
| 129 | |
| 130 | // Gets each bytes into integers |
| 131 | a = (unsigned char)internet_address.h_addr_list[0][0]; |
| 132 | b = (unsigned char)internet_address.h_addr_list[0][1]; |
| 133 | c = (unsigned char)internet_address.h_addr_list[0][2]; |
| 134 | d = (unsigned char)internet_address.h_addr_list[0][3]; |
| 135 | sprintf(buffer,"%d.%d.%d.%d",a,b,c,d); |
| 136 | result = buffer; |
| 137 | return(result); |
| 138 | } |
| 139 | |
| 140 | // ========================================================================= |
| 141 | OSD_OEMType OSD_Host::MachineType(){ |
| 142 | struct utsname info; |
| 143 | |
| 144 | uname (&info); |
| 145 | |
| 146 | if (!strcmp(info.sysname,"SunOS")) return (OSD_SUN); |
| 147 | if (!strcmp(info.sysname,"ULTRIX")) return (OSD_DEC); |
| 148 | if (!strncmp(info.sysname,"IRIX",4)) return (OSD_SGI); |
| 149 | if (!strcmp(info.sysname,"HP-UX")) return (OSD_HP); |
| 150 | if (!strcmp(info.sysname,"UNIX_System_V")) return (OSD_NEC); |
| 151 | if (!strcmp(info.sysname,"VMS_POSIX")) return (OSD_VAX); |
| 152 | if (!strncmp(info.sysname,"OSF",3)) return (OSD_DEC); |
| 153 | if (!strncmp(info.sysname,"Linux",5)) return (OSD_LIN); |
| 154 | if (!strcmp(info.sysname,"FreeBSD")) return (OSD_LIN); |
| 155 | if (!strncmp(info.sysname,"AIX",3)) return (OSD_AIX); |
| 156 | if (!strcmp(info.sysname,"Darwin")) return (OSD_MAC); |
| 157 | return (OSD_Unavailable); |
| 158 | |
| 159 | } |
| 160 | |
| 161 | void OSD_Host::Reset(){ |
| 162 | myError.Reset(); |
| 163 | } |
| 164 | |
| 165 | Standard_Boolean OSD_Host::Failed()const{ |
| 166 | return( myError.Failed()); |
| 167 | } |
| 168 | |
| 169 | void OSD_Host::Perror() { |
| 170 | myError.Perror(); |
| 171 | } |
| 172 | |
| 173 | |
| 174 | Standard_Integer OSD_Host::Error()const{ |
| 175 | return( myError.Error()); |
| 176 | } |
| 177 | |
| 178 | #else |
| 179 | |
| 180 | //------------------------------------------------------------------------ |
| 181 | //------------------- WNT Sources of OSD_Host --------------------------- |
| 182 | //------------------------------------------------------------------------ |
| 183 | |
| 184 | #define STRICT |
| 185 | #include <windows.h> |
| 186 | |
| 187 | #include <OSD_Host.hxx> |
| 188 | |
| 189 | #if defined(_MSC_VER) |
| 190 | #pragma comment( lib, "WSOCK32.LIB" ) |
| 191 | #endif |
| 192 | |
| 193 | void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... ); |
| 194 | |
| 195 | static BOOL fInit = FALSE; |
| 196 | static TCollection_AsciiString hostName; |
| 197 | static TCollection_AsciiString version; |
| 198 | static TCollection_AsciiString interAddr; |
| 199 | static Standard_Integer memSize; |
| 200 | |
| 201 | OSD_Host :: OSD_Host () { |
| 202 | #ifndef OCCT_UWP |
| 203 | DWORD nSize; |
| 204 | char szHostName[MAX_COMPUTERNAME_LENGTH + 1]; |
| 205 | char* hostAddr = 0; |
| 206 | MEMORYSTATUS ms; |
| 207 | WSADATA wd; |
| 208 | PHOSTENT phe; |
| 209 | IN_ADDR inAddr; |
| 210 | OSVERSIONINFOW osVerInfo; |
| 211 | |
| 212 | if ( !fInit ) { |
| 213 | |
| 214 | nSize = MAX_COMPUTERNAME_LENGTH + 1; |
| 215 | osVerInfo.dwOSVersionInfoSize = sizeof ( OSVERSIONINFO ); |
| 216 | |
| 217 | ZeroMemory (&ms, sizeof(ms)); |
| 218 | ZeroMemory (szHostName, sizeof(char) * (MAX_COMPUTERNAME_LENGTH + 1)); |
| 219 | |
| 220 | #ifdef _MSC_VER |
| 221 | // suppress GetVersionEx() deprecation warning |
| 222 | #pragma warning(disable : 4996) |
| 223 | #endif |
| 224 | if (!GetVersionExW (&osVerInfo)) |
| 225 | { |
| 226 | _osd_wnt_set_error (myError, OSD_WHost); |
| 227 | } |
| 228 | else if (!GetComputerNameA (szHostName, &nSize)) |
| 229 | { |
| 230 | _osd_wnt_set_error (myError, OSD_WHost); |
| 231 | } |
| 232 | else |
| 233 | { |
| 234 | ms.dwLength = sizeof(MEMORYSTATUS); |
| 235 | GlobalMemoryStatus (&ms); |
| 236 | } // end else |
| 237 | #ifdef _MSC_VER |
| 238 | #pragma warning(default : 4996) |
| 239 | #endif |
| 240 | |
| 241 | if ( !Failed () ) { |
| 242 | |
| 243 | memSize = (Standard_Integer) ms.dwAvailPageFile; |
| 244 | |
| 245 | if ( WSAStartup ( MAKEWORD( 1, 1 ), &wd ) ) { |
| 246 | |
| 247 | _osd_wnt_set_error ( myError, OSD_WHost ); |
| 248 | |
| 249 | } else if ( ( phe = gethostbyname (szHostName) ) == NULL ) { |
| 250 | |
| 251 | _osd_wnt_set_error ( myError, OSD_WHost ); |
| 252 | |
| 253 | } else { |
| 254 | |
| 255 | CopyMemory ( &inAddr, *phe -> h_addr_list, sizeof ( IN_ADDR ) ); |
| 256 | hostAddr = inet_ntoa ( inAddr ); |
| 257 | |
| 258 | } // end else |
| 259 | |
| 260 | } // end if |
| 261 | |
| 262 | if ( !Failed () ) { |
| 263 | |
| 264 | hostName = szHostName; |
| 265 | interAddr = Standard_CString ( hostAddr ); |
| 266 | wsprintf ( |
| 267 | osVerInfo.szCSDVersion, TEXT( "Windows NT Version %d.%d" ), |
| 268 | osVerInfo.dwMajorVersion, osVerInfo.dwMinorVersion |
| 269 | ); |
| 270 | version = osVerInfo.szCSDVersion; |
| 271 | |
| 272 | fInit = TRUE; |
| 273 | |
| 274 | } // end if |
| 275 | |
| 276 | } // end if |
| 277 | |
| 278 | if ( fInit ) |
| 279 | |
| 280 | myName = hostName; |
| 281 | #endif |
| 282 | } // end constructor |
| 283 | |
| 284 | TCollection_AsciiString OSD_Host :: SystemVersion () { |
| 285 | |
| 286 | return version; |
| 287 | |
| 288 | } // end OSD_Host :: SystemVersion |
| 289 | |
| 290 | OSD_SysType OSD_Host :: SystemId () const { |
| 291 | |
| 292 | return OSD_WindowsNT; |
| 293 | |
| 294 | } // end OSD_Host :: SystemId |
| 295 | |
| 296 | TCollection_AsciiString OSD_Host :: HostName () { |
| 297 | |
| 298 | return hostName; |
| 299 | |
| 300 | } // end OSD_Host :: HostName |
| 301 | |
| 302 | Standard_Integer OSD_Host :: AvailableMemory () { |
| 303 | |
| 304 | return memSize; |
| 305 | |
| 306 | } // end OSD_Host :: AvailableMemory |
| 307 | |
| 308 | TCollection_AsciiString OSD_Host :: InternetAddress () { |
| 309 | |
| 310 | return interAddr; |
| 311 | |
| 312 | } // end OSD_Host :: InternetAddress |
| 313 | |
| 314 | OSD_OEMType OSD_Host :: MachineType () { |
| 315 | |
| 316 | return OSD_PC; |
| 317 | |
| 318 | } // end OSD_Host :: MachineTYpe |
| 319 | |
| 320 | Standard_Boolean OSD_Host :: Failed () const { |
| 321 | |
| 322 | return myError.Failed (); |
| 323 | |
| 324 | } // end OSD_Host :: Failed |
| 325 | |
| 326 | void OSD_Host :: Reset () { |
| 327 | |
| 328 | myError.Reset (); |
| 329 | |
| 330 | } // end OSD_Host :: Reset |
| 331 | |
| 332 | void OSD_Host :: Perror () { |
| 333 | |
| 334 | myError.Perror (); |
| 335 | |
| 336 | } // end OSD_Host :: Perror |
| 337 | |
| 338 | Standard_Integer OSD_Host :: Error () const { |
| 339 | |
| 340 | return myError.Error (); |
| 341 | |
| 342 | } //end OSD_Host :: Error |
| 343 | |
| 344 | #endif |
| 345 | |
| 346 | |
| 347 | |
| 348 | |
| 349 | |