42 #include <sys/utime.h> 43 #include <sys/timeb.h> 62 #if defined (_MSC_VER) && (_MSC_VER >= 1400) 64 #elif defined (_M_IX86) 65 static void __cpuid(
int* cpuid_data,
int info_type)
92 static void __cpuid(
int* cpuid_data,
int) {
93 cpuid_data[0] = 0x00000000;
94 cpuid_data[1] = 0x00000000;
95 cpuid_data[2] = 0x00000000;
96 cpuid_data[3] = 0x00000000;
111 TFdSet() { fds_bits =
new fd_set; fds_bits->fd_count = 0; }
112 virtual ~TFdSet() {
delete fds_bits; }
113 void Copy(TFdSet &fd)
const { memcpy((
void*)fd.fds_bits, fds_bits,
sizeof(fd_set)); }
114 TFdSet(
const TFdSet& fd) { fd.Copy(*
this); }
115 TFdSet& operator=(
const TFdSet& fd) { fd.Copy(*
this);
return *
this; }
116 void Zero() { fds_bits->fd_count = 0; }
119 if (fds_bits->fd_count < FD_SETSIZE-1)
120 fds_bits->fd_array[fds_bits->fd_count++] = (
SOCKET)fd;
122 ::SysError(
"TFdSet::Set",
"fd_count will exeed FD_SETSIZE");
127 for (i=0; i<fds_bits->fd_count; i++) {
128 if (fds_bits->fd_array[i]==(
SOCKET)fd) {
129 while (i<fds_bits->fd_count-1) {
130 fds_bits->fd_array[i] = fds_bits->fd_array[i+1];
133 fds_bits->fd_count--;
139 Int_t *GetBits() {
return fds_bits && fds_bits->fd_count ? (
Int_t*)fds_bits : 0; }
140 UInt_t GetCount() {
return (
UInt_t)fds_bits->fd_count; }
141 Int_t GetFd(
Int_t i) {
return i<fds_bits->fd_count ? fds_bits->fd_array[i] : 0; }
149 static HANDLE gGlobalEvent;
150 static HANDLE gTimerThreadHandle;
151 typedef NET_API_STATUS (WINAPI *pfn1)(LPVOID);
152 typedef NET_API_STATUS (WINAPI *pfn2)(LPCWSTR, LPCWSTR, DWORD, LPBYTE*);
153 typedef NET_API_STATUS (WINAPI *pfn3)(LPCWSTR, LPCWSTR, DWORD, LPBYTE*,
154 DWORD, LPDWORD, LPDWORD, PDWORD);
155 typedef NET_API_STATUS (WINAPI *pfn4)(LPCWSTR, DWORD, LPBYTE*, DWORD, LPDWORD,
157 static pfn1 p2NetApiBufferFree;
158 static pfn2 p2NetUserGetInfo;
159 static pfn3 p2NetLocalGroupGetMembers;
160 static pfn4 p2NetLocalGroupEnum;
162 static struct signal_map {
168 SIGSEGV, 0,
"segmentation violation",
169 -1 , 0,
"bad argument to system call",
170 -1 , 0,
"write on a pipe with no one to read it",
171 SIGILL, 0,
"illegal instruction",
173 SIGINT, 0,
"interrupt",
174 -1 , 0,
"window size change",
175 -1 , 0,
"alarm clock",
176 -1 , 0,
"death of a child",
177 -1 , 0,
"urgent data arrived on an I/O channel",
178 SIGFPE, 0,
"floating point exception",
179 SIGTERM, 0,
"termination signal",
180 -1 , 0,
"user-defined signal 1",
181 -1 , 0,
"user-defined signal 2" 202 static int WinNTRecv(
int socket,
void *buffer,
int length,
int flag)
204 if (socket == -1)
return -1;
212 if (flag == MSG_PEEK) {
217 char *buf = (
char *)buffer;
219 for (n = 0; n < length; n += nrecv) {
220 if ((nrecv = ::recv(sock, buf+n, length-n, flag)) <= 0) {
224 if (flag == MSG_OOB) {
225 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
227 }
else if (::WSAGetLastError() == WSAEINVAL) {
231 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
234 if (::WSAGetLastError() != WSAEINTR)
235 ::
SysError(
"TWinNTSystem::WinNTRecv",
"recv");
236 if (::WSAGetLastError() == EPIPE ||
237 ::WSAGetLastError() == WSAECONNRESET)
256 static int WinNTSend(
int socket,
const void *buffer,
int length,
int flag)
258 if (socket < 0)
return -1;
268 const char *buf = (
const char *)buffer;
270 for (n = 0; n < length; n += nsent) {
271 if ((nsent = ::send(sock, buf+n, length-n, flag)) <= 0) {
275 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
278 if (::WSAGetLastError() != WSAEINTR)
279 ::
SysError(
"TWinNTSystem::WinNTSend",
"send");
280 if (::WSAGetLastError() == EPIPE ||
281 ::WSAGetLastError() == WSAECONNRESET)
298 static int WinNTSelect(TFdSet *readready, TFdSet *writeready,
Long_t timeout)
301 fd_set* rbits = readready ? (fd_set*)readready->GetBits() : 0;
302 fd_set* wbits = writeready ? (fd_set*)writeready->GetBits() : 0;
306 tv.tv_sec = timeout / 1000;
307 tv.tv_usec = (timeout % 1000) * 1000;
309 retcode = ::select(0, rbits, wbits, 0, &tv);
311 retcode = ::select(0, rbits, wbits, 0, 0);
314 if (retcode == SOCKET_ERROR) {
315 int errcode = ::WSAGetLastError();
319 if (errcode == WSAENOTSOCK) {
321 int result = _fstat64( readready->GetFd(0), &buf );
329 ::WaitForSingleObject(gGlobalEvent, 1);
330 ::ResetEvent(gGlobalEvent);
335 if ( errcode == WSAEINTR) {
339 if (errcode == EBADF) {
354 if (reset || newpath) {
361 }
else if (dynpath ==
"") {
364 if (rdynpath ==
"") {
366 rdynpath =
".;"; rdynpath += ROOTBINDIR;
368 rdynpath =
".;"; rdynpath +=
gRootDir; rdynpath +=
"/bin";
375 dynpath = path; dynpath +=
";"; dynpath += rdynpath;
380 if (!dynpath.
Contains(ROOTLIBDIR)) {
381 dynpath +=
";"; dynpath += ROOTLIBDIR;
385 dynpath +=
";"; dynpath +=
gRootDir; dynpath +=
"/lib";
398 if (signal_map[i].code == sig) {
399 (*signal_map[i].handler)((
ESignals)i);
410 signal_map[sig].handler = handler;
411 if (signal_map[sig].code != -1)
418 static char *WinNTSigname(
ESignals sig)
420 return signal_map[sig].signame;
426 static BOOL ConsoleSigHandler(DWORD sig)
434 Break(
"TInterruptHandler::Notify",
"keyboard interrupt");
440 case CTRL_BREAK_EVENT:
441 case CTRL_LOGOFF_EVENT:
442 case CTRL_SHUTDOWN_EVENT:
443 case CTRL_CLOSE_EVENT:
445 printf(
"\n *** Break *** keyboard interrupt - ROOT is terminated\n");
451 static CONTEXT *fgXcptContext = 0;
465 LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS pXcp)
467 fgXcptContext = pXcp->ContextRecord;
469 return EXCEPTION_CONTINUE_SEARCH;
473 #pragma intrinsic(_ReturnAddress) 474 #pragma auto_inline(off) 475 DWORD_PTR GetProgramCounter()
480 #pragma auto_inline(on) 491 static DWORD WINAPI GUIThreadMessageProcessingLoop(
void *p)
496 ::PeekMessage(&msg,
NULL, WM_USER, WM_USER, PM_NOREMOVE);
501 if (gGlobalEvent) ::SetEvent(gGlobalEvent);
503 if (erret <= 0) endLoop =
kTRUE;
504 if (gGUIThreadMsgFunc)
505 endLoop = (*gGUIThreadMsgFunc)(&msg);
512 erret = ::GetLastError();
513 Error(
"MsgLoop",
"Error in GetMessage");
527 typedef BOOL (__stdcall *SYMINITIALIZEPROC)( HANDLE, LPSTR, BOOL );
528 typedef BOOL (__stdcall *SYMCLEANUPPROC)( HANDLE );
529 typedef BOOL (__stdcall *STACKWALK64PROC)
530 ( DWORD, HANDLE, HANDLE, LPSTACKFRAME64, LPVOID,
531 PREAD_PROCESS_MEMORY_ROUTINE,PFUNCTION_TABLE_ACCESS_ROUTINE,
532 PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE );
533 typedef LPVOID (__stdcall *SYMFUNCTIONTABLEACCESS64PROC)( HANDLE, DWORD64 );
534 typedef DWORD (__stdcall *SYMGETMODULEBASE64PROC)( HANDLE, DWORD64 );
535 typedef BOOL (__stdcall *SYMGETMODULEINFO64PROC)(HANDLE, DWORD64, PIMAGEHLP_MODULE64);
536 typedef BOOL (__stdcall *SYMGETSYMFROMADDR64PROC)( HANDLE, DWORD64, PDWORD64, PIMAGEHLP_SYMBOL64);
537 typedef BOOL (__stdcall *SYMGETLINEFROMADDR64PROC)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64);
538 typedef DWORD (__stdcall *UNDECORATESYMBOLNAMEPROC)(PCSTR, PSTR, DWORD, DWORD);
541 static SYMINITIALIZEPROC _SymInitialize = 0;
542 static SYMCLEANUPPROC _SymCleanup = 0;
543 static STACKWALK64PROC _StackWalk64 = 0;
544 static SYMFUNCTIONTABLEACCESS64PROC _SymFunctionTableAccess64 = 0;
545 static SYMGETMODULEBASE64PROC _SymGetModuleBase64 = 0;
546 static SYMGETMODULEINFO64PROC _SymGetModuleInfo64 = 0;
547 static SYMGETSYMFROMADDR64PROC _SymGetSymFromAddr64 = 0;
548 static SYMGETLINEFROMADDR64PROC _SymGetLineFromAddr64 = 0;
549 static UNDECORATESYMBOLNAMEPROC _UnDecorateSymbolName = 0;
551 BOOL InitImagehlpFunctions()
559 HMODULE hModImagehlp = LoadLibrary(
"IMAGEHLP.DLL" );
563 _SymInitialize = (SYMINITIALIZEPROC) GetProcAddress( hModImagehlp,
"SymInitialize" );
567 _SymCleanup = (SYMCLEANUPPROC) GetProcAddress( hModImagehlp,
"SymCleanup" );
571 _StackWalk64 = (STACKWALK64PROC) GetProcAddress( hModImagehlp,
"StackWalk64" );
575 _SymFunctionTableAccess64 = (SYMFUNCTIONTABLEACCESS64PROC) GetProcAddress(hModImagehlp,
"SymFunctionTableAccess64" );
576 if (!_SymFunctionTableAccess64)
579 _SymGetModuleBase64=(SYMGETMODULEBASE64PROC)GetProcAddress(hModImagehlp,
"SymGetModuleBase64");
580 if (!_SymGetModuleBase64)
583 _SymGetModuleInfo64=(SYMGETMODULEINFO64PROC)GetProcAddress(hModImagehlp,
"SymGetModuleInfo64");
584 if (!_SymGetModuleInfo64)
587 _SymGetSymFromAddr64=(SYMGETSYMFROMADDR64PROC)GetProcAddress(hModImagehlp,
"SymGetSymFromAddr64");
588 if (!_SymGetSymFromAddr64)
591 _SymGetLineFromAddr64=(SYMGETLINEFROMADDR64PROC)GetProcAddress(hModImagehlp,
"SymGetLineFromAddr64");
592 if (!_SymGetLineFromAddr64)
595 _UnDecorateSymbolName=(UNDECORATESYMBOLNAMEPROC)GetProcAddress(hModImagehlp,
"UnDecorateSymbolName");
596 if (!_UnDecorateSymbolName)
599 if (!_SymInitialize(GetCurrentProcess(), 0,
TRUE ))
615 std::string GetModuleName(DWORD64 address)
619 std::ostringstream out;
620 HANDLE process = ::GetCurrentProcess();
622 DWORD lineDisplacement = 0;
623 IMAGEHLP_LINE64
line;
624 ::ZeroMemory(&line,
sizeof(line));
625 line.SizeOfStruct =
sizeof(
line);
626 if(_SymGetLineFromAddr64(process, address, &lineDisplacement, &line)) {
627 out << line.FileName <<
"(" << line.LineNumber <<
"): ";
629 IMAGEHLP_MODULE64 module;
630 ::ZeroMemory(&module,
sizeof(module));
631 module.SizeOfStruct =
sizeof(module);
632 if(_SymGetModuleInfo64(process, address, &module)) {
633 out << module.ModuleName <<
"!";
635 out <<
"0x" << std::hex << address << std::dec <<
" ";
642 std::string GetFunctionName(DWORD64 address)
646 DWORD64 symbolDisplacement = 0;
647 HANDLE process = ::GetCurrentProcess();
649 const unsigned int SYMBOL_BUFFER_SIZE = 8192;
650 char symbolBuffer[SYMBOL_BUFFER_SIZE];
651 PIMAGEHLP_SYMBOL64 symbol =
reinterpret_cast<PIMAGEHLP_SYMBOL64
>(symbolBuffer);
652 ::ZeroMemory(symbol, SYMBOL_BUFFER_SIZE);
653 symbol->SizeOfStruct = SYMBOL_BUFFER_SIZE;
654 symbol->MaxNameLength = SYMBOL_BUFFER_SIZE -
sizeof(IMAGEHLP_SYMBOL64);
656 if(_SymGetSymFromAddr64(process, address, &symbolDisplacement, symbol)) {
658 const unsigned int NAME_SIZE = 8192;
659 char name[NAME_SIZE];
660 _UnDecorateSymbolName(
665 UNDNAME_NO_THISTYPE |
666 UNDNAME_NO_SPECIAL_SYMS |
667 UNDNAME_NO_MEMBER_TYPE |
668 UNDNAME_NO_MS_KEYWORDS |
669 UNDNAME_NO_ACCESS_SPECIFIERS
687 static BOOL IsShortcut(
const char *filename)
690 const char *extLnk =
".lnk";
691 if (filename !=
NULL) {
703 static BOOL ResolveShortCut(LPCSTR pszShortcutFile,
char *pszPath,
int maxbuf)
707 char szGotPath[MAX_PATH];
714 typedef HRESULT (__stdcall *COINITIALIZEPROC)( LPVOID );
715 static COINITIALIZEPROC _CoInitialize = 0;
716 typedef void (__stdcall *COUNINITIALIZEPROC)(
void );
717 static COUNINITIALIZEPROC _CoUninitialize = 0;
718 typedef HRESULT (__stdcall *COCREATEINSTANCEPROC)( REFCLSID, LPUNKNOWN,
719 DWORD, REFIID, LPVOID );
720 static COCREATEINSTANCEPROC _CoCreateInstance = 0;
722 HMODULE hModImagehlp = LoadLibrary(
"ole32.dll" );
726 _CoInitialize = (COINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoInitialize" );
729 _CoUninitialize = (COUNINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoUninitialize");
730 if (!_CoUninitialize)
732 _CoCreateInstance = (COCREATEINSTANCEPROC) GetProcAddress( hModImagehlp,
"CoCreateInstance" );
733 if (!_CoCreateInstance)
738 hres = _CoCreateInstance(CLSID_ShellLink,
NULL, CLSCTX_INPROC_SERVER,
739 IID_IShellLink, (
void **) &psl);
740 if (SUCCEEDED(hres)) {
743 hres = psl->QueryInterface(IID_IPersistFile, (
void **) &ppf);
744 if (SUCCEEDED(hres)) {
746 MultiByteToWideChar(CP_ACP, 0, pszShortcutFile, -1, wsz, MAX_PATH);
748 hres = ppf->Load(wsz, STGM_READ);
749 if (SUCCEEDED(hres)) {
750 hres = psl->Resolve(HWND_DESKTOP, SLR_ANY_MATCH | SLR_NO_UI | SLR_UPDATE);
751 if (SUCCEEDED(hres)) {
752 strlcpy(szGotPath, pszShortcutFile,MAX_PATH);
753 hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA *)&wfd,
754 SLGP_UNCPRIORITY | SLGP_RAWPATH);
755 strlcpy(pszPath,szGotPath, maxbuf);
756 if (maxbuf) pszPath[maxbuf-1] = 0;
765 return SUCCEEDED(hres);
771 if (strcmp(sys->TWinNTSystem::BaseName(buf),
"root.exe"))
774 if (!::RegOpenKeyEx(HKEY_CURRENT_USER,
"Software", 0, KEY_READ, ®CUS) == ERROR_SUCCESS)
777 if (!::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ, ®CUSC) == ERROR_SUCCESS) {
778 ::RegCloseKey(regCUS);
783 bool regROOTwrite =
false;
787 if (::RegOpenKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, KEY_READ, ®ROOT) != ERROR_SUCCESS) {
788 ::RegCloseKey(regCUSC);
789 if (::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ | KEY_WRITE, ®CUSC) == ERROR_SUCCESS &&
790 ::RegCreateKeyEx(regCUSC,
"ROOTDEV.ROOT", 0,
NULL, 0, KEY_READ | KEY_WRITE,
791 NULL, ®ROOT,
NULL) == ERROR_SUCCESS) {
796 if (::RegOpenKeyEx(regROOT,
"DefaultIcon", 0, KEY_READ, ®ROOTIcon) == ERROR_SUCCESS) {
797 char bufIconLoc[1024];
799 DWORD dwSize =
sizeof(bufIconLoc);
801 if (::RegQueryValueEx(regROOTIcon,
NULL,
NULL, &dwType, (BYTE*)bufIconLoc, &dwSize) == ERROR_SUCCESS)
802 regROOTwrite = (iconloc != bufIconLoc);
805 ::RegCloseKey(regROOTIcon);
810 ::RegCloseKey(regCUSC);
811 ::RegCloseKey(regROOT);
812 if (::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ | KEY_WRITE, ®CUSC) != ERROR_SUCCESS) {
814 regROOTwrite =
false;
816 if (::RegOpenKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, KEY_WRITE, ®ROOT) != ERROR_SUCCESS) {
818 regROOTwrite =
false;
819 ::RegCloseKey(regCUSC);
828 fileopen += sys->TWinNTSystem::DriveName(buf);
830 fileopen += sys->TWinNTSystem::DirName(sys->TWinNTSystem::DirName(buf));
831 fileopen +=
"\\macros";
833 fileopen += ROOTMACRODIR;
835 fileopen +=
"\\fileopen.C";
843 ::RegCloseKey(regROOT);
844 ::RegCloseKey(regCUSC);
845 ::RegCloseKey(regCUS);
849 static const char apptitle[] =
"ROOT data file";
850 ::RegSetValueEx(regROOT,
NULL, 0, REG_SZ, (BYTE*)apptitle,
sizeof(apptitle));
851 DWORD editflags = 0x00010000;
852 ::RegSetValueEx(regROOT,
"EditFlags", 0, REG_DWORD, (BYTE*)&editflags,
sizeof(editflags));
855 if (::RegCreateKeyEx(regROOT,
"DefaultIcon", 0,
NULL, 0, KEY_READ | KEY_WRITE,
856 NULL, ®ROOTIcon,
NULL) == ERROR_SUCCESS) {
859 ::RegSetValueEx(regROOTIcon,
NULL, 0, REG_SZ, (BYTE*)iconloc.
Data(), iconloc.
Length() + 1);
860 ::RegCloseKey(regROOTIcon);
865 if (::RegCreateKeyEx(regROOT,
"shell", 0,
NULL, 0, KEY_READ | KEY_WRITE,
866 NULL, ®ROOTshell,
NULL) == ERROR_SUCCESS) {
868 if (::RegCreateKeyEx(regROOTshell,
"open", 0,
NULL, 0, KEY_READ | KEY_WRITE,
869 NULL, ®ShellOpen,
NULL) == ERROR_SUCCESS) {
870 HKEY regShellOpenCmd;
871 if (::RegCreateKeyEx(regShellOpen,
"command", 0,
NULL, 0, KEY_READ | KEY_WRITE,
872 NULL, ®ShellOpenCmd,
NULL) == ERROR_SUCCESS) {
874 cmd +=
" -l \"%1\" \"";
877 ::RegSetValueEx(regShellOpenCmd,
NULL, 0, REG_SZ, (BYTE*)cmd.
Data(), cmd.
Length() + 1);
878 ::RegCloseKey(regShellOpenCmd);
880 ::RegCloseKey(regShellOpen);
882 ::RegCloseKey(regROOTshell);
884 ::RegCloseKey(regROOT);
886 if (::RegCreateKeyEx(regCUSC,
".root", 0,
NULL, 0, KEY_READ | KEY_WRITE,
887 NULL, ®ROOT,
NULL) == ERROR_SUCCESS) {
888 static const char appname[] =
"ROOTDEV.ROOT";
889 ::RegSetValueEx(regROOT,
NULL, 0, REG_SZ, (BYTE*)appname,
sizeof(appname));
891 ::RegCloseKey(regCUSC);
892 ::RegCloseKey(regCUS);
895 ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST,
NULL,
NULL);
903 static bool once =
true;
906 if ((arg !=
"root") && (arg !=
"rootn") &&
907 (arg !=
"root.exe") && (arg !=
"rootn.exe"))
return false;
911 if ((arg ==
"-l") || (arg ==
"-b")) {
924 static void SetConsoleWindowName()
926 char pszNewWindowTitle[1024];
927 char pszOldWindowTitle[1024];
929 CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
931 if (!::GetConsoleTitle(pszOldWindowTitle, 1024))
934 wsprintf(pszNewWindowTitle,
"%d/%d", ::GetTickCount(), ::GetCurrentProcessId());
936 if (!::SetConsoleTitle(pszNewWindowTitle))
946 ::SetConsoleTitle(
"ROOT session");
948 hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
949 ::SetConsoleMode(hStdout, ENABLE_PROCESSED_OUTPUT |
950 ENABLE_WRAP_AT_EOL_OUTPUT);
951 if (!::GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
970 TIter next(fSignalHandler);
988 fGUIThreadHandle(0), fGUIThreadId(0)
996 if (initwinsock = ::WSAStartup(MAKEWORD(2, 0), &WSAData)) {
997 Error(
"TWinNTSystem()",
"Starting sockets failed");
1008 char *buf =
new char[MAX_MODULE_NAME32 + 1];
1012 HMODULE hModCore = ::GetModuleHandle(
"libCore.dll");
1015 char *pLibName = strstr(buf,
"libCore.dll");
1018 while (--pLibName >= buf && *pLibName !=
'\\' && *pLibName !=
'/');
1021 check_path +=
"\\etc";
1023 while (buf[0] && GetFileAttributes(check_path.
Data()) == INVALID_FILE_ATTRIBUTES) {
1024 while (--pLibName >= buf && *pLibName !=
'\\' && *pLibName !=
'/');
1027 check_path +=
"\\etc";
1040 UpdateRegistry(
this, buf);
1051 typedef UINT (WINAPI* LPTIMEENDPERIOD)( UINT uPeriod );
1052 HINSTANCE hInstWinMM = LoadLibrary(
"winmm.dll" );
1054 LPTIMEENDPERIOD pTimeEndPeriod = (LPTIMEENDPERIOD)GetProcAddress( hInstWinMM,
"timeEndPeriod" );
1055 if(
NULL != pTimeEndPeriod )
1057 FreeLibrary(hInstWinMM);
1068 ::ResetEvent(gGlobalEvent);
1069 ::CloseHandle(gGlobalEvent);
1072 if (gTimerThreadHandle) {
1073 ::TerminateThread(gTimerThreadHandle, 0);
1074 ::CloseHandle(gTimerThreadHandle);
1083 const char *dir = 0;
1111 ::SetUnhandledExceptionFilter(ExceptionFilter);
1118 static char lpFilename[MAX_PATH];
1121 sizeof(lpFilename)))
1134 typedef UINT (WINAPI* LPTIMEBEGINPERIOD)( UINT uPeriod );
1135 HINSTANCE hInstWinMM = LoadLibrary(
"winmm.dll" );
1137 LPTIMEBEGINPERIOD pTimeBeginPeriod = (LPTIMEBEGINPERIOD)GetProcAddress( hInstWinMM,
"timeBeginPeriod" );
1138 if(
NULL != pTimeBeginPeriod )
1139 pTimeBeginPeriod(1);
1140 FreeLibrary(hInstWinMM);
1148 char *buf =
new char[MAX_MODULE_NAME32 + 1];
1149 HMODULE hModCore = ::GetModuleHandle(
"libCore.dll");
1152 char *pLibName = strstr(buf,
"libCore.dll");
1159 SetConsoleWindowName();
1183 const char *symbol=
name;
1186 while ( (*symbol ==
' ' || *symbol ==
'\t') && *symbol) symbol++;
1189 if (isalpha(symbol[idx]) && symbol[idx+1] ==
':') idx = 2;
1190 if ( (symbol[idx] ==
'/' || symbol[idx] ==
'\\') && symbol[idx+1] ==
'\0') {
1195 Error(
"BaseName",
"name = 0");
1199 char *bslash = (
char *)strrchr(&symbol[idx],
'\\');
1200 char *rslash = (
char *)strrchr(&symbol[idx],
'/');
1201 if (cp = std::max(rslash, bslash)) {
1206 return &symbol[idx];
1208 Error(
"BaseName",
"name = 0");
1224 ULong_t namelen=name ? strlen(name) : 0;
1225 if (name && namelen > 0) {
1227 fullname =
new char[namelen+5];
1228 strlcpy(fullname, name,namelen+5);
1229 if ( !strrchr(fullname,
'.') )
1230 strlcat(fullname,
".exe",namelen+5);
1233 dot = strrchr(progname,
'.');
1234 idot = dot ? (
ULong_t)(dot - progname) : strlen(progname);
1239 which =
StrDup(fullname);
1247 const char *d =
DirName(which);
1250 dirname.
Form(
"%c:%s", driveletter, d);
1252 dirname.
Form(
"%s", d);
1265 progname[idot] =
'\0';
1267 if (which)
delete [] which;
1271 if (::NeedSplash()) {
1284 if (err < 0 || err >= sys_nerr) {
1286 error_msg.
Form(
"errno out of range %d", err);
1289 return sys_errlist[err];
1302 DWORD il =
sizeof(hn);
1303 ::GetComputerName(hn, &il);
1319 if (freq < 37) freq = 440;
1320 if (duration < 0) duration = 100;
1329 gGUIThreadMsgFunc =
func;
1352 int fd = h->
GetFd();
1390 set_console =
kTRUE;
1403 ::SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleSigHandler,
TRUE);
1429 ::SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleSigHandler,
FALSE);
1473 HANDLE snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,::GetCurrentProcessId());
1478 if (!InitImagehlpFunctions()) {
1479 std::cerr <<
"No stack trace: cannot find (functions in) dbghelp.dll!" << std::endl;
1484 SYSTEM_INFO sysInfo;
1485 ::GetSystemInfo(&sysInfo);
1486 DWORD machineType = IMAGE_FILE_MACHINE_I386;
1487 switch (sysInfo.wProcessorArchitecture) {
1488 case PROCESSOR_ARCHITECTURE_AMD64:
1489 machineType = IMAGE_FILE_MACHINE_AMD64;
1491 case PROCESSOR_ARCHITECTURE_IA64:
1492 machineType = IMAGE_FILE_MACHINE_IA64;
1496 DWORD currentThreadID = ::GetCurrentThreadId();
1497 DWORD currentProcessID = ::GetCurrentProcessId();
1501 THREADENTRY32 threadentry;
1502 threadentry.dwSize =
sizeof(THREADENTRY32);
1503 if (!::Thread32First(snapshot, &threadentry))
return;
1505 std::cerr << std::endl <<
"==========================================" << std::endl;
1506 std::cerr <<
"=============== STACKTRACE ===============" << std::endl;
1507 std::cerr <<
"==========================================" << std::endl << std::endl;
1510 if (threadentry.th32OwnerProcessID != currentProcessID)
1512 HANDLE thread = ::OpenThread(THREAD_GET_CONTEXT|THREAD_SUSPEND_RESUME|THREAD_QUERY_INFORMATION,
1513 FALSE, threadentry.th32ThreadID);
1515 memset(&context, 0,
sizeof(CONTEXT));
1517 if (threadentry.th32ThreadID != currentThreadID) {
1518 ::SuspendThread(thread);
1519 context.ContextFlags = CONTEXT_ALL;
1520 ::GetThreadContext(thread, &context);
1521 ::ResumeThread(thread);
1523 if (fgXcptContext) {
1524 context = *fgXcptContext;
1526 typedef void (WINAPI *RTLCCTXT)(PCONTEXT);
1527 RTLCCTXT p2RtlCCtxt = (RTLCCTXT) ::GetProcAddress(
1528 GetModuleHandle(
"kernel32.dll"),
"RtlCaptureContext");
1530 context.ContextFlags = CONTEXT_ALL;
1531 p2RtlCCtxt(&context);
1537 ::ZeroMemory(&frame,
sizeof(frame));
1539 frame.AddrPC.Mode = AddrModeFlat;
1540 frame.AddrFrame.Mode = AddrModeFlat;
1541 frame.AddrStack.Mode = AddrModeFlat;
1542 #if defined(_M_IX86) 1543 frame.AddrPC.Offset = context.Eip;
1544 frame.AddrFrame.Offset = context.Ebp;
1545 frame.AddrStack.Offset = context.Esp;
1546 #elif defined(_M_X64) 1547 frame.AddrPC.Offset = context.Rip;
1548 frame.AddrFrame.Offset = context.Rsp;
1549 frame.AddrStack.Offset = context.Rsp;
1550 #elif defined(_M_IA64) 1551 frame.AddrPC.Offset = context.StIIP;
1552 frame.AddrFrame.Offset = context.IntSp;
1553 frame.AddrStack.Offset = context.IntSp;
1554 frame.AddrBStore.Offset= context.RsBSP;
1556 std::cerr <<
"Stack traces not supported on your architecture yet." << std::endl;
1561 while (_StackWalk64(machineType, (HANDLE)::GetCurrentProcess(), thread, (LPSTACKFRAME64)&frame,
1562 (LPVOID)&context, (PREAD_PROCESS_MEMORY_ROUTINE)
NULL, (PFUNCTION_TABLE_ACCESS_ROUTINE)_SymFunctionTableAccess64,
1563 (PGET_MODULE_BASE_ROUTINE)_SymGetModuleBase64, NULL)) {
1565 std::cerr << std::endl <<
"================ Thread " << iThread++ <<
" ================" << std::endl;
1566 if (!bFirst || threadentry.th32ThreadID != currentThreadID) {
1567 const std::string moduleName = GetModuleName(frame.AddrPC.Offset);
1568 const std::string functionName = GetFunctionName(frame.AddrPC.Offset);
1569 std::cerr <<
" " << moduleName << functionName << std::endl;
1573 ::CloseHandle(thread);
1574 }
while (::Thread32Next(snapshot, &threadentry));
1576 std::cerr << std::endl <<
"==========================================" << std::endl;
1577 std::cerr <<
"============= END STACKTRACE =============" << std::endl;
1578 std::cerr <<
"==========================================" << std::endl << std::endl;
1579 ::CloseHandle(snapshot);
1580 _SymCleanup(GetCurrentProcess());
1589 UInt_t oldmask = _statusfp( );
1591 if (oldmask & _EM_INVALID ) mask |=
kInvalid;
1592 if (oldmask & _EM_ZERODIVIDE) mask |=
kDivByZero;
1593 if (oldmask & _EM_OVERFLOW ) mask |=
kOverflow;
1594 if (oldmask & _EM_UNDERFLOW) mask |=
kUnderflow;
1595 if (oldmask & _EM_INEXACT ) mask |=
kInexact;
1609 if (mask &
kInvalid ) newm |= _EM_INVALID;
1610 if (mask &
kDivByZero) newm |= _EM_ZERODIVIDE;
1611 if (mask &
kOverflow ) newm |= _EM_OVERFLOW;
1612 if (mask &
kUnderflow) newm |= _EM_UNDERFLOW;
1613 if (mask &
kInexact ) newm |= _EM_INEXACT;
1615 UInt_t cm = ::_statusfp();
1617 ::_controlfp(cm , _MCW_EM);
1636 if (pendingOnly && gGlobalEvent) ::SetEvent(gGlobalEvent);
1638 Bool_t pollOnce = pendingOnly;
1642 if (
gROOT->GetApplication()) {
1658 ::WaitForSingleObject(gGlobalEvent, 1);
1659 ::ResetEvent(gGlobalEvent);
1685 if (pendingOnly && !pollOnce)
1724 if (!pendingOnly && gGlobalEvent) {
1725 ::WaitForSingleObject(gGlobalEvent, 1);
1726 ::ResetEvent(gGlobalEvent);
1740 for (i = 0; i <
fReadmask->GetCount(); i++) {
1745 rc = WinNTSelect(&t, 0, 0);
1746 if (rc < 0 && rc != -2) {
1747 ::SysError(
"DispatchOneEvent",
"select: read error on %d\n", fd);
1753 for (i = 0; i <
fWritemask->GetCount(); i++) {
1759 rc = WinNTSelect(0, &t, 0);
1760 if (rc < 0 && rc != -2) {
1761 ::SysError(
"DispatchOneEvent",
"select: write error on %d\n", fd);
1813 if (sync == sh->
IsSync()) {
1815 if ((
fSignals->IsSet(sig) && sigdone == -1) || sigdone == sig) {
1816 if (sigdone == -1) {
1826 if (sigdone != -1)
return kTRUE;
1847 if ((
fReadready->IsSet(fd) && fddone == -1) ||
1848 (fddone == fd && read)) {
1858 (fddone == fd && !read)) {
1868 if (fddone != -1)
return kTRUE;
1885 if (dirname.
Length() == 0) {
1894 const char driveletter =
DriveName(name);
1902 if (res)
return res;
1922 const char *
proto = (strstr(name,
"file:///")) ?
"file://" :
"file:";
1925 if (!name)
return 0;
1929 if (!name)
return 0;
1961 HANDLE searchFile = (HANDLE)dirp;
1995 return (psz[0] == TEXT(
'\\') && psz[1] == TEXT(
'\\'));
2015 #pragma data_seg(".text", "CODE") 2030 if (!IsDBCSLeadByte(*pPath)) {
2035 if ((*pPath == TEXT(
'\\')) && (*(pPath + 1) == 0))
2041 int cBackslashes = 0;
2042 for (p = pPath + 2; *p; p = CharNext(p)) {
2043 if (*p == TEXT(
'\\') && (++cBackslashes > 1))
2063 const char *
proto = (strstr(fdir,
"file:///")) ?
"file://" :
"file:";
2066 char *dir =
new char[MAX_PATH];
2067 if (IsShortcut(sdir)) {
2068 if (!ResolveShortCut(sdir, dir, MAX_PATH))
2069 strlcpy(dir, sdir,MAX_PATH);
2072 strlcpy(dir, sdir,MAX_PATH);
2074 int nche = strlen(dir)+3;
2075 char *entry =
new char[nche];
2076 struct _stati64 finfo;
2079 strlcpy(entry, dir,nche);
2080 if ((entry[strlen(dir)-1] ==
'/') || (entry[strlen(dir)-1] ==
'\\' )) {
2081 entry[strlen(dir)-1] =
'\0';
2084 strlcat(entry,
"\\",nche);
2086 if (_stati64(entry, &finfo) < 0) {
2093 strlcpy(entry, dir,nche);
2094 if ((entry[strlen(dir)-1] ==
'/') || (entry[strlen(dir)-1] ==
'\\' )) {
2096 entry[strlen(dir)-1] =
'\0';
2098 if (_stati64(entry, &finfo) < 0) {
2105 if (finfo.st_mode & S_IFDIR) {
2106 strlcpy(entry, dir,nche);
2107 if (!(entry[strlen(dir)-1] ==
'/' || entry[strlen(dir)-1] ==
'\\' )) {
2108 strlcat(entry,
"\\",nche);
2110 strlcat(entry,
"*",nche);
2179 char drive = driveletter ? toupper( driveletter ) -
'A' + 1 : 0;
2185 if (!(wdpath = ::_getdcwd( (
int)drive, wdpath,
kMAXPATHLEN))) {
2187 Warning(
"WorkingDirectory",
"getcwd() failed");
2211 return std::string(mydir);
2220 if (!(h = ::getenv(
"home"))) h = ::getenv(
"HOME");
2227 h = ::getenv(
"HOMESHARE");
2228 if (!h) h = ::getenv(
"HOMEDRIVE");
2231 h = ::getenv(
"HOMEPATH");
2236 h = ::getenv(
"USERPROFILE");
2241 if (mydir[1] ==
':')
2242 mydir[0] = toupper(mydir[0]);
2259 if (!dir) dir =
"c:\\";
2275 char tmpName[MAX_PATH];
2279 FILE *fp = fopen(tmpName,
"w+");
2281 if (!fp)
::SysError(
"TempFileName",
"error opening %s", tmpName);
2299 if (!opt || !opt[0]) {
2304 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2308 curdrive = _getdrive();
2309 if (strstr(opt,
"cur")) {
2311 sDrive.
Form(
"%c:", (curdrive +
'A' - 1));
2312 sType.
Form(
"Unknown Drive (%s)", sDrive.
Data());
2314 NULL, (LPSTR)szFs, 32);
2315 type = ::GetDriveType(sDrive.
Data());
2318 case DRIVE_NO_ROOT_DIR:
2320 case DRIVE_REMOVABLE:
2321 sType.
Form(
"Removable Disk (%s)", sDrive.
Data());
2324 sType.
Form(
"Local Disk (%s)", sDrive.
Data());
2327 sType.
Form(
"Network Drive (%s) (%s)", szFs, sDrive.
Data());
2330 sType.
Form(
"CD/DVD Drive (%s)", sDrive.
Data());
2333 sType.
Form(
"RAM Disk (%s)", sDrive.
Data());
2338 else if (strstr(opt,
"all")) {
2341 if (::GetLogicalDriveStrings(511, szTemp)) {
2342 TCHAR szDrive[3] = TEXT(
" :");
2348 sDrive.
Form(
"%s", szDrive);
2350 if ((sDrive ==
"A:") || (sDrive ==
"B:")) {
2354 sType.
Form(
"Unknown Drive (%s)", sDrive.
Data());
2357 type = ::GetDriveType(sDrive.
Data());
2360 case DRIVE_NO_ROOT_DIR:
2362 case DRIVE_REMOVABLE:
2363 sType.
Form(
"Removable Disk (%s)", sDrive.
Data());
2366 sType.
Form(
"Local Disk (%s)", sDrive.
Data());
2369 sType.
Form(
"Network Drive (%s) (%s)", szFs, sDrive.
Data());
2372 sType.
Form(
"CD/DVD Drive (%s)", sDrive.
Data());
2375 sType.
Form(
"RAM Disk (%s)", sDrive.
Data());
2385 ::SetErrorMode(nOldErrorMode);
2404 if (strchr(pathname,
'/') || strchr(pathname,
'\\')) {
2405 const char *rslash = strrchr(pathname,
'/');
2406 const char *bslash = strrchr(pathname,
'\\');
2407 const char *
r = std::max(rslash, bslash);
2408 const char *ptr = pathname;
2418 int len = r - pathname;
2449 if (!pathname)
return 0;
2450 if (!pathname[0])
return 0;
2456 while(*lpchar ==
' ') lpchar++;
2458 if (isalpha((
int)*lpchar) && *(lpchar+1) ==
':') {
2462 if ( (*lpchar ==
'\\' || *lpchar ==
'/' ) &&
2463 (*(lpchar+1) ==
'\\' || *(lpchar+1) ==
'/') )
return 0;
2476 if (strchr(dir,
':')) idx = 2;
2477 return (dir[idx] ==
'/' || dir[idx] ==
'\\');
2510 static char temp[1024];
2511 strlcpy(temp, name,1024);
2512 char *currentChar = temp;
2514 while (*currentChar !=
'\0') {
2515 if (*currentChar ==
'\\') *currentChar =
'/';
2533 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2537 const char *
proto = (strstr(path,
"file:///")) ?
"file://" :
"file:";
2540 ::SetErrorMode(nOldErrorMode);
2545 ::SetErrorMode(nOldErrorMode);
2567 if (name ==
".") name =
"";
2568 if (dir && dir[0]) {
2570 char last = dir[strlen(dir) - 1];
2571 if (last !=
'/' && last !=
'\\') {
2592 if (!ret)
return -1;
2601 int ret = ::rename(f, t);
2618 struct _stati64 sbuf;
2621 const char *
proto = (strstr(path,
"file:///")) ?
"file://" :
"file:";
2623 int l = strlen(newpath);
2625 if (newpath[--l] !=
'\\' || newpath[--l] !=
'/') {
2631 if (newpath && ::_stati64(newpath, &sbuf) >= 0) {
2633 buf.
fDev = sbuf.st_dev;
2634 buf.
fIno = sbuf.st_ino;
2635 buf.
fMode = sbuf.st_mode;
2636 buf.
fUid = sbuf.st_uid;
2637 buf.
fGid = sbuf.st_gid;
2638 buf.
fSize = sbuf.st_size;
2639 buf.
fMtime = sbuf.st_mtime;
2640 buf.
fIsLink = IsShortcut(newpath);
2642 char *lpath =
new char[MAX_PATH];
2643 if (IsShortcut(newpath)) {
2644 struct _stati64 sbuf2;
2645 if (ResolveShortCut(newpath, lpath, MAX_PATH)) {
2646 if (::_stati64(lpath, &sbuf2) >= 0) {
2647 buf.
fMode = sbuf2.st_mode;
2673 LPCTSTR lpRootPathName = path;
2676 LPTSTR lpVolumeNameBuffer = 0;
2677 DWORD nVolumeNameSize = 0;
2679 DWORD volumeSerialNumber;
2680 DWORD maximumComponentLength;
2683 DWORD fileSystemFlags;
2686 char fileSystemNameBuffer[512];
2687 DWORD nFileSystemNameSize =
sizeof(fileSystemNameBuffer);
2690 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2691 if (!::GetVolumeInformation(lpRootPathName,
2692 lpVolumeNameBuffer, nVolumeNameSize,
2693 &volumeSerialNumber,
2694 &maximumComponentLength,
2696 fileSystemNameBuffer, nFileSystemNameSize)) {
2698 ::SetErrorMode(nOldErrorMode);
2702 const char *fsNames[] = {
"FAT",
"NTFS" };
2704 for (i = 0; i < 2; i++) {
2705 if (!strncmp(fileSystemNameBuffer, fsNames[i], nFileSystemNameSize))
2710 DWORD sectorsPerCluster;
2711 DWORD bytesPerSector;
2712 DWORD numberOfFreeClusters;
2713 DWORD totalNumberOfClusters;
2715 if (!::GetDiskFreeSpace(lpRootPathName,
2718 &numberOfFreeClusters,
2719 &totalNumberOfClusters)) {
2721 ::SetErrorMode(nOldErrorMode);
2725 ::SetErrorMode(nOldErrorMode);
2727 *bsize = sectorsPerCluster * bytesPerSector;
2728 *blocks = totalNumberOfClusters;
2729 *bfree = numberOfFreeClusters;
2739 struct _stati64 finfo;
2744 char linkname[1024];
2745 LPTSTR lpszFilePart;
2746 TCHAR szPath[MAX_PATH];
2749 typedef BOOL (__stdcall *CREATEHARDLINKPROC)( LPCTSTR, LPCTSTR, LPSECURITY_ATTRIBUTES );
2750 static CREATEHARDLINKPROC _CreateHardLink = 0;
2752 HMODULE hModImagehlp = LoadLibrary(
"Kernel32.dll" );
2757 _CreateHardLink = (CREATEHARDLINKPROC) GetProcAddress( hModImagehlp,
"CreateHardLinkW" );
2759 _CreateHardLink = (CREATEHARDLINKPROC) GetProcAddress( hModImagehlp,
"CreateHardLinkA" );
2761 if (!_CreateHardLink)
2764 dwRet = GetFullPathName(from,
sizeof(szPath) /
sizeof(TCHAR),
2765 szPath, &lpszFilePart);
2767 if (_stati64(szPath, &finfo) < 0)
2770 if (finfo.st_mode & S_IFDIR)
2774 _splitpath(linkname,winDrive,winDir,winName,winExt);
2775 if ((!winDrive[0] ) &&
2777 _splitpath(szPath,winDrive,winDir,winName,winExt);
2778 snprintf(linkname,1024,
"%s\\%s\\%s", winDrive, winDir, to);
2780 else if (!winDrive[0]) {
2781 _splitpath(szPath,winDrive,winDir,winName,winExt);
2782 snprintf(linkname,1024,
"%s\\%s", winDrive, to);
2785 if (!_CreateHardLink(linkname, szPath,
NULL))
2798 IShellLink* pShellLink;
2799 IPersistFile* pPersistFile;
2800 WCHAR wszLinkfile[MAX_PATH];
2801 int iWideCharsWritten;
2803 LPTSTR lpszFilePart;
2804 TCHAR szPath[MAX_PATH];
2806 hRes = E_INVALIDARG;
2807 if ((from ==
NULL) || (!from[0]) || (to ==
NULL) ||
2813 typedef HRESULT (__stdcall *COINITIALIZEPROC)( LPVOID );
2814 static COINITIALIZEPROC _CoInitialize = 0;
2815 typedef void (__stdcall *COUNINITIALIZEPROC)(
void );
2816 static COUNINITIALIZEPROC _CoUninitialize = 0;
2817 typedef HRESULT (__stdcall *COCREATEINSTANCEPROC)( REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID );
2818 static COCREATEINSTANCEPROC _CoCreateInstance = 0;
2820 HMODULE hModImagehlp = LoadLibrary(
"ole32.dll" );
2824 _CoInitialize = (COINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoInitialize" );
2827 _CoUninitialize = (COUNINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoUninitialize" );
2828 if (!_CoUninitialize)
2830 _CoCreateInstance = (COCREATEINSTANCEPROC) GetProcAddress( hModImagehlp,
"CoCreateInstance" );
2831 if (!_CoCreateInstance)
2838 _CoInitialize(
NULL);
2841 dwRet = GetFullPathName(from,
sizeof(szPath) /
sizeof(TCHAR),
2842 szPath, &lpszFilePart);
2843 hRes = _CoCreateInstance(CLSID_ShellLink,
NULL, CLSCTX_INPROC_SERVER,
2844 IID_IShellLink, (LPVOID *)&pShellLink);
2845 if (SUCCEEDED(hRes)) {
2847 hRes = pShellLink->SetPath(szPath);
2849 hRes = pShellLink->QueryInterface(IID_IPersistFile, (
void **)&pPersistFile);
2850 if (SUCCEEDED(hRes)){
2851 iWideCharsWritten = MultiByteToWideChar(CP_ACP, 0, linkname.
Data(), -1,
2852 wszLinkfile, MAX_PATH);
2853 hRes = pPersistFile->Save(wszLinkfile,
TRUE);
2854 pPersistFile->Release();
2856 pShellLink->Release();
2869 return helper->
Unlink(name);
2871 struct _stati64 finfo;
2873 if (_stati64(name, &finfo) < 0) {
2877 if (finfo.st_mode & S_IFDIR) {
2878 return ::_rmdir(name);
2880 return ::_unlink(name);
2889 if (::ioctlsocket(fd, FIONBIO, (u_long *)1) == SOCKET_ERROR) {
2908 const char *patbuf = (
const char *)patbuf0;
2926 while (*patbuf ==
' ') {
2931 while (*patbuf ==
':') {
2936 while (*patbuf ==
';') {
2942 for (q = (
char*)patbuf; *
q; q++) {
2946 if ( (((q-2)>patbuf) && ( (*(q-2)!=
';') || !isalpha(*(q-1)) )) &&
2953 for (p = patbuf; *p; p++) {
2970 char replacement[4];
2973 for (
int k = 0; k<3; k++) replacement[k] = 0
x1;
2975 replacement[3] = 0x0;
2979 while ( (pos = patbuf0.
Index(TildaNum,pos)) !=
kNPOS ) {
2980 patbuf0.
Replace(pos, 1, replacement);
2986 Int_t lbuf = ::ExpandEnvironmentStrings(
2992 cmd =
new char[lbuf+1];
2993 ::ExpandEnvironmentStrings(
3012 char newpath[MAX_PATH];
3013 if (IsShortcut(path)) {
3014 if (!ResolveShortCut(path, newpath, MAX_PATH))
3015 strlcpy(newpath, path, MAX_PATH);
3018 strlcpy(newpath, path, MAX_PATH);
3033 return ::_chmod(file, mode);
3041 return ::umask(mask);
3051 Error(
"Utime",
"need write permission for %s to change utime", file);
3054 if (!actime) actime = modtime;
3057 t.actime = (time_t)actime;
3058 t.modtime = (time_t)modtime;
3059 return ::utime(file, &t);
3078 return infile.
Data();
3086 Int_t lastDelim = -1;
3087 for(
int i=0; i < exsearch.
Length(); ++i) {
3088 switch( exsearch[i] ) {
3091 if (i-lastDelim!=2) exsearch[i] =
';';
3094 case ';': lastDelim = i;
break;
3101 char *lpFilePart = 0;
3103 ::access(name, mode) == 0 && stat(name, &finfo) == 0 &&
3104 finfo.st_mode & S_IFREG) {
3106 Printf(
"Which: %s = %s", infile, name);
3109 return infile.
Data();
3123 if ((
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) && (::GetVersion() < 0x80000000)) {
3126 HINSTANCE netapi = ::LoadLibrary(
"netapi32.DLL");
3127 if (!netapi)
return kFALSE;
3129 p2NetApiBufferFree = (pfn1)::GetProcAddress(netapi,
"NetApiBufferFree");
3130 p2NetUserGetInfo = (pfn2)::GetProcAddress(netapi,
"NetUserGetInfo");
3131 p2NetLocalGroupGetMembers = (pfn3)::GetProcAddress(netapi,
"NetLocalGroupGetMembers");
3132 p2NetLocalGroupEnum = (pfn4)::GetProcAddress(netapi,
"NetLocalGroupEnum");
3134 if (!p2NetApiBufferFree || !p2NetUserGetInfo ||
3135 !p2NetLocalGroupGetMembers || !p2NetLocalGroupEnum)
return kFALSE;
3146 ::FreeLibrary(netapi);
3156 NET_API_STATUS NetStatus = NERR_Success;
3158 DWORD
Index = 0, ResumeHandle = 0, Total = 0;
3159 LOCALGROUP_MEMBERS_INFO_1 *MemberInfo;
3160 WCHAR wszGroupName[256];
3162 DWORD dwLastError = 0;
3164 iRetOp = MultiByteToWideChar (
3166 (DWORD)MB_PRECOMPOSED,
3167 (LPCSTR)lpszGroupName,
3169 (LPWSTR)wszGroupName,
3170 (
int)
sizeof(wszGroupName) );
3173 dwLastError = GetLastError();
3175 p2NetApiBufferFree(Data);
3181 NetStatus = p2NetLocalGroupGetMembers (
NULL, wszGroupName, 1,
3182 &Data, 8192, &Index, &Total, &ResumeHandle );
3184 if (NetStatus != NERR_Success || Data ==
NULL) {
3185 dwLastError = GetLastError();
3187 if (dwLastError == ERROR_ENVVAR_NOT_FOUND) {
3193 NetStatus = p2NetLocalGroupGetMembers (
NULL, wszGroupName, 0,
3194 &Data, 8192, &Index, &Total, &ResumeHandle );
3198 p2NetApiBufferFree(Data);
3203 MemberInfo = (LOCALGROUP_MEMBERS_INFO_1 *)Data;
3206 p2NetApiBufferFree(Data);
3215 NET_API_STATUS NetStatus = NERR_Success;
3217 DWORD
Index = 0, ResumeHandle = 0, Total = 0, i;
3218 LOCALGROUP_INFO_0 *GroupInfo;
3219 char szAnsiName[256];
3220 DWORD dwLastError = 0;
3223 NetStatus = p2NetLocalGroupEnum(
NULL, 0, &Data, 8192, &Index,
3224 &Total, &ResumeHandle );
3226 if (NetStatus != NERR_Success || Data ==
NULL) {
3227 dwLastError = GetLastError();
3229 p2NetApiBufferFree(Data);
3234 GroupInfo = (LOCALGROUP_INFO_0 *)Data;
3235 for (i=0; i < Total; i++) {
3237 iRetOp = WideCharToMultiByte (
3240 (LPCWSTR)(GroupInfo->lgrpi0_name),
3243 (
int)(
sizeof(szAnsiName)),
3255 p2NetApiBufferFree(Data);
3267 int &groupIdx,
int &memberIdx)
3269 BOOL bRetOp =
FALSE;
3271 DWORD dwSidSize, dwDomainNameSize;
3274 SID_NAME_USE sidType;
3275 PUCHAR puchar_SubAuthCount =
NULL;
3276 SID_IDENTIFIER_AUTHORITY sid_identifier_authority;
3277 PSID_IDENTIFIER_AUTHORITY psid_identifier_authority =
NULL;
3278 unsigned char j = 0;
3279 DWORD dwLastError = 0;
3281 pSid = (PSID)bySidBuffer;
3282 dwSidSize =
sizeof(bySidBuffer);
3283 dwDomainNameSize =
sizeof(szDomainName);
3285 bRetOp = LookupAccountName (
3287 (LPCTSTR)lpszAccountName,
3289 (LPDWORD)&dwSidSize,
3290 (LPTSTR)szDomainName,
3291 (LPDWORD)&dwDomainNameSize,
3292 (PSID_NAME_USE)&sidType );
3294 if (bRetOp ==
FALSE) {
3295 dwLastError = GetLastError();
3299 bRetOp = IsValidSid((PSID)pSid);
3301 if (bRetOp ==
FALSE) {
3302 dwLastError = GetLastError();
3307 psid_identifier_authority = GetSidIdentifierAuthority ((PSID)pSid);
3310 memcpy (&sid_identifier_authority, psid_identifier_authority,
3311 sizeof(SID_IDENTIFIER_AUTHORITY));
3314 puchar_SubAuthCount = (PUCHAR)GetSidSubAuthorityCount((PSID)pSid);
3316 j = (
unsigned char)(*puchar_SubAuthCount);
3318 DWORD dwSubAuth = 0;
3319 PDWORD pdwSubAuth =
NULL;
3321 pdwSubAuth = (PDWORD)GetSidSubAuthority (
3324 dwSubAuth = *pdwSubAuth;
3343 NET_API_STATUS NetStatus = NERR_Success;
3345 DWORD
Index = 0, ResumeHandle = 0, Total = 0, i;
3346 LOCALGROUP_MEMBERS_INFO_1 *MemberInfo;
3347 char szAnsiMemberName[256];
3348 char szFullMemberName[256];
3349 char szMemberHomeDir[256];
3350 WCHAR wszGroupName[256];
3353 DWORD length =
sizeof (act_name);
3354 DWORD dwLastError = 0;
3355 LPUSER_INFO_11 pUI11Buf =
NULL;
3356 NET_API_STATUS nStatus;
3358 iRetOp = MultiByteToWideChar (
3360 (DWORD)MB_PRECOMPOSED,
3361 (LPCSTR)lpszGroupName,
3363 (LPWSTR)wszGroupName,
3364 (
int)
sizeof(wszGroupName) );
3367 dwLastError = GetLastError();
3369 p2NetApiBufferFree(Data);
3373 GetUserName (act_name, &length);
3377 NetStatus = p2NetLocalGroupGetMembers (
NULL, wszGroupName, 1,
3378 &Data, 8192, &Index, &Total, &ResumeHandle );
3380 if (NetStatus != NERR_Success || Data ==
NULL) {
3381 dwLastError = GetLastError();
3383 if (dwLastError == ERROR_ENVVAR_NOT_FOUND) {
3389 NetStatus = p2NetLocalGroupGetMembers (
NULL, wszGroupName, 0,
3390 &Data, 8192, &Index, &Total, &ResumeHandle );
3394 p2NetApiBufferFree(Data);
3398 MemberInfo = (LOCALGROUP_MEMBERS_INFO_1 *)Data;
3399 for (i=0; i < Total; i++) {
3400 iRetOp = WideCharToMultiByte (
3403 (LPCWSTR)(MemberInfo->lgrmi1_name),
3405 (LPSTR)szAnsiMemberName,
3406 (
int)(
sizeof(szAnsiMemberName)),
3411 dwLastError = GetLastError();
3422 TCHAR szUserName[255]=TEXT(
"");
3423 MultiByteToWideChar(CP_ACP, 0, szAnsiMemberName, -1, (LPWSTR)szUserName, 255);
3427 nStatus = p2NetUserGetInfo(NULL, (LPCWSTR)szUserName, 11, (LPBYTE *)&pUI11Buf);
3431 if (nStatus == NERR_Success) {
3432 if (pUI11Buf != NULL) {
3433 wsprintf(szFullMemberName,
"%S",pUI11Buf->usri11_full_name);
3435 wsprintf(szMemberHomeDir,
"%S",pUI11Buf->usri11_home_dir);
3446 if (pUI11Buf != NULL) {
3447 p2NetApiBufferFree(pUI11Buf);
3452 if (getenv(
"SHELL") == NULL)
3453 putenv ((GetVersion () & 0x80000000) ?
"SHELL=command" :
"SHELL=cmd");
3466 p2NetApiBufferFree(Data);
3476 NET_API_STATUS NetStatus = NERR_Success;
3478 DWORD
Index = 0, ResumeHandle = 0, Total = 0, i;
3479 LOCALGROUP_INFO_0 *GroupInfo;
3480 char szAnsiName[256];
3481 DWORD dwLastError = 0;
3482 int iRetOp = 0, iGroupIdx = 0, iMemberIdx = 0;
3484 NetStatus = p2NetLocalGroupEnum(
NULL, 0, &Data, 8192, &Index,
3485 &Total, &ResumeHandle );
3487 if (NetStatus != NERR_Success || Data ==
NULL) {
3488 dwLastError = GetLastError();
3490 p2NetApiBufferFree(Data);
3494 GroupInfo = (LOCALGROUP_INFO_0 *)Data;
3495 for (i=0; i < Total; i++) {
3497 iRetOp = WideCharToMultiByte (
3500 (LPCWSTR)(GroupInfo->lgrpi0_name),
3503 (
int)(
sizeof(szAnsiName)),
3521 p2NetApiBufferFree(Data);
3535 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3538 DWORD length =
sizeof (
name);
3539 if (::GetUserName (name, &length)) {
3540 if (stricmp (
"administrator", name) == 0)
3550 if (!user || !user[0])
3576 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3579 DWORD length =
sizeof (
name);
3580 if (::GetUserName (name, &length)) {
3581 if (stricmp (
"administrator", name) == 0)
3603 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3606 DWORD length =
sizeof (
name);
3607 if (::GetUserName (name, &length)) {
3608 if (stricmp (
"administrator", name) == 0)
3618 if (!group || !group[0])
3621 struct group *grp = 0;
3644 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3647 DWORD length =
sizeof (
name);
3648 if (::GetUserName (name, &length)) {
3649 if (stricmp (
"administrator", name) == 0)
3672 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3674 DWORD length =
sizeof (
name);
3676 if (::GetUserName (name, &length)) {
3678 if (stricmp (
"administrator", name) == 0) {
3680 ug->
fGroup =
"administrators";
3689 ug->
fUser =
"unknown";
3702 for (
int i = 0; i <
fNbUsers; i++) {
3746 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3748 DWORD length =
sizeof (
name);
3750 if (::GetUserName (name, &length)) {
3751 if (stricmp (
"administrator", name) == 0) {
3752 gr->
fGroup =
"administrators";
3767 struct group *grp = 0;
3812 const char *env = ::getenv(name);
3814 if (::_stricmp(name,
"home") == 0 ) {
3816 }
else if (::_stricmp(name,
"rootsys") == 0 ) {
3830 return ::system(shellcmd);
3838 return ::_popen(command, mode);
3846 return ::_pclose(pipe);
3873 gROOT->CloseFiles();
3874 if (
gROOT->GetListOfBrowsers()) {
3881 gROOT->ProcessLine(
TString::Format(
"((TBrowser*)0x%lx)->GetBrowserImp()->GetMainFrame()->CloseWindow();",
3923 static int fd1=0, fd2=0;
3924 static fpos_t pos1=0, pos2=0;
3934 const char *
m = (mode[0] ==
'a' || mode[0] ==
'w') ? mode :
"a";
3947 fgetpos(stdout, &pos1);
3948 fd1 = _dup(fileno(stdout));
3950 if ((fout = freopen(file, m, stdout)) == 0) {
3951 SysError(
"RedirectOutput",
"could not freopen stdout");
3953 _dup2(fd1, fileno(stdout));
3957 fsetpos(stdout, &pos1);
3962 fgetpos(stderr, &pos2);
3963 fd2 = _dup(fileno(stderr));
3964 if ((ferr = freopen(file, m, stderr)) == 0) {
3965 SysError(
"RedirectOutput",
"could not freopen stderr");
3967 _dup2(fd1, fileno(stdout));
3971 fsetpos(stdout, &pos1);
3973 _dup2(fd2, fileno(stderr));
3977 fsetpos(stderr, &pos2);
3982 fseek(fout, 0, SEEK_END);
3983 fseek(ferr, 0, SEEK_END);
3990 if (_dup2(fd1, fileno(stdout))) {
3991 SysError(
"RedirectOutput",
"could not restore stdout");
3997 fsetpos(stdout, &pos1);
4004 if (_dup2(fd2, fileno(stderr))) {
4005 SysError(
"RedirectOutput",
"could not restore stderr");
4011 fsetpos(stderr, &pos2);
4066 if (len > 4 && (!stricmp(sLib.
Data()+len-4,
".dll"))) {
4079 Error(
"DynamicPathName",
4080 "%s does not exist in %s,\nor has wrong file extension (.dll)",
4097 #pragma warning(push) 4098 #pragma warning(disable:4200) 4115 if (!linkedLibs.
IsNull())
4128 HANDLE hFile, hMapping;
4131 if((hFile = CreateFile(exe,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0))==
INVALID_HANDLE_VALUE) {
4135 if(!(hMapping = CreateFileMapping(hFile,0,PAGE_READONLY|SEC_COMMIT,0,0,0))) {
4140 if(!(basepointer = MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0))) {
4141 CloseHandle(hMapping);
4148 IMAGE_DOS_HEADER *dos_head = (IMAGE_DOS_HEADER *)basepointer;
4151 IMAGE_FILE_HEADER _head;
4152 IMAGE_OPTIONAL_HEADER opt_head;
4153 IMAGE_SECTION_HEADER section_header[];
4155 struct header *pheader;
4156 const IMAGE_SECTION_HEADER * section_header;
4158 if(dos_head->e_magic!=
'ZM') {
4163 pheader = (
struct header *)((
char*)dos_head + dos_head->e_lfanew);
4165 if(IsBadReadPtr(pheader,
sizeof(
struct header))) {
4169 if(pheader->signature!=IMAGE_NT_SIGNATURE) {
4170 switch((
unsigned short)pheader->signature) {
4171 case IMAGE_DOS_SIGNATURE:
4174 case IMAGE_OS2_SIGNATURE:
4177 case IMAGE_OS2_SIGNATURE_LE:
4185 #define isin(address,start,length) ((address)>=(start) && (address)<(start)+(length)) 4188 for(sect=0,section_header=pheader->section_header;
4189 sect<pheader->_head.NumberOfSections;sect++,section_header++) {
4191 const void *
const section_data =
4192 (
char*)basepointer + section_header->PointerToRawData;
4193 for(directory=0;directory<IMAGE_NUMBEROF_DIRECTORY_ENTRIES;directory++) {
4194 if(
isin(pheader->opt_head.DataDirectory[directory].VirtualAddress,
4195 section_header->VirtualAddress,
4196 section_header->SizeOfRawData)) {
4197 const IMAGE_IMPORT_DESCRIPTOR *stuff_start =
4198 (IMAGE_IMPORT_DESCRIPTOR *)((
char*)section_data +
4199 (pheader->opt_head.DataDirectory[directory].VirtualAddress -
4200 section_header->VirtualAddress));
4203 const unsigned stuff_length =
4204 pheader->opt_head.DataDirectory[directory].Size;
4205 if(directory == IMAGE_DIRECTORY_ENTRY_IMPORT) {
4206 while(!IsBadReadPtr(stuff_start,
sizeof(*stuff_start)) &&
4207 stuff_start->Name) {
4208 TString dll = (
char*)section_data +
4209 ((DWORD)(stuff_start->Name)) -
4210 section_header->VirtualAddress;
4214 char *winPath = getenv(
"windir");
4215 _splitpath(winPath,winDrive,winDir,winName,winExt);
4216 if(!strstr(dllPath, winDir)) {
4217 if (!linkedLibs.
IsNull())
4219 linkedLibs += dllPath;
4231 UnmapViewOfFile(basepointer);
4232 CloseHandle(hMapping);
4244 #pragma warning(pop) 4270 Ssiz_t start, index, end;
4271 start = index = end = 0;
4273 while ((start < libs.
Length()) && (index !=
kNPOS)) {
4274 index = libs.
Index(separator, &end, start);
4278 s = libs(index, end);
4355 if (mode && t->
IsSync()) {
4359 }
else if (!mode && t->
IsAsync()) {
4377 FILETIME ftFileTime;
4381 ::GetSystemTimeAsFileTime(&ftRealTime.ftFileTime);
4390 OSVERSIONINFO OsVersionInfo;
4399 OsVersionInfo.dwOSVersionInfoSize =
sizeof(OSVERSIONINFO);
4400 GetVersionEx(&OsVersionInfo);
4401 if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) {
4407 FILETIME ftFileTime;
4412 FILETIME ftFileTime;
4416 HANDLE hThread = GetCurrentThread();
4417 ret = GetThreadTimes (hThread, &ftCreate, &ftExit,
4418 &ftKernel.ftFileTime,
4419 &ftUser.ftFileTime);
4421 ret = ::GetLastError();
4422 ::Error(
"GetCPUTime",
" Error on GetProcessTimes 0x%lx", (
int)ret);
4442 static time_t jan95 = 0;
4453 jan95 = mktime(&tp);
4454 if ((
int)jan95 == -1) {
4455 ::SysError(
"TWinNTSystem::Now",
"error converting 950001 0:00 to time_t");
4462 return TTime((now.time-(
Long_t)jan95)*1000 + now.millitm);
4494 rc = WinNTSelect(&rd, &wr, to);
4528 rc = WinNTSelect(&rd, &wr, to);
4550 if ((sp = ::getservbyname(servicename,
kProtocolName)) == 0) {
4551 Error(
"GetServiceByName",
"no service \"%s\" with protocol \"%s\"\n",
4555 return ::ntohs(sp->s_port);
4566 if ((sp = ::getservbyport(::htons(port),
kProtocolName)) == 0) {
4567 return Form(
"%d", port);
4577 struct hostent *host_ptr;
4582 if ((addr = ::inet_addr(hostname)) != INADDR_NONE) {
4584 if ((host_ptr = ::gethostbyaddr((
const char *)&addr,
4585 sizeof(addr), AF_INET))) {
4586 host = host_ptr->h_name;
4590 for (i = 1; host_ptr->h_addr_list[i]; i++) {
4591 memcpy(&addr2, host_ptr->h_addr_list[i], host_ptr->h_length);
4594 for (i = 0; host_ptr->h_aliases[i]; i++)
4595 a.
AddAlias(host_ptr->h_aliases[i]);
4598 host =
"UnNamedHost";
4600 }
else if ((host_ptr = ::gethostbyname(hostname))) {
4602 if (host_ptr->h_addrtype != AF_INET) {
4603 Error(
"GetHostByName",
"%s is not an internet host\n", hostname);
4606 memcpy(&addr, host_ptr->h_addr, host_ptr->h_length);
4607 host = host_ptr->h_name;
4608 type = host_ptr->h_addrtype;
4612 for (i = 1; host_ptr->h_addr_list[i]; i++) {
4613 memcpy(&addr2, host_ptr->h_addr_list[i], host_ptr->h_length);
4616 for (i = 0; host_ptr->h_aliases[i]; i++)
4617 a.
AddAlias(host_ptr->h_aliases[i]);
4620 if (
gDebug > 0)
Error(
"GetHostByName",
"unknown host %s", hostname);
4633 struct sockaddr_in addr;
4634 int len =
sizeof(addr);
4636 if (::getpeername(sock, (
struct sockaddr *)&addr, &len) == SOCKET_ERROR) {
4641 struct hostent *host_ptr;
4642 const char *hostname;
4646 if ((host_ptr = ::gethostbyaddr((
const char *)&addr.sin_addr,
4647 sizeof(addr.sin_addr), AF_INET))) {
4648 memcpy(&iaddr, host_ptr->h_addr, host_ptr->h_length);
4649 hostname = host_ptr->h_name;
4650 family = host_ptr->h_addrtype;
4652 memcpy(&iaddr, &addr.sin_addr,
sizeof(addr.sin_addr));
4657 return TInetAddress(hostname, ::ntohl(iaddr), family, ::ntohs(addr.sin_port));
4666 struct sockaddr_in addr;
4667 int len =
sizeof(addr);
4669 if (::getsockname(sock, (
struct sockaddr *)&addr, &len) == SOCKET_ERROR) {
4674 struct hostent *host_ptr;
4675 const char *hostname;
4679 if ((host_ptr = ::gethostbyaddr((
const char *)&addr.sin_addr,
4680 sizeof(addr.sin_addr), AF_INET))) {
4681 memcpy(&iaddr, host_ptr->h_addr, host_ptr->h_length);
4682 hostname = host_ptr->h_name;
4683 family = host_ptr->h_addrtype;
4685 memcpy(&iaddr, &addr.sin_addr,
sizeof(addr.sin_addr));
4690 return TInetAddress(hostname, ::ntohl(iaddr), family, ::ntohs(addr.sin_port));
4701 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) ==
INVALID_SOCKET) {
4702 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket");
4706 struct sockaddr_in inserver;
4707 memset(&inserver, 0,
sizeof(inserver));
4708 inserver.sin_family = AF_INET;
4709 inserver.sin_addr.s_addr = ::htonl(INADDR_LOOPBACK);
4710 inserver.sin_port = port;
4714 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver)) == SOCKET_ERROR) {
4715 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"bind");
4720 if (::listen(sock, backlog)) {
4721 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"listen");
4733 if (!sockpath || strlen(sockpath) <= 0) {
4734 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket path undefined");
4738 struct sockaddr_in myaddr;
4740 int len =
sizeof myaddr;
4745 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4746 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket");
4750 memset(&myaddr, 0,
sizeof(myaddr));
4751 myaddr.sin_port = 0;
4752 myaddr.sin_family = AF_INET;
4753 myaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4755 rc = bind(sock, (
struct sockaddr *)&myaddr, len);
4757 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"bind");
4760 rc = getsockname(sock, (
struct sockaddr *)&myaddr, &len);
4762 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"getsockname");
4765 TString socketpath = sockpath;
4767 fp = fopen(socketpath,
"wb");
4769 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"fopen");
4772 fprintf(fp,
"%d", myaddr.sin_port);
4776 if (listen(sock, backlog)) {
4777 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"listen");
4789 if (socket == -1)
return;
4793 ::shutdown(sock, 2);
4795 struct linger linger = {0, 0};
4796 ::setsockopt(sock, SOL_SOCKET, SO_LINGER, (
char *) &linger,
sizeof(linger));
4797 while (::
closesocket(sock) == SOCKET_ERROR && WSAGetLastError() == WSAEINTR) {
4811 if (WinNTRecv(sock, &header,
sizeof(header), 0) > 0) {
4812 int count = ::ntohl(header);
4814 if (count > length) {
4815 Error(
"RecvBuf",
"record header exceeds buffer size");
4817 }
else if (count > 0) {
4818 if (WinNTRecv(sock, buf, count, 0) < 0) {
4819 Error(
"RecvBuf",
"cannot receive buffer");
4834 Int_t header = ::htonl(length);
4836 if (WinNTSend(sock, &header,
sizeof(header), 0) < 0) {
4837 Error(
"SendBuf",
"cannot send header");
4841 if (WinNTSend(sock, buf, length, 0) < 0) {
4842 Error(
"SendBuf",
"cannot send buffer");
4882 if ((n = WinNTRecv(sock, buf, length, flag)) <= 0) {
4884 Error(
"RecvRaw",
"cannot receive buffer");
4918 if ((n = WinNTSend(sock, buf, length, flag)) <= 0) {
4919 if (n == -1 &&
GetErrno() != EINTR) {
4920 Error(
"SendRaw",
"cannot send buffer");
4933 if (socket == -1)
return -1;
4938 if (::setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4939 ::SysError(
"SetSockOpt",
"setsockopt(SO_SNDBUF)");
4944 if (::setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4945 ::SysError(
"SetSockOpt",
"setsockopt(SO_RCVBUF)");
4950 if (::setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4951 SysError(
"SetSockOpt",
"setsockopt(SO_OOBINLINE)");
4956 if (::setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4957 ::SysError(
"SetSockOpt",
"setsockopt(SO_KEEPALIVE)");
4962 if (::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4963 ::SysError(
"SetSockOpt",
"setsockopt(SO_REUSEADDR)");
4968 if (::setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4969 ::SysError(
"SetSockOpt",
"setsockopt(TCP_NODELAY)");
4974 if (::ioctlsocket(sock, FIONBIO, &val) == SOCKET_ERROR) {
4981 if (::ioctl(sock, SIOCSPGRP, &val) == -1) {
4982 ::SysError(
"SetSockOpt",
"ioctl(SIOCSPGRP)");
4990 Error(
"SetSockOpt",
"illegal option (%d)", opt);
5002 if (socket == -1)
return -1;
5005 int optlen =
sizeof(*val);
5009 if (::getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)val, &optlen) == SOCKET_ERROR) {
5010 ::SysError(
"GetSockOpt",
"getsockopt(SO_SNDBUF)");
5015 if (::getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)val, &optlen) == SOCKET_ERROR) {
5016 ::SysError(
"GetSockOpt",
"getsockopt(SO_RCVBUF)");
5021 if (::getsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)val, &optlen) == SOCKET_ERROR) {
5022 ::SysError(
"GetSockOpt",
"getsockopt(SO_OOBINLINE)");
5027 if (::getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)val, &optlen) == SOCKET_ERROR) {
5028 ::SysError(
"GetSockOpt",
"getsockopt(SO_KEEPALIVE)");
5033 if (::getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)val, &optlen) == SOCKET_ERROR) {
5034 ::SysError(
"GetSockOpt",
"getsockopt(SO_REUSEADDR)");
5039 if (::getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)val, &optlen) == SOCKET_ERROR) {
5040 ::SysError(
"GetSockOpt",
"getsockopt(TCP_NODELAY)");
5056 if (::ioctlsocket(sock, SIOCGPGRP, (u_long*)val) == SOCKET_ERROR) {
5057 ::SysError(
"GetSockOpt",
"ioctl(SIOCGPGRP)");
5063 if (::ioctlsocket(sock, SIOCATMARK, (u_long*)val) == SOCKET_ERROR) {
5064 ::SysError(
"GetSockOpt",
"ioctl(SIOCATMARK)");
5069 if (::ioctlsocket(sock, FIONREAD, (u_long*)val) == SOCKET_ERROR) {
5075 Error(
"GetSockOpt",
"illegal option (%d)", opt);
5087 int tcpwindowsize,
const char *protocol)
5092 if (!strcmp(servername,
"unix")) {
5096 (servername[1] ==
':' && servername[2] ==
'/')) {
5100 if (!strcmp(protocol,
"udp")){
5107 sport = ::htons(port);
5111 if (!addr.
IsValid())
return -1;
5114 struct sockaddr_in server;
5115 memset(&server, 0,
sizeof(server));
5116 memcpy(&server.sin_addr, &adr,
sizeof(adr));
5118 server.sin_port = sport;
5122 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) ==
INVALID_SOCKET) {
5123 ::SysError(
"TWinNTSystem::WinNTConnectTcp",
"socket");
5127 if (tcpwindowsize > 0) {
5132 if (::connect(sock, (
struct sockaddr*) &server,
sizeof(server)) ==
INVALID_SOCKET) {
5145 struct sockaddr_in myaddr;
5148 memset(&myaddr, 0,
sizeof(myaddr));
5149 myaddr.sin_family = AF_INET;
5150 myaddr.sin_port = port;
5151 myaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
5154 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
5155 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"socket");
5159 while ((connect(sock, (
struct sockaddr *)&myaddr,
sizeof myaddr)) == -1) {
5163 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"connect");
5179 if (!sockpath || strlen(sockpath) <= 0) {
5180 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"socket path undefined");
5183 TString socketpath = sockpath;
5185 fp = fopen(socketpath.
Data(),
"rb");
5187 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"fopen");
5190 fscanf(fp,
"%d", &port);
5193 if (port < 0 || port > 65535) {
5194 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"invalid port");
5212 sport = htons(port);
5215 if (!addr.
IsValid())
return -1;
5218 struct sockaddr_in server;
5219 memset(&server, 0,
sizeof(server));
5220 memcpy(&server.sin_addr, &adr,
sizeof(adr));
5222 server.sin_port = sport;
5226 if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
5227 ::SysError(
"TWinNTSystem::WinNTUdpConnect",
"socket (%s:%d)",
5232 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
5236 ::SysError(
"TWinNTSystem::WinNTUdpConnect",
"connect (%s:%d)",
5254 const char *protocol)
5275 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
5276 short tryport = kSOCKET_MINPORT;
5281 sport = ::htons(port);
5284 if (port == 0 && reuse) {
5285 ::Error(
"TWinNTSystem::WinNTTcpService",
"cannot do a port scan while reuse is true");
5292 sport = ::htons(port);
5297 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) < 0) {
5298 ::SysError(
"TWinNTSystem::WinNTTcpService",
"socket");
5306 if (tcpwindowsize > 0) {
5311 struct sockaddr_in inserver;
5312 memset(&inserver, 0,
sizeof(inserver));
5313 inserver.sin_family = AF_INET;
5314 inserver.sin_addr.s_addr = ::htonl(INADDR_ANY);
5315 inserver.sin_port = sport;
5319 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver)) == SOCKET_ERROR) {
5320 ::SysError(
"TWinNTSystem::WinNTTcpService",
"bind");
5326 inserver.sin_port = ::htons(tryport);
5327 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
5329 }
while (bret == SOCKET_ERROR && WSAGetLastError() == WSAEADDRINUSE &&
5330 tryport < kSOCKET_MAXPORT);
5331 if (bret == SOCKET_ERROR) {
5332 ::SysError(
"TWinNTSystem::WinNTTcpService",
"bind (port scan)");
5338 if (::listen(sock, backlog) == SOCKET_ERROR) {
5339 ::SysError(
"TWinNTSystem::WinNTTcpService",
"listen");
5356 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
5357 short sport, tryport = kSOCKET_MINPORT;
5363 sport = htons(port);
5367 if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
5368 ::SysError(
"TUnixSystem::UnixUdpService",
"socket");
5372 struct sockaddr_in inserver;
5373 memset(&inserver, 0,
sizeof(inserver));
5374 inserver.sin_family = AF_INET;
5375 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
5376 inserver.sin_port = sport;
5380 if (bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
5381 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"bind");
5387 inserver.sin_port = htons(tryport);
5388 bret = bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
5390 }
while (bret == SOCKET_ERROR && WSAGetLastError() == WSAEADDRINUSE &&
5391 tryport < kSOCKET_MAXPORT);
5393 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"bind (port scan)");
5399 if (listen(sock, backlog)) {
5400 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"listen");
5418 (::WSAGetLastError() == WSAEINTR)) {
5423 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
5437 #define SystemBasicInformation 0 5438 #define SystemPerformanceInformation 2 5443 ULONG uKeMaximumIncrement;
5445 ULONG uMmNumberOfPhysicalPages;
5446 ULONG uMmLowestPhysicalPage;
5447 ULONG UMmHighestPhysicalPage;
5448 ULONG uAllocationGranularity;
5449 PVOID pLowestUserAddress;
5450 PVOID pMmHighestUserAddress;
5451 ULONG uKeActiveProcessors;
5452 BYTE bKeNumberProcessors;
5455 } SYSTEM_BASIC_INFORMATION;
5459 LARGE_INTEGER liIdleTime;
5461 } SYSTEM_PERFORMANCE_INFORMATION;
5463 typedef struct _PROCESS_MEMORY_COUNTERS {
5465 DWORD PageFaultCount;
5466 SIZE_T PeakWorkingSetSize;
5467 SIZE_T WorkingSetSize;
5468 SIZE_T QuotaPeakPagedPoolUsage;
5469 SIZE_T QuotaPagedPoolUsage;
5470 SIZE_T QuotaPeakNonPagedPoolUsage;
5471 SIZE_T QuotaNonPagedPoolUsage;
5472 SIZE_T PagefileUsage;
5473 SIZE_T PeakPagefileUsage;
5478 #define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart)) 5486 LARGE_INTEGER ulFreq, ulTicks, ulValue, ulStartCounter;
5490 if (QueryPerformanceFrequency(&ulFreq)) {
5492 QueryPerformanceCounter(&ulTicks);
5495 ulValue.QuadPart = ulTicks.QuadPart + ulFreq.QuadPart/10;
5496 ulStartCounter.QuadPart =
__rdtsc();
5500 QueryPerformanceCounter(&ulTicks);
5501 }
while (ulTicks.QuadPart <= ulValue.QuadPart);
5503 return (DWORD)((
__rdtsc() - ulStartCounter.QuadPart)/100000);
5511 #define SM_SERVERR2 89 5518 OSVERSIONINFOEX osvi;
5521 BOOL bOsVersionInfoEx;
5522 static char *strReturn = 0;
5526 strReturn =
new char[2048];
5530 ZeroMemory(&si,
sizeof(SYSTEM_INFO));
5531 ZeroMemory(&osvi,
sizeof(OSVERSIONINFOEX));
5536 osvi.dwOSVersionInfoSize =
sizeof(OSVERSIONINFOEX);
5538 if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
5540 osvi.dwOSVersionInfoSize =
sizeof (OSVERSIONINFO);
5541 if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
5546 pGNSI = (
PGNSI) GetProcAddress( GetModuleHandle(
"kernel32.dll"),
5547 "GetNativeSystemInfo");
5550 else GetSystemInfo(&si);
5552 switch (osvi.dwPlatformId)
5555 case VER_PLATFORM_WIN32_NT:
5558 if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
5560 if( osvi.wProductType == VER_NT_WORKSTATION )
5561 strlcpy(strReturn,
"Microsoft Windows Vista ",2048);
5562 else strlcpy(strReturn,
"Windows Server \"Longhorn\" " ,2048);
5564 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
5567 strlcpy(strReturn,
"Microsoft Windows Server 2003 \"R2\" ",2048);
5568 else if( osvi.wProductType == VER_NT_WORKSTATION &&
5569 si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
5571 strlcpy(strReturn,
"Microsoft Windows XP Professional x64 Edition ",2048);
5573 else strlcpy(strReturn,
"Microsoft Windows Server 2003, ",2048);
5575 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
5576 strlcpy(strReturn,
"Microsoft Windows XP ",2048);
5578 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
5579 strlcpy(strReturn,
"Microsoft Windows 2000 ",2048);
5581 if ( osvi.dwMajorVersion <= 4 )
5582 strlcpy(strReturn,
"Microsoft Windows NT ",2048);
5585 if( bOsVersionInfoEx )
5588 if ( osvi.wProductType == VER_NT_WORKSTATION &&
5589 si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)
5591 if( osvi.dwMajorVersion == 4 )
5592 strlcat(strReturn,
"Workstation 4.0 ",2048 );
5593 else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
5594 strlcat(strReturn,
"Home Edition " ,2048);
5595 else strlcat(strReturn,
"Professional " ,2048);
5598 else if ( osvi.wProductType == VER_NT_SERVER ||
5599 osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
5601 if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)
5603 if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )
5605 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5606 strlcat(strReturn,
"Datacenter Edition for Itanium-based Systems",2048 );
5607 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5608 strlcat(strReturn,
"Enterprise Edition for Itanium-based Systems" ,2048);
5610 else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
5612 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5613 strlcat(strReturn,
"Datacenter x64 Edition ",2048 );
5614 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5615 strlcat(strReturn,
"Enterprise x64 Edition ",2048 );
5616 else strlcat(strReturn,
"Standard x64 Edition ",2048 );
5620 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5621 strlcat(strReturn,
"Datacenter Edition ",2048 );
5622 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5623 strlcat(strReturn,
"Enterprise Edition ",2048 );
5624 else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
5625 strlcat(strReturn,
"Web Edition " ,2048);
5626 else strlcat(strReturn,
"Standard Edition ",2048 );
5629 else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
5631 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5632 strlcat(strReturn,
"Datacenter Server ",2048 );
5633 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5634 strlcat(strReturn,
"Advanced Server ",2048 );
5635 else strlcat(strReturn,
"Server ",2048 );
5639 if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5640 strlcat(strReturn,
"Server 4.0, Enterprise Edition " ,2048);
5641 else strlcat(strReturn,
"Server 4.0 ",2048 );
5650 DWORD dwBufLen=
BUFSIZE*
sizeof(TCHAR);
5653 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
5654 "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
5655 0, KEY_QUERY_VALUE, &hKey );
5656 if( lRet != ERROR_SUCCESS )
5659 lRet = RegQueryValueEx( hKey,
"ProductType",
NULL,
NULL,
5660 (LPBYTE) szProductType, &dwBufLen);
5661 RegCloseKey( hKey );
5663 if( (lRet != ERROR_SUCCESS) || (dwBufLen >
BUFSIZE*
sizeof(TCHAR)) )
5666 if ( lstrcmpi(
"WINNT", szProductType) == 0 )
5667 strlcat(strReturn,
"Workstation " ,2048);
5668 if ( lstrcmpi(
"LANMANNT", szProductType) == 0 )
5669 strlcat(strReturn,
"Server " ,2048);
5670 if ( lstrcmpi(
"SERVERNT", szProductType) == 0 )
5671 strlcat(strReturn,
"Advanced Server " ,2048);
5672 snprintf(temp,512,
"%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion);
5673 strlcat(strReturn, temp,2048);
5678 if( osvi.dwMajorVersion == 4 &&
5679 lstrcmpi( osvi.szCSDVersion,
"Service Pack 6" ) == 0 )
5685 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
5686 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
5687 0, KEY_QUERY_VALUE, &hKey );
5688 if( lRet == ERROR_SUCCESS ) {
5689 snprintf(temp, 512,
"Service Pack 6a (Build %d)", osvi.dwBuildNumber & 0xFFFF );
5690 strlcat(strReturn, temp,2048 );
5694 snprintf(temp,512,
"%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
5695 strlcat(strReturn, temp,2048 );
5698 RegCloseKey( hKey );
5702 snprintf(temp, 512,
"%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
5703 strlcat(strReturn, temp,2048 );
5709 case VER_PLATFORM_WIN32_WINDOWS:
5711 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
5713 strlcpy(strReturn,
"Microsoft Windows 95 ",2048);
5714 if (osvi.szCSDVersion[1]==
'C' || osvi.szCSDVersion[1]==
'B')
5715 strlcat(strReturn,
"OSR2 " ,2048);
5718 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
5720 strlcpy(strReturn,
"Microsoft Windows 98 ",2048);
5721 if ( osvi.szCSDVersion[1]==
'A' || osvi.szCSDVersion[1]==
'B')
5722 strlcat(strReturn,
"SE ",2048 );
5725 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
5727 strlcpy(strReturn,
"Microsoft Windows Millennium Edition",2048);
5731 case VER_PLATFORM_WIN32s:
5732 strlcpy(strReturn,
"Microsoft Win32s",2048);
5743 unsigned nHighestFeatureEx;
5747 nHighestFeatureEx = (unsigned)nBuff[0];
5749 if (nHighestFeatureEx >= 0x80000006) {
5751 return (((
unsigned)nBuff[2])>>16);
5761 SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
5762 SYSTEM_INFO sysInfo;
5763 MEMORYSTATUSEX statex;
5764 OSVERSIONINFO OsVersionInfo;
5766 char szKeyValueString[80];
5767 DWORD szKeyValueDword;
5772 NtQuerySystemInformation = (
PROCNTQSI)GetProcAddress(
5773 GetModuleHandle(
"ntdll"),
"NtQuerySystemInformation");
5775 if (!NtQuerySystemInformation) {
5777 "Error on GetProcAddress(NtQuerySystemInformation)");
5782 &SysPerfInfo,
sizeof(SysPerfInfo),
5784 OsVersionInfo.dwOSVersionInfoSize =
sizeof(OSVERSIONINFO);
5785 GetVersionEx(&OsVersionInfo);
5786 GetSystemInfo(&sysInfo);
5787 statex.dwLength =
sizeof(statex);
5788 if (!GlobalMemoryStatusEx(&statex)) {
5789 ::Error(
"GetWinNTSysInfo",
"Error on GlobalMemoryStatusEx()");
5792 sysinfo->
fCpus = sysInfo.dwNumberOfProcessors;
5801 status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System",
5802 0, KEY_QUERY_VALUE, &hKey);
5803 if (status == ERROR_SUCCESS) {
5804 dwBufLen =
sizeof(szKeyValueString);
5805 RegQueryValueEx(hKey,
"Identifier",
NULL,
NULL,(LPBYTE)szKeyValueString,
5807 sysinfo->
fModel = szKeyValueString;
5810 status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
5811 "Hardware\\Description\\System\\CentralProcessor\\0",
5812 0, KEY_QUERY_VALUE, &hKey);
5813 if (status == ERROR_SUCCESS) {
5814 dwBufLen =
sizeof(szKeyValueString);
5815 status = RegQueryValueEx(hKey,
"ProcessorNameString",
NULL,
NULL,
5816 (LPBYTE)szKeyValueString, &dwBufLen);
5817 if (status == ERROR_SUCCESS)
5818 sysinfo->
fCpuType = szKeyValueString;
5819 dwBufLen =
sizeof(DWORD);
5820 status = RegQueryValueEx(hKey,
"~MHz",
NULL,
NULL,(LPBYTE)&szKeyValueDword,
5822 if ((status == ERROR_SUCCESS) && ((sysinfo->
fCpuSpeed <= 0) ||
5823 (sysinfo->
fCpuSpeed < (szKeyValueDword >> 1))))
5837 SYSTEM_INFO sysInfo;
5838 Float_t idle_ratio, kernel_ratio, user_ratio, total_ratio;
5839 FILETIME ft_sys_idle, ft_sys_kernel, ft_sys_user, ft_fun_time;
5840 SYSTEMTIME st_fun_time;
5842 ULARGE_INTEGER ul_sys_idle, ul_sys_kernel, ul_sys_user;
5843 static ULARGE_INTEGER ul_sys_idleold = {0, 0};
5844 static ULARGE_INTEGER ul_sys_kernelold = {0, 0};
5845 static ULARGE_INTEGER ul_sys_userold = {0, 0};
5846 ULARGE_INTEGER ul_sys_idle_diff, ul_sys_kernel_diff, ul_sys_user_diff;
5848 ULARGE_INTEGER ul_fun_time;
5849 ULARGE_INTEGER ul_fun_timeold = {0, 0};
5850 ULARGE_INTEGER ul_fun_time_diff;
5852 typedef BOOL (__stdcall *GetSystemTimesProc)( LPFILETIME lpIdleTime,
5853 LPFILETIME lpKernelTime, LPFILETIME lpUserTime );
5854 static GetSystemTimesProc pGetSystemTimes = 0;
5856 HMODULE hModImagehlp = LoadLibrary(
"Kernel32.dll" );
5857 if (!hModImagehlp) {
5858 ::Error(
"GetWinNTCpuInfo",
"Error on LoadLibrary(Kernel32.dll)");
5862 pGetSystemTimes = (GetSystemTimesProc) GetProcAddress( hModImagehlp,
5864 if (!pGetSystemTimes) {
5865 ::Error(
"GetWinNTCpuInfo",
"Error on GetProcAddress(GetSystemTimes)");
5868 GetSystemInfo(&sysInfo);
5871 pGetSystemTimes(&ft_sys_idle,&ft_sys_kernel,&ft_sys_user);
5872 GetSystemTime(&st_fun_time);
5873 SystemTimeToFileTime(&st_fun_time,&ft_fun_time);
5875 memcpy(&ul_sys_idle, &ft_sys_idle,
sizeof(FILETIME));
5876 memcpy(&ul_sys_kernel, &ft_sys_kernel,
sizeof(FILETIME));
5877 memcpy(&ul_sys_user, &ft_sys_user,
sizeof(FILETIME));
5878 memcpy(&ul_fun_time, &ft_fun_time,
sizeof(FILETIME));
5880 ul_sys_idle_diff.QuadPart = ul_sys_idle.QuadPart -
5881 ul_sys_idleold.QuadPart;
5882 ul_sys_kernel_diff.QuadPart = ul_sys_kernel.QuadPart -
5883 ul_sys_kernelold.QuadPart;
5884 ul_sys_user_diff.QuadPart = ul_sys_user.QuadPart -
5885 ul_sys_userold.QuadPart;
5887 ul_fun_time_diff.QuadPart = ul_fun_time.QuadPart -
5888 ul_fun_timeold.QuadPart;
5890 ul_sys_idleold.QuadPart = ul_sys_idle.QuadPart;
5891 ul_sys_kernelold.QuadPart = ul_sys_kernel.QuadPart;
5892 ul_sys_userold.QuadPart = ul_sys_user.QuadPart;
5894 if (ul_fun_timeold.QuadPart == 0) {
5896 ul_fun_timeold.QuadPart = ul_fun_time.QuadPart;
5899 ul_fun_timeold.QuadPart = ul_fun_time.QuadPart;
5907 idle_ratio /= (
Float_t)sysInfo.dwNumberOfProcessors;
5908 user_ratio /= (
Float_t)sysInfo.dwNumberOfProcessors;
5909 kernel_ratio /= (
Float_t)sysInfo.dwNumberOfProcessors;
5910 total_ratio = 100.0 - idle_ratio;
5915 cpuinfo->
fUser = user_ratio;
5916 cpuinfo->
fSys = kernel_ratio;
5917 cpuinfo->
fTotal = total_ratio;
5918 cpuinfo->
fIdle = idle_ratio;
5927 MEMORYSTATUSEX statex;
5928 statex.dwLength =
sizeof(statex);
5929 if (!GlobalMemoryStatusEx(&statex)) {
5930 ::Error(
"GetWinNTMemInfo",
"Error on GlobalMemoryStatusEx()");
5933 used = (
Long64_t)(statex.ullTotalPhys - statex.ullAvailPhys);
5934 free = (
Long64_t) statex.ullAvailPhys;
5935 total = (
Long64_t) statex.ullTotalPhys;
5941 swap_total = (
Long64_t)(statex.ullTotalPageFile - statex.ullTotalPhys);
5942 swap_avail = (
Long64_t)(statex.ullAvailPageFile - statex.ullAvailPhys);
5943 swap_used = swap_total - swap_avail;
5956 FILETIME starttime, exittime, kerneltime, usertime;
5957 timeval ru_stime, ru_utime;
5960 typedef BOOL (__stdcall *GetProcessMemoryInfoProc)( HANDLE Process,
5962 static GetProcessMemoryInfoProc pGetProcessMemoryInfo = 0;
5964 HMODULE hModImagehlp = LoadLibrary(
"Psapi.dll" );
5965 if (!hModImagehlp) {
5966 ::Error(
"GetWinNTProcInfo",
"Error on LoadLibrary(Psapi.dll)");
5970 pGetProcessMemoryInfo = (GetProcessMemoryInfoProc) GetProcAddress(
5971 hModImagehlp,
"GetProcessMemoryInfo" );
5972 if (!pGetProcessMemoryInfo) {
5974 "Error on GetProcAddress(GetProcessMemoryInfo)");
5978 if ( pGetProcessMemoryInfo( GetCurrentProcess(), &pmc,
sizeof(pmc)) ) {
5982 if ( GetProcessTimes(GetCurrentProcess(), &starttime, &exittime,
5983 &kerneltime, &usertime)) {
5986 memcpy(&li, &kerneltime,
sizeof(FILETIME));
5988 ru_stime.tv_sec = li.QuadPart / 1000000
L;
5989 ru_stime.tv_usec = li.QuadPart % 1000000
L;
5991 memcpy(&li, &usertime,
sizeof(FILETIME));
5993 ru_utime.tv_sec = li.QuadPart / 1000000
L;
5994 ru_utime.tv_usec = li.QuadPart % 1000000
L;
5997 ((
Float_t)(ru_utime.tv_usec) / 1000000.);
5999 ((
Float_t)(ru_stime.tv_usec) / 1000000.);
6010 if (!info)
return -1;
6022 if (!info)
return -1;
6033 if (!info)
return -1;
6044 if (!info)
return -1;
Int_t GetGid(const char *group=0)
Returns the group's id. If group = 0, returns current user's group.
void DispatchOneEvent(Bool_t pendingOnly=kFALSE)
Dispatch a single event in TApplication::Run() loop.
void(* SigHandler_t)(ESignals)
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
const TCHAR c_szColonSlash[]
const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual void SysError(const char *method, const char *msgfmt,...) const
Issue system error message.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
int GetSockOpt(int sock, int opt, int *val)
Get socket option.
FILE * OpenPipe(const char *shellcmd, const char *mode)
Open a pipe.
double read(const std::string &file_name)
reading
static void GetWinNTProcInfo(ProcInfo_t *procinfo)
Get process info for this process on Windows NT.
virtual void SetWriteReady()
Int_t GetEffectiveGid()
Returns the effective group id.
static void __cpuid(int *cpuid_data, int)
UserGroup_t * GetUserInfo(Int_t uid)
Returns all user info in the UserGroup_t structure.
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
const char * HomeDirectory(const char *userName=0)
Return the user's home directory.
virtual Bool_t Notify()
Notify when event occurred on descriptor associated with this handler.
int RecvRaw(int sock, void *buffer, int length, int flag)
Receive exactly length bytes into buffer.
const char * HostName()
Return the system's host name.
WIN32_FIND_DATA fFindFileData
virtual Bool_t IsPathLocal(const char *path)
Returns TRUE if the url in 'path' points to the local file system.
void SetDynamicPath(const char *path)
Set the dynamic path to a new value.
const char * TempDirectory() const
Return a user configured or systemwide directory to create temporary files in.
R__EXTERN Int_t gErrorIgnoreLevel
static DWORD GetCPUSpeed()
Calculate the CPU clock speed using the 'rdtsc' instruction.
int Link(const char *from, const char *to)
Create a link from file1 to file2.
virtual void StackTrace()
Print a stack trace.
const char * GetError()
Return system error string.
BOOL PathIsUNC(LPCTSTR pszPath)
Returns TRUE if the given string is a UNC path.
Bool_t EqualTo(const char *cs, ECaseCompare cmp=kExact) const
const char * GetLinkedLibraries()
Get list of shared libraries loaded at the start of the executable.
#define INVALID_HANDLE_VALUE
int Unlink(const char *name)
Unlink, i.e. remove, a file or directory.
HANDLE GetProcess()
Get current process handle.
TTime Now()
Get current time in milliseconds since 0:00 Jan 1 1995.
void CloseConnection(int sock, Bool_t force=kFALSE)
Close socket.
std::string GetWorkingDirectory() const
Return the working directory for the default drive.
int CopyFile(const char *from, const char *to, Bool_t overwrite=kFALSE)
Copy a file.
void * _ReturnAddress(void)
RooArgList L(const RooAbsArg &v1)
const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
This class represents a WWW compatible URL.
TString & ReplaceAll(const TString &s1, const TString &s2)
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
std::string GetHomeDirectory(const char *userName=0) const
Return the user's home directory.
const char * GetProtocol() const
static char * GetWindowsVersion()
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
void AddDynamicPath(const char *dir)
Add a new directory to the dynamic path.
TTimer * RemoveTimer(TTimer *ti)
Remove timer from list of system timers.
This class represents an Internet Protocol (IP) address.
virtual int MakeDirectory(const char *name)
Make a directory.
int GetPathInfo(const char *path, FileStat_t &buf)
Get info about a file.
virtual void AddSignalHandler(TSignalHandler *sh)
Add a signal handler to list of system signal handlers.
Regular expression class.
int Umask(Int_t mask)
Set the process file creation mode mask.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
char * GetServiceByPort(int port)
Get name of internet service.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
int SendRaw(int sock, const void *buffer, int length, int flag)
Send exactly length bytes from buffer.
TSeqCollection * fSignalHandler
void(WINAPI * PGNSI)(LPSYSTEM_INFO)
void IgnoreSignal(ESignals sig, Bool_t ignore=kTRUE)
If ignore is true ignore the specified signal, else restore previous behaviour.
virtual TTimer * RemoveTimer(TTimer *t)
Remove timer from list of system timers.
Bool_t IsAbsoluteFileName(const char *dir)
Return true if dir is an absolute pathname.
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
void Break(const char *location, const char *msgfmt,...)
Bool_t CheckDescriptors()
Check if there is activity on some file descriptors and call their Notify() member.
const char * DirName(const char *pathname)
Return the directory name in pathname.
static void ThreadStub(void *Parameter)
virtual void ResetReadyMask()
TString & Prepend(const char *cs)
R__EXTERN TApplication * gApplication
Basic time type with millisecond precision.
int ClosePipe(FILE *pipe)
Close the pipe.
Bool_t IsPathLocal(const char *path)
Returns TRUE if the url in 'path' points to the local file system.
Int_t GetEffectiveUid()
Returns the effective user id.
const char * kProtocolName
virtual TFileHandler * RemoveFileHandler(TFileHandler *fh)
Remove a file handler from the list of file handlers.
void NotifyApplicationCreated()
Hook to tell TSystem that the TApplication object has been created.
void SysError(const char *location, const char *msgfmt,...)
virtual Bool_t HandleTermInput()
virtual const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
Bool_t DispatchTimers(Bool_t mode)
Handle and dispatch timers.
TString & Replace(Ssiz_t pos, Ssiz_t n, const char *s)
static Int_t GetErrno()
Static function returning system error number.
Int_t GetSysInfo(SysInfo_t *info) const
Returns static system info, like OS type, CPU type, number of CPUs RAM size, etc into the SysInfo_t s...
void Abort(int code=0)
Abort the application.
static int GetL2CacheSize()
Use assembly to retrieve the L2 cache information ...
void AddSignalHandler(TSignalHandler *sh)
Add a signal handler to list of system signal handlers.
virtual Bool_t Notify()
Notify when signal occurs.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual int Unlink(const char *name)
Unlink, i.e. remove, a file.
Bool_t ChangeDirectory(const char *path)
Change directory.
Int_t GetCpuInfo(CpuInfo_t *info, Int_t sampleTime=1000) const
Returns cpu load average and load info into the CpuInfo_t structure.
static int WinNTUnixConnect(int port)
Connect to a Unix domain socket.
BOOL PathIsRoot(LPCTSTR pPath)
check if a path is a root
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString...
TSignalHandler * RemoveSignalHandler(TSignalHandler *sh)
Remove a signal handler from list of signal handlers.
Int_t SetFPEMask(Int_t mask=kDefaultMask)
Set which conditions trigger a floating point exception.
int AcceptConnection(int sock)
Accept a connection.
static Bool_t Initialized()
Return kTRUE if the TROOT object has been initialized.
static const char * DynamicPath(const char *newpath=0, Bool_t reset=kFALSE)
Get shared library search path. Static utility function.
const char * FindDynamicLibrary(TString &lib, Bool_t quiet=kFALSE)
Returns and updates sLib to the path of a dynamic library (searches for library in the dynamic librar...
int GetPid()
Get process id.
TObject * Next()
Return next object in collection.
R__EXTERN TFileHandler * gXDisplay
Int_t fNfd
Signals that were trapped.
void AddTimer(TTimer *ti)
Add timer to list of system timers.
virtual const char * Getenv(const char *env)
Get environment variable.
TString & Append(const char *cs)
std::vector< std::vector< double > > Data
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
virtual void ExitLoop()
Exit from event loop.
struct _PROCESS_MEMORY_COUNTERS PROCESS_MEMORY_COUNTERS
Ssiz_t First(char c) const
Find first occurrence of a character c.
const char * WorkingDirectory()
Return the working directory for the default drive.
LONG(WINAPI * PROCNTQSI)(UINT, PVOID, ULONG, PULONG)
int GetServiceByName(const char *service)
Get port # of internet service.
virtual TInetAddress GetHostByName(const char *server)
Get Internet Protocol (IP) address of host.
int OpenConnection(const char *server, int port, int tcpwindowsize=-1, const char *protocol="tcp")
Open a connection to a service on a server.
void Error(const char *location, const char *msgfmt,...)
const char * GetDynamicPath()
Return the dynamic path (used to find shared libraries).
TSeqCollection * fFileHandler
TString & GetLastErrorString()
Return the thread local storage for the custom last error message.
struct _PROCESS_MEMORY_COUNTERS * PPROCESS_MEMORY_COUNTERS
Bool_t InitUsersGroups()
Collect local users and groups accounts information.
static void SigHandler(ESignals sig)
Unix signal handler.
virtual ~TWinNTSystem()
dtor
int MakeDirectory(const char *name)
Make a WinNT file system directory.
Using a TBrowser one can browse all ROOT objects.
virtual Bool_t WriteNotify()
Notify when something can be written to the descriptor associated with this handler.
const char * GetDirEntry(void *dirp)
Returns the next directory entry.
R__EXTERN const char * gProgName
static int WinNTUdpConnect(const char *hostname, int port)
Creates a UDP socket connection Is called via the TSocket constructor.
Bool_t Init()
Initialize WinNT system interface.
static void sighandler(int sig)
Call the signal handler associated with the signal.
void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
virtual Bool_t HasWriteInterest()
True if handler is interested in write events.
const char * BaseName(const char *name)
Base name of a file name.
Bool_t ProcessEvents()
process pending events, i.e. DispatchOneEvent(kTRUE)
virtual Bool_t Init()
Initialize the OS interface.
R__EXTERN TSystem * gSystem
Int_t GetFPEMask()
Return the bitmap of conditions that trigger a floating point exception.
virtual const char * GetLibraries(const char *regexp="", const char *option="", Bool_t isRegexp=kTRUE)
Return a space separated list of loaded shared libraries.
#define SystemPerformanceInformation
UInt_t GetAddress() const
virtual Int_t GetValue(const char *name, Int_t dflt)
Returns the integer value for a resource.
int ConnectService(const char *servername, int port, int tcpwindowsize, const char *protocol="tcp")
Connect to service servicename on server servername.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
static int push(struct mg_context *ctx, FILE *fp, SOCKET sock, SSL *ssl, const char *buf, int len, double timeout)
virtual void SetReadReady()
virtual Long_t NextTimeOut(Bool_t mode)
Time when next timer of mode (synchronous=kTRUE or asynchronous=kFALSE) will time-out (in ms)...
void AddFileHandler(TFileHandler *fh)
Add a file handler to the list of system file handlers.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
#define isin(address, start, length)
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
char * Form(const char *fmt,...)
void Exit(int code, Bool_t mode=kTRUE)
Exit the application.
int Utime(const char *file, Long_t modtime, Long_t actime)
Set a files modification and access times.
ESignals GetSignal() const
void ResetSignal(ESignals sig, Bool_t reset=kTRUE)
If reset is true reset the signal handler for the specified signal to the default handler...
static const char * StripOffProto(const char *path, const char *proto)
struct passwd * fPasswords
const char * UnixPathName(const char *unixpathname)
Convert a pathname to a unix pathname.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
static void GetWinNTSysInfo(SysInfo_t *sysinfo)
Get system info for Windows NT.
Handles synchronous and a-synchronous timer events.
Bool_t CheckTimer(const TTime &now)
Check if timer timed out.
void DoBeep(Int_t freq=-1, Int_t duration=-1) const
Beep.
void ResetSignals()
Reset signals handlers to previous behaviour.
static void GetWinNTCpuInfo(CpuInfo_t *cpuinfo, Int_t sampleTime)
Get CPU stat for Window.
void DispatchSignals(ESignals sig)
Handle and dispatch signals.
void AddAlias(const char *alias)
Add alias to list of aliases.
virtual void FreeDirectory(void *dirp)
Free a directory.
const char * GetLibraries(const char *regexp="", const char *option="", Bool_t isRegexp=kTRUE)
Return a space separated list of loaded shared libraries.
const char DriveName(const char *pathname="/")
Return the drive letter in pathname.
char * StrDup(const char *str)
Duplicate the string str.
void ExitLoop()
Exit from event loop.
virtual int SetSockOpt(int sock, int kind, int val)
Set socket option.
int Exec(const char *shellcmd)
Execute a command.
UserGroup_t * GetGroupInfo(Int_t gid)
Returns all group info in the UserGroup_t structure.
static unsigned int total
TString & Remove(Ssiz_t pos)
RooCmdArg Index(RooCategory &icat)
int SendBuf(int sock, const void *buffer, int length)
Send a buffer headed by a length indicator.
virtual TSignalHandler * RemoveSignalHandler(TSignalHandler *sh)
Remove a signal handler from list of signal handlers.
TFdSet * fReadready
Files that should be checked for write events.
void AddAddress(UInt_t addr)
Add alternative address to list of addresses.
R__EXTERN const char * gProgPath
void Copy(void *source, void *dest)
static const double x1[5]
TString & Swap(TString &other)
int AnnounceTcpService(int port, Bool_t reuse, int backlog, int tcpwindowsize=-1)
Announce TCP/IP service.
R__EXTERN TWin32SplashThread * gSplash
Ssiz_t Last(char c) const
Find last occurrence of a character c.
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
int AnnounceUnixService(int port, int backlog)
Announce unix domain service.
int RecvBuf(int sock, void *buffer, int length)
Receive a buffer headed by a length indicator.
int Chmod(const char *file, UInt_t mode)
Set the file permission bits.
virtual const char * ExpandFileName(const char *fname)
Expand a pathname getting rid of special shell characters like ~.
double func(double *x, double *p)
int AnnounceUdpService(int port, int backlog)
Announce UDP service.
void TimerThread()
Special Thread to check asynchronous timers.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TFdSet * fSignals
Files with writes waiting.
void Beep(Int_t freq=-1, Int_t duration=-1, Bool_t setDefault=kFALSE)
Beep for duration milliseconds with a tone of frequency freq.
__inline BOOL DBL_BSLASH(LPCTSTR psz)
Inline function to check for a double-backslash at the beginning of a string.
int Symlink(const char *from, const char *to)
Create a symlink from file1 to file2.
void Gl_setwidth(int width)
void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
void FillWithHomeDirectory(const char *userName, char *mydir) const
Fill buffer with user's home directory.
int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
int mkdir(const char *name, Bool_t recursive=kFALSE)
Make a file system directory.
TInetAddress GetPeerName(int sock)
Get Internet Protocol (IP) address of remote host and port #.
TFileHandler * RemoveFileHandler(TFileHandler *fh)
Remove a file handler from the list of file handlers.
Bool_t ExpandPathName(TString &patbuf)
Expand a pathname getting rid of special shell characaters like ~.$, etc.
void Throw(int code)
If an exception context has been set (using the TRY and RETRY macros) jump back to where it was set...
void FreeDirectory(void *dirp)
Close a WinNT file system directory.
Int_t Select(TList *active, Long_t timeout)
Select on file descriptors. The timeout to is in millisec.
int SetSockOpt(int sock, int opt, int val)
Set socket option.
TInetAddress GetSockName(int sock)
Get Internet Protocol (IP) address of host and port #.
typedef void((*Func_t)())
Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
TInetAddress GetHostByName(const char *server)
Get Internet Protocol (IP) address of host.
Bool_t CountMembers(const char *lpszGroupName)
Bool_t(* ThreadMsgFunc_t)(MSG *)
Int_t GetUid(const char *user=0)
Returns the user's id. If user = 0, returns current user's id.
virtual void Add(TObject *obj)
virtual void AddTimer(TTimer *t)
Add timer to list of system timers.
R__EXTERN const char * gRootDir
Int_t GetProcInfo(ProcInfo_t *info) const
Returns cpu and memory used by this process into the ProcInfo_t structure.
virtual void Exit(int code, Bool_t mode=kTRUE)
Exit the application.
int SetNonBlock(int fd)
Make descriptor fd non-blocking.
int GetFsInfo(const char *path, Long_t *id, Long_t *bsize, Long_t *blocks, Long_t *bfree)
Get info about a file system: id, bsize, bfree, blocks.
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
FILE * TempFileName(TString &base, const char *dir=0)
Create a secure temporary file by appending a unique 6 letter string to base.
Long_t LookupSID(const char *lpszAccountName, int what, int &groupIdx, int &memberIdx)
Take the name and look up a SID so that we can get full domain/user information.
virtual void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
Iterator of ordered collection.
virtual Bool_t ReadNotify()
Notify when something can be read from the descriptor associated with this handler.
Bool_t CollectMembers(const char *lpszGroupName, int &groupIdx, int &memberIdx)
TSystem * FindHelper(const char *path, void *dirptr=0)
Create helper TSystem to handle file and directory operations that might be special for remote file a...
virtual void AddFileHandler(TFileHandler *fh)
Add a file handler to the list of system file handlers.
static void ResetErrno()
Static function resetting system error number.
void SetProgname(const char *name)
Set the application name (from command line, argv[0]) and copy it in gProgName.
Bool_t CheckSignals(Bool_t sync)
Check if some signals were raised and call their Notify() member.
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
void Setenv(const char *name, const char *value)
Set environment variable.
TFdSet * fWriteready
Files with reads waiting.
TList * GetVolumes(Option_t *opt="") const
Get list of volumes (drives) mounted on the system.
static void GetWinNTMemInfo(MemInfo_t *meminfo)
Get VM stat for Windows NT.
virtual Int_t GetSize() const
Abstract base class defining a generic interface to the underlying Operating System.
TFdSet * fWritemask
Files that should be checked for read events.
Int_t GetMemInfo(MemInfo_t *info) const
Returns ram and swap memory usage info into the MemInfo_t structure.
void StackTrace()
Print a stack trace, if gEnv entry "Root.Stacktrace" is unset or 1, and if the image helper functions...
const char * Getenv(const char *name)
Get environment variable.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
void SetGUIThreadMsgHandler(ThreadMsgFunc_t func)
Set the (static part of) the event handler func for GUI messages.
Int_t RedirectOutput(const char *name, const char *mode="a", RedirectHandle_t *h=0)
Redirect standard output (stdout, stderr) to the specified file.
int Rename(const char *from, const char *to)
Rename a file. Returns 0 when successful, -1 in case of failure.
virtual Bool_t HasReadInterest()
True if handler is interested in read events.
const char * Data() const