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 ==
"") {
371 dynpath = path; dynpath +=
";"; dynpath += rdynpath;
389 if (signal_map[i].code == sig) {
390 (*signal_map[i].handler)((
ESignals)i);
401 signal_map[sig].handler = handler;
402 if (signal_map[sig].code != -1)
409 static char *WinNTSigname(
ESignals sig)
411 return signal_map[sig].signame;
417 static BOOL ConsoleSigHandler(DWORD sig)
425 Break(
"TInterruptHandler::Notify",
"keyboard interrupt");
431 case CTRL_BREAK_EVENT:
432 case CTRL_LOGOFF_EVENT:
433 case CTRL_SHUTDOWN_EVENT:
434 case CTRL_CLOSE_EVENT:
436 printf(
"\n *** Break *** keyboard interrupt - ROOT is terminated\n");
442 static CONTEXT *fgXcptContext = 0;
456 LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS pXcp)
458 fgXcptContext = pXcp->ContextRecord;
460 return EXCEPTION_CONTINUE_SEARCH;
464 #pragma intrinsic(_ReturnAddress) 465 #pragma auto_inline(off) 466 DWORD_PTR GetProgramCounter()
471 #pragma auto_inline(on) 482 static DWORD WINAPI GUIThreadMessageProcessingLoop(
void *p)
487 ::PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
492 if (gGlobalEvent) ::SetEvent(gGlobalEvent);
493 erret = ::GetMessage(&msg, NULL, NULL, NULL);
494 if (erret <= 0) endLoop =
kTRUE;
495 if (gGUIThreadMsgFunc)
496 endLoop = (*gGUIThreadMsgFunc)(&msg);
503 erret = ::GetLastError();
504 Error(
"MsgLoop",
"Error in GetMessage");
518 typedef BOOL (__stdcall *SYMINITIALIZEPROC)( HANDLE, LPSTR, BOOL );
519 typedef BOOL (__stdcall *SYMCLEANUPPROC)( HANDLE );
520 typedef BOOL (__stdcall *STACKWALK64PROC)
521 ( DWORD, HANDLE, HANDLE, LPSTACKFRAME64, LPVOID,
522 PREAD_PROCESS_MEMORY_ROUTINE,PFUNCTION_TABLE_ACCESS_ROUTINE,
523 PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE );
524 typedef LPVOID (__stdcall *SYMFUNCTIONTABLEACCESS64PROC)( HANDLE, DWORD64 );
525 typedef DWORD (__stdcall *SYMGETMODULEBASE64PROC)( HANDLE, DWORD64 );
526 typedef BOOL (__stdcall *SYMGETMODULEINFO64PROC)(HANDLE, DWORD64, PIMAGEHLP_MODULE64);
527 typedef BOOL (__stdcall *SYMGETSYMFROMADDR64PROC)( HANDLE, DWORD64, PDWORD64, PIMAGEHLP_SYMBOL64);
528 typedef BOOL (__stdcall *SYMGETLINEFROMADDR64PROC)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64);
529 typedef DWORD (__stdcall *UNDECORATESYMBOLNAMEPROC)(PCSTR, PSTR, DWORD, DWORD);
532 static SYMINITIALIZEPROC _SymInitialize = 0;
533 static SYMCLEANUPPROC _SymCleanup = 0;
534 static STACKWALK64PROC _StackWalk64 = 0;
535 static SYMFUNCTIONTABLEACCESS64PROC _SymFunctionTableAccess64 = 0;
536 static SYMGETMODULEBASE64PROC _SymGetModuleBase64 = 0;
537 static SYMGETMODULEINFO64PROC _SymGetModuleInfo64 = 0;
538 static SYMGETSYMFROMADDR64PROC _SymGetSymFromAddr64 = 0;
539 static SYMGETLINEFROMADDR64PROC _SymGetLineFromAddr64 = 0;
540 static UNDECORATESYMBOLNAMEPROC _UnDecorateSymbolName = 0;
542 BOOL InitImagehlpFunctions()
550 HMODULE hModImagehlp = LoadLibrary(
"IMAGEHLP.DLL" );
554 _SymInitialize = (SYMINITIALIZEPROC) GetProcAddress( hModImagehlp,
"SymInitialize" );
558 _SymCleanup = (SYMCLEANUPPROC) GetProcAddress( hModImagehlp,
"SymCleanup" );
562 _StackWalk64 = (STACKWALK64PROC) GetProcAddress( hModImagehlp,
"StackWalk64" );
566 _SymFunctionTableAccess64 = (SYMFUNCTIONTABLEACCESS64PROC) GetProcAddress(hModImagehlp,
"SymFunctionTableAccess64" );
567 if (!_SymFunctionTableAccess64)
570 _SymGetModuleBase64=(SYMGETMODULEBASE64PROC)GetProcAddress(hModImagehlp,
"SymGetModuleBase64");
571 if (!_SymGetModuleBase64)
574 _SymGetModuleInfo64=(SYMGETMODULEINFO64PROC)GetProcAddress(hModImagehlp,
"SymGetModuleInfo64");
575 if (!_SymGetModuleInfo64)
578 _SymGetSymFromAddr64=(SYMGETSYMFROMADDR64PROC)GetProcAddress(hModImagehlp,
"SymGetSymFromAddr64");
579 if (!_SymGetSymFromAddr64)
582 _SymGetLineFromAddr64=(SYMGETLINEFROMADDR64PROC)GetProcAddress(hModImagehlp,
"SymGetLineFromAddr64");
583 if (!_SymGetLineFromAddr64)
586 _UnDecorateSymbolName=(UNDECORATESYMBOLNAMEPROC)GetProcAddress(hModImagehlp,
"UnDecorateSymbolName");
587 if (!_UnDecorateSymbolName)
590 if (!_SymInitialize(GetCurrentProcess(), 0,
TRUE ))
606 std::string GetModuleName(DWORD64 address)
610 std::ostringstream out;
611 HANDLE process = ::GetCurrentProcess();
613 DWORD lineDisplacement = 0;
614 IMAGEHLP_LINE64
line;
615 ::ZeroMemory(&line,
sizeof(line));
616 line.SizeOfStruct =
sizeof(
line);
617 if(_SymGetLineFromAddr64(process, address, &lineDisplacement, &line)) {
618 out << line.FileName <<
"(" << line.LineNumber <<
"): ";
620 IMAGEHLP_MODULE64 module;
621 ::ZeroMemory(&module,
sizeof(module));
622 module.SizeOfStruct =
sizeof(module);
623 if(_SymGetModuleInfo64(process, address, &module)) {
624 out << module.ModuleName <<
"!";
626 out <<
"0x" << std::hex << address << std::dec <<
" ";
633 std::string GetFunctionName(DWORD64 address)
637 DWORD64 symbolDisplacement = 0;
638 HANDLE process = ::GetCurrentProcess();
640 const unsigned int SYMBOL_BUFFER_SIZE = 8192;
641 char symbolBuffer[SYMBOL_BUFFER_SIZE];
642 PIMAGEHLP_SYMBOL64 symbol =
reinterpret_cast<PIMAGEHLP_SYMBOL64
>(symbolBuffer);
643 ::ZeroMemory(symbol, SYMBOL_BUFFER_SIZE);
644 symbol->SizeOfStruct = SYMBOL_BUFFER_SIZE;
645 symbol->MaxNameLength = SYMBOL_BUFFER_SIZE -
sizeof(IMAGEHLP_SYMBOL64);
647 if(_SymGetSymFromAddr64(process, address, &symbolDisplacement, symbol)) {
649 const unsigned int NAME_SIZE = 8192;
650 char name[NAME_SIZE];
651 _UnDecorateSymbolName(
656 UNDNAME_NO_THISTYPE |
657 UNDNAME_NO_SPECIAL_SYMS |
658 UNDNAME_NO_MEMBER_TYPE |
659 UNDNAME_NO_MS_KEYWORDS |
660 UNDNAME_NO_ACCESS_SPECIFIERS
678 static BOOL IsShortcut(
const char *filename)
681 const char *extLnk =
".lnk";
682 if (filename != NULL) {
694 static BOOL ResolveShortCut(LPCSTR pszShortcutFile,
char *pszPath,
int maxbuf)
698 char szGotPath[MAX_PATH];
705 typedef HRESULT (__stdcall *COINITIALIZEPROC)( LPVOID );
706 static COINITIALIZEPROC _CoInitialize = 0;
707 typedef void (__stdcall *COUNINITIALIZEPROC)(
void );
708 static COUNINITIALIZEPROC _CoUninitialize = 0;
709 typedef HRESULT (__stdcall *COCREATEINSTANCEPROC)( REFCLSID, LPUNKNOWN,
710 DWORD, REFIID, LPVOID );
711 static COCREATEINSTANCEPROC _CoCreateInstance = 0;
713 HMODULE hModImagehlp = LoadLibrary(
"ole32.dll" );
717 _CoInitialize = (COINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoInitialize" );
720 _CoUninitialize = (COUNINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoUninitialize");
721 if (!_CoUninitialize)
723 _CoCreateInstance = (COCREATEINSTANCEPROC) GetProcAddress( hModImagehlp,
"CoCreateInstance" );
724 if (!_CoCreateInstance)
729 hres = _CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
730 IID_IShellLink, (
void **) &psl);
731 if (SUCCEEDED(hres)) {
734 hres = psl->QueryInterface(IID_IPersistFile, (
void **) &ppf);
735 if (SUCCEEDED(hres)) {
737 MultiByteToWideChar(CP_ACP, 0, pszShortcutFile, -1, wsz, MAX_PATH);
739 hres = ppf->Load(wsz, STGM_READ);
740 if (SUCCEEDED(hres)) {
741 hres = psl->Resolve(HWND_DESKTOP, SLR_ANY_MATCH | SLR_NO_UI | SLR_UPDATE);
742 if (SUCCEEDED(hres)) {
743 strlcpy(szGotPath, pszShortcutFile,MAX_PATH);
744 hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA *)&wfd,
745 SLGP_UNCPRIORITY | SLGP_RAWPATH);
746 strlcpy(pszPath,szGotPath, maxbuf);
747 if (maxbuf) pszPath[maxbuf-1] = 0;
756 return SUCCEEDED(hres);
761 GetModuleFileName(0, buf, MAX_MODULE_NAME32 + 1);
762 if (strcmp(sys->TWinNTSystem::BaseName(buf),
"root.exe"))
765 if (!::RegOpenKeyEx(HKEY_CURRENT_USER,
"Software", 0, KEY_READ, ®CUS) == ERROR_SUCCESS)
768 if (!::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ, ®CUSC) == ERROR_SUCCESS) {
769 ::RegCloseKey(regCUS);
774 bool regROOTwrite =
false;
778 if (::RegOpenKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, KEY_READ, ®ROOT) != ERROR_SUCCESS) {
779 ::RegCloseKey(regCUSC);
780 if (::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ | KEY_WRITE, ®CUSC) == ERROR_SUCCESS &&
781 ::RegCreateKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, NULL, 0, KEY_READ | KEY_WRITE,
782 NULL, ®ROOT, NULL) == ERROR_SUCCESS) {
787 if (::RegOpenKeyEx(regROOT,
"DefaultIcon", 0, KEY_READ, ®ROOTIcon) == ERROR_SUCCESS) {
788 char bufIconLoc[1024];
790 DWORD dwSize =
sizeof(bufIconLoc);
792 if (::RegQueryValueEx(regROOTIcon, NULL, NULL, &dwType, (BYTE*)bufIconLoc, &dwSize) == ERROR_SUCCESS)
793 regROOTwrite = (iconloc != bufIconLoc);
796 ::RegCloseKey(regROOTIcon);
801 ::RegCloseKey(regCUSC);
802 ::RegCloseKey(regROOT);
803 if (::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ | KEY_WRITE, ®CUSC) != ERROR_SUCCESS) {
805 regROOTwrite =
false;
807 if (::RegOpenKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, KEY_WRITE, ®ROOT) != ERROR_SUCCESS) {
809 regROOTwrite =
false;
810 ::RegCloseKey(regCUSC);
817 TString fileopen =
"fileopen.C";
818 TString rootmacrodir =
"macros";
828 ::RegCloseKey(regROOT);
829 ::RegCloseKey(regCUSC);
830 ::RegCloseKey(regCUS);
834 static const char apptitle[] =
"ROOT data file";
835 ::RegSetValueEx(regROOT, NULL, 0, REG_SZ, (BYTE*)apptitle,
sizeof(apptitle));
836 DWORD editflags = 0x00010000;
837 ::RegSetValueEx(regROOT,
"EditFlags", 0, REG_DWORD, (BYTE*)&editflags,
sizeof(editflags));
840 if (::RegCreateKeyEx(regROOT,
"DefaultIcon", 0, NULL, 0, KEY_READ | KEY_WRITE,
841 NULL, ®ROOTIcon, NULL) == ERROR_SUCCESS) {
844 ::RegSetValueEx(regROOTIcon, NULL, 0, REG_SZ, (BYTE*)iconloc.
Data(), iconloc.
Length() + 1);
845 ::RegCloseKey(regROOTIcon);
850 if (::RegCreateKeyEx(regROOT,
"shell", 0, NULL, 0, KEY_READ | KEY_WRITE,
851 NULL, ®ROOTshell, NULL) == ERROR_SUCCESS) {
853 if (::RegCreateKeyEx(regROOTshell,
"open", 0, NULL, 0, KEY_READ | KEY_WRITE,
854 NULL, ®ShellOpen, NULL) == ERROR_SUCCESS) {
855 HKEY regShellOpenCmd;
856 if (::RegCreateKeyEx(regShellOpen,
"command", 0, NULL, 0, KEY_READ | KEY_WRITE,
857 NULL, ®ShellOpenCmd, NULL) == ERROR_SUCCESS) {
859 cmd +=
" -l \"%1\" \"";
862 ::RegSetValueEx(regShellOpenCmd, NULL, 0, REG_SZ, (BYTE*)cmd.
Data(), cmd.
Length() + 1);
863 ::RegCloseKey(regShellOpenCmd);
865 ::RegCloseKey(regShellOpen);
867 ::RegCloseKey(regROOTshell);
869 ::RegCloseKey(regROOT);
871 if (::RegCreateKeyEx(regCUSC,
".root", 0, NULL, 0, KEY_READ | KEY_WRITE,
872 NULL, ®ROOT, NULL) == ERROR_SUCCESS) {
873 static const char appname[] =
"ROOTDEV.ROOT";
874 ::RegSetValueEx(regROOT, NULL, 0, REG_SZ, (BYTE*)appname,
sizeof(appname));
876 ::RegCloseKey(regCUSC);
877 ::RegCloseKey(regCUS);
880 ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
888 static bool once =
true;
891 if ((arg !=
"root") && (arg !=
"rootn") &&
892 (arg !=
"root.exe") && (arg !=
"rootn.exe"))
return false;
896 if ((arg ==
"-l") || (arg ==
"-b")) {
909 static void SetConsoleWindowName()
911 char pszNewWindowTitle[1024];
912 char pszOldWindowTitle[1024];
914 CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
916 if (!::GetConsoleTitle(pszOldWindowTitle, 1024))
919 wsprintf(pszNewWindowTitle,
"%d/%d", ::GetTickCount(), ::GetCurrentProcessId());
921 if (!::SetConsoleTitle(pszNewWindowTitle))
931 ::SetConsoleTitle(
"ROOT session");
933 hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
934 ::SetConsoleMode(hStdout, ENABLE_PROCESSED_OUTPUT |
935 ENABLE_WRAP_AT_EOL_OUTPUT);
936 if (!::GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
955 TIter next(fSignalHandler);
973 fGUIThreadHandle(0), fGUIThreadId(0)
981 if (initwinsock = ::WSAStartup(MAKEWORD(2, 0), &WSAData)) {
982 Error(
"TWinNTSystem()",
"Starting sockets failed");
993 char *buf =
new char[MAX_MODULE_NAME32 + 1];
999 HMODULE hModCore = ::GetModuleHandle(
"libCore.dll");
1001 ::GetModuleFileName(hModCore, buf, MAX_MODULE_NAME32 + 1);
1002 char *pLibName = strstr(buf,
"libCore.dll");
1005 while (--pLibName >= buf && *pLibName !=
'\\' && *pLibName !=
'/');
1008 check_path +=
"\\etc";
1010 while (buf[0] && GetFileAttributes(check_path.
Data()) == INVALID_FILE_ATTRIBUTES) {
1011 while (--pLibName >= buf && *pLibName !=
'\\' && *pLibName !=
'/');
1014 check_path +=
"\\etc";
1029 UpdateRegistry(
this, buf);
1040 typedef UINT (WINAPI* LPTIMEENDPERIOD)( UINT uPeriod );
1041 HINSTANCE hInstWinMM = LoadLibrary(
"winmm.dll" );
1043 LPTIMEENDPERIOD pTimeEndPeriod = (LPTIMEENDPERIOD)GetProcAddress( hInstWinMM,
"timeEndPeriod" );
1044 if( NULL != pTimeEndPeriod )
1046 FreeLibrary(hInstWinMM);
1057 ::ResetEvent(gGlobalEvent);
1058 ::CloseHandle(gGlobalEvent);
1061 if (gTimerThreadHandle) {
1062 ::TerminateThread(gTimerThreadHandle, 0);
1063 ::CloseHandle(gTimerThreadHandle);
1072 const char *dir = 0;
1100 ::SetUnhandledExceptionFilter(ExceptionFilter);
1105 static char lpFilename[MAX_PATH];
1106 if (::GetModuleFileName(
1109 sizeof(lpFilename))) {
1117 typedef UINT (WINAPI* LPTIMEBEGINPERIOD)( UINT uPeriod );
1118 HINSTANCE hInstWinMM = LoadLibrary(
"winmm.dll" );
1120 LPTIMEBEGINPERIOD pTimeBeginPeriod = (LPTIMEBEGINPERIOD)GetProcAddress( hInstWinMM,
"timeBeginPeriod" );
1121 if( NULL != pTimeBeginPeriod )
1122 pTimeBeginPeriod(1);
1123 FreeLibrary(hInstWinMM);
1125 gTimerThreadHandle = ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)
ThreadStub,
1128 gGlobalEvent = ::CreateEvent(NULL,
TRUE,
FALSE, NULL);
1131 char *buf =
new char[MAX_MODULE_NAME32 + 1];
1132 HMODULE hModCore = ::GetModuleHandle(
"libCore.dll");
1134 ::GetModuleFileName(hModCore, buf, MAX_MODULE_NAME32 + 1);
1135 char *pLibName = strstr(buf,
"libCore.dll");
1142 SetConsoleWindowName();
1166 const char *symbol=
name;
1169 while ( (*symbol ==
' ' || *symbol ==
'\t') && *symbol) symbol++;
1172 if (isalpha(symbol[idx]) && symbol[idx+1] ==
':') idx = 2;
1173 if ( (symbol[idx] ==
'/' || symbol[idx] ==
'\\') && symbol[idx+1] ==
'\0') {
1178 Error(
"BaseName",
"name = 0");
1182 char *bslash = (
char *)strrchr(&symbol[idx],
'\\');
1183 char *rslash = (
char *)strrchr(&symbol[idx],
'/');
1184 if (cp = (std::max)(rslash, bslash)) {
1189 return &symbol[idx];
1191 Error(
"BaseName",
"name = 0");
1207 ULong_t namelen=name ? strlen(name) : 0;
1208 if (name && namelen > 0) {
1210 fullname =
new char[namelen+5];
1211 strlcpy(fullname, name,namelen+5);
1212 if ( !strrchr(fullname,
'.') )
1213 strlcat(fullname,
".exe",namelen+5);
1216 dot = strrchr(progname,
'.');
1217 idot = dot ? (
ULong_t)(dot - progname) : strlen(progname);
1222 which =
StrDup(fullname);
1230 const char *d =
DirName(which);
1233 dirname.
Form(
"%c:%s", driveletter, d);
1235 dirname.
Form(
"%s", d);
1248 progname[idot] =
'\0';
1250 if (which)
delete [] which;
1254 if (::NeedSplash()) {
1267 if (err < 0 || err >= sys_nerr) {
1269 error_msg.
Form(
"errno out of range %d", err);
1272 return sys_errlist[err];
1285 DWORD il =
sizeof(hn);
1286 ::GetComputerName(hn, &il);
1302 if (freq < 37) freq = 440;
1303 if (duration < 0) duration = 100;
1312 gGUIThreadMsgFunc = func;
1335 int fd = h->
GetFd();
1373 set_console =
kTRUE;
1386 ::SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleSigHandler,
TRUE);
1412 ::SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleSigHandler,
FALSE);
1456 HANDLE snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,::GetCurrentProcessId());
1461 if (!InitImagehlpFunctions()) {
1462 std::cerr <<
"No stack trace: cannot find (functions in) dbghelp.dll!" << std::endl;
1467 SYSTEM_INFO sysInfo;
1468 ::GetSystemInfo(&sysInfo);
1469 DWORD machineType = IMAGE_FILE_MACHINE_I386;
1470 switch (sysInfo.wProcessorArchitecture) {
1471 case PROCESSOR_ARCHITECTURE_AMD64:
1472 machineType = IMAGE_FILE_MACHINE_AMD64;
1474 case PROCESSOR_ARCHITECTURE_IA64:
1475 machineType = IMAGE_FILE_MACHINE_IA64;
1479 DWORD currentThreadID = ::GetCurrentThreadId();
1480 DWORD currentProcessID = ::GetCurrentProcessId();
1484 THREADENTRY32 threadentry;
1485 threadentry.dwSize =
sizeof(THREADENTRY32);
1486 if (!::Thread32First(snapshot, &threadentry))
return;
1488 std::cerr << std::endl <<
"==========================================" << std::endl;
1489 std::cerr <<
"=============== STACKTRACE ===============" << std::endl;
1490 std::cerr <<
"==========================================" << std::endl << std::endl;
1493 if (threadentry.th32OwnerProcessID != currentProcessID)
1495 HANDLE thread = ::OpenThread(THREAD_GET_CONTEXT|THREAD_SUSPEND_RESUME|THREAD_QUERY_INFORMATION,
1496 FALSE, threadentry.th32ThreadID);
1498 memset(&context, 0,
sizeof(CONTEXT));
1500 if (threadentry.th32ThreadID != currentThreadID) {
1501 ::SuspendThread(thread);
1502 context.ContextFlags = CONTEXT_ALL;
1503 ::GetThreadContext(thread, &context);
1504 ::ResumeThread(thread);
1506 if (fgXcptContext) {
1507 context = *fgXcptContext;
1509 typedef void (WINAPI *RTLCCTXT)(PCONTEXT);
1510 RTLCCTXT p2RtlCCtxt = (RTLCCTXT) ::GetProcAddress(
1511 GetModuleHandle(
"kernel32.dll"),
"RtlCaptureContext");
1513 context.ContextFlags = CONTEXT_ALL;
1514 p2RtlCCtxt(&context);
1520 ::ZeroMemory(&frame,
sizeof(frame));
1522 frame.AddrPC.Mode = AddrModeFlat;
1523 frame.AddrFrame.Mode = AddrModeFlat;
1524 frame.AddrStack.Mode = AddrModeFlat;
1525 #if defined(_M_IX86) 1526 frame.AddrPC.Offset = context.Eip;
1527 frame.AddrFrame.Offset = context.Ebp;
1528 frame.AddrStack.Offset = context.Esp;
1529 #elif defined(_M_X64) 1530 frame.AddrPC.Offset = context.Rip;
1531 frame.AddrFrame.Offset = context.Rsp;
1532 frame.AddrStack.Offset = context.Rsp;
1533 #elif defined(_M_IA64) 1534 frame.AddrPC.Offset = context.StIIP;
1535 frame.AddrFrame.Offset = context.IntSp;
1536 frame.AddrStack.Offset = context.IntSp;
1537 frame.AddrBStore.Offset= context.RsBSP;
1539 std::cerr <<
"Stack traces not supported on your architecture yet." << std::endl;
1544 while (_StackWalk64(machineType, (HANDLE)::GetCurrentProcess(), thread, (LPSTACKFRAME64)&frame,
1545 (LPVOID)&context, (PREAD_PROCESS_MEMORY_ROUTINE)NULL, (PFUNCTION_TABLE_ACCESS_ROUTINE)_SymFunctionTableAccess64,
1546 (PGET_MODULE_BASE_ROUTINE)_SymGetModuleBase64, NULL)) {
1548 std::cerr << std::endl <<
"================ Thread " << iThread++ <<
" ================" << std::endl;
1549 if (!bFirst || threadentry.th32ThreadID != currentThreadID) {
1550 const std::string moduleName = GetModuleName(frame.AddrPC.Offset);
1551 const std::string functionName = GetFunctionName(frame.AddrPC.Offset);
1552 std::cerr <<
" " << moduleName << functionName << std::endl;
1556 ::CloseHandle(thread);
1557 }
while (::Thread32Next(snapshot, &threadentry));
1559 std::cerr << std::endl <<
"==========================================" << std::endl;
1560 std::cerr <<
"============= END STACKTRACE =============" << std::endl;
1561 std::cerr <<
"==========================================" << std::endl << std::endl;
1562 ::CloseHandle(snapshot);
1563 _SymCleanup(GetCurrentProcess());
1572 UInt_t oldmask = _statusfp( );
1574 if (oldmask & _EM_INVALID ) mask |=
kInvalid;
1575 if (oldmask & _EM_ZERODIVIDE) mask |=
kDivByZero;
1576 if (oldmask & _EM_OVERFLOW ) mask |=
kOverflow;
1577 if (oldmask & _EM_UNDERFLOW) mask |=
kUnderflow;
1578 if (oldmask & _EM_INEXACT ) mask |=
kInexact;
1592 if (mask &
kInvalid ) newm |= _EM_INVALID;
1593 if (mask &
kDivByZero) newm |= _EM_ZERODIVIDE;
1594 if (mask &
kOverflow ) newm |= _EM_OVERFLOW;
1595 if (mask &
kUnderflow) newm |= _EM_UNDERFLOW;
1596 if (mask &
kInexact ) newm |= _EM_INEXACT;
1600 ::_controlfp(cm , _MCW_EM);
1619 if (pendingOnly && gGlobalEvent) ::SetEvent(gGlobalEvent);
1621 Bool_t pollOnce = pendingOnly;
1625 if (
gROOT->GetApplication()) {
1641 ::WaitForSingleObject(gGlobalEvent, 1);
1642 ::ResetEvent(gGlobalEvent);
1668 if (pendingOnly && !pollOnce)
1707 if (!pendingOnly && gGlobalEvent) {
1708 ::WaitForSingleObject(gGlobalEvent, 1);
1709 ::ResetEvent(gGlobalEvent);
1723 for (i = 0; i <
fReadmask->GetCount(); i++) {
1728 rc = WinNTSelect(&t, 0, 0);
1729 if (rc < 0 && rc != -2) {
1730 ::SysError(
"DispatchOneEvent",
"select: read error on %d\n", fd);
1736 for (i = 0; i <
fWritemask->GetCount(); i++) {
1742 rc = WinNTSelect(0, &t, 0);
1743 if (rc < 0 && rc != -2) {
1744 ::SysError(
"DispatchOneEvent",
"select: write error on %d\n", fd);
1796 if (sync == sh->
IsSync()) {
1798 if ((
fSignals->IsSet(sig) && sigdone == -1) || sigdone == sig) {
1799 if (sigdone == -1) {
1809 if (sigdone != -1)
return kTRUE;
1830 if ((
fReadready->IsSet(fd) && fddone == -1) ||
1831 (fddone == fd && read)) {
1841 (fddone == fd && !read)) {
1851 if (fddone != -1)
return kTRUE;
1868 if (dirname.
Length() == 0) {
1877 const char driveletter =
DriveName(name);
1885 if (res)
return res;
1905 const char *
proto = (strstr(name,
"file:///")) ?
"file://" :
"file:";
1908 if (!name)
return 0;
1912 if (!name)
return 0;
1944 HANDLE searchFile = (HANDLE)dirp;
1978 return (psz[0] == TEXT(
'\\') && psz[1] == TEXT(
'\\'));
1998 #pragma data_seg(".text", "CODE") 2013 if (!IsDBCSLeadByte(*pPath)) {
2018 if ((*pPath == TEXT(
'\\')) && (*(pPath + 1) == 0))
2024 int cBackslashes = 0;
2025 for (p = pPath + 2; *p; p = CharNext(p)) {
2026 if (*p == TEXT(
'\\') && (++cBackslashes > 1))
2046 const char *
proto = (strstr(fdir,
"file:///")) ?
"file://" :
"file:";
2049 char *dir =
new char[MAX_PATH];
2050 if (IsShortcut(sdir)) {
2051 if (!ResolveShortCut(sdir, dir, MAX_PATH))
2052 strlcpy(dir, sdir,MAX_PATH);
2055 strlcpy(dir, sdir,MAX_PATH);
2057 int nche = strlen(dir)+3;
2058 char *entry =
new char[nche];
2059 struct _stati64 finfo;
2062 strlcpy(entry, dir,nche);
2063 if ((entry[strlen(dir)-1] ==
'/') || (entry[strlen(dir)-1] ==
'\\' )) {
2064 entry[strlen(dir)-1] =
'\0';
2067 strlcat(entry,
"\\",nche);
2069 if (_stati64(entry, &finfo) < 0) {
2076 strlcpy(entry, dir,nche);
2077 if ((entry[strlen(dir)-1] ==
'/') || (entry[strlen(dir)-1] ==
'\\' )) {
2079 entry[strlen(dir)-1] =
'\0';
2081 if (_stati64(entry, &finfo) < 0) {
2088 if (finfo.st_mode & S_IFDIR) {
2089 strlcpy(entry, dir,nche);
2090 if (!(entry[strlen(dir)-1] ==
'/' || entry[strlen(dir)-1] ==
'\\' )) {
2091 strlcat(entry,
"\\",nche);
2093 strlcat(entry,
"*",nche);
2162 char drive = driveletter ? toupper( driveletter ) -
'A' + 1 : 0;
2168 if (!(wdpath = ::_getdcwd( (
int)drive, wdpath,
kMAXPATHLEN))) {
2170 Warning(
"WorkingDirectory",
"getcwd() failed");
2194 return std::string(mydir);
2203 if (!(h = ::getenv(
"home"))) h = ::getenv(
"HOME");
2210 h = ::getenv(
"HOMESHARE");
2211 if (!h) h = ::getenv(
"HOMEDRIVE");
2214 h = ::getenv(
"HOMEPATH");
2219 h = ::getenv(
"USERPROFILE");
2224 if (mydir[1] ==
':')
2225 mydir[0] = toupper(mydir[0]);
2241 if (!dir) dir =
"c:\\";
2257 char tmpName[MAX_PATH];
2261 FILE *fp = fopen(tmpName,
"w+");
2263 if (!fp)
::SysError(
"TempFileName",
"error opening %s", tmpName);
2281 if (!opt || !opt[0]) {
2286 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2290 curdrive = _getdrive();
2291 if (strstr(opt,
"cur")) {
2293 sDrive.
Form(
"%c:", (curdrive +
'A' - 1));
2294 sType.
Form(
"Unknown Drive (%s)", sDrive.
Data());
2295 ::GetVolumeInformation(
Form(
"%s\\", sDrive.
Data()), NULL, 0, NULL, NULL,
2296 NULL, (LPSTR)szFs, 32);
2297 type = ::GetDriveType(sDrive.
Data());
2300 case DRIVE_NO_ROOT_DIR:
2302 case DRIVE_REMOVABLE:
2303 sType.
Form(
"Removable Disk (%s)", sDrive.
Data());
2306 sType.
Form(
"Local Disk (%s)", sDrive.
Data());
2309 sType.
Form(
"Network Drive (%s) (%s)", szFs, sDrive.
Data());
2312 sType.
Form(
"CD/DVD Drive (%s)", sDrive.
Data());
2315 sType.
Form(
"RAM Disk (%s)", sDrive.
Data());
2320 else if (strstr(opt,
"all")) {
2323 if (::GetLogicalDriveStrings(511, szTemp)) {
2324 TCHAR szDrive[3] = TEXT(
" :");
2330 sDrive.
Form(
"%s", szDrive);
2332 if ((sDrive ==
"A:") || (sDrive ==
"B:")) {
2336 sType.
Form(
"Unknown Drive (%s)", sDrive.
Data());
2337 ::GetVolumeInformation(
Form(
"%s\\", sDrive.
Data()), NULL, 0, NULL,
2338 NULL, NULL, (LPSTR)szFs, 32);
2339 type = ::GetDriveType(sDrive.
Data());
2342 case DRIVE_NO_ROOT_DIR:
2344 case DRIVE_REMOVABLE:
2345 sType.
Form(
"Removable Disk (%s)", sDrive.
Data());
2348 sType.
Form(
"Local Disk (%s)", sDrive.
Data());
2351 sType.
Form(
"Network Drive (%s) (%s)", szFs, sDrive.
Data());
2354 sType.
Form(
"CD/DVD Drive (%s)", sDrive.
Data());
2357 sType.
Form(
"RAM Disk (%s)", sDrive.
Data());
2367 ::SetErrorMode(nOldErrorMode);
2386 if (strchr(pathname,
'/') || strchr(pathname,
'\\')) {
2387 const char *rslash = strrchr(pathname,
'/');
2388 const char *bslash = strrchr(pathname,
'\\');
2389 const char *
r = (std::max)(rslash, bslash);
2390 const char *ptr = pathname;
2400 int len = r - pathname;
2432 if (!pathname)
return 0;
2433 if (!pathname[0])
return 0;
2439 while(*lpchar ==
' ') lpchar++;
2441 if (isalpha((
int)*lpchar) && *(lpchar+1) ==
':') {
2445 if ( (*lpchar ==
'\\' || *lpchar ==
'/' ) &&
2446 (*(lpchar+1) ==
'\\' || *(lpchar+1) ==
'/') )
return 0;
2459 if (strchr(dir,
':')) idx = 2;
2460 return (dir[idx] ==
'/' || dir[idx] ==
'\\');
2493 static char temp[1024];
2494 strlcpy(temp, name,1024);
2495 char *currentChar = temp;
2497 while (*currentChar !=
'\0') {
2498 if (*currentChar ==
'\\') *currentChar =
'/';
2516 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2520 const char *
proto = (strstr(path,
"file:///")) ?
"file://" :
"file:";
2523 ::SetErrorMode(nOldErrorMode);
2528 ::SetErrorMode(nOldErrorMode);
2550 if (name ==
".") name =
"";
2551 if (dir && dir[0]) {
2553 char last = dir[strlen(dir) - 1];
2554 if (last !=
'/' && last !=
'\\') {
2575 if (!ret)
return -1;
2584 int ret = ::rename(f, t);
2601 struct _stati64 sbuf;
2604 const char *
proto = (strstr(path,
"file:///")) ?
"file://" :
"file:";
2606 int l = strlen(newpath);
2608 if (newpath[--l] !=
'\\' || newpath[--l] !=
'/') {
2614 if (newpath && ::_stati64(newpath, &sbuf) >= 0) {
2616 buf.
fDev = sbuf.st_dev;
2617 buf.
fIno = sbuf.st_ino;
2618 buf.
fMode = sbuf.st_mode;
2619 buf.
fUid = sbuf.st_uid;
2620 buf.
fGid = sbuf.st_gid;
2621 buf.
fSize = sbuf.st_size;
2622 buf.
fMtime = sbuf.st_mtime;
2623 buf.
fIsLink = IsShortcut(newpath);
2625 char *lpath =
new char[MAX_PATH];
2626 if (IsShortcut(newpath)) {
2627 struct _stati64 sbuf2;
2628 if (ResolveShortCut(newpath, lpath, MAX_PATH)) {
2629 if (::_stati64(lpath, &sbuf2) >= 0) {
2630 buf.
fMode = sbuf2.st_mode;
2656 LPCTSTR lpRootPathName = path;
2659 LPTSTR lpVolumeNameBuffer = 0;
2660 DWORD nVolumeNameSize = 0;
2662 DWORD volumeSerialNumber;
2663 DWORD maximumComponentLength;
2666 DWORD fileSystemFlags;
2669 char fileSystemNameBuffer[512];
2670 DWORD nFileSystemNameSize =
sizeof(fileSystemNameBuffer);
2673 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2674 if (!::GetVolumeInformation(lpRootPathName,
2675 lpVolumeNameBuffer, nVolumeNameSize,
2676 &volumeSerialNumber,
2677 &maximumComponentLength,
2679 fileSystemNameBuffer, nFileSystemNameSize)) {
2681 ::SetErrorMode(nOldErrorMode);
2685 const char *fsNames[] = {
"FAT",
"NTFS" };
2687 for (i = 0; i < 2; i++) {
2688 if (!strncmp(fileSystemNameBuffer, fsNames[i], nFileSystemNameSize))
2693 DWORD sectorsPerCluster;
2694 DWORD bytesPerSector;
2695 DWORD numberOfFreeClusters;
2696 DWORD totalNumberOfClusters;
2698 if (!::GetDiskFreeSpace(lpRootPathName,
2701 &numberOfFreeClusters,
2702 &totalNumberOfClusters)) {
2704 ::SetErrorMode(nOldErrorMode);
2708 ::SetErrorMode(nOldErrorMode);
2710 *bsize = sectorsPerCluster * bytesPerSector;
2711 *blocks = totalNumberOfClusters;
2712 *bfree = numberOfFreeClusters;
2722 struct _stati64 finfo;
2727 char linkname[1024];
2728 LPTSTR lpszFilePart;
2729 TCHAR szPath[MAX_PATH];
2732 typedef BOOL (__stdcall *CREATEHARDLINKPROC)( LPCTSTR, LPCTSTR, LPSECURITY_ATTRIBUTES );
2733 static CREATEHARDLINKPROC _CreateHardLink = 0;
2735 HMODULE hModImagehlp = LoadLibrary(
"Kernel32.dll" );
2740 _CreateHardLink = (CREATEHARDLINKPROC) GetProcAddress( hModImagehlp,
"CreateHardLinkW" );
2742 _CreateHardLink = (CREATEHARDLINKPROC) GetProcAddress( hModImagehlp,
"CreateHardLinkA" );
2744 if (!_CreateHardLink)
2747 dwRet = GetFullPathName(from,
sizeof(szPath) /
sizeof(TCHAR),
2748 szPath, &lpszFilePart);
2750 if (_stati64(szPath, &finfo) < 0)
2753 if (finfo.st_mode & S_IFDIR)
2757 _splitpath(linkname,winDrive,winDir,winName,winExt);
2758 if ((!winDrive[0] ) &&
2760 _splitpath(szPath,winDrive,winDir,winName,winExt);
2761 snprintf(linkname,1024,
"%s\\%s\\%s", winDrive, winDir, to);
2763 else if (!winDrive[0]) {
2764 _splitpath(szPath,winDrive,winDir,winName,winExt);
2765 snprintf(linkname,1024,
"%s\\%s", winDrive, to);
2768 if (!_CreateHardLink(linkname, szPath, NULL))
2781 IShellLink* pShellLink;
2782 IPersistFile* pPersistFile;
2783 WCHAR wszLinkfile[MAX_PATH];
2784 int iWideCharsWritten;
2786 LPTSTR lpszFilePart;
2787 TCHAR szPath[MAX_PATH];
2789 hRes = E_INVALIDARG;
2790 if ((from == NULL) || (!from[0]) || (to == NULL) ||
2796 typedef HRESULT (__stdcall *COINITIALIZEPROC)( LPVOID );
2797 static COINITIALIZEPROC _CoInitialize = 0;
2798 typedef void (__stdcall *COUNINITIALIZEPROC)(
void );
2799 static COUNINITIALIZEPROC _CoUninitialize = 0;
2800 typedef HRESULT (__stdcall *COCREATEINSTANCEPROC)( REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID );
2801 static COCREATEINSTANCEPROC _CoCreateInstance = 0;
2803 HMODULE hModImagehlp = LoadLibrary(
"ole32.dll" );
2807 _CoInitialize = (COINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoInitialize" );
2810 _CoUninitialize = (COUNINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoUninitialize" );
2811 if (!_CoUninitialize)
2813 _CoCreateInstance = (COCREATEINSTANCEPROC) GetProcAddress( hModImagehlp,
"CoCreateInstance" );
2814 if (!_CoCreateInstance)
2821 _CoInitialize(NULL);
2824 dwRet = GetFullPathName(from,
sizeof(szPath) /
sizeof(TCHAR),
2825 szPath, &lpszFilePart);
2826 hRes = _CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
2827 IID_IShellLink, (LPVOID *)&pShellLink);
2828 if (SUCCEEDED(hRes)) {
2830 hRes = pShellLink->SetPath(szPath);
2832 hRes = pShellLink->QueryInterface(IID_IPersistFile, (
void **)&pPersistFile);
2833 if (SUCCEEDED(hRes)){
2834 iWideCharsWritten = MultiByteToWideChar(CP_ACP, 0, linkname.
Data(), -1,
2835 wszLinkfile, MAX_PATH);
2836 hRes = pPersistFile->Save(wszLinkfile,
TRUE);
2837 pPersistFile->Release();
2839 pShellLink->Release();
2852 return helper->
Unlink(name);
2854 struct _stati64 finfo;
2856 if (_stati64(name, &finfo) < 0) {
2860 if (finfo.st_mode & S_IFDIR) {
2861 return ::_rmdir(name);
2863 return ::_unlink(name);
2872 if (::ioctlsocket(fd, FIONBIO, (u_long *)1) == SOCKET_ERROR) {
2891 const char *patbuf = (
const char *)patbuf0;
2909 while (*patbuf ==
' ') {
2914 while (*patbuf ==
':') {
2919 while (*patbuf ==
';') {
2925 for (q = (
char*)patbuf; *
q; q++) {
2929 if ( (((q-2)>patbuf) && ( (*(q-2)!=
';') || !isalpha(*(q-1)) )) &&
2936 for (p = patbuf; *p; p++) {
2953 char replacement[4];
2956 for (
int k = 0; k<3; k++) replacement[k] = 0
x1;
2958 replacement[3] = 0x0;
2962 while ( (pos = patbuf0.
Index(TildaNum,pos)) !=
kNPOS ) {
2963 patbuf0.
Replace(pos, 1, replacement);
2969 Int_t lbuf = ::ExpandEnvironmentStrings(
2975 cmd =
new char[lbuf+1];
2976 ::ExpandEnvironmentStrings(
2995 char newpath[MAX_PATH];
2996 if (IsShortcut(path)) {
2997 if (!ResolveShortCut(path, newpath, MAX_PATH))
2998 strlcpy(newpath, path, MAX_PATH);
3001 strlcpy(newpath, path, MAX_PATH);
3016 return ::_chmod(file, mode);
3024 return ::umask(mask);
3034 Error(
"Utime",
"need write permission for %s to change utime", file);
3037 if (!actime) actime = modtime;
3040 t.actime = (time_t)actime;
3041 t.modtime = (time_t)modtime;
3042 return ::utime(file, &t);
3061 return infile.
Data();
3069 Int_t lastDelim = -1;
3070 for(
int i=0; i < exsearch.
Length(); ++i) {
3071 switch( exsearch[i] ) {
3074 if (i-lastDelim!=2) exsearch[i] =
';';
3077 case ';': lastDelim = i;
break;
3084 char *lpFilePart = 0;
3086 ::access(name, mode) == 0 && stat(name, &finfo) == 0 &&
3087 finfo.st_mode & S_IFREG) {
3089 Printf(
"Which: %s = %s", infile, name);
3092 return infile.
Data();
3106 if ((
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) && (::GetVersion() < 0x80000000)) {
3109 HINSTANCE netapi = ::LoadLibrary(
"netapi32.DLL");
3110 if (!netapi)
return kFALSE;
3112 p2NetApiBufferFree = (pfn1)::GetProcAddress(netapi,
"NetApiBufferFree");
3113 p2NetUserGetInfo = (pfn2)::GetProcAddress(netapi,
"NetUserGetInfo");
3114 p2NetLocalGroupGetMembers = (pfn3)::GetProcAddress(netapi,
"NetLocalGroupGetMembers");
3115 p2NetLocalGroupEnum = (pfn4)::GetProcAddress(netapi,
"NetLocalGroupEnum");
3117 if (!p2NetApiBufferFree || !p2NetUserGetInfo ||
3118 !p2NetLocalGroupGetMembers || !p2NetLocalGroupEnum)
return kFALSE;
3129 ::FreeLibrary(netapi);
3139 NET_API_STATUS NetStatus = NERR_Success;
3141 DWORD
Index = 0, ResumeHandle = 0, Total = 0;
3142 LOCALGROUP_MEMBERS_INFO_1 *MemberInfo;
3143 WCHAR wszGroupName[256];
3145 DWORD dwLastError = 0;
3147 iRetOp = MultiByteToWideChar (
3149 (DWORD)MB_PRECOMPOSED,
3150 (LPCSTR)lpszGroupName,
3152 (LPWSTR)wszGroupName,
3153 (
int)
sizeof(wszGroupName) );
3156 dwLastError = GetLastError();
3158 p2NetApiBufferFree(Data);
3164 NetStatus = p2NetLocalGroupGetMembers (NULL, wszGroupName, 1,
3165 &Data, 8192, &Index, &Total, &ResumeHandle );
3167 if (NetStatus != NERR_Success || Data == NULL) {
3168 dwLastError = GetLastError();
3170 if (dwLastError == ERROR_ENVVAR_NOT_FOUND) {
3176 NetStatus = p2NetLocalGroupGetMembers ( NULL, wszGroupName, 0,
3177 &Data, 8192, &Index, &Total, &ResumeHandle );
3181 p2NetApiBufferFree(Data);
3186 MemberInfo = (LOCALGROUP_MEMBERS_INFO_1 *)Data;
3189 p2NetApiBufferFree(Data);
3198 NET_API_STATUS NetStatus = NERR_Success;
3200 DWORD
Index = 0, ResumeHandle = 0, Total = 0, i;
3201 LOCALGROUP_INFO_0 *GroupInfo;
3202 char szAnsiName[256];
3203 DWORD dwLastError = 0;
3206 NetStatus = p2NetLocalGroupEnum(NULL, 0, &Data, 8192, &Index,
3207 &Total, &ResumeHandle );
3209 if (NetStatus != NERR_Success || Data == NULL) {
3210 dwLastError = GetLastError();
3212 p2NetApiBufferFree(Data);
3217 GroupInfo = (LOCALGROUP_INFO_0 *)Data;
3218 for (i=0; i < Total; i++) {
3220 iRetOp = WideCharToMultiByte (
3223 (LPCWSTR)(GroupInfo->lgrpi0_name),
3226 (
int)(
sizeof(szAnsiName)),
3238 p2NetApiBufferFree(Data);
3250 int &groupIdx,
int &memberIdx)
3252 BOOL bRetOp =
FALSE;
3254 DWORD dwSidSize, dwDomainNameSize;
3257 SID_NAME_USE sidType;
3258 PUCHAR puchar_SubAuthCount = NULL;
3259 SID_IDENTIFIER_AUTHORITY sid_identifier_authority;
3260 PSID_IDENTIFIER_AUTHORITY psid_identifier_authority = NULL;
3261 unsigned char j = 0;
3262 DWORD dwLastError = 0;
3264 pSid = (PSID)bySidBuffer;
3265 dwSidSize =
sizeof(bySidBuffer);
3266 dwDomainNameSize =
sizeof(szDomainName);
3268 bRetOp = LookupAccountName (
3270 (LPCTSTR)lpszAccountName,
3272 (LPDWORD)&dwSidSize,
3273 (LPTSTR)szDomainName,
3274 (LPDWORD)&dwDomainNameSize,
3275 (PSID_NAME_USE)&sidType );
3277 if (bRetOp ==
FALSE) {
3278 dwLastError = GetLastError();
3282 bRetOp = IsValidSid((PSID)pSid);
3284 if (bRetOp ==
FALSE) {
3285 dwLastError = GetLastError();
3290 psid_identifier_authority = GetSidIdentifierAuthority ((PSID)pSid);
3293 memcpy (&sid_identifier_authority, psid_identifier_authority,
3294 sizeof(SID_IDENTIFIER_AUTHORITY));
3297 puchar_SubAuthCount = (PUCHAR)GetSidSubAuthorityCount((PSID)pSid);
3299 j = (
unsigned char)(*puchar_SubAuthCount);
3301 DWORD dwSubAuth = 0;
3302 PDWORD pdwSubAuth = NULL;
3304 pdwSubAuth = (PDWORD)GetSidSubAuthority (
3307 dwSubAuth = *pdwSubAuth;
3326 NET_API_STATUS NetStatus = NERR_Success;
3328 DWORD
Index = 0, ResumeHandle = 0, Total = 0, i;
3329 LOCALGROUP_MEMBERS_INFO_1 *MemberInfo;
3330 char szAnsiMemberName[256];
3331 char szFullMemberName[256];
3332 char szMemberHomeDir[256];
3333 WCHAR wszGroupName[256];
3336 DWORD length =
sizeof (act_name);
3337 DWORD dwLastError = 0;
3338 LPUSER_INFO_11 pUI11Buf = NULL;
3339 NET_API_STATUS nStatus;
3341 iRetOp = MultiByteToWideChar (
3343 (DWORD)MB_PRECOMPOSED,
3344 (LPCSTR)lpszGroupName,
3346 (LPWSTR)wszGroupName,
3347 (
int)
sizeof(wszGroupName) );
3350 dwLastError = GetLastError();
3352 p2NetApiBufferFree(Data);
3356 GetUserName (act_name, &length);
3360 NetStatus = p2NetLocalGroupGetMembers (NULL, wszGroupName, 1,
3361 &Data, 8192, &Index, &Total, &ResumeHandle );
3363 if (NetStatus != NERR_Success || Data == NULL) {
3364 dwLastError = GetLastError();
3366 if (dwLastError == ERROR_ENVVAR_NOT_FOUND) {
3372 NetStatus = p2NetLocalGroupGetMembers ( NULL, wszGroupName, 0,
3373 &Data, 8192, &Index, &Total, &ResumeHandle );
3377 p2NetApiBufferFree(Data);
3381 MemberInfo = (LOCALGROUP_MEMBERS_INFO_1 *)Data;
3382 for (i=0; i < Total; i++) {
3383 iRetOp = WideCharToMultiByte (
3386 (LPCWSTR)(MemberInfo->lgrmi1_name),
3388 (LPSTR)szAnsiMemberName,
3389 (
int)(
sizeof(szAnsiMemberName)),
3394 dwLastError = GetLastError();
3405 TCHAR szUserName[255]=TEXT(
"");
3406 MultiByteToWideChar(CP_ACP, 0, szAnsiMemberName, -1, (LPWSTR)szUserName, 255);
3410 nStatus = p2NetUserGetInfo(NULL, (LPCWSTR)szUserName, 11, (LPBYTE *)&pUI11Buf);
3414 if (nStatus == NERR_Success) {
3415 if (pUI11Buf != NULL) {
3416 wsprintf(szFullMemberName,
"%S",pUI11Buf->usri11_full_name);
3418 wsprintf(szMemberHomeDir,
"%S",pUI11Buf->usri11_home_dir);
3429 if (pUI11Buf != NULL) {
3430 p2NetApiBufferFree(pUI11Buf);
3435 if (getenv(
"SHELL") == NULL)
3436 putenv ((GetVersion () & 0x80000000) ?
"SHELL=command" :
"SHELL=cmd");
3449 p2NetApiBufferFree(Data);
3459 NET_API_STATUS NetStatus = NERR_Success;
3461 DWORD
Index = 0, ResumeHandle = 0, Total = 0, i;
3462 LOCALGROUP_INFO_0 *GroupInfo;
3463 char szAnsiName[256];
3464 DWORD dwLastError = 0;
3465 int iRetOp = 0, iGroupIdx = 0, iMemberIdx = 0;
3467 NetStatus = p2NetLocalGroupEnum(NULL, 0, &Data, 8192, &Index,
3468 &Total, &ResumeHandle );
3470 if (NetStatus != NERR_Success || Data == NULL) {
3471 dwLastError = GetLastError();
3473 p2NetApiBufferFree(Data);
3477 GroupInfo = (LOCALGROUP_INFO_0 *)Data;
3478 for (i=0; i < Total; i++) {
3480 iRetOp = WideCharToMultiByte (
3483 (LPCWSTR)(GroupInfo->lgrpi0_name),
3486 (
int)(
sizeof(szAnsiName)),
3504 p2NetApiBufferFree(Data);
3518 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3521 DWORD length =
sizeof (
name);
3522 if (::GetUserName (name, &length)) {
3523 if (stricmp (
"administrator", name) == 0)
3533 if (!user || !user[0])
3559 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3562 DWORD length =
sizeof (
name);
3563 if (::GetUserName (name, &length)) {
3564 if (stricmp (
"administrator", name) == 0)
3586 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3589 DWORD length =
sizeof (
name);
3590 if (::GetUserName (name, &length)) {
3591 if (stricmp (
"administrator", name) == 0)
3601 if (!group || !group[0])
3604 struct group *grp = 0;
3627 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3630 DWORD length =
sizeof (
name);
3631 if (::GetUserName (name, &length)) {
3632 if (stricmp (
"administrator", name) == 0)
3655 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3657 DWORD length =
sizeof (
name);
3659 if (::GetUserName (name, &length)) {
3661 if (stricmp (
"administrator", name) == 0) {
3663 ug->
fGroup =
"administrators";
3672 ug->
fUser =
"unknown";
3685 for (
int i = 0; i <
fNbUsers; i++) {
3729 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3731 DWORD length =
sizeof (
name);
3733 if (::GetUserName (name, &length)) {
3734 if (stricmp (
"administrator", name) == 0) {
3735 gr->
fGroup =
"administrators";
3750 struct group *grp = 0;
3795 const char *env = ::getenv(name);
3797 if (::_stricmp(name,
"home") == 0 ) {
3799 }
else if (::_stricmp(name,
"rootsys") == 0 ) {
3813 return ::system(shellcmd);
3821 return ::_popen(command, mode);
3829 return ::_pclose(pipe);
3856 gROOT->CloseFiles();
3857 if (
gROOT->GetListOfBrowsers()) {
3864 gROOT->ProcessLine(
TString::Format(
"((TBrowser*)0x%lx)->GetBrowserImp()->GetMainFrame()->CloseWindow();",
3867 gROOT->EndOfProcessCleanups();
3907 static int fd1=0, fd2=0;
3908 static fpos_t pos1=0, pos2=0;
3918 const char *
m = (mode[0] ==
'a' || mode[0] ==
'w') ? mode :
"a";
3931 fgetpos(stdout, &pos1);
3932 fd1 = _dup(fileno(stdout));
3934 if ((fout = freopen(file, m, stdout)) == 0) {
3935 SysError(
"RedirectOutput",
"could not freopen stdout");
3937 _dup2(fd1, fileno(stdout));
3941 fsetpos(stdout, &pos1);
3946 fgetpos(stderr, &pos2);
3947 fd2 = _dup(fileno(stderr));
3948 if ((ferr = freopen(file, m, stderr)) == 0) {
3949 SysError(
"RedirectOutput",
"could not freopen stderr");
3951 _dup2(fd1, fileno(stdout));
3955 fsetpos(stdout, &pos1);
3957 _dup2(fd2, fileno(stderr));
3961 fsetpos(stderr, &pos2);
3966 fseek(fout, 0, SEEK_END);
3967 fseek(ferr, 0, SEEK_END);
3974 if (_dup2(fd1, fileno(stdout))) {
3975 SysError(
"RedirectOutput",
"could not restore stdout");
3981 fsetpos(stdout, &pos1);
3988 if (_dup2(fd2, fileno(stderr))) {
3989 SysError(
"RedirectOutput",
"could not restore stderr");
3995 fsetpos(stderr, &pos2);
4050 if (len > 4 && (!stricmp(sLib.
Data()+len-4,
".dll"))) {
4063 Error(
"DynamicPathName",
4064 "%s does not exist in %s,\nor has wrong file extension (.dll)",
4081 #pragma warning(push) 4082 #pragma warning(disable:4200) 4099 if (!linkedLibs.
IsNull())
4112 HANDLE hFile, hMapping;
4115 if((hFile = CreateFile(exe,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0))==
INVALID_HANDLE_VALUE) {
4119 if(!(hMapping = CreateFileMapping(hFile,0,PAGE_READONLY|SEC_COMMIT,0,0,0))) {
4124 if(!(basepointer = MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0))) {
4125 CloseHandle(hMapping);
4132 IMAGE_DOS_HEADER *dos_head = (IMAGE_DOS_HEADER *)basepointer;
4135 IMAGE_FILE_HEADER _head;
4136 IMAGE_OPTIONAL_HEADER opt_head;
4137 IMAGE_SECTION_HEADER section_header[];
4139 struct header *pheader;
4140 const IMAGE_SECTION_HEADER * section_header;
4142 if(dos_head->e_magic!=
'ZM') {
4147 pheader = (
struct header *)((
char*)dos_head + dos_head->e_lfanew);
4149 if(IsBadReadPtr(pheader,
sizeof(
struct header))) {
4153 if(pheader->signature!=IMAGE_NT_SIGNATURE) {
4154 switch((
unsigned short)pheader->signature) {
4155 case IMAGE_DOS_SIGNATURE:
4158 case IMAGE_OS2_SIGNATURE:
4161 case IMAGE_OS2_SIGNATURE_LE:
4169 #define isin(address,start,length) ((address)>=(start) && (address)<(start)+(length)) 4172 for(sect=0,section_header=pheader->section_header;
4173 sect<pheader->_head.NumberOfSections;sect++,section_header++) {
4175 const void *
const section_data =
4176 (
char*)basepointer + section_header->PointerToRawData;
4177 for(directory=0;directory<IMAGE_NUMBEROF_DIRECTORY_ENTRIES;directory++) {
4178 if(
isin(pheader->opt_head.DataDirectory[directory].VirtualAddress,
4179 section_header->VirtualAddress,
4180 section_header->SizeOfRawData)) {
4181 const IMAGE_IMPORT_DESCRIPTOR *stuff_start =
4182 (IMAGE_IMPORT_DESCRIPTOR *)((
char*)section_data +
4183 (pheader->opt_head.DataDirectory[directory].VirtualAddress -
4184 section_header->VirtualAddress));
4187 const unsigned stuff_length =
4188 pheader->opt_head.DataDirectory[directory].Size;
4189 if(directory == IMAGE_DIRECTORY_ENTRY_IMPORT) {
4190 while(!IsBadReadPtr(stuff_start,
sizeof(*stuff_start)) &&
4191 stuff_start->Name) {
4192 TString dll = (
char*)section_data +
4193 ((DWORD)(stuff_start->Name)) -
4194 section_header->VirtualAddress;
4198 char *winPath = getenv(
"windir");
4199 _splitpath(winPath,winDrive,winDir,winName,winExt);
4200 if(!strstr(dllPath, winDir)) {
4201 if (!linkedLibs.
IsNull())
4203 linkedLibs += dllPath;
4215 UnmapViewOfFile(basepointer);
4216 CloseHandle(hMapping);
4228 #pragma warning(pop) 4249 TRegexp separator(
"[^ \\t\\s]+");
4254 Ssiz_t start, index, end;
4255 start = index = end = 0;
4257 while ((start < libs.
Length()) && (index !=
kNPOS)) {
4258 index = libs.
Index(separator, &end, start);
4262 s = libs(index, end);
4339 if (mode && t->
IsSync()) {
4343 }
else if (!mode && t->
IsAsync()) {
4361 FILETIME ftFileTime;
4365 ::GetSystemTimeAsFileTime(&ftRealTime.ftFileTime);
4374 OSVERSIONINFO OsVersionInfo;
4383 OsVersionInfo.dwOSVersionInfoSize =
sizeof(OSVERSIONINFO);
4384 GetVersionEx(&OsVersionInfo);
4385 if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) {
4391 FILETIME ftFileTime;
4396 FILETIME ftFileTime;
4400 HANDLE hThread = GetCurrentThread();
4401 ret = GetThreadTimes (hThread, &ftCreate, &ftExit,
4402 &ftKernel.ftFileTime,
4403 &ftUser.ftFileTime);
4405 ret = ::GetLastError();
4406 ::Error(
"GetCPUTime",
" Error on GetProcessTimes 0x%lx", (
int)ret);
4426 static time_t jan95 = 0;
4437 jan95 = mktime(&tp);
4438 if ((
int)jan95 == -1) {
4439 ::SysError(
"TWinNTSystem::Now",
"error converting 950001 0:00 to time_t");
4446 return TTime((now.time-(
Long_t)jan95)*1000 + now.millitm);
4478 rc = WinNTSelect(&rd, &wr, to);
4512 rc = WinNTSelect(&rd, &wr, to);
4534 if ((sp = ::getservbyname(servicename,
kProtocolName)) == 0) {
4535 Error(
"GetServiceByName",
"no service \"%s\" with protocol \"%s\"\n",
4539 return ::ntohs(sp->s_port);
4550 if ((sp = ::getservbyport(::htons(port),
kProtocolName)) == 0) {
4551 return Form(
"%d", port);
4561 struct hostent *host_ptr;
4566 if ((addr = ::inet_addr(hostname)) != INADDR_NONE) {
4568 if ((host_ptr = ::gethostbyaddr((
const char *)&addr,
4569 sizeof(addr), AF_INET))) {
4570 host = host_ptr->h_name;
4574 for (i = 1; host_ptr->h_addr_list[i]; i++) {
4575 memcpy(&addr2, host_ptr->h_addr_list[i], host_ptr->h_length);
4578 for (i = 0; host_ptr->h_aliases[i]; i++)
4579 a.
AddAlias(host_ptr->h_aliases[i]);
4582 host =
"UnNamedHost";
4584 }
else if ((host_ptr = ::gethostbyname(hostname))) {
4586 if (host_ptr->h_addrtype != AF_INET) {
4587 Error(
"GetHostByName",
"%s is not an internet host\n", hostname);
4590 memcpy(&addr, host_ptr->h_addr, host_ptr->h_length);
4591 host = host_ptr->h_name;
4592 type = host_ptr->h_addrtype;
4596 for (i = 1; host_ptr->h_addr_list[i]; i++) {
4597 memcpy(&addr2, host_ptr->h_addr_list[i], host_ptr->h_length);
4600 for (i = 0; host_ptr->h_aliases[i]; i++)
4601 a.
AddAlias(host_ptr->h_aliases[i]);
4604 if (
gDebug > 0)
Error(
"GetHostByName",
"unknown host %s", hostname);
4617 struct sockaddr_in addr;
4618 int len =
sizeof(addr);
4620 if (::getpeername(sock, (
struct sockaddr *)&addr, &len) == SOCKET_ERROR) {
4625 struct hostent *host_ptr;
4626 const char *hostname;
4630 if ((host_ptr = ::gethostbyaddr((
const char *)&addr.sin_addr,
4631 sizeof(addr.sin_addr), AF_INET))) {
4632 memcpy(&iaddr, host_ptr->h_addr, host_ptr->h_length);
4633 hostname = host_ptr->h_name;
4634 family = host_ptr->h_addrtype;
4636 memcpy(&iaddr, &addr.sin_addr,
sizeof(addr.sin_addr));
4641 return TInetAddress(hostname, ::ntohl(iaddr), family, ::ntohs(addr.sin_port));
4650 struct sockaddr_in addr;
4651 int len =
sizeof(addr);
4653 if (::getsockname(sock, (
struct sockaddr *)&addr, &len) == SOCKET_ERROR) {
4658 struct hostent *host_ptr;
4659 const char *hostname;
4663 if ((host_ptr = ::gethostbyaddr((
const char *)&addr.sin_addr,
4664 sizeof(addr.sin_addr), AF_INET))) {
4665 memcpy(&iaddr, host_ptr->h_addr, host_ptr->h_length);
4666 hostname = host_ptr->h_name;
4667 family = host_ptr->h_addrtype;
4669 memcpy(&iaddr, &addr.sin_addr,
sizeof(addr.sin_addr));
4674 return TInetAddress(hostname, ::ntohl(iaddr), family, ::ntohs(addr.sin_port));
4685 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) ==
INVALID_SOCKET) {
4686 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket");
4690 struct sockaddr_in inserver;
4691 memset(&inserver, 0,
sizeof(inserver));
4692 inserver.sin_family = AF_INET;
4693 inserver.sin_addr.s_addr = ::htonl(INADDR_LOOPBACK);
4694 inserver.sin_port = port;
4698 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver)) == SOCKET_ERROR) {
4699 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"bind");
4704 if (::listen(sock, backlog)) {
4705 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"listen");
4717 if (!sockpath || strlen(sockpath) <= 0) {
4718 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket path undefined");
4722 struct sockaddr_in myaddr;
4724 int len =
sizeof myaddr;
4729 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4730 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket");
4734 memset(&myaddr, 0,
sizeof(myaddr));
4735 myaddr.sin_port = 0;
4736 myaddr.sin_family = AF_INET;
4737 myaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4739 rc = bind(sock, (
struct sockaddr *)&myaddr, len);
4741 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"bind");
4744 rc = getsockname(sock, (
struct sockaddr *)&myaddr, &len);
4746 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"getsockname");
4749 TString socketpath = sockpath;
4751 fp = fopen(socketpath,
"wb");
4753 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"fopen");
4756 fprintf(fp,
"%d", myaddr.sin_port);
4760 if (listen(sock, backlog)) {
4761 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"listen");
4773 if (socket == -1)
return;
4777 ::shutdown(sock, 2);
4779 struct linger linger = {0, 0};
4780 ::setsockopt(sock, SOL_SOCKET, SO_LINGER, (
char *) &linger,
sizeof(linger));
4781 while (::
closesocket(sock) == SOCKET_ERROR && WSAGetLastError() == WSAEINTR) {
4795 if (WinNTRecv(sock, &header,
sizeof(header), 0) > 0) {
4796 int count = ::ntohl(header);
4798 if (count > length) {
4799 Error(
"RecvBuf",
"record header exceeds buffer size");
4801 }
else if (count > 0) {
4802 if (WinNTRecv(sock, buf, count, 0) < 0) {
4803 Error(
"RecvBuf",
"cannot receive buffer");
4818 Int_t header = ::htonl(length);
4820 if (WinNTSend(sock, &header,
sizeof(header), 0) < 0) {
4821 Error(
"SendBuf",
"cannot send header");
4825 if (WinNTSend(sock, buf, length, 0) < 0) {
4826 Error(
"SendBuf",
"cannot send buffer");
4866 if ((n = WinNTRecv(sock, buf, length, flag)) <= 0) {
4868 Error(
"RecvRaw",
"cannot receive buffer");
4902 if ((n = WinNTSend(sock, buf, length, flag)) <= 0) {
4903 if (n == -1 &&
GetErrno() != EINTR) {
4904 Error(
"SendRaw",
"cannot send buffer");
4917 if (socket == -1)
return -1;
4922 if (::setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4923 ::SysError(
"SetSockOpt",
"setsockopt(SO_SNDBUF)");
4928 if (::setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4929 ::SysError(
"SetSockOpt",
"setsockopt(SO_RCVBUF)");
4934 if (::setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4935 SysError(
"SetSockOpt",
"setsockopt(SO_OOBINLINE)");
4940 if (::setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4941 ::SysError(
"SetSockOpt",
"setsockopt(SO_KEEPALIVE)");
4946 if (::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4947 ::SysError(
"SetSockOpt",
"setsockopt(SO_REUSEADDR)");
4952 if (::setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4953 ::SysError(
"SetSockOpt",
"setsockopt(TCP_NODELAY)");
4958 if (::ioctlsocket(sock, FIONBIO, &val) == SOCKET_ERROR) {
4965 if (::ioctl(sock, SIOCSPGRP, &val) == -1) {
4966 ::SysError(
"SetSockOpt",
"ioctl(SIOCSPGRP)");
4974 Error(
"SetSockOpt",
"illegal option (%d)", opt);
4986 if (socket == -1)
return -1;
4989 int optlen =
sizeof(*val);
4993 if (::getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)val, &optlen) == SOCKET_ERROR) {
4994 ::SysError(
"GetSockOpt",
"getsockopt(SO_SNDBUF)");
4999 if (::getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)val, &optlen) == SOCKET_ERROR) {
5000 ::SysError(
"GetSockOpt",
"getsockopt(SO_RCVBUF)");
5005 if (::getsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)val, &optlen) == SOCKET_ERROR) {
5006 ::SysError(
"GetSockOpt",
"getsockopt(SO_OOBINLINE)");
5011 if (::getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)val, &optlen) == SOCKET_ERROR) {
5012 ::SysError(
"GetSockOpt",
"getsockopt(SO_KEEPALIVE)");
5017 if (::getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)val, &optlen) == SOCKET_ERROR) {
5018 ::SysError(
"GetSockOpt",
"getsockopt(SO_REUSEADDR)");
5023 if (::getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)val, &optlen) == SOCKET_ERROR) {
5024 ::SysError(
"GetSockOpt",
"getsockopt(TCP_NODELAY)");
5040 if (::ioctlsocket(sock, SIOCGPGRP, (u_long*)val) == SOCKET_ERROR) {
5041 ::SysError(
"GetSockOpt",
"ioctl(SIOCGPGRP)");
5047 if (::ioctlsocket(sock, SIOCATMARK, (u_long*)val) == SOCKET_ERROR) {
5048 ::SysError(
"GetSockOpt",
"ioctl(SIOCATMARK)");
5053 if (::ioctlsocket(sock, FIONREAD, (u_long*)val) == SOCKET_ERROR) {
5059 Error(
"GetSockOpt",
"illegal option (%d)", opt);
5071 int tcpwindowsize,
const char *protocol)
5076 if (!strcmp(servername,
"unix")) {
5080 (servername[1] ==
':' && servername[2] ==
'/')) {
5084 if (!strcmp(protocol,
"udp")){
5091 sport = ::htons(port);
5095 if (!addr.
IsValid())
return -1;
5098 struct sockaddr_in server;
5099 memset(&server, 0,
sizeof(server));
5100 memcpy(&server.sin_addr, &adr,
sizeof(adr));
5102 server.sin_port = sport;
5106 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) ==
INVALID_SOCKET) {
5107 ::SysError(
"TWinNTSystem::WinNTConnectTcp",
"socket");
5111 if (tcpwindowsize > 0) {
5116 if (::connect(sock, (
struct sockaddr*) &server,
sizeof(server)) ==
INVALID_SOCKET) {
5129 struct sockaddr_in myaddr;
5132 memset(&myaddr, 0,
sizeof(myaddr));
5133 myaddr.sin_family = AF_INET;
5134 myaddr.sin_port = port;
5135 myaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
5138 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
5139 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"socket");
5143 while ((connect(sock, (
struct sockaddr *)&myaddr,
sizeof myaddr)) == -1) {
5147 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"connect");
5163 if (!sockpath || strlen(sockpath) <= 0) {
5164 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"socket path undefined");
5167 TString socketpath = sockpath;
5169 fp = fopen(socketpath.
Data(),
"rb");
5171 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"fopen");
5174 fscanf(fp,
"%d", &port);
5177 if (port < 0 || port > 65535) {
5178 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"invalid port");
5196 sport = htons(port);
5199 if (!addr.
IsValid())
return -1;
5202 struct sockaddr_in server;
5203 memset(&server, 0,
sizeof(server));
5204 memcpy(&server.sin_addr, &adr,
sizeof(adr));
5206 server.sin_port = sport;
5210 if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
5211 ::SysError(
"TWinNTSystem::WinNTUdpConnect",
"socket (%s:%d)",
5216 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
5220 ::SysError(
"TWinNTSystem::WinNTUdpConnect",
"connect (%s:%d)",
5238 const char *protocol)
5259 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
5260 short tryport = kSOCKET_MINPORT;
5265 sport = ::htons(port);
5268 if (port == 0 && reuse) {
5269 ::Error(
"TWinNTSystem::WinNTTcpService",
"cannot do a port scan while reuse is true");
5276 sport = ::htons(port);
5281 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) < 0) {
5282 ::SysError(
"TWinNTSystem::WinNTTcpService",
"socket");
5290 if (tcpwindowsize > 0) {
5295 struct sockaddr_in inserver;
5296 memset(&inserver, 0,
sizeof(inserver));
5297 inserver.sin_family = AF_INET;
5298 inserver.sin_addr.s_addr = ::htonl(INADDR_ANY);
5299 inserver.sin_port = sport;
5303 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver)) == SOCKET_ERROR) {
5304 ::SysError(
"TWinNTSystem::WinNTTcpService",
"bind");
5310 inserver.sin_port = ::htons(tryport);
5311 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
5313 }
while (bret == SOCKET_ERROR && WSAGetLastError() == WSAEADDRINUSE &&
5314 tryport < kSOCKET_MAXPORT);
5315 if (bret == SOCKET_ERROR) {
5316 ::SysError(
"TWinNTSystem::WinNTTcpService",
"bind (port scan)");
5322 if (::listen(sock, backlog) == SOCKET_ERROR) {
5323 ::SysError(
"TWinNTSystem::WinNTTcpService",
"listen");
5340 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
5341 short sport, tryport = kSOCKET_MINPORT;
5347 sport = htons(port);
5351 if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
5352 ::SysError(
"TUnixSystem::UnixUdpService",
"socket");
5356 struct sockaddr_in inserver;
5357 memset(&inserver, 0,
sizeof(inserver));
5358 inserver.sin_family = AF_INET;
5359 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
5360 inserver.sin_port = sport;
5364 if (bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
5365 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"bind");
5371 inserver.sin_port = htons(tryport);
5372 bret = bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
5374 }
while (bret == SOCKET_ERROR && WSAGetLastError() == WSAEADDRINUSE &&
5375 tryport < kSOCKET_MAXPORT);
5377 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"bind (port scan)");
5383 if (listen(sock, backlog)) {
5384 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"listen");
5402 (::WSAGetLastError() == WSAEINTR)) {
5407 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
5421 #define SystemBasicInformation 0 5422 #define SystemPerformanceInformation 2 5427 ULONG uKeMaximumIncrement;
5429 ULONG uMmNumberOfPhysicalPages;
5430 ULONG uMmLowestPhysicalPage;
5431 ULONG UMmHighestPhysicalPage;
5432 ULONG uAllocationGranularity;
5433 PVOID pLowestUserAddress;
5434 PVOID pMmHighestUserAddress;
5435 ULONG uKeActiveProcessors;
5436 BYTE bKeNumberProcessors;
5439 } SYSTEM_BASIC_INFORMATION;
5443 LARGE_INTEGER liIdleTime;
5445 } SYSTEM_PERFORMANCE_INFORMATION;
5447 typedef struct _PROCESS_MEMORY_COUNTERS {
5449 DWORD PageFaultCount;
5450 SIZE_T PeakWorkingSetSize;
5451 SIZE_T WorkingSetSize;
5452 SIZE_T QuotaPeakPagedPoolUsage;
5453 SIZE_T QuotaPagedPoolUsage;
5454 SIZE_T QuotaPeakNonPagedPoolUsage;
5455 SIZE_T QuotaNonPagedPoolUsage;
5456 SIZE_T PagefileUsage;
5457 SIZE_T PeakPagefileUsage;
5462 #define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart)) 5470 LARGE_INTEGER ulFreq, ulTicks, ulValue, ulStartCounter;
5474 if (QueryPerformanceFrequency(&ulFreq)) {
5476 QueryPerformanceCounter(&ulTicks);
5479 ulValue.QuadPart = ulTicks.QuadPart + ulFreq.QuadPart/10;
5480 ulStartCounter.QuadPart =
__rdtsc();
5484 QueryPerformanceCounter(&ulTicks);
5485 }
while (ulTicks.QuadPart <= ulValue.QuadPart);
5487 return (DWORD)((
__rdtsc() - ulStartCounter.QuadPart)/100000);
5495 #define SM_SERVERR2 89 5502 OSVERSIONINFOEX osvi;
5505 BOOL bOsVersionInfoEx;
5506 static char *strReturn = 0;
5510 strReturn =
new char[2048];
5514 ZeroMemory(&si,
sizeof(SYSTEM_INFO));
5515 ZeroMemory(&osvi,
sizeof(OSVERSIONINFOEX));
5520 osvi.dwOSVersionInfoSize =
sizeof(OSVERSIONINFOEX);
5522 if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
5524 osvi.dwOSVersionInfoSize =
sizeof (OSVERSIONINFO);
5525 if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
5530 pGNSI = (
PGNSI) GetProcAddress( GetModuleHandle(
"kernel32.dll"),
5531 "GetNativeSystemInfo");
5534 else GetSystemInfo(&si);
5536 switch (osvi.dwPlatformId)
5539 case VER_PLATFORM_WIN32_NT:
5542 if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
5544 if( osvi.wProductType == VER_NT_WORKSTATION )
5545 strlcpy(strReturn,
"Microsoft Windows Vista ",2048);
5546 else strlcpy(strReturn,
"Windows Server \"Longhorn\" " ,2048);
5548 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
5551 strlcpy(strReturn,
"Microsoft Windows Server 2003 \"R2\" ",2048);
5552 else if( osvi.wProductType == VER_NT_WORKSTATION &&
5553 si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
5555 strlcpy(strReturn,
"Microsoft Windows XP Professional x64 Edition ",2048);
5557 else strlcpy(strReturn,
"Microsoft Windows Server 2003, ",2048);
5559 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
5560 strlcpy(strReturn,
"Microsoft Windows XP ",2048);
5562 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
5563 strlcpy(strReturn,
"Microsoft Windows 2000 ",2048);
5565 if ( osvi.dwMajorVersion <= 4 )
5566 strlcpy(strReturn,
"Microsoft Windows NT ",2048);
5569 if( bOsVersionInfoEx )
5572 if ( osvi.wProductType == VER_NT_WORKSTATION &&
5573 si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)
5575 if( osvi.dwMajorVersion == 4 )
5576 strlcat(strReturn,
"Workstation 4.0 ",2048 );
5577 else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
5578 strlcat(strReturn,
"Home Edition " ,2048);
5579 else strlcat(strReturn,
"Professional " ,2048);
5582 else if ( osvi.wProductType == VER_NT_SERVER ||
5583 osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
5585 if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)
5587 if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )
5589 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5590 strlcat(strReturn,
"Datacenter Edition for Itanium-based Systems",2048 );
5591 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5592 strlcat(strReturn,
"Enterprise Edition for Itanium-based Systems" ,2048);
5594 else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
5596 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5597 strlcat(strReturn,
"Datacenter x64 Edition ",2048 );
5598 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5599 strlcat(strReturn,
"Enterprise x64 Edition ",2048 );
5600 else strlcat(strReturn,
"Standard x64 Edition ",2048 );
5604 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5605 strlcat(strReturn,
"Datacenter Edition ",2048 );
5606 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5607 strlcat(strReturn,
"Enterprise Edition ",2048 );
5608 else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
5609 strlcat(strReturn,
"Web Edition " ,2048);
5610 else strlcat(strReturn,
"Standard Edition ",2048 );
5613 else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
5615 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5616 strlcat(strReturn,
"Datacenter Server ",2048 );
5617 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5618 strlcat(strReturn,
"Advanced Server ",2048 );
5619 else strlcat(strReturn,
"Server ",2048 );
5623 if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5624 strlcat(strReturn,
"Server 4.0, Enterprise Edition " ,2048);
5625 else strlcat(strReturn,
"Server 4.0 ",2048 );
5634 DWORD dwBufLen=
BUFSIZE*
sizeof(TCHAR);
5637 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
5638 "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
5639 0, KEY_QUERY_VALUE, &hKey );
5640 if( lRet != ERROR_SUCCESS )
5643 lRet = RegQueryValueEx( hKey,
"ProductType", NULL, NULL,
5644 (LPBYTE) szProductType, &dwBufLen);
5645 RegCloseKey( hKey );
5647 if( (lRet != ERROR_SUCCESS) || (dwBufLen >
BUFSIZE*
sizeof(TCHAR)) )
5650 if ( lstrcmpi(
"WINNT", szProductType) == 0 )
5651 strlcat(strReturn,
"Workstation " ,2048);
5652 if ( lstrcmpi(
"LANMANNT", szProductType) == 0 )
5653 strlcat(strReturn,
"Server " ,2048);
5654 if ( lstrcmpi(
"SERVERNT", szProductType) == 0 )
5655 strlcat(strReturn,
"Advanced Server " ,2048);
5656 snprintf(temp,512,
"%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion);
5657 strlcat(strReturn, temp,2048);
5662 if( osvi.dwMajorVersion == 4 &&
5663 lstrcmpi( osvi.szCSDVersion,
"Service Pack 6" ) == 0 )
5669 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
5670 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
5671 0, KEY_QUERY_VALUE, &hKey );
5672 if( lRet == ERROR_SUCCESS ) {
5673 snprintf(temp, 512,
"Service Pack 6a (Build %d)", osvi.dwBuildNumber & 0xFFFF );
5674 strlcat(strReturn, temp,2048 );
5678 snprintf(temp,512,
"%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
5679 strlcat(strReturn, temp,2048 );
5682 RegCloseKey( hKey );
5686 snprintf(temp, 512,
"%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
5687 strlcat(strReturn, temp,2048 );
5693 case VER_PLATFORM_WIN32_WINDOWS:
5695 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
5697 strlcpy(strReturn,
"Microsoft Windows 95 ",2048);
5698 if (osvi.szCSDVersion[1]==
'C' || osvi.szCSDVersion[1]==
'B')
5699 strlcat(strReturn,
"OSR2 " ,2048);
5702 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
5704 strlcpy(strReturn,
"Microsoft Windows 98 ",2048);
5705 if ( osvi.szCSDVersion[1]==
'A' || osvi.szCSDVersion[1]==
'B')
5706 strlcat(strReturn,
"SE ",2048 );
5709 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
5711 strlcpy(strReturn,
"Microsoft Windows Millennium Edition",2048);
5715 case VER_PLATFORM_WIN32s:
5716 strlcpy(strReturn,
"Microsoft Win32s",2048);
5727 unsigned nHighestFeatureEx;
5731 nHighestFeatureEx = (unsigned)nBuff[0];
5733 if (nHighestFeatureEx >= 0x80000006) {
5735 return (((
unsigned)nBuff[2])>>16);
5745 SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
5746 SYSTEM_INFO sysInfo;
5747 MEMORYSTATUSEX statex;
5748 OSVERSIONINFO OsVersionInfo;
5750 char szKeyValueString[80];
5751 DWORD szKeyValueDword;
5756 NtQuerySystemInformation = (
PROCNTQSI)GetProcAddress(
5757 GetModuleHandle(
"ntdll"),
"NtQuerySystemInformation");
5759 if (!NtQuerySystemInformation) {
5761 "Error on GetProcAddress(NtQuerySystemInformation)");
5766 &SysPerfInfo,
sizeof(SysPerfInfo),
5768 OsVersionInfo.dwOSVersionInfoSize =
sizeof(OSVERSIONINFO);
5769 GetVersionEx(&OsVersionInfo);
5770 GetSystemInfo(&sysInfo);
5771 statex.dwLength =
sizeof(statex);
5772 if (!GlobalMemoryStatusEx(&statex)) {
5773 ::Error(
"GetWinNTSysInfo",
"Error on GlobalMemoryStatusEx()");
5776 sysinfo->
fCpus = sysInfo.dwNumberOfProcessors;
5785 status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System",
5786 0, KEY_QUERY_VALUE, &hKey);
5787 if (status == ERROR_SUCCESS) {
5788 dwBufLen =
sizeof(szKeyValueString);
5789 RegQueryValueEx(hKey,
"Identifier", NULL, NULL,(LPBYTE)szKeyValueString,
5791 sysinfo->
fModel = szKeyValueString;
5794 status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
5795 "Hardware\\Description\\System\\CentralProcessor\\0",
5796 0, KEY_QUERY_VALUE, &hKey);
5797 if (status == ERROR_SUCCESS) {
5798 dwBufLen =
sizeof(szKeyValueString);
5799 status = RegQueryValueEx(hKey,
"ProcessorNameString", NULL, NULL,
5800 (LPBYTE)szKeyValueString, &dwBufLen);
5801 if (status == ERROR_SUCCESS)
5802 sysinfo->
fCpuType = szKeyValueString;
5803 dwBufLen =
sizeof(DWORD);
5804 status = RegQueryValueEx(hKey,
"~MHz",NULL,NULL,(LPBYTE)&szKeyValueDword,
5806 if ((status == ERROR_SUCCESS) && ((sysinfo->
fCpuSpeed <= 0) ||
5807 (sysinfo->
fCpuSpeed < (szKeyValueDword >> 1))))
5821 SYSTEM_INFO sysInfo;
5822 Float_t idle_ratio, kernel_ratio, user_ratio, total_ratio;
5823 FILETIME ft_sys_idle, ft_sys_kernel, ft_sys_user, ft_fun_time;
5824 SYSTEMTIME st_fun_time;
5826 ULARGE_INTEGER ul_sys_idle, ul_sys_kernel, ul_sys_user;
5827 static ULARGE_INTEGER ul_sys_idleold = {0, 0};
5828 static ULARGE_INTEGER ul_sys_kernelold = {0, 0};
5829 static ULARGE_INTEGER ul_sys_userold = {0, 0};
5830 ULARGE_INTEGER ul_sys_idle_diff, ul_sys_kernel_diff, ul_sys_user_diff;
5832 ULARGE_INTEGER ul_fun_time;
5833 ULARGE_INTEGER ul_fun_timeold = {0, 0};
5834 ULARGE_INTEGER ul_fun_time_diff;
5836 typedef BOOL (__stdcall *GetSystemTimesProc)( LPFILETIME lpIdleTime,
5837 LPFILETIME lpKernelTime, LPFILETIME lpUserTime );
5838 static GetSystemTimesProc pGetSystemTimes = 0;
5840 HMODULE hModImagehlp = LoadLibrary(
"Kernel32.dll" );
5841 if (!hModImagehlp) {
5842 ::Error(
"GetWinNTCpuInfo",
"Error on LoadLibrary(Kernel32.dll)");
5846 pGetSystemTimes = (GetSystemTimesProc) GetProcAddress( hModImagehlp,
5848 if (!pGetSystemTimes) {
5849 ::Error(
"GetWinNTCpuInfo",
"Error on GetProcAddress(GetSystemTimes)");
5852 GetSystemInfo(&sysInfo);
5855 pGetSystemTimes(&ft_sys_idle,&ft_sys_kernel,&ft_sys_user);
5856 GetSystemTime(&st_fun_time);
5857 SystemTimeToFileTime(&st_fun_time,&ft_fun_time);
5859 memcpy(&ul_sys_idle, &ft_sys_idle,
sizeof(FILETIME));
5860 memcpy(&ul_sys_kernel, &ft_sys_kernel,
sizeof(FILETIME));
5861 memcpy(&ul_sys_user, &ft_sys_user,
sizeof(FILETIME));
5862 memcpy(&ul_fun_time, &ft_fun_time,
sizeof(FILETIME));
5864 ul_sys_idle_diff.QuadPart = ul_sys_idle.QuadPart -
5865 ul_sys_idleold.QuadPart;
5866 ul_sys_kernel_diff.QuadPart = ul_sys_kernel.QuadPart -
5867 ul_sys_kernelold.QuadPart;
5868 ul_sys_user_diff.QuadPart = ul_sys_user.QuadPart -
5869 ul_sys_userold.QuadPart;
5871 ul_fun_time_diff.QuadPart = ul_fun_time.QuadPart -
5872 ul_fun_timeold.QuadPart;
5874 ul_sys_idleold.QuadPart = ul_sys_idle.QuadPart;
5875 ul_sys_kernelold.QuadPart = ul_sys_kernel.QuadPart;
5876 ul_sys_userold.QuadPart = ul_sys_user.QuadPart;
5878 if (ul_fun_timeold.QuadPart == 0) {
5880 ul_fun_timeold.QuadPart = ul_fun_time.QuadPart;
5883 ul_fun_timeold.QuadPart = ul_fun_time.QuadPart;
5891 idle_ratio /= (
Float_t)sysInfo.dwNumberOfProcessors;
5892 user_ratio /= (
Float_t)sysInfo.dwNumberOfProcessors;
5893 kernel_ratio /= (
Float_t)sysInfo.dwNumberOfProcessors;
5894 total_ratio = 100.0 - idle_ratio;
5899 cpuinfo->
fUser = user_ratio;
5900 cpuinfo->
fSys = kernel_ratio;
5901 cpuinfo->
fTotal = total_ratio;
5902 cpuinfo->
fIdle = idle_ratio;
5911 MEMORYSTATUSEX statex;
5912 statex.dwLength =
sizeof(statex);
5913 if (!GlobalMemoryStatusEx(&statex)) {
5914 ::Error(
"GetWinNTMemInfo",
"Error on GlobalMemoryStatusEx()");
5917 used = (
Long64_t)(statex.ullTotalPhys - statex.ullAvailPhys);
5918 free = (
Long64_t) statex.ullAvailPhys;
5919 total = (
Long64_t) statex.ullTotalPhys;
5925 swap_total = (
Long64_t)(statex.ullTotalPageFile - statex.ullTotalPhys);
5926 swap_avail = (
Long64_t)(statex.ullAvailPageFile - statex.ullAvailPhys);
5927 swap_used = swap_total - swap_avail;
5940 FILETIME starttime, exittime, kerneltime, usertime;
5941 timeval ru_stime, ru_utime;
5944 typedef BOOL (__stdcall *GetProcessMemoryInfoProc)( HANDLE Process,
5946 static GetProcessMemoryInfoProc pGetProcessMemoryInfo = 0;
5948 HMODULE hModImagehlp = LoadLibrary(
"Psapi.dll" );
5949 if (!hModImagehlp) {
5950 ::Error(
"GetWinNTProcInfo",
"Error on LoadLibrary(Psapi.dll)");
5954 pGetProcessMemoryInfo = (GetProcessMemoryInfoProc) GetProcAddress(
5955 hModImagehlp,
"GetProcessMemoryInfo" );
5956 if (!pGetProcessMemoryInfo) {
5958 "Error on GetProcAddress(GetProcessMemoryInfo)");
5962 if ( pGetProcessMemoryInfo( GetCurrentProcess(), &pmc,
sizeof(pmc)) ) {
5966 if ( GetProcessTimes(GetCurrentProcess(), &starttime, &exittime,
5967 &kerneltime, &usertime)) {
5970 memcpy(&li, &kerneltime,
sizeof(FILETIME));
5972 ru_stime.tv_sec = li.QuadPart / 1000000
L;
5973 ru_stime.tv_usec = li.QuadPart % 1000000
L;
5975 memcpy(&li, &usertime,
sizeof(FILETIME));
5977 ru_utime.tv_sec = li.QuadPart / 1000000
L;
5978 ru_utime.tv_usec = li.QuadPart % 1000000
L;
5981 ((
Float_t)(ru_utime.tv_usec) / 1000000.);
5983 ((
Float_t)(ru_stime.tv_usec) / 1000000.);
5994 if (!info)
return -1;
6006 if (!info)
return -1;
6017 if (!info)
return -1;
6028 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.
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)
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
static constexpr double cm
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)
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
static constexpr double L
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
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 ~.
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.
static constexpr double s
void Beep(Int_t freq=-1, Int_t duration=-1, Bool_t setDefault=kFALSE)
Beep for duration milliseconds with a tone of frequency freq.
Bool_t HandleConsoleEvent()
__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.
Binding & operator=(OUT(*fun)(void))
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)
static const TString & GetLibDir()
Get the library directory in the installation. Static utility function.
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.
static const TString & GetBinDir()
Get the binary directory in the installation. Static utility function.
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.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
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