1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-08 18:40:55 +03:00
occt/src/OSD/OSD_Process.cxx
bugmaster b311480ed5 0023024: Update headers of OCCT files
Added appropriate copyright and license information in source files
2012-03-21 19:43:04 +04:00

451 lines
10 KiB
C++
Executable File

// Copyright (c) 1998-1999 Matra Datavision
// Copyright (c) 1999-2012 OPEN CASCADE SAS
//
// The content of this file is subject to the Open CASCADE Technology Public
// License Version 6.5 (the "License"). You may not use the content of this file
// except in compliance with the License. Please obtain a copy of the License
// at http://www.opencascade.org and read it completely before using this file.
//
// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
//
// The Original Code and all software distributed under the License is
// distributed on an "AS IS" basis, without warranty of any kind, and the
// Initial Developer hereby disclaims all such warranties, including without
// limitation, any warranties of merchantability, fitness for a particular
// purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License.
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#ifndef WNT
#include <OSD_Process.ixx>
#include <OSD_WhoAmI.hxx>
#include <OSD_Environment.hxx>
const OSD_WhoAmI Iam = OSD_WProcess;
#include <errno.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#include <stdlib.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
#if defined(HAVE_TIME_H) || defined(WNT)
# include <time.h>
#endif
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
#ifdef HAVE_PWD_H
# include <pwd.h> // For command getpwuid
#endif
OSD_Process::OSD_Process(){
}
void OSD_Process::Spawn (const TCollection_AsciiString& cmd,
const Standard_Boolean /*ShowWindow*/)
{
system(cmd.ToCString());
}
void OSD_Process::TerminalType(TCollection_AsciiString& Name){
TCollection_AsciiString which="TERM";
OSD_Environment term (which,"");
term.Value();
which = term.Value();
Name = term.Name();
}
// Get date of system date
Quantity_Date OSD_Process::SystemDate(){
Quantity_Date result;
Standard_Integer month=0,day=0,year=0,hh=0,mn=0,ss=0;
struct tm transfert;
struct timeval tval;
struct timezone tzone;
int status;
status = gettimeofday( &tval, &tzone );
if (status == -1) myError.SetValue (errno, Iam, "GetSystem");
else {
memcpy(&transfert, localtime((time_t *)&tval.tv_sec), sizeof(struct
tm));
month = transfert.tm_mon + 1; // Add to January (month #1)
day = transfert.tm_mday;
year = transfert.tm_year;
hh = transfert.tm_hour;
mn = transfert.tm_min ;
ss = transfert.tm_sec ;
}
result.SetValues ( month, day, year+1900, hh, mn, ss);
return (result);
}
Standard_Integer OSD_Process::ProcessId(){
return (getpid());
}
Standard_Integer OSD_Process::UserId(){
return (getuid());
}
TCollection_AsciiString OSD_Process::UserName(){
struct passwd *infos;
infos = getpwuid(getuid());
TCollection_AsciiString result=infos->pw_name;
return(result);
}
Standard_Boolean OSD_Process::IsSuperUser (){
if (getuid()) {
return Standard_False;
}
else {
return Standard_True;
}
}
OSD_Path OSD_Process::CurrentDirectory(){
char cwd[MAXPATHLEN+1] ;
OSD_Path result;
TCollection_AsciiString Name;
if (!getcwd(cwd,MAXPATHLEN+1))
myError.SetValue (errno, Iam, "Where");
else {
Name = cwd;
// JPT : August,20 1993. This code has been replaced by #ifdef ... #endif
// position = Name.SearchFromEnd(".");
// if (position != -1){
// Ext = Name;
// Ext.Remove(1,position);
// Name.Remove( position,Ext.Length()+1);
// }
// result.SetValues("","","","","",Name,Ext);
// End
#if defined(vax) || defined(__vms)
Standard_Integer iDisk = Name.Search(":");
if (iDisk){
TCollection_AsciiString Disk;
TCollection_AsciiString Directory;
Disk = Name.SubString(1,iDisk-1);
Directory = Name.SubString(iDisk+1,Name.Length());
result.SetValues("","","",Disk,Directory,"","");
}
#else
Name += TCollection_AsciiString("/");
result = OSD_Path(Name);
// result.SetValues("","","","",Name,"","");
#endif
}
return (result);
}
void OSD_Process::SetCurrentDirectory(const OSD_Path& where){
TCollection_AsciiString Name;
int status;
where.SystemName(Name);
status = chdir (Name.ToCString());
if (status == -1) myError.SetValue(errno, Iam, "Move to directory");
}
void OSD_Process::Reset(){
myError.Reset();
}
Standard_Boolean OSD_Process::Failed()const{
return( myError.Failed());
}
void OSD_Process::Perror() {
myError.Perror();
}
Standard_Integer OSD_Process::Error()const{
return( myError.Error());
}
#else
//------------------------------------------------------------------------
//------------------- WNT Sources of OSD_Path ---------------------------
//------------------------------------------------------------------------
//it is important to undefine NOUSER and enforce including <windows.h> before
//Standard_Macro.hxx defines it and includes <windows.h> causing compilation errors
#ifdef NOUSER
#undef NOUSER /* we need SW_HIDE from windows.h */
#endif
#include <windows.h>
#ifdef SetCurrentDirectory
# undef SetCurrentDirectory /* undefine SetCurrentDirectory from <winbase.h> to correctly include <OSD_Process.hxx> */
#endif
#include <OSD_Process.hxx>
#include <OSD_Path.hxx>
#include <Quantity_Date.hxx>
#include <OSD_WNT_1.hxx>
#include <LMCONS.H> /// pour UNLEN ( see MSDN about GetUserName() )
#pragma warning( disable : 4700 )
void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
OSD_Process :: OSD_Process () {
} // end constructor
void OSD_Process :: Spawn ( const TCollection_AsciiString& cmd ,
const Standard_Boolean ShowWindow /* = Standard_True */) {
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory ( &si, sizeof ( STARTUPINFO ) );
si.cb = sizeof ( STARTUPINFO );
//============================================
//---> Added by Stephane Routelous ( stephane.routelous@altavista.net ) [16.03.01]
//---> Reason : to allow to hide the window
if ( !ShowWindow )
{
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
}
//<--- End Added by Stephane Routelous ( stephane.routelous@altavista.net ) [16.03.01]
//============================================
if (!CreateProcess (
NULL, (char *)cmd.ToCString (), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi
)
)
_osd_wnt_set_error ( myError, OSD_WProcess );
else {
CloseHandle ( pi.hThread );
WaitForSingleObject ( pi.hProcess, INFINITE );
CloseHandle ( pi.hProcess );
} // end else
} // end OSD_Process :: Spawn
void OSD_Process :: TerminalType ( TCollection_AsciiString& Name ) {
Name = TEXT( "WIN32 console" );
} // end OSD_Process :: TerminalType
Quantity_Date OSD_Process :: SystemDate () {
Quantity_Date retVal;
SYSTEMTIME st;
GetLocalTime ( &st );
retVal.SetValues (
st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds
);
return retVal;
} // end OSD_Process :: SystemDate
Standard_Integer OSD_Process :: UserId () {
PSID retVal = NULL;
HANDLE hProcessToken = INVALID_HANDLE_VALUE;
PTOKEN_OWNER pTKowner = NULL;
if ( !OpenProcessToken (
GetCurrentProcess (),
TOKEN_QUERY, &hProcessToken
) ||
( pTKowner = ( PTOKEN_OWNER )GetTokenInformationEx (
hProcessToken, TokenOwner
)
) == NULL ||
( retVal = CopySidEx ( pTKowner -> Owner ) ) == NULL
)
_osd_wnt_set_error ( myError, OSD_WProcess );
if ( hProcessToken != INVALID_HANDLE_VALUE ) CloseHandle ( hProcessToken );
if ( pTKowner != NULL ) FreeTokenInformation ( pTKowner );
return ( Standard_Integer )retVal;
} // end OSD_Process :: UserId
TCollection_AsciiString OSD_Process :: UserName ()
{
Standard_PCharacter pBuff = new char[UNLEN + 1];
DWORD dwSize = UNLEN + 1;
TCollection_AsciiString retVal;
if ( !GetUserName ( pBuff, &dwSize ) )
{
_osd_wnt_set_error ( myError, OSD_WProcess );
}
else
{
TCollection_AsciiString theTmpUserName(pBuff,(int)dwSize -1 );
retVal = theTmpUserName;
}
delete [] pBuff;
return retVal;
} // end OSD_Process :: UserName
Standard_Boolean OSD_Process :: IsSuperUser () {
Standard_Boolean retVal = FALSE;
PSID pSIDadmin;
HANDLE hProcessToken = INVALID_HANDLE_VALUE;
PTOKEN_GROUPS pTKgroups;
if ( !OpenProcessToken (
GetCurrentProcess (),
TOKEN_QUERY, &hProcessToken
) ||
( pTKgroups = ( PTOKEN_GROUPS )GetTokenInformationEx (
hProcessToken, TokenGroups
)
) == NULL
)
_osd_wnt_set_error ( myError, OSD_WProcess );
else {
pSIDadmin = AdminSid ();
for ( int i = 0; i < ( int )pTKgroups -> GroupCount; ++i )
if ( EqualSid ( pTKgroups -> Groups[ i ].Sid, pSIDadmin ) ) {
retVal = TRUE;
break;
} // end if
} // end else
if ( hProcessToken != INVALID_HANDLE_VALUE ) CloseHandle ( hProcessToken );
if ( pTKgroups != NULL ) FreeTokenInformation ( pTKgroups );
return retVal;
} // end OSD_Process :: IsSuperUser
Standard_Integer OSD_Process :: ProcessId () {
return ( Standard_Integer )GetCurrentProcessId ();
} // end OSD_Process :: ProcessId
OSD_Path OSD_Process :: CurrentDirectory () {
Standard_PCharacter pBuff;
DWORD dwSize = 0;
OSD_Path retVal;
dwSize = GetCurrentDirectory ( dwSize, pBuff );
pBuff = new Standard_Character[ dwSize ];
if ( ( dwSize = GetCurrentDirectory ( dwSize, pBuff ) ) == NULL )
_osd_wnt_set_error ( myError, OSD_WProcess );
else
retVal = OSD_Path ( pBuff );
delete[] pBuff;
return retVal;
} // end OSD_Process :: CurrentDirectory
void OSD_Process :: SetCurrentDirectory ( const OSD_Path& where ) {
#ifdef UNICODE
# define SetCurrentDirectory SetCurrentDirectoryW
#else
# define SetCurrentDirectory SetCurrentDirectoryA
#endif // UNICODE
TCollection_AsciiString path;
where.SystemName ( path );
if ( !::SetCurrentDirectory ( path.ToCString () ) )
_osd_wnt_set_error ( myError, OSD_WProcess );
} // end OSD_Process :: SetCurrentDirectory
Standard_Boolean OSD_Process :: Failed () const {
return myError.Failed ();
} // end OSD_Process :: Failed
void OSD_Process :: Reset () {
myError.Reset ();
} // end OSD_Process :: Reset
void OSD_Process :: Perror () {
myError.Perror ();
} // end OSD_Process :: Perror
Standard_Integer OSD_Process :: Error () const {
return myError.Error ();
} // end OSD_Process :: Error
#endif