b311480e |
1 | // Copyright (c) 1998-1999 Matra Datavision |
973c2be1 |
2 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
b311480e |
3 | // |
973c2be1 |
4 | // This file is part of Open CASCADE Technology software library. |
b311480e |
5 | // |
d5f74e42 |
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 |
973c2be1 |
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. |
b311480e |
11 | // |
973c2be1 |
12 | // Alternatively, this file may be used under the terms of Open CASCADE |
13 | // commercial license or contractual agreement. |
7fd59977 |
14 | |
57c28b61 |
15 | #ifndef _WIN32 |
7fd59977 |
16 | |
42cf5bc1 |
17 | |
7fd59977 |
18 | #include <OSD_Environment.hxx> |
42cf5bc1 |
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> |
7fd59977 |
25 | |
26 | const OSD_WhoAmI Iam = OSD_WProcess; |
27 | |
28 | #include <errno.h> |
7fd59977 |
29 | #include <stdlib.h> |
03155c18 |
30 | #include <sys/param.h> |
31 | #include <sys/time.h> |
32 | #include <pwd.h> // For command getpwuid |
33 | #include <unistd.h> |
7fd59977 |
34 | |
35 | OSD_Process::OSD_Process(){ |
36 | } |
37 | |
38 | |
98160038 |
39 | Standard_Integer OSD_Process::Spawn (const TCollection_AsciiString& cmd, |
7fd59977 |
40 | const Standard_Boolean /*ShowWindow*/) |
41 | { |
98160038 |
42 | return system(cmd.ToCString()); |
7fd59977 |
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 | |
7fd59977 |
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> |
d9ff84e8 |
194 | #include <Standard_PExtCharacter.hxx> |
195 | #include <TCollection_ExtendedString.hxx> |
7fd59977 |
196 | |
197 | #include <OSD_WNT_1.hxx> |
198 | #include <LMCONS.H> /// pour UNLEN ( see MSDN about GetUserName() ) |
199 | |
7c65581d |
200 | #if defined(_MSC_VER) |
201 | #pragma warning( disable : 4700 ) |
202 | #endif |
7fd59977 |
203 | |
204 | void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... ); |
205 | |
206 | OSD_Process :: OSD_Process () { |
207 | |
208 | } // end constructor |
209 | |
98160038 |
210 | |
211 | Standard_Integer OSD_Process::Spawn (const TCollection_AsciiString& cmd, |
7fd59977 |
212 | const Standard_Boolean ShowWindow /* = Standard_True */) { |
742cc8b0 |
213 | #ifndef OCCT_UWP |
7fd59977 |
214 | STARTUPINFO si; |
215 | PROCESS_INFORMATION pi; |
98160038 |
216 | DWORD aRes = 0; |
7fd59977 |
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 | ) |
98160038 |
235 | ) { |
7fd59977 |
236 | |
237 | _osd_wnt_set_error ( myError, OSD_WProcess ); |
98160038 |
238 | aRes = myError.Error(); |
239 | } |
7fd59977 |
240 | else { |
241 | |
242 | CloseHandle ( pi.hThread ); |
243 | |
244 | WaitForSingleObject ( pi.hProcess, INFINITE ); |
98160038 |
245 | GetExitCodeProcess (pi.hProcess, &aRes); |
7fd59977 |
246 | CloseHandle ( pi.hProcess ); |
247 | |
248 | } // end else |
249 | |
98160038 |
250 | return aRes; |
742cc8b0 |
251 | #else |
252 | (void)cmd; |
253 | (void)ShowWindow; |
254 | return 0; |
255 | #endif |
7fd59977 |
256 | } // end OSD_Process :: Spawn |
257 | |
258 | void OSD_Process :: TerminalType ( TCollection_AsciiString& Name ) { |
259 | |
d9ff84e8 |
260 | Name = "WIN32 console"; |
7fd59977 |
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 | |
7fd59977 |
279 | TCollection_AsciiString OSD_Process :: UserName () |
280 | { |
742cc8b0 |
281 | #ifndef OCCT_UWP |
7fd59977 |
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; |
742cc8b0 |
296 | #else |
297 | return ""; |
298 | #endif |
7fd59977 |
299 | } // end OSD_Process :: UserName |
300 | |
301 | Standard_Boolean OSD_Process :: IsSuperUser () { |
742cc8b0 |
302 | #ifndef OCCT_UWP |
7fd59977 |
303 | Standard_Boolean retVal = FALSE; |
304 | PSID pSIDadmin; |
305 | HANDLE hProcessToken = INVALID_HANDLE_VALUE; |
302f96fb |
306 | PTOKEN_GROUPS pTKgroups = NULL; |
7fd59977 |
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; |
742cc8b0 |
339 | #else |
340 | return FALSE; |
341 | #endif |
7fd59977 |
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 () { |
a8195d65 |
351 | OSD_Path anCurrentDirectory; |
742cc8b0 |
352 | #ifndef OCCT_UWP |
a8195d65 |
353 | DWORD dwSize = PATHLEN + 1; |
d9ff84e8 |
354 | Standard_WideChar* pBuff = new wchar_t[dwSize]; |
7fd59977 |
355 | |
fb0b0531 |
356 | if (GetCurrentDirectoryW (dwSize, pBuff) > 0) |
d9ff84e8 |
357 | { |
358 | // conversion to UTF-8 is performed inside |
fb0b0531 |
359 | TCollection_AsciiString aPath (pBuff); |
d9ff84e8 |
360 | anCurrentDirectory = OSD_Path ( aPath ); |
361 | } |
a8195d65 |
362 | else |
363 | _osd_wnt_set_error ( myError, OSD_WProcess ); |
7fd59977 |
364 | |
a8195d65 |
365 | delete[] pBuff; |
742cc8b0 |
366 | #endif |
a8195d65 |
367 | return anCurrentDirectory; |
7fd59977 |
368 | } // end OSD_Process :: CurrentDirectory |
369 | |
370 | void OSD_Process :: SetCurrentDirectory ( const OSD_Path& where ) { |
371 | |
7fd59977 |
372 | TCollection_AsciiString path; |
373 | |
374 | where.SystemName ( path ); |
d9ff84e8 |
375 | TCollection_ExtendedString pathW(path); |
7fd59977 |
376 | |
fb0b0531 |
377 | if (!::SetCurrentDirectoryW (pathW.ToWideString())) |
7fd59977 |
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 |