0022651: Impossible to build OCC as static library due to using Standard_EXPORT inste...
[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 #include <OSD_Environment.hxx>
18 #include <OSD_OSDError.hxx>
19 #include <OSD_Path.hxx>
20 #include <OSD_Process.hxx>
21 #include <OSD_WhoAmI.hxx>
22 #include <Quantity_Date.hxx>
23 #include <TCollection_AsciiString.hxx>
24
25 const OSD_WhoAmI Iam = OSD_WProcess;
26
27 #include <errno.h>
28 #include <stdlib.h>
29 #include <sys/param.h>
30 #include <sys/time.h>
31 #include <pwd.h>       // For command getpwuid
32 #include <unistd.h>
33
34 OSD_Process::OSD_Process(){
35 }
36
37
38 void OSD_Process::TerminalType(TCollection_AsciiString& Name){
39 TCollection_AsciiString which="TERM";
40 OSD_Environment term (which,"");
41
42  term.Value();
43  which = term.Value();
44  Name = term.Name();
45 }
46
47
48 // Get date of system date
49
50 Quantity_Date  OSD_Process::SystemDate(){
51 Quantity_Date result;
52 Standard_Integer month=0,day=0,year=0,hh=0,mn=0,ss=0;
53 struct tm transfert;
54 struct timeval tval;
55 struct timezone tzone;
56 int status;
57
58  status = gettimeofday( &tval, &tzone );
59  if (status == -1) myError.SetValue (errno, Iam, "GetSystem");
60  else {
61   memcpy(&transfert, localtime((time_t *)&tval.tv_sec), sizeof(struct
62 tm));
63   month = transfert.tm_mon + 1;  // Add to January (month #1)
64   day   = transfert.tm_mday;
65   year  = transfert.tm_year;
66   hh    = transfert.tm_hour;
67   mn    = transfert.tm_min ;
68   ss    = transfert.tm_sec ;
69 }
70
71  result.SetValues ( month, day, year+1900, hh, mn, ss);
72  return (result);
73 }
74
75
76 Standard_Integer OSD_Process::ProcessId(){
77  return (getpid());
78 }
79
80 TCollection_AsciiString OSD_Process::UserName()
81 {
82   struct passwd *anInfos = getpwuid (getuid());
83   return TCollection_AsciiString (anInfos ? anInfos->pw_name : "");
84 }
85
86 Standard_Boolean OSD_Process::IsSuperUser (){
87   if (getuid()) {
88     return Standard_False;
89   }
90   else {
91     return Standard_True;
92   }
93 }
94
95
96 OSD_Path OSD_Process::CurrentDirectory(){
97 char cwd[MAXPATHLEN+1] ;
98 OSD_Path result;
99 TCollection_AsciiString Name;
100
101  if (!getcwd(cwd,MAXPATHLEN+1))
102    myError.SetValue (errno, Iam, "Where");
103  else {
104    Name = cwd;
105
106 //   JPT : August,20 1993. This code has been replaced by #ifdef ... #endif
107 //   position = Name.SearchFromEnd(".");
108 //   if (position != -1){
109 //     Ext = Name;
110 //     Ext.Remove(1,position);
111 //     Name.Remove( position,Ext.Length()+1);
112 //   }
113 //   result.SetValues("","","","","",Name,Ext);
114 //   End
115
116 #if defined(vax) || defined(__vms)
117    Standard_Integer iDisk = Name.Search(":");
118    if (iDisk){
119      TCollection_AsciiString Disk;
120      TCollection_AsciiString Directory;
121      Disk = Name.SubString(1,iDisk-1);
122      Directory = Name.SubString(iDisk+1,Name.Length());
123      result.SetValues("","","",Disk,Directory,"","");
124    }
125 #else
126    Name += TCollection_AsciiString("/");
127    result = OSD_Path(Name);
128    //      result.SetValues("","","","",Name,"","");
129 #endif
130
131  }
132 return (result);
133 }
134
135
136 void OSD_Process::SetCurrentDirectory(const OSD_Path& where){
137 TCollection_AsciiString Name;
138 int status;
139
140  where.SystemName(Name);
141
142  status = chdir (Name.ToCString());
143  if (status == -1) myError.SetValue(errno, Iam, "Move to directory");
144 }
145
146
147 void OSD_Process::Reset(){
148  myError.Reset();
149 }
150
151 Standard_Boolean OSD_Process::Failed()const{
152  return( myError.Failed());
153 }
154
155 void OSD_Process::Perror() {
156  myError.Perror();
157 }
158
159
160 Standard_Integer OSD_Process::Error()const{
161  return( myError.Error());
162 }
163
164 #else
165
166 //------------------------------------------------------------------------
167 //-------------------  WNT Sources of OSD_Path ---------------------------
168 //------------------------------------------------------------------------
169
170 //it is important to undefine NOUSER and enforce including <windows.h> before
171 //Standard_Macro.hxx defines it and includes <windows.h> causing compilation errors
172 #ifdef NOUSER
173 #undef NOUSER /* we need SW_HIDE from windows.h */
174 #endif
175 #include <windows.h>
176
177 #include <OSD_Process.hxx>
178
179 #include <OSD_Path.hxx>
180 #include <Quantity_Date.hxx>
181 #include <Standard_PExtCharacter.hxx>
182 #include <TCollection_ExtendedString.hxx>
183
184 #include <OSD_WNT.hxx>
185 #include <LMCONS.H> // for UNLEN - maximum user name length GetUserName()
186
187 void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
188
189 // =======================================================================
190 // function : OSD_Process
191 // purpose  :
192 // =======================================================================
193 OSD_Process::OSD_Process()
194 {
195   //
196 }
197
198 void OSD_Process :: TerminalType ( TCollection_AsciiString& Name ) {
199
200  Name = "WIN32 console";
201
202 }  // end OSD_Process :: TerminalType
203
204 Quantity_Date OSD_Process :: SystemDate () {
205
206  Quantity_Date retVal;
207  SYSTEMTIME    st;
208
209  GetLocalTime ( &st );
210
211  retVal.SetValues (
212          st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
213         );
214
215  return retVal;
216
217 }  // end OSD_Process :: SystemDate
218
219 // =======================================================================
220 // function : UserName
221 // purpose  :
222 // =======================================================================
223 TCollection_AsciiString OSD_Process::UserName()
224 {
225 #ifndef OCCT_UWP
226   wchar_t aUserName[UNLEN + 1];
227   DWORD aNameSize = UNLEN + 1;
228   TCollection_AsciiString retVal;
229   if (!GetUserNameW (aUserName, &aNameSize))
230   {
231     _osd_wnt_set_error(myError, OSD_WProcess);
232     return TCollection_AsciiString();
233   }
234   return TCollection_AsciiString (aUserName);
235 #else
236   return TCollection_AsciiString();
237 #endif
238 }
239
240 Standard_Boolean OSD_Process :: IsSuperUser () {
241 #ifndef OCCT_UWP
242  Standard_Boolean retVal = FALSE;
243  PSID             pSIDadmin;
244  HANDLE           hProcessToken = INVALID_HANDLE_VALUE;
245  PTOKEN_GROUPS    pTKgroups = NULL;
246
247  if (  !OpenProcessToken (
248          GetCurrentProcess (),
249          TOKEN_QUERY, &hProcessToken
250         ) ||
251         (  pTKgroups = ( PTOKEN_GROUPS )GetTokenInformationEx (
252                                          hProcessToken, TokenGroups
253                                         )
254         ) == NULL
255  )
256
257   _osd_wnt_set_error ( myError, OSD_WProcess );
258
259  else {
260  
261   pSIDadmin = AdminSid ();
262
263   for ( int i = 0; i < ( int )pTKgroups -> GroupCount; ++i )
264
265    if (  EqualSid ( pTKgroups -> Groups[ i ].Sid, pSIDadmin )  ) {
266    
267     retVal = TRUE;
268     break;
269    
270    }  // end if
271  
272  }  // end else
273
274  if ( hProcessToken != INVALID_HANDLE_VALUE ) CloseHandle ( hProcessToken );
275  if ( pTKgroups     != NULL                 ) FreeTokenInformation ( pTKgroups );
276
277  return retVal;
278 #else
279  return FALSE;
280 #endif
281 }  // end OSD_Process :: IsSuperUser
282
283 // =======================================================================
284 // function : ProcessId
285 // purpose  :
286 // =======================================================================
287 Standard_Integer OSD_Process::ProcessId()
288 {
289   return (Standard_Integer )GetCurrentProcessId();
290 }
291
292 // =======================================================================
293 // function : CurrentDirectory
294 // purpose  :
295 // =======================================================================
296 OSD_Path OSD_Process::CurrentDirectory()
297 {
298   OSD_Path anCurrentDirectory;
299 #ifndef OCCT_UWP
300   const DWORD aBuffLen = GetCurrentDirectoryW (0, NULL);
301   if (aBuffLen > 0)
302   {
303     wchar_t* aBuff = new wchar_t[aBuffLen + 1];
304     GetCurrentDirectoryW (aBuffLen, aBuff);
305     aBuff[aBuffLen] = L'\0';
306     const TCollection_AsciiString aPath (aBuff);
307     delete[] aBuff;
308
309     anCurrentDirectory = OSD_Path (aPath);
310   }
311   else
312   {
313     _osd_wnt_set_error (myError, OSD_WProcess);
314   }
315 #endif
316   return anCurrentDirectory;
317 }
318
319 void OSD_Process :: SetCurrentDirectory ( const OSD_Path& where ) {
320
321  TCollection_AsciiString path;
322
323  where.SystemName ( path );
324  TCollection_ExtendedString pathW(path);
325
326  if (!::SetCurrentDirectoryW (pathW.ToWideString()))
327
328   _osd_wnt_set_error ( myError, OSD_WProcess );
329
330 }  // end OSD_Process :: SetCurrentDirectory
331
332 Standard_Boolean OSD_Process :: Failed () const {
333
334  return myError.Failed ();
335
336 }  // end OSD_Process :: Failed
337
338 void OSD_Process :: Reset () {
339
340  myError.Reset ();
341
342 }  // end OSD_Process :: Reset
343
344 void OSD_Process :: Perror () {
345
346  myError.Perror ();
347
348 }  // end OSD_Process :: Perror
349
350 Standard_Integer OSD_Process :: Error () const {
351
352  return myError.Error ();
353
354 }  // end OSD_Process :: Error
355
356 #endif