17ed7074c732804318f84165d47f509dc4ed68ac
[occt.git] / src / OSD / OSD_Process.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_Environment.hxx>
19 #include <OSD_OSDError.hxx>
20 #include <OSD_Path.hxx>
21 #include <OSD_Process.hxx>
22 #include <OSD_WhoAmI.hxx>
23 #include <Quantity_Date.hxx>
24 #include <TCollection_AsciiString.hxx>
25
26 const OSD_WhoAmI Iam = OSD_WProcess;
27
28 #include <errno.h>
29 #include <stdlib.h>
30 #include <sys/param.h>
31 #include <sys/time.h>
32 #include <pwd.h>       // For command getpwuid
33 #include <unistd.h>
34
35 OSD_Process::OSD_Process(){
36 }
37
38
39 Standard_Integer OSD_Process::Spawn (const TCollection_AsciiString& cmd,
40                          const Standard_Boolean /*ShowWindow*/)
41 {
42  return system(cmd.ToCString());
43 }
44
45
46 void OSD_Process::TerminalType(TCollection_AsciiString& Name){
47 TCollection_AsciiString which="TERM";
48 OSD_Environment term (which,"");
49
50  term.Value();
51  which = term.Value();
52  Name = term.Name();
53 }
54
55
56 // Get date of system date
57
58 Quantity_Date  OSD_Process::SystemDate(){
59 Quantity_Date result;
60 Standard_Integer month=0,day=0,year=0,hh=0,mn=0,ss=0;
61 struct tm transfert;
62 struct timeval tval;
63 struct timezone tzone;
64 int status;
65
66  status = gettimeofday( &tval, &tzone );
67  if (status == -1) myError.SetValue (errno, Iam, "GetSystem");
68  else {
69   memcpy(&transfert, localtime((time_t *)&tval.tv_sec), sizeof(struct
70 tm));
71   month = transfert.tm_mon + 1;  // Add to January (month #1)
72   day   = transfert.tm_mday;
73   year  = transfert.tm_year;
74   hh    = transfert.tm_hour;
75   mn    = transfert.tm_min ;
76   ss    = transfert.tm_sec ;
77 }
78
79  result.SetValues ( month, day, year+1900, hh, mn, ss);
80  return (result);
81 }
82
83
84 Standard_Integer OSD_Process::ProcessId(){
85  return (getpid());
86 }
87
88 TCollection_AsciiString OSD_Process::UserName(){
89  struct passwd *infos;
90  infos = getpwuid(getuid()); 
91  TCollection_AsciiString result=infos->pw_name;
92
93  return(result);
94 }
95
96 Standard_Boolean OSD_Process::IsSuperUser (){
97   if (getuid()) {
98     return Standard_False;
99   }
100   else {
101     return Standard_True;
102   }
103 }
104
105
106 OSD_Path OSD_Process::CurrentDirectory(){
107 char cwd[MAXPATHLEN+1] ;
108 OSD_Path result;
109 TCollection_AsciiString Name;
110
111  if (!getcwd(cwd,MAXPATHLEN+1))
112    myError.SetValue (errno, Iam, "Where");
113  else {
114    Name = cwd;
115
116 //   JPT : August,20 1993. This code has been replaced by #ifdef ... #endif
117 //   position = Name.SearchFromEnd(".");
118 //   if (position != -1){
119 //     Ext = Name;
120 //     Ext.Remove(1,position);
121 //     Name.Remove( position,Ext.Length()+1);
122 //   }
123 //   result.SetValues("","","","","",Name,Ext);
124 //   End
125
126 #if defined(vax) || defined(__vms)
127    Standard_Integer iDisk = Name.Search(":");
128    if (iDisk){
129      TCollection_AsciiString Disk;
130      TCollection_AsciiString Directory;
131      Disk = Name.SubString(1,iDisk-1);
132      Directory = Name.SubString(iDisk+1,Name.Length());
133      result.SetValues("","","",Disk,Directory,"","");
134    }
135 #else
136    Name += TCollection_AsciiString("/");
137    result = OSD_Path(Name);
138    //      result.SetValues("","","","",Name,"","");
139 #endif
140
141  }
142 return (result);
143 }
144
145
146 void OSD_Process::SetCurrentDirectory(const OSD_Path& where){
147 TCollection_AsciiString Name;
148 int status;
149
150  where.SystemName(Name);
151
152  status = chdir (Name.ToCString());
153  if (status == -1) myError.SetValue(errno, Iam, "Move to directory");
154 }
155
156
157 void OSD_Process::Reset(){
158  myError.Reset();
159 }
160
161 Standard_Boolean OSD_Process::Failed()const{
162  return( myError.Failed());
163 }
164
165 void OSD_Process::Perror() {
166  myError.Perror();
167 }
168
169
170 Standard_Integer OSD_Process::Error()const{
171  return( myError.Error());
172 }
173
174 #else
175
176 //------------------------------------------------------------------------
177 //-------------------  WNT Sources of OSD_Path ---------------------------
178 //------------------------------------------------------------------------
179
180 //it is important to undefine NOUSER and enforce including <windows.h> before
181 //Standard_Macro.hxx defines it and includes <windows.h> causing compilation errors
182 #ifdef NOUSER
183 #undef NOUSER /* we need SW_HIDE from windows.h */
184 #endif
185 #include <windows.h>
186
187 #ifdef SetCurrentDirectory
188 # undef SetCurrentDirectory /* undefine SetCurrentDirectory from <winbase.h> to correctly include <OSD_Process.hxx> */
189 #endif
190 #include <OSD_Process.hxx>
191
192 #include <OSD_Path.hxx>
193 #include <Quantity_Date.hxx>
194 #include <Standard_PExtCharacter.hxx>
195 #include <TCollection_ExtendedString.hxx>
196
197 #include <OSD_WNT_1.hxx>
198 #include <LMCONS.H> /// pour UNLEN  ( see MSDN about GetUserName() )
199
200 #if defined(_MSC_VER)
201   #pragma warning( disable : 4700 )
202 #endif
203
204 void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
205
206 OSD_Process :: OSD_Process () {
207
208 }  // end constructor
209
210
211 Standard_Integer OSD_Process::Spawn (const TCollection_AsciiString& cmd,
212                             const Standard_Boolean ShowWindow /* = Standard_True */) {
213 #ifndef OCCT_UWP
214  STARTUPINFO         si;
215  PROCESS_INFORMATION pi;
216  DWORD aRes = 0;
217
218  ZeroMemory (  &si, sizeof ( STARTUPINFO )  );
219
220  si.cb = sizeof ( STARTUPINFO );
221  //============================================
222  //---> Added by Stephane Routelous ( stephane.routelous@altavista.net )        [16.03.01]
223  //---> Reason : to allow to hide the window
224  if ( !ShowWindow )
225  {
226          si.dwFlags             = STARTF_USESHOWWINDOW;
227          si.wShowWindow = SW_HIDE;      
228  }
229  //<--- End Added by Stephane Routelous ( stephane.routelous@altavista.net )    [16.03.01]
230  //============================================
231
232  if (!CreateProcess (
233       NULL, (char *)cmd.ToCString (), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi
234                     )
235  ) {
236
237   _osd_wnt_set_error ( myError, OSD_WProcess );
238   aRes = myError.Error();
239  }
240  else {
241  
242   CloseHandle ( pi.hThread );
243
244   WaitForSingleObject ( pi.hProcess, INFINITE );
245   GetExitCodeProcess (pi.hProcess, &aRes);
246   CloseHandle ( pi.hProcess );
247  
248  }  // end else
249
250  return aRes;
251 #else
252   (void)cmd;
253   (void)ShowWindow;
254   return 0;
255 #endif
256 }  // end OSD_Process :: Spawn
257
258 void OSD_Process :: TerminalType ( TCollection_AsciiString& Name ) {
259
260  Name = "WIN32 console";
261
262 }  // end OSD_Process :: TerminalType
263
264 Quantity_Date OSD_Process :: SystemDate () {
265
266  Quantity_Date retVal;
267  SYSTEMTIME    st;
268
269  GetLocalTime ( &st );
270
271  retVal.SetValues (
272          st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
273         );
274
275  return retVal;
276
277 }  // end OSD_Process :: SystemDate
278
279 TCollection_AsciiString OSD_Process :: UserName () 
280 {
281 #ifndef OCCT_UWP
282         Standard_PCharacter pBuff = new char[UNLEN + 1];
283         DWORD                   dwSize = UNLEN + 1;
284         TCollection_AsciiString retVal;
285         if (  !GetUserName ( pBuff, &dwSize )  )
286         {
287                 _osd_wnt_set_error ( myError, OSD_WProcess );
288         }
289         else
290         {
291                 TCollection_AsciiString theTmpUserName(pBuff,(int)dwSize -1 );
292                 retVal = theTmpUserName;
293         }
294         delete [] pBuff;
295         return retVal;
296 #else
297   return "";
298 #endif
299 }  // end OSD_Process :: UserName
300
301 Standard_Boolean OSD_Process :: IsSuperUser () {
302 #ifndef OCCT_UWP
303  Standard_Boolean retVal = FALSE;
304  PSID             pSIDadmin;
305  HANDLE           hProcessToken = INVALID_HANDLE_VALUE;
306  PTOKEN_GROUPS    pTKgroups = NULL;
307
308  if (  !OpenProcessToken (
309          GetCurrentProcess (),
310          TOKEN_QUERY, &hProcessToken
311         ) ||
312         (  pTKgroups = ( PTOKEN_GROUPS )GetTokenInformationEx (
313                                          hProcessToken, TokenGroups
314                                         )
315         ) == NULL
316  )
317
318   _osd_wnt_set_error ( myError, OSD_WProcess );
319
320  else {
321  
322   pSIDadmin = AdminSid ();
323
324   for ( int i = 0; i < ( int )pTKgroups -> GroupCount; ++i )
325
326    if (  EqualSid ( pTKgroups -> Groups[ i ].Sid, pSIDadmin )  ) {
327    
328     retVal = TRUE;
329     break;
330    
331    }  // end if
332  
333  }  // end else
334
335  if ( hProcessToken != INVALID_HANDLE_VALUE ) CloseHandle ( hProcessToken );
336  if ( pTKgroups     != NULL                 ) FreeTokenInformation ( pTKgroups );
337
338  return retVal;
339 #else
340  return FALSE;
341 #endif
342 }  // end OSD_Process :: IsSuperUser
343
344 Standard_Integer OSD_Process :: ProcessId () {
345
346  return ( Standard_Integer )GetCurrentProcessId ();
347
348 }  // end OSD_Process :: ProcessId
349
350 OSD_Path OSD_Process :: CurrentDirectory () {
351   OSD_Path anCurrentDirectory;
352 #ifndef OCCT_UWP
353   DWORD dwSize = PATHLEN + 1;
354   Standard_WideChar* pBuff = new wchar_t[dwSize];
355
356   if (GetCurrentDirectoryW (dwSize, pBuff) > 0)
357   {
358     // conversion to UTF-8 is performed inside
359     TCollection_AsciiString aPath (pBuff);
360     anCurrentDirectory = OSD_Path ( aPath );
361   }
362   else
363     _osd_wnt_set_error ( myError, OSD_WProcess );
364  
365   delete[] pBuff;
366 #endif
367   return anCurrentDirectory;
368 }  // end OSD_Process :: CurrentDirectory
369
370 void OSD_Process :: SetCurrentDirectory ( const OSD_Path& where ) {
371
372  TCollection_AsciiString path;
373
374  where.SystemName ( path );
375  TCollection_ExtendedString pathW(path);
376
377  if (!::SetCurrentDirectoryW (pathW.ToWideString()))
378
379   _osd_wnt_set_error ( myError, OSD_WProcess );
380
381 }  // end OSD_Process :: SetCurrentDirectory
382
383 Standard_Boolean OSD_Process :: Failed () const {
384
385  return myError.Failed ();
386
387 }  // end OSD_Process :: Failed
388
389 void OSD_Process :: Reset () {
390
391  myError.Reset ();
392
393 }  // end OSD_Process :: Reset
394
395 void OSD_Process :: Perror () {
396
397  myError.Perror ();
398
399 }  // end OSD_Process :: Perror
400
401 Standard_Integer OSD_Process :: Error () const {
402
403  return myError.Error ();
404
405 }  // end OSD_Process :: Error
406
407 #endif