ROOT logo
#ifndef __TMrbSystem_h__
#define __TMrbSystem_h__

namespace std {} using namespace std;

#if ROOT_VERSION_CODE <= ROOT_VERSION(4,01,00)
 enum EFileModeMask {
   kS_IFMT   = 0170000,   // bitmask for the file type bitfields
   kS_IFSOCK = 0140000,   // socket
   kS_IFLNK  = 0120000,   // symbolic link
   kS_IFREG  = 0100000,   // regular file
   kS_IFBLK  = 0060000,   // block device
   kS_IFDIR  = 0040000,   // directory
   kS_IFCHR  = 0020000,   // character device
   kS_IFIFO  = 0010000,   // fifo
   kS_ISUID  = 0004000,   // set UID bit
   kS_ISGID  = 0002000,   // set GID bit
   kS_ISVTX  = 0001000,   // sticky bit
   kS_IRWXU  = 00700,     // mask for file owner permissions
   kS_IRUSR  = 00400,     // owner has read permission
   kS_IWUSR  = 00200,     // owner has write permission
   kS_IXUSR  = 00100,     // owner has execute permission
   kS_IRWXG  = 00070,     // mask for group permissions
   kS_IRGRP  = 00040,     // group has read permission
   kS_IWGRP  = 00020,     // group has write permission
   kS_IXGRP  = 00010,     // group has execute permission
   kS_IRWXO  = 00007,     // mask for permissions for others (not in group)
   kS_IROTH  = 00004,     // others have read permission
   kS_IWOTH  = 00002,     // others have write permisson
   kS_IXOTH  = 00001      // others have execute permission
};

inline Bool_t R_ISDIR(Int_t mode)  { return ((mode & kS_IFMT) == kS_IFDIR); }
inline Bool_t R_ISCHR(Int_t mode)  { return ((mode & kS_IFMT) == kS_IFCHR); }
inline Bool_t R_ISBLK(Int_t mode)  { return ((mode & kS_IFMT) == kS_IFBLK); }
inline Bool_t R_ISREG(Int_t mode)  { return ((mode & kS_IFMT) == kS_IFREG); }
inline Bool_t R_ISLNK(Int_t mode)  { return ((mode & kS_IFMT) == kS_IFLNK); }
inline Bool_t R_ISFIFO(Int_t mode) { return ((mode & kS_IFMT) == kS_IFIFO); }
inline Bool_t R_ISSOCK(Int_t mode) { return ((mode & kS_IFMT) == kS_IFSOCK); }

struct FileStat_t {
   Long_t   fDev;          // device id
   Long_t   fIno;          // inode
   Int_t    fMode;         // protection (combination of EFileModeMask bits)
   Int_t    fUid;          // user id of owner
   Int_t    fGid;          // group id of owner
   Long64_t fSize;         // total size in bytes
   Long_t   fMtime;        // modification date
   Bool_t   fIsLink;       // symbolic link
   FileStat_t() : fDev(0), fIno(0), fMode(0), fUid(0), fGid(0), fSize(0),
                  fMtime(0), fIsLink(kFALSE) { }
};
#endif

//_________________________________________________[C++ CLASS DEFINITION FILE]
//////////////////////////////////////////////////////////////////////////////
// Name:           utils/inc/TMrbSystem.h
// Purpose:        Define utilities to be used with MARaBOU
// Class:          TMrbSystem    -- extension to TSystem class
// Description:    Common class definitions to be used within MARaBOU
// Author:         R. Lutter
// Revision:       $Id: TMrbSystem.h,v 1.17 2007-09-06 11:25:32 Rudolf.Lutter Exp $       
// Date:           
// Keywords:
//////////////////////////////////////////////////////////////////////////////

#include "TSystem.h"
#include "TObjArray.h"

#include "TMrbNamedX.h"
#include "TMrbLofNamedX.h"

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbSystem
// Purpose:        Some extensions to TSystem
// Description:    Some high-level methods based on TSystem class.
// Keywords:
//////////////////////////////////////////////////////////////////////////////

class TMrbSystem: public TObject {

	public:
		enum EMrbFileType		{	kMrbRegularFile		= kS_IFREG,
									kMrbDirectory 		= kS_IFDIR,
									kMrbSymbolicLink 	= kS_IFLNK,
									kMrbCharDev 	 	= kS_IFCHR,
									kMrbBlockDev 	 	= kS_IFBLK,
									kMrbFifo	 	 	= kS_IFIFO,
									kMrbSocket	 	 	= kS_IFSOCK,
									kMrbExecutable		= kS_IXUSR | kS_IXGRP | kS_IXOTH,
								};
	
