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