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