1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
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.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
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>
26 const OSD_WhoAmI Iam = OSD_WProcess;
30 #include <sys/param.h>
32 #include <pwd.h> // For command getpwuid
35 OSD_Process::OSD_Process(){
39 void OSD_Process::Spawn (const TCollection_AsciiString& cmd,
40 const Standard_Boolean /*ShowWindow*/)
42 system(cmd.ToCString());
46 void OSD_Process::TerminalType(TCollection_AsciiString& Name){
47 TCollection_AsciiString which="TERM";
48 OSD_Environment term (which,"");
56 // Get date of system date
58 Quantity_Date OSD_Process::SystemDate(){
60 Standard_Integer month=0,day=0,year=0,hh=0,mn=0,ss=0;
63 struct timezone tzone;
66 status = gettimeofday( &tval, &tzone );
67 if (status == -1) myError.SetValue (errno, Iam, "GetSystem");
69 memcpy(&transfert, localtime((time_t *)&tval.tv_sec), sizeof(struct
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 ;
79 result.SetValues ( month, day, year+1900, hh, mn, ss);
84 Standard_Integer OSD_Process::ProcessId(){
89 Standard_Integer OSD_Process::UserId(){
94 TCollection_AsciiString OSD_Process::UserName(){
96 infos = getpwuid(getuid());
97 TCollection_AsciiString result=infos->pw_name;
102 Standard_Boolean OSD_Process::IsSuperUser (){
104 return Standard_False;
107 return Standard_True;
112 OSD_Path OSD_Process::CurrentDirectory(){
113 char cwd[MAXPATHLEN+1] ;
115 TCollection_AsciiString Name;
117 if (!getcwd(cwd,MAXPATHLEN+1))
118 myError.SetValue (errno, Iam, "Where");
122 // JPT : August,20 1993. This code has been replaced by #ifdef ... #endif
123 // position = Name.SearchFromEnd(".");
124 // if (position != -1){
126 // Ext.Remove(1,position);
127 // Name.Remove( position,Ext.Length()+1);
129 // result.SetValues("","","","","",Name,Ext);
132 #if defined(vax) || defined(__vms)
133 Standard_Integer iDisk = Name.Search(":");
135 TCollection_AsciiString Disk;
136 TCollection_AsciiString Directory;
137 Disk = Name.SubString(1,iDisk-1);
138 Directory = Name.SubString(iDisk+1,Name.Length());
139 result.SetValues("","","",Disk,Directory,"","");
142 Name += TCollection_AsciiString("/");
143 result = OSD_Path(Name);
144 // result.SetValues("","","","",Name,"","");
152 void OSD_Process::SetCurrentDirectory(const OSD_Path& where){
153 TCollection_AsciiString Name;
156 where.SystemName(Name);
158 status = chdir (Name.ToCString());
159 if (status == -1) myError.SetValue(errno, Iam, "Move to directory");
163 void OSD_Process::Reset(){
167 Standard_Boolean OSD_Process::Failed()const{
168 return( myError.Failed());
171 void OSD_Process::Perror() {
176 Standard_Integer OSD_Process::Error()const{
177 return( myError.Error());
182 //------------------------------------------------------------------------
183 //------------------- WNT Sources of OSD_Path ---------------------------
184 //------------------------------------------------------------------------
186 //it is important to undefine NOUSER and enforce including <windows.h> before
187 //Standard_Macro.hxx defines it and includes <windows.h> causing compilation errors
189 #undef NOUSER /* we need SW_HIDE from windows.h */
193 #ifdef SetCurrentDirectory
194 # undef SetCurrentDirectory /* undefine SetCurrentDirectory from <winbase.h> to correctly include <OSD_Process.hxx> */
196 #include <OSD_Process.hxx>
198 #include <OSD_Path.hxx>
199 #include <Quantity_Date.hxx>
200 #include <Standard_PExtCharacter.hxx>
201 #include <TCollection_ExtendedString.hxx>
203 #include <OSD_WNT_1.hxx>
204 #include <LMCONS.H> /// pour UNLEN ( see MSDN about GetUserName() )
207 #pragma warning( disable : 4700 )
209 void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
211 OSD_Process :: OSD_Process () {
215 void OSD_Process :: Spawn ( const TCollection_AsciiString& cmd ,
216 const Standard_Boolean ShowWindow /* = Standard_True */) {
219 PROCESS_INFORMATION pi;
221 ZeroMemory ( &si, sizeof ( STARTUPINFO ) );
223 si.cb = sizeof ( STARTUPINFO );
224 //============================================
225 //---> Added by Stephane Routelous ( stephane.routelous@altavista.net ) [16.03.01]
226 //---> Reason : to allow to hide the window
229 si.dwFlags = STARTF_USESHOWWINDOW;
230 si.wShowWindow = SW_HIDE;
232 //<--- End Added by Stephane Routelous ( stephane.routelous@altavista.net ) [16.03.01]
233 //============================================
236 NULL, (char *)cmd.ToCString (), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi
240 _osd_wnt_set_error ( myError, OSD_WProcess );
244 CloseHandle ( pi.hThread );
246 WaitForSingleObject ( pi.hProcess, INFINITE );
248 CloseHandle ( pi.hProcess );
252 } // end OSD_Process :: Spawn
254 void OSD_Process :: TerminalType ( TCollection_AsciiString& Name ) {
256 Name = "WIN32 console";
258 } // end OSD_Process :: TerminalType
260 Quantity_Date OSD_Process :: SystemDate () {
262 Quantity_Date retVal;
265 GetLocalTime ( &st );
268 st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
273 } // end OSD_Process :: SystemDate
275 Standard_Integer OSD_Process :: UserId () {
278 HANDLE hProcessToken = INVALID_HANDLE_VALUE;
279 PTOKEN_OWNER pTKowner = NULL;
281 if ( !OpenProcessToken (
282 GetCurrentProcess (),
283 TOKEN_QUERY, &hProcessToken
285 ( pTKowner = ( PTOKEN_OWNER )GetTokenInformationEx (
286 hProcessToken, TokenOwner
289 ( retVal = CopySidEx ( pTKowner -> Owner ) ) == NULL
292 _osd_wnt_set_error ( myError, OSD_WProcess );
294 if ( hProcessToken != INVALID_HANDLE_VALUE ) CloseHandle ( hProcessToken );
295 if ( pTKowner != NULL ) FreeTokenInformation ( pTKowner );
297 return ( Standard_Integer )retVal;
299 } // end OSD_Process :: UserId
301 TCollection_AsciiString OSD_Process :: UserName ()
303 Standard_PCharacter pBuff = new char[UNLEN + 1];
304 DWORD dwSize = UNLEN + 1;
305 TCollection_AsciiString retVal;
306 if ( !GetUserName ( pBuff, &dwSize ) )
308 _osd_wnt_set_error ( myError, OSD_WProcess );
312 TCollection_AsciiString theTmpUserName(pBuff,(int)dwSize -1 );
313 retVal = theTmpUserName;
317 } // end OSD_Process :: UserName
319 Standard_Boolean OSD_Process :: IsSuperUser () {
321 Standard_Boolean retVal = FALSE;
323 HANDLE hProcessToken = INVALID_HANDLE_VALUE;
324 PTOKEN_GROUPS pTKgroups = NULL;
326 if ( !OpenProcessToken (
327 GetCurrentProcess (),
328 TOKEN_QUERY, &hProcessToken
330 ( pTKgroups = ( PTOKEN_GROUPS )GetTokenInformationEx (
331 hProcessToken, TokenGroups
336 _osd_wnt_set_error ( myError, OSD_WProcess );
340 pSIDadmin = AdminSid ();
342 for ( int i = 0; i < ( int )pTKgroups -> GroupCount; ++i )
344 if ( EqualSid ( pTKgroups -> Groups[ i ].Sid, pSIDadmin ) ) {
353 if ( hProcessToken != INVALID_HANDLE_VALUE ) CloseHandle ( hProcessToken );
354 if ( pTKgroups != NULL ) FreeTokenInformation ( pTKgroups );
358 } // end OSD_Process :: IsSuperUser
360 Standard_Integer OSD_Process :: ProcessId () {
362 return ( Standard_Integer )GetCurrentProcessId ();
364 } // end OSD_Process :: ProcessId
366 OSD_Path OSD_Process :: CurrentDirectory () {
368 OSD_Path anCurrentDirectory;
370 DWORD dwSize = PATHLEN + 1;
371 Standard_WideChar* pBuff = new wchar_t[dwSize];
373 if ( GetCurrentDirectoryW(dwSize, (wchar_t*)pBuff) > 0 )
375 // conversion to UTF-8 is performed inside
376 TCollection_AsciiString aPath(TCollection_ExtendedString((Standard_ExtString)pBuff));
377 anCurrentDirectory = OSD_Path ( aPath );
380 _osd_wnt_set_error ( myError, OSD_WProcess );
383 return anCurrentDirectory;
384 } // end OSD_Process :: CurrentDirectory
386 void OSD_Process :: SetCurrentDirectory ( const OSD_Path& where ) {
388 TCollection_AsciiString path;
390 where.SystemName ( path );
391 TCollection_ExtendedString pathW(path);
393 if ( !::SetCurrentDirectoryW ( (const wchar_t*) pathW.ToExtString () ) )
395 _osd_wnt_set_error ( myError, OSD_WProcess );
397 } // end OSD_Process :: SetCurrentDirectory
399 Standard_Boolean OSD_Process :: Failed () const {
401 return myError.Failed ();
403 } // end OSD_Process :: Failed
405 void OSD_Process :: Reset () {
409 } // end OSD_Process :: Reset
411 void OSD_Process :: Perror () {
415 } // end OSD_Process :: Perror
417 Standard_Integer OSD_Process :: Error () const {
419 return myError.Error ();
421 } // end OSD_Process :: Error