		enum EMrbDirMode		{	kMrbDirAsIs 		= 0,
									kMrbDirAppendSlash	= BIT(0),
									kMrbDirReturnDot	= BIT(1),
									kMrbDirExpandWdir 	= BIT(2)
								};
	
	public:
		TMrbSystem();						// default ctor
		~TMrbSystem() {};					// default dtor

		Int_t FindFile(TObjArray & PathList,
				const Char_t * FileName, const Char_t * SearchPath = "", Bool_t MultipleMatch = kFALSE) const;

		const Char_t * GetDirName(TString & DirName, const Char_t * FilePath, EMrbDirMode Mode = kMrbDirAsIs) const;
		const Char_t * GetBaseName(TString & FileName, const Char_t * FilePath) const;
		const Char_t * GetExtension(TString & Extension, const Char_t * FileName) const;
		Bool_t CheckExtension(const Char_t * FileName, const Char_t * Extension) const;
		const Char_t * GetRelPath(TString & Path, const Char_t * BaseDir = NULL) const;

		inline const Char_t * WorkingDirectory() const { return(gSystem->WorkingDirectory()); };
		inline Bool_t ChangeDirectory(const Char_t * Path) const { return(gSystem->ChangeDirectory(Path)); };
		
																						// check file type
		Int_t GetType(const Char_t * Path) const;

		inline Bool_t IsRegular(const Char_t * Path) const { return(this->CheckType(Path, TMrbSystem::kMrbRegularFile)); };
		inline Bool_t IsExecutable(const Char_t * Path) const { return((this->GetType(Path) & TMrbSystem::kMrbExecutable) != 0); };
		inline Bool_t IsDirectory(const Char_t * Path) const { return(this->CheckType(Path, TMrbSystem::kMrbDirectory)); };
		inline Bool_t IsSymbolicLink(const Char_t * Path) const { return(this->CheckType(Path, TMrbSystem::kMrbSymbolicLink)); };

		inline Bool_t Exists(const Char_t * Path) const { return(this->CheckAccess(Path, kFileExists)); };
		inline Bool_t HasReadPermission(const Char_t * Path) const { return(this->CheckAccess(Path, kReadPermission)); };
		inline Bool_t HasWritePermission(const Char_t * Path) const { return(this->CheckAccess(Path, kWritePermission)); };
		inline Bool_t HasExecutePermission(const Char_t * Path) const { return(this->CheckAccess(Path, kExecutePermission)); };
		
		const Char_t * GetSymbolicLink(TString & SymLink, const Char_t * Path);

		const Char_t * GetHostName(TString & HostName); 		// get host name
		const Char_t * GetDomainName(TString & DomainName); 	// get domain name

		const Char_t * Which(TString & Result, const Char_t * Search, const Char_t * File, EAccessMode Mode = kFileExists);

		Bool_t GetStat(TMrbLofNamedX & StatBuf, const Char_t * Path);  // perform stat(2) call
		Bool_t IsSameFile(const Char_t * Path1, const Char_t * Path2);	// check if same inode

		inline void SetIncludePath(const Char_t * IncludePath) { gSystem->SetIncludePath(IncludePath); };
		inline const Char_t * GetIncludePath() { return(gSystem->GetIncludePath()); };
		void AddIncludePath(const Char_t * IncludePath);

		Int_t Load(const char * LofModules, Bool_t SystemFlag = kFALSE);
		void PrintLoadPath(Int_t Status, const Char_t * Module, const Char_t * Path = "", const Char_t * Entry = "", Bool_t SystemFlag = kFALSE);

		inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };

	protected:
		inline Bool_t CheckType(const Char_t * Path, EMrbFileType Type) const {	return((this->GetType(Path) & Type) == Type); };
		Bool_t CheckAccess(const Char_t * Path, EAccessMode Mode) const;
	
	ClassDef(TMrbSystem, 1) 	// [Utils] Some extensions to TSystem class
};

#endif
 TMrbSystem.h:1
 TMrbSystem.h:2
 TMrbSystem.h:3
 TMrbSystem.h:4
 TMrbSystem.h:5
 TMrbSystem.h:6
 TMrbSystem.h:7
 TMrbSystem.h:8
 TMrbSystem.h:9
 TMrbSystem.h:10
 TMrbSystem.h:11
 TMrbSystem.h:12
 TMrbSystem.h:13
 TMrbSystem.h:14
 TMrbSystem.h:15
 TMrbSystem.h:16
 TMrbSystem.h:17
 TMrbSystem.h:18
 TMrbSystem.h:19
 TMrbSystem.h:20
 TMrbSystem.h:21
 TMrbSystem.h:22
 TMrbSystem.h:23
 TMrbSystem.h:24
 TMrbSystem.h:25
 TMrbSystem.h:26
 TMrbSystem.h:27
 TMrbSystem.h:28
 TMrbSystem.h:29
 TMrbSystem.h:30
 TMrbSystem.h:31
 TMrbSystem.h:32
 TMrbSystem.h:33
 TMrbSystem.h:34
 TMrbSystem.h:35
 TMrbSystem.h:36
 TMrbSystem.h:37
 TMrbSystem.h:38
 TMrbSystem.h:39
 TMrbSystem.h:40
 TMrbSystem.h:41
 TMrbSystem.h:42
 TMrbSystem.h:43
 TMrbSystem.h:44
 TMrbSystem.h:45
 TMrbSystem.h:46
 TMrbSystem.h:47
 TMrbSystem.h:48
 TMrbSystem.h:49
 TMrbSystem.h:50
 TMrbSystem.h:51
 TMrbSystem.h:52
 TMrbSystem.h:53
 TMrbSystem.h:54
 TMrbSystem.h:55
 TMrbSystem.h:56
 TMrbSystem.h:57
 TMrbSystem.h:58
 TMrbSystem.h:59
 TMrbSystem.h:60
 TMrbSystem.h:61
 TMrbSystem.h:62
 TMrbSystem.h:63
 TMrbSystem.h:64
 TMrbSystem.h:65
 TMrbSystem.h:66
 TMrbSystem.h:67
 TMrbSystem.h:68
 TMrbSystem.h:69
 TMrbSystem.h:70
 TMrbSystem.h:71
 TMrbSystem.h:72
 TMrbSystem.h:73
 TMrbSystem.h:74
 TMrbSystem.h:75
 TMrbSystem.h:76
 TMrbSystem.h:77
 TMrbSystem.h:78
 TMrbSystem.h:79
 TMrbSystem.h:80
 TMrbSystem.h:81
 TMrbSystem.h:82
 TMrbSystem.h:83
 TMrbSystem.h:84
 TMrbSystem.h:85
 TMrbSystem.h:86
 TMrbSystem.h:87
 TMrbSystem.h:88
 TMrbSystem.h:89
 TMrbSystem.h:90
 TMrbSystem.h:91
 TMrbSystem.h:92
 TMrbSystem.h:93
 TMrbSystem.h:94
 TMrbSystem.h:95
 TMrbSystem.h:96
 TMrbSystem.h:97
 TMrbSystem.h:98
 TMrbSystem.h:99
 TMrbSystem.h:100
 TMrbSystem.h:101
 TMrbSystem.h:102
 TMrbSystem.h:103
 TMrbSystem.h:104
 TMrbSystem.h:105
 TMrbSystem.h:106
 TMrbSystem.h:107
 TMrbSystem.h:108
 TMrbSystem.h:109
 TMrbSystem.h:110
 TMrbSystem.h:111
 TMrbSystem.h:112
 TMrbSystem.h:113
 TMrbSystem.h:114
 TMrbSystem.h:115
 TMrbSystem.h:116
 TMrbSystem.h:117
 TMrbSystem.h:118
 TMrbSystem.h:119
 TMrbSystem.h:120
 TMrbSystem.h:121
 TMrbSystem.h:122
 TMrbSystem.h:123
 TMrbSystem.h:124
 TMrbSystem.h:125
 TMrbSystem.h:126
 TMrbSystem.h:127
 TMrbSystem.h:128
 TMrbSystem.h:129
 TMrbSystem.h:130
 TMrbSystem.h:131
 TMrbSystem.h:132
 TMrbSystem.h:133
 TMrbSystem.h:134
 TMrbSystem.h:135
 TMrbSystem.h:136
 TMrbSystem.h:137
 TMrbSystem.h:138
 TMrbSystem.h:139
 TMrbSystem.h:140
 TMrbSystem.h:141
 TMrbSystem.h:142
 TMrbSystem.h:143
 TMrbSystem.h:144
 TMrbSystem.h:145
 TMrbSystem.h:146
 TMrbSystem.h:147
 TMrbSystem.h:148
 TMrbSystem.h:149
 TMrbSystem.h:150
 TMrbSystem.h:151
 TMrbSystem.h:152
 TMrbSystem.h:153
 TMrbSystem.h:154
 TMrbSystem.h:155