20#include "RConfigure.h"
48#if defined(R__SUN) || defined(R__AIX) || \
49 defined(R__LINUX) || defined(R__SOLARIS) || \
50 defined(R__FBSD) || defined(R__OBSD) || \
51 defined(R__MACOSX) || defined(R__HURD)
59#if defined(ULTRIX) || defined(R__SUN)
62#if defined(R__AIX) || defined(R__LINUX) || \
63 defined(R__FBSD) || defined(R__OBSD) || \
64 defined(R__LYNXOS) || defined(R__MACOSX) || defined(R__HURD)
65# include <sys/ioctl.h>
67#if defined(R__AIX) || defined(R__SOLARIS)
68# include <sys/select.h>
71# include <mach-o/dyld.h>
72# include <sys/mount.h>
73 extern "C" int statfs(
const char *
file,
struct statfs *buffer);
74#elif defined(R__LINUX) || defined(R__HURD)
76#elif defined(R__FBSD) || defined(R__OBSD)
77# include <sys/param.h>
78# include <sys/mount.h>
80# include <sys/statfs.h>
92#include <sys/resource.h>
97#include <sys/socket.h>
98#include <netinet/in.h>
99#include <netinet/tcp.h>
101# define _XOPEN_EXTENDED_SOURCE
102# include <arpa/inet.h>
103# undef _XOPEN_EXTENDED_SOURCE
104# if !defined(_AIX41) && !defined(_AIX43)
106# define HASNOT_INETATON
109# include <arpa/inet.h>
114#if defined(R__SOLARIS)
115# include <sys/systeminfo.h>
116# include <sys/filio.h>
117# include <sys/sockio.h>
118# define HASNOT_INETATON
120# define INADDR_NONE (UInt_t)-1
124#if defined(R__SOLARIS)
129#if defined(MAC_OS_X_VERSION_10_5)
135# include <sys/param.h>
136# if __FreeBSD_version >= 900007
141#if defined(R__AIX) || defined(R__FBSD) || \
142 defined(R__OBSD) || defined(R__LYNXOS) || \
143 (defined(R__MACOSX) && !defined(MAC_OS_X_VERSION_10_5))
147#if (defined(R__AIX) && !defined(_AIX43)) || \
148 (defined(R__SUNGCC3) && !defined(__arch64__))
150#elif defined(R__GLIBC) || defined(R__FBSD) || \
151 (defined(R__SUNGCC3) && defined(__arch64__)) || \
152 defined(R__OBSD) || defined(MAC_OS_X_VERSION_10_4) || \
153 (defined(R__AIX) && defined(_AIX43)) || \
154 (defined(R__SOLARIS) && defined(_SOCKLEN_T))
155# define USE_SOCKLEN_T
158#if defined(R__LYNXOS)
160 extern int putenv(
const char *);
161 extern int inet_aton(
const char *,
struct in_addr *);
167#define STRUCT_UTMP struct utmpx
170#define STRUCT_UTMP struct utmp
172#if !defined(UTMP_FILE) && defined(_PATH_UTMP)
173#define UTMP_FILE _PATH_UTMP
175#if defined(UTMPX_FILE)
177#define UTMP_FILE UTMPX_FILE
180#define UTMP_FILE "/etc/utmp"
184#if (defined(R__LINUX) || defined(R__HURD)) && !defined(R__WINGCC)
185# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 1
186# define HAVE_BACKTRACE_SYMBOLS_FD
190#if defined(R__MACOSX)
191# define HAVE_BACKTRACE_SYMBOLS_FD
195#ifdef HAVE_BACKTRACE_SYMBOLS_FD
196# include <execinfo.h>
205#ifdef HAVE_BACKTRACE_SYMBOLS_FD
208 static const int kMAX_BACKTRACE_DEPTH = 128;
212#if (defined(R__LINUX) && !defined(R__WINGCC))
213#include <fpu_control.h>
215#include <sys/prctl.h>
218#if defined(R__MACOSX) && defined(__SSE2__)
219#include <xmmintrin.h>
222#if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \
223 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \
230#include <mach/thread_status.h>
232#define fegetenvd(x) asm volatile("mffs %0" : "=f" (x));
233#define fesetenvd(x) asm volatile("mtfsf 255,%0" : : "f" (x));
236 FE_ENABLE_INEXACT = 0x00000008,
237 FE_ENABLE_DIVBYZERO = 0x00000010,
238 FE_ENABLE_UNDERFLOW = 0x00000020,
239 FE_ENABLE_OVERFLOW = 0x00000040,
240 FE_ENABLE_INVALID = 0x00000080,
241 FE_ENABLE_ALL_EXCEPT = 0x000000F8
245#if defined(R__MACOSX) && !defined(__SSE2__) && \
246 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__))
258 template<
typename U = T,
typename std::enable_if<std::is_member_po
inter<decltype(&U::ut_name)>::value,
int>::type = 0>
259 static char getValue(U* ue,
int) {
260 return ue->ut_name[0];
263 template<
typename U = T,
typename std::enable_if<std::is_member_po
inter<decltype(&U::ut_user)>::value,
int>::type = 0>
264 static char getValue(U* ue,
long) {
265 return ue->ut_user[0];
271 return ut_name<STRUCT_UTMP>::getValue(ue, 0);
279 TUtmpContent() : fUtmpContents(0), fEntries(0) {}
280 ~TUtmpContent() {
free(fUtmpContents); }
290 if (get_ut_name(ue) && !strncmp(tty, ue->ut_line,
sizeof(ue->ut_line)))
302 struct stat file_stats;
313 if (fstat(fileno(utmp), &file_stats) == -1) {
317 size = file_stats.st_size;
324 if (!fUtmpContents) {
329 n_read = fread(fUtmpContents, 1, size, utmp);
331 if (fclose(utmp) != EOF && n_read == size) {
350# define HOWMANY(x, y) (((x)+((y)-1))/(y))
365 TFdSet() { memset(fds_bits, 0,
sizeof(fds_bits)); }
366 TFdSet(
const TFdSet &
org) { memcpy(fds_bits,
org.fds_bits,
sizeof(
org.fds_bits)); }
367 TFdSet &
operator=(
const TFdSet &rhs) {
if (
this != &rhs) { memcpy(fds_bits, rhs.fds_bits,
sizeof(rhs.fds_bits));}
return *
this; }
368 void Zero() { memset(fds_bits, 0,
sizeof(fds_bits)); }
410 TTHREAD_TLS_DECL(
TString,exepath);
412#if defined(R__MACOSX)
413 exepath = _dyld_get_image_name(0);
414#elif defined(R__LINUX) || defined(R__SOLARIS) || defined(R__FBSD)
419 int ret = readlink(
"/proc/self/exe", buf,
kMAXPATHLEN);
420#elif defined(R__SOLARIS)
421 int ret = readlink(
"/proc/self/path/a.out", buf,
kMAXPATHLEN);
422#elif defined(R__FBSD)
423 int ret = readlink(
"/proc/curproc/file", buf,
kMAXPATHLEN);
451#if defined(HAVE_DLADDR) && !defined(R__MACOSX)
461 if (dladdr(addr, &info) && info.dli_fname && info.dli_fname[0]) {
463 if (!realpath(info.dli_fname, respath)) {
465 ::SysError(
"TUnixSystem::SetRootSys",
"error getting realpath of libCore, please set ROOTSYS in the shell");
477#if defined(R__MACOSX)
482static void DylibAdded(
const struct mach_header *mh, intptr_t )
491 gLinkedDylibs = linkedDylibs;
495 TString lib = _dyld_get_image_name(i++);
497 TRegexp sovers =
"libCore\\.[0-9]+\\.*[0-9]*\\.*[0-9]*\\.so";
498 TRegexp dyvers =
"libCore\\.[0-9]+\\.*[0-9]*\\.*[0-9]*\\.dylib";
506 if (!realpath(lib, respath)) {
508 ::SysError(
"TUnixSystem::DylibAdded",
"error getting realpath of libCore, please set ROOTSYS in the shell");
522 if (lib.
EndsWith(
"/libSystem.B.dylib")) {
524 if (linkedDylibs.
IsNull()) {
534 sovers =
"\\.[0-9]+\\.*[0-9]*\\.so";
540 dyvers =
"\\.[0-9]+\\.*[0-9]*\\.dylib";
541 idx = lib.
Index(dyvers);
547 if (linkedDylibs.
Length())
602#if defined(R__MACOSX)
605 _dyld_register_func_for_add_image(DylibAdded);
606#elif defined(HAVE_DLADDR)
649 char *tty = ::ttyname(0);
656 STRUCT_UTMP *utmp_entry = utmp.SearchUtmpEntry(tty);
658 if (utmp_entry->ut_host[0]) {
659 if (strchr(utmp_entry->ut_host,
':')) {
660 Setenv(
"DISPLAY", utmp_entry->ut_host);
661 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
662 utmp_entry->ut_host);
665 snprintf(disp,
sizeof(disp),
"%s:0.0", utmp_entry->ut_host);
667 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
672 else if (utmp_entry->ut_addr) {
674 struct sockaddr_in addr;
675 addr.sin_family = AF_INET;
677 memcpy(&addr.sin_addr, &utmp_entry->ut_addr,
sizeof(addr.sin_addr));
678 memset(&addr.sin_zero[0], 0,
sizeof(addr.sin_zero));
679 struct sockaddr *sa = (
struct sockaddr *) &addr;
681 char hbuf[NI_MAXHOST + 4];
682 if (getnameinfo(sa,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, NI_NAMEREQD) == 0) {
683 assert( strlen(hbuf) < NI_MAXHOST );
684 strcat(hbuf,
":0.0");
686 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
694 if (!
gROOT->IsBatch() && !getenv(
"DISPLAY")) {
695 Error(
"SetDisplay",
"Can't figure out DISPLAY, set it manually\n"
696 "In case you run a remote ssh session, restart your ssh session with:\n"
697 "=========> ssh -Y");
712#if defined(R__SOLARIS) || defined (R__LINUX) || defined(R__AIX) || \
713 defined(R__FBSD) || defined(R__OBSD) || defined(R__HURD)
714 return strerror(err);
716 if (err < 0 || err >= sys_nerr)
717 return Form(
"errno out of range %d", err);
718 return sys_errlist[err];
729#if defined(R__SOLARIS)
730 sysinfo(SI_HOSTNAME, hn,
sizeof(hn));
732 gethostname(hn,
sizeof(hn));
752 if (
h->HasReadInterest()) {
756 if (
h->HasWriteInterest()) {
782 int fd = th->
GetFd();
883#if defined(R__LINUX) && !defined(__powerpc__)
884#if defined(__GLIBC__) && (__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1)
886#if __GLIBC_MINOR__>=3
888 Int_t oldmask = fegetexcept();
895 Int_t oldmask = ~oldenv;
897 Int_t oldmask = ~oldenv.__control_word;
901 if (oldmask & FE_INVALID ) mask |=
kInvalid;
902 if (oldmask & FE_DIVBYZERO) mask |=
kDivByZero;
903 if (oldmask & FE_OVERFLOW ) mask |=
kOverflow;
904 if (oldmask & FE_UNDERFLOW) mask |=
kUnderflow;
906 if (oldmask & FE_INEXACT ) mask |=
kInexact;
911#if defined(R__MACOSX) && defined(__SSE2__)
913 Int_t oldmask = ~_MM_GET_EXCEPTION_MASK();
915 if (oldmask & _MM_MASK_INVALID ) mask |=
kInvalid;
916 if (oldmask & _MM_MASK_DIV_ZERO ) mask |=
kDivByZero;
917 if (oldmask & _MM_MASK_OVERFLOW ) mask |=
kOverflow;
918 if (oldmask & _MM_MASK_UNDERFLOW) mask |=
kUnderflow;
919 if (oldmask & _MM_MASK_INEXACT ) mask |=
kInexact;
922#if defined(R__MACOSX) && !defined(__SSE2__) && \
923 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__))
928 Int_t oldmask = ~oldenv.__fpscr;
929#elif defined(__arm64__)
930 Int_t oldmask = ~oldenv.__fpcr;
932 Int_t oldmask = ~oldenv.__control;
935 if (oldmask & FE_INVALID ) mask |=
kInvalid;
936 if (oldmask & FE_DIVBYZERO) mask |=
kDivByZero;
937 if (oldmask & FE_OVERFLOW ) mask |=
kOverflow;
938 if (oldmask & FE_UNDERFLOW) mask |=
kUnderflow;
939 if (oldmask & FE_INEXACT ) mask |=
kInexact;
942#if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \
943 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \
948 if (oldmask & FE_ENABLE_INVALID ) mask |=
kInvalid;
949 if (oldmask & FE_ENABLE_DIVBYZERO) mask |=
kDivByZero;
950 if (oldmask & FE_ENABLE_OVERFLOW ) mask |=
kOverflow;
951 if (oldmask & FE_ENABLE_UNDERFLOW) mask |=
kUnderflow;
952 if (oldmask & FE_ENABLE_INEXACT ) mask |=
kInexact;
968#if defined(R__LINUX) && !defined(__powerpc__)
969#if defined(__GLIBC__) && (__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1)
971 if (mask &
kInvalid ) newm |= FE_INVALID;
973 if (mask &
kOverflow ) newm |= FE_OVERFLOW;
976 if (mask &
kInexact ) newm |= FE_INEXACT;
979#if __GLIBC_MINOR__>=3
982 feclearexcept(FE_ALL_EXCEPT);
983 fedisableexcept(FE_ALL_EXCEPT);
984 feenableexcept(newm);
993 cur.__control_word &= ~newm;
1001#if defined(R__MACOSX) && defined(__SSE2__)
1004 if (mask &
kInvalid ) newm |= _MM_MASK_INVALID;
1005 if (mask &
kDivByZero) newm |= _MM_MASK_DIV_ZERO;
1006 if (mask &
kOverflow ) newm |= _MM_MASK_OVERFLOW;
1007 if (mask &
kUnderflow) newm |= _MM_MASK_UNDERFLOW;
1008 if (mask &
kInexact ) newm |= _MM_MASK_INEXACT;
1010 _MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~newm);
1013#if defined(R__MACOSX) && !defined(__SSE2__) && \
1014 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__))
1016 if (mask &
kInvalid ) newm |= FE_INVALID;
1018 if (mask &
kOverflow ) newm |= FE_OVERFLOW;
1020 if (mask &
kInexact ) newm |= FE_INEXACT;
1025 cur.__fpscr &= ~newm;
1026#elif defined(__arm64__)
1027 cur.__fpcr &= ~newm;
1029 cur.__control &= ~newm;
1034#if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \
1035 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \
1038 if (mask &
kInvalid ) newm |= FE_ENABLE_INVALID;
1039 if (mask &
kDivByZero) newm |= FE_ENABLE_DIVBYZERO;
1040 if (mask &
kOverflow ) newm |= FE_ENABLE_OVERFLOW;
1041 if (mask &
kUnderflow) newm |= FE_ENABLE_UNDERFLOW;
1042 if (mask &
kInexact ) newm |= FE_ENABLE_INEXACT;
1046 curmask = (curmask & ~FE_ENABLE_ALL_EXCEPT) | newm;
1058 Bool_t pollOnce = pendingOnly;
1067 if (!pendingOnly)
return;
1073 if (!pendingOnly)
return;
1078 if (pendingOnly && !pollOnce)
1084 if (!pendingOnly)
return;
1115 if (mxfd == 0 && nextto == -1)
1122 for (fd = 0; fd < mxfd; fd++) {
1126 if (rc < 0 && rc != -2) {
1127 SysError(
"DispatchOneEvent",
"select: read error on %d", fd);
1133 if (rc < 0 && rc != -2) {
1134 SysError(
"DispatchOneEvent",
"select: write error on %d", fd);
1151 tv.tv_sec = milliSec / 1000;
1152 tv.tv_usec = (milliSec % 1000) * 1000;
1154 select(0, 0, 0, 0, &tv);
1176 if (
h->HasReadInterest()) {
1180 if (
h->HasWriteInterest()) {
1184 h->ResetReadyMask();
1223 if (
h->HasReadInterest())
1225 if (
h->HasWriteInterest())
1227 h->ResetReadyMask();
1257 if (sync == sh->
IsSync()) {
1259 if ((
fSignals->IsSet(sig) && sigdone == -1) || sigdone == sig) {
1260 if (sigdone == -1) {
1285 TIter next(zombieHandler);
1286 register UnixPtty *pty;
1287 while ((pty = (UnixPtty*) next()))
1288 if (pty->GetPid() == pid) {
1289 zombieHandler->RemovePtr(pty);
1308 if ((fd <= fMaxrfd && fReadready->IsSet(fd) && fddone == -1) ||
1309 (fddone == fd && read)) {
1319 if ((fd <= fMaxwfd && fWriteready->IsSet(fd) && fddone == -1) ||
1320 (fddone == fd && !read)) {
1376 ::closedir((DIR*)dirp);
1430 return std::string(cwd);
1439 Error(
"WorkingDirectory",
"getcwd() failed");
1458 if (res)
return std::string(res);
1459 else return std::string();
1491 char *arg =
StrDup(base);
1492 int fd = mkstemp(arg);
1500 FILE *fp = fdopen(fd,
"w+");
1502 SysError(
"TempFileName",
"converting filedescriptor (%d)", fd);
1512 if (
name.IsNull() ||
name ==
".") {
1515 if (dir[strlen(dir) - 1] !=
'/')
1521 if (!dir || !dir[0]) dir =
"/";
1522 else if (dir[strlen(dir) - 1] !=
'/')
1560 FILE *from = fopen(
f,
"r");
1564 FILE *to = fopen(t,
"w");
1570 const int bufsize = 1024;
1573 while (!ret && !feof(from)) {
1574 size_t numread = fread (buf,
sizeof(
char), bufsize, from);
1575 size_t numwritten = fwrite(buf,
sizeof(
char), numread, to);
1576 if (numread != numwritten)
1591 int ret = ::rename(
f, t);
1636 return UnixFSstat(path,
id, bsize, blocks, bfree);
1645 return ::link(from, to);
1655 return ::symlink((
char*)from, (
char*)to);
1657 return ::symlink(from, to);
1671#if defined(R__SEEK64)
1672 struct stat64 finfo;
1673 if (lstat64(
name, &finfo) < 0)
1676 if (lstat(
name, &finfo) < 0)
1680 if (S_ISDIR(finfo.st_mode))
1681 return ::rmdir(
name);
1683 return ::unlink(
name);
1692 kShellEscape =
'\\',
1693 *kShellStuff =
"(){}<>\"'",
1708 const char *p, *patbuf = (
const char *)path;
1711 while (*patbuf ==
' ')
1715 for (p = patbuf; *p; p++)
1740 const char *patbuf = (
const char *)patbuf0;
1749 while (*patbuf ==
' ')
1753 for (p = patbuf; *p; p++)
1765 EscChar(patbuf, stuffedPat,
sizeof(stuffedPat), (
char*)kShellStuff, kShellEscape);
1770 if (stuffedPat[0] ==
'~') {
1771 if (stuffedPat[1] !=
'\0' && stuffedPat[1] !=
'/') {
1773 for (p = &stuffedPat[1],
q =
name; *p && *p !=
'/';)
1790 cmd += &stuffedPat[1];
1795 if ((pf = ::popen(cmd.Data(),
"r")) == 0) {
1806 for (ch = fgetc(pf); ch != EOF && ch !=
' ' && ch !=
'\n'; ch = fgetc(pf)) {
1812 if (
cnt == 0 && ch == EOF)
goto again;
1818 if (ch ==
' ' || ch ==
'\t') {
1852 return ::chmod(
file, mode);
1860 return ::umask(mask);
1873 t.actime = (time_t)actime;
1874 t.modtime = (time_t)modtime;
1875 return ::utime(
file, &t);
1888 show.
Form(
"Which: %s =", wfil.
Data());
1892 if (wfil[0] ==
'/') {
1893#if defined(R__SEEK64)
1894 struct stat64 finfo;
1895 if (access(wfil.
Data(), mode) == 0 &&
1896 stat64(wfil.
Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1899 if (access(wfil.
Data(), mode) == 0 &&
1900 stat(wfil.
Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1917 for (
const char* ptr = search; *ptr;) {
1919 if (*ptr !=
'/' && *ptr !=
'$' && *ptr !=
'~')
1921 const char* posEndOfPart = strchr(ptr,
':');
1923 name.Append(ptr, posEndOfPart - ptr);
1924 ptr = posEndOfPart + 1;
1930 if (!
name.EndsWith(
"/"))
1935#if defined(R__SEEK64)
1936 struct stat64 finfo;
1937 if (access(
name.Data(), mode) == 0 &&
1938 stat64(
name.Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1941 if (access(
name.Data(), mode) == 0 &&
1942 stat(
name.Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1964 if (!user || !user[0])
1967 struct passwd *apwd = getpwnam(user);
2014 static UserInfoCache_t gUserInfo;
2016 UserInfoCache_t::const_iterator iUserInfo = gUserInfo.find(uid);
2017 if (iUserInfo != gUserInfo.end())
2020 struct passwd *apwd = getpwuid(uid);
2033 gUserInfo[uid] = *ug;
2058 struct group *grp = getgrgid(gid);
2088 ::setenv(
name, value, 1);
2096 return ::getenv(
name);
2114 return ::system(shellcmd);
2122 return ::popen(command, mode);
2130 return ::pclose(pipe);
2167#include <mach/mach.h>
2175 typedef CSTypeRef CSSymbolicatorRef;
2176 typedef CSTypeRef CSSourceInfoRef;
2177 typedef CSTypeRef CSSymbolOwnerRef;
2178 typedef CSTypeRef CSSymbolRef;
2180 CSSymbolicatorRef CSSymbolicatorCreateWithPid(pid_t pid);
2181 CSSymbolRef CSSymbolicatorGetSymbolWithAddressAtTime(CSSymbolicatorRef cs, vm_address_t addr, uint64_t time);
2182 CSSourceInfoRef CSSymbolicatorGetSourceInfoWithAddressAtTime(CSSymbolicatorRef cs, vm_address_t addr, uint64_t time);
2183 const char* CSSymbolGetName(CSSymbolRef
sym);
2184 CSSymbolOwnerRef CSSymbolGetSymbolOwner(CSSymbolRef
sym);
2185 const char* CSSymbolOwnerGetPath(CSSymbolOwnerRef symbol);
2186 const char* CSSourceInfoGetPath(CSSourceInfoRef info);
2187 int CSSourceInfoGetLineNumber(CSSourceInfoRef info);
2190bool CSTypeRefIdValid(CSTypeRef ref) {
2191 return ref.csCppData || ref.csCppObj;
2194void macosx_backtrace() {
2195void* addrlist[kMAX_BACKTRACE_DEPTH];
2197 int numstacks = backtrace( addrlist,
sizeof( addrlist ) /
sizeof(
void* ));
2199 CSSymbolicatorRef symbolicator = CSSymbolicatorCreateWithPid(getpid());
2202 static const int skipFrames = 2;
2203 for (
int i = skipFrames; i < numstacks; ++i) {
2205 CSSymbolRef
sym = CSSymbolicatorGetSymbolWithAddressAtTime(symbolicator,
2206 (vm_address_t)addrlist[i],
2208 CSSymbolOwnerRef symOwner = CSSymbolGetSymbolOwner(
sym);
2210 if (
const char* libPath = CSSymbolOwnerGetPath(symOwner)) {
2211 printf(
"[%s]", libPath);
2213 printf(
"[<unknown binary>]");
2216 if (
const char* symname = CSSymbolGetName(
sym)) {
2217 printf(
" %s", symname);
2220 CSSourceInfoRef sourceInfo
2221 = CSSymbolicatorGetSourceInfoWithAddressAtTime(symbolicator,
2222 (vm_address_t)addrlist[i],
2224 if (
const char* sourcePath = CSSourceInfoGetPath(sourceInfo)) {
2225 printf(
" %s:%d", sourcePath, (
int)CSSourceInfoGetLineNumber(sourceInfo));
2227 printf(
" (no debug info)");
2244 gdbscript = gdbscript.
Strip();
2245 if (gdbscript !=
"") {
2247 fprintf(stderr,
"Root.StacktraceScript %s does not exist\n", gdbscript.
Data());
2251 if (gdbscript ==
"") {
2252 gdbscript =
"gdb-backtrace.sh";
2255 fprintf(stderr,
"Error in <TUnixSystem::StackTrace> script %s is missing\n", gdbscript.
Data());
2262 gdbmess = gdbmess.
Strip();
2270 int fd = STDERR_FILENO;
2272 const char *message =
" Generating stack trace...\n";
2274 if (fd && message) { }
2277 Getlinem(kCleanUp, 0);
2279#if defined(USE_GDB_STACK_TRACE)
2282 fprintf(stderr,
"gdb not found, need it for stack trace\n");
2287 TString gdbmessf =
"gdb-message";
2288 if (gdbmess !=
"") {
2290 fprintf(
f,
"%s\n", gdbmess.
Data());
2298 if (gdbmess !=
"") {
2300 gdbscript += gdbmessf;
2302 gdbscript +=
" 1>&2";
2307#elif defined(R__AIX)
2308 TString script =
"procstack ";
2312#elif defined(R__SOLARIS)
2323#elif defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_DLADDR)
2331 const char *cppfilt =
"c++filt";
2332 const char *cppfiltarg =
"";
2334 const char *format1 =
" 0x%016lx in %.200s %s 0x%lx from %.200s\n";
2336 const char *format2 =
" 0x%016lx in %.200s\n";
2338 const char *format2 =
" 0x%016lx in %.200s at %.200s from %.200s\n";
2340 const char *format3 =
" 0x%016lx in %.200s from %.200s\n";
2341 const char *format4 =
" 0x%016lx in <unknown function>\n";
2343 const char *format1 =
" 0x%08lx in %.200s %s 0x%lx from %.200s\n";
2345 const char *format2 =
" 0x%08lx in %.200s\n";
2347 const char *format2 =
" 0x%08lx in %.200s at %.200s from %.200s\n";
2349 const char *format3 =
" 0x%08lx in %.200s from %.200s\n";
2350 const char *format4 =
" 0x%08lx in <unknown function>\n";
2362 while (help.
Gets(p)) {
2364 cppfiltarg =
"--format=gnu-v3";
2366 }
else if (help.
Index(
"gnu-new-abi") !=
kNPOS) {
2367 cppfiltarg =
"--format=gnu-new-abi";
2376#if (defined(R__LINUX) && !defined(R__WINGCC))
2379#ifdef PR_SET_PTRACER
2380 prctl(PR_SET_PTRACER, getpid(), 0, 0, 0);
2386 TString gdbmessf =
"gdb-message";
2387 if (gdbmess !=
"") {
2389 fprintf(
f,
"%s\n", gdbmess.
Data());
2399 if (gdbmess !=
"") {
2401 gdbscript += gdbmessf;
2403 gdbscript +=
" 1>&2";
2416 if (write(fd, message, strlen(message)) < 0)
2421 TString tmpf1 =
"gdb-backtrace";
2422 std::ofstream file1;
2428 Error(
"StackTrace",
"could not open file %s", tmpf1.
Data());
2440 void *trace[kMAX_BACKTRACE_DEPTH];
2441 int depth = backtrace(trace, kMAX_BACKTRACE_DEPTH);
2442 for (
int n = 5;
n < depth;
n++) {
2446 if (dladdr(trace[
n], &info) && info.dli_fname && info.dli_fname[0]) {
2447 const char *libname = info.dli_fname;
2448 const char *symname = (info.dli_sname && info.dli_sname[0]) ?
2449 info.dli_sname :
"<unknown>";
2452 Bool_t gte = (addr >= symaddr);
2453 ULong_t diff = (gte) ? addr - symaddr : symaddr - addr;
2454 if (addr2line && symaddr) {
2458#if defined(MAC_OS_X_VERSION_10_10)
2459 snprintf(buffer,
sizeof(buffer),
"%s -p %d 0x%016lx", addr2line,
GetPid(), addr);
2460#elif defined(MAC_OS_X_VERSION_10_9)
2462 snprintf(buffer,
sizeof(buffer),
"%s -d -p %d 0x%016lx", addr2line,
GetPid(), addr);
2464 snprintf(buffer,
sizeof(buffer),
"%s -p %d 0x%016lx", addr2line,
GetPid(), addr);
2467 ULong_t offset = (addr >= libaddr) ? addr - libaddr :
2473 if (
name.Contains(
".so") ||
name.Contains(
".sl")) noShare =
kFALSE;
2474 if (noShare) offset = addr;
2475 if (noPath)
name =
"`which " +
name +
"`";
2476 snprintf(buffer,
sizeof(buffer),
"%s -e %s 0x%016lx", addr2line,
name.Data(), offset);
2478 if (FILE *pf = ::popen(buffer,
"r")) {
2480 if (fgets(buf, 2048, pf)) {
2481 buf[strlen(buf)-1] = 0;
2482 if (strncmp(buf,
"??", 2)) {
2484 snprintf(buffer,
sizeof(buffer), format2, addr, buf);
2486 snprintf(buffer,
sizeof(buffer), format2, addr, symname, buf, libname);
2494 snprintf(buffer,
sizeof(buffer), format1, addr, symname,
2495 gte ?
"+" :
"-", diff, libname);
2498 snprintf(buffer,
sizeof(buffer), format1, addr, symname,
2499 gte ?
"+" :
"-", diff, libname);
2501 snprintf(buffer,
sizeof(buffer), format3, addr, symname, libname);
2504 snprintf(buffer,
sizeof(buffer), format4, addr);
2510 if (write(fd, buffer, ::strlen(buffer)) < 0)
2515 TString tmpf2 =
"gdb-backtrace";
2519 snprintf(buffer,
sizeof(buffer),
"%s %s < %s > %s", filter, cppfiltarg, tmpf1.
Data(), tmpf2.
Data());
2521 std::ifstream file2(tmpf2);
2525 line.ReadString(file2);
2526 if (write(fd,
line.Data(),
line.Length()) < 0)
2534 delete [] addr2line;
2537#elif defined(HAVE_EXCPT_H) && defined(HAVE_PDSC_H) && \
2538 defined(HAVE_RLD_INTERFACE_H)
2547 exc_capture_context (&context);
2548 while (!rc && context.sc_pc) {
2550 pdsc_crd *func, *base, *crd
2551 = exc_remote_lookup_function_entry(0, 0, context.sc_pc, 0, &func, &base);
2552 Elf32_Addr addr = PDSC_CRD_BEGIN_ADDRESS(base, func);
2554 const char *
name =
"<unknown function>";
2555 sprintf(buffer,
" 0x%012lx %.200s + 0x%lx\n",
2556 context.sc_pc,
name, context.sc_pc - addr);
2557 write(fd, buffer, ::strlen(buffer));
2558 rc = exc_virtual_unwind(0, &context);
2603 ::openlog(
name, options, fac);
2613 ::syslog(level,
"%s", mess);
2653 const char *tty = ttyname(STDOUT_FILENO);
2657 if ((xh->
fStdOutDup = dup(STDOUT_FILENO)) < 0) {
2665 const char *tty = ttyname(STDERR_FILENO);
2669 if ((xh->
fStdErrDup = dup(STDERR_FILENO)) < 0) {
2671 if (outdone && dup2(xh->
fStdOutDup, STDOUT_FILENO) < 0) {
2672 Warning(
"RedirectOutput",
"could not restore stdout (back to original redirected"
2681 const char *
m = (mode[0] ==
'a' || mode[0] ==
'w') ? mode :
"a";
2694 if (freopen(
file,
m, stdout) == 0) {
2698 if (freopen(
file,
m, stderr) == 0) {
2714 if (
close(STDOUT_FILENO) != 0) {
2716 "problems closing STDOUT_FILENO (%d) before 'dup2' (errno: %d)",
2720 if (dup2(xh->
fStdOutDup, STDOUT_FILENO) < 0) {
2721 SysError(
"RedirectOutput",
"could not restore stdout (back to original redirected"
2727 "problems closing temporary 'out' descriptor %d (errno: %d)",
2740 if (
close(STDERR_FILENO) != 0) {
2742 "problems closing STDERR_FILENO (%d) before 'dup2' (errno: %d)",
2746 if (dup2(xh->
fStdErrDup, STDERR_FILENO) < 0) {
2747 SysError(
"RedirectOutput",
"could not restore stderr (back to original redirected"
2753 "problems closing temporary 'err' descriptor %d (errno: %d)",
2798 Error(
"ListSymbols",
"not yet implemented");
2820 if (!linkedLibs.
IsNull())
2826#if !defined(R__MACOSX)
2832#if defined(R__MACOSX)
2834 linkedLibs = gLinkedDylibs;
2838 while (otool.
Gets(p)) {
2843 if (!linkedLibs.
IsNull())
2845 linkedLibs += dylib;
2853#elif defined(R__LINUX) || defined(R__SOLARIS) || defined(R__AIX)
2854#if defined(R__WINGCC )
2855 const char *cLDD=
"cygcheck";
2856 const char *cSOEXT=
".dll";
2857 size_t lenexe = strlen(exe);
2858 if (strcmp(exe + lenexe - 4,
".exe")
2859 && strcmp(exe + lenexe - 4,
".dll")) {
2862 char* longerexe =
new char[lenexe + 5];
2863 strlcpy(longerexe, exe,lenexe+5);
2864 strlcat(longerexe,
".exe",lenexe+5);
2868 TRegexp sovers =
"\\.so\\.[0-9]+";
2870 const char *cLDD=
"ldd";
2872 const char *cSOEXT=
".a";
2873 TRegexp sovers =
"\\.a\\.[0-9]+";
2875 const char *cSOEXT=
".so";
2876 TRegexp sovers =
"\\.so\\.[0-9]+";
2882 while (ldd.
Gets(p)) {
2901 if (!linkedLibs.
IsNull())
2903 linkedLibs += solib;
2948 if (mode && t->
IsSync()) {
2951 }
else if (!mode && t->
IsAsync()) {
3005 struct addrinfo hints;
3006 struct addrinfo *result, *rp;
3007 memset(&hints, 0,
sizeof(
struct addrinfo));
3008 hints.ai_family = AF_INET;
3009 hints.ai_socktype = 0;
3010 hints.ai_protocol = 0;
3011 hints.ai_flags = AI_CANONNAME;
3016 size_t lenHostname = strlen(hostname);
3017 std::string hostnameWithoutLocal{hostname};
3018 if (lenHostname > 6 && !strcmp(hostname + lenHostname - 6,
".local")) {
3019 hostnameWithoutLocal.erase(lenHostname - 6);
3020 hostname = hostnameWithoutLocal.c_str();
3025 int rc = getaddrinfo(hostname,
nullptr, &hints, &result);
3027 if (rc == EAI_NONAME) {
3028 if (
gDebug > 0)
Error(
"GetHostByName",
"unknown host '%s'", hostname);
3031 Error(
"GetHostByName",
"getaddrinfo failed for '%s': %s", hostname, gai_strerror(rc));
3037 std::string hostcanon(result->ai_canonname ? result->ai_canonname : hostname);
3039 ia.
fFamily = result->ai_family;
3040 ia.
fAddresses[0] = ntohl(((
struct sockaddr_in *)(result->ai_addr))->sin_addr.s_addr);
3042 if (hostcanon.compare(hostname) != 0) ia.
AddAlias(hostname);
3045 char tmp[
sizeof(
struct in_addr)];
3046 if (inet_pton(AF_INET, hostcanon.data(), tmp) == 1) {
3047 char hbuf[NI_MAXHOST];
3048 if (getnameinfo(result->ai_addr, result->ai_addrlen, hbuf,
sizeof(hbuf),
nullptr, 0, 0) == 0)
3053 rp = result->ai_next;
3054 for (; rp !=
nullptr; rp = rp->ai_next) {
3055 UInt_t arp = ntohl(((
struct sockaddr_in *)(rp->ai_addr))->sin_addr.s_addr);
3060 freeaddrinfo(result);
3069 struct sockaddr addr;
3070#if defined(USE_SIZE_T)
3071 size_t len =
sizeof(addr);
3072#elif defined(USE_SOCKLEN_T)
3073 socklen_t len =
sizeof(addr);
3075 int len =
sizeof(addr);
3079 if (getsockname(sock, &addr, &len) == -1) {
3080 SysError(
"GetSockName",
"getsockname failed");
3084 if (addr.sa_family != AF_INET)
return ia;
3086 struct sockaddr_in *addrin = (
struct sockaddr_in *)&addr;
3087 ia.
fPort = ntohs(addrin->sin_port);
3088 ia.
fAddresses[0] = ntohl(addrin->sin_addr.s_addr);
3090 char hbuf[NI_MAXHOST];
3091 if (getnameinfo(&addr,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, 0) != 0) {
3092 Error(
"GetSockName",
"getnameinfo failed");
3105 struct sockaddr addr;
3106#if defined(USE_SIZE_T)
3107 size_t len =
sizeof(addr);
3108#elif defined(USE_SOCKLEN_T)
3109 socklen_t len =
sizeof(addr);
3111 int len =
sizeof(addr);
3115 if (getpeername(sock, &addr, &len) == -1) {
3116 SysError(
"GetPeerName",
"getpeername failed");
3120 if (addr.sa_family != AF_INET)
return ia;
3122 struct sockaddr_in *addrin = (
struct sockaddr_in *)&addr;
3123 ia.
fPort = ntohs(addrin->sin_port);
3124 ia.
fAddresses[0] = ntohl(addrin->sin_addr.s_addr);
3126 char hbuf[NI_MAXHOST];
3127 if (getnameinfo(&addr,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, 0) != 0) {
3128 Error(
"GetPeerName",
"getnameinfo failed");
3143 if ((sp = getservbyname(servicename,
kProtocolName)) == 0) {
3144 Error(
"GetServiceByName",
"no service \"%s\" with protocol \"%s\"\n",
3148 return ntohs(sp->s_port);
3158 if ((sp = getservbyport(htons(port),
kProtocolName)) == 0) {
3161 return Form(
"%d", port);
3170 int tcpwindowsize,
const char *protocol)
3172 if (!strcmp(servername,
"unix")) {
3178 if (!strcmp(protocol,
"udp")){
3248 while ((soc = ::accept(sock, 0, 0)) == -1 &&
GetErrno() == EINTR)
3255 SysError(
"AcceptConnection",
"accept");
3268 if (sock < 0)
return;
3270#if !defined(R__AIX) || defined(_AIX41) || defined(_AIX43)
3272 ::shutdown(sock, 2);
3288 if (
UnixRecv(sock, &header,
sizeof(header), 0) > 0) {
3289 int count = ntohl(header);
3291 if (count > length) {
3292 Error(
"RecvBuf",
"record header exceeds buffer size");
3294 }
else if (count > 0) {
3295 if (
UnixRecv(sock, buf, count, 0) < 0) {
3296 Error(
"RecvBuf",
"cannot receive buffer");
3311 Int_t header = htonl(length);
3313 if (
UnixSend(sock, &header,
sizeof(header), 0) < 0) {
3314 Error(
"SendBuf",
"cannot send header");
3318 if (
UnixSend(sock, buf, length, 0) < 0) {
3319 Error(
"SendBuf",
"cannot send buffer");
3359 if ((
n =
UnixRecv(sock, buf, length, flag)) <= 0) {
3361 Error(
"RecvRaw",
"cannot receive buffer");
3394 if ((
n =
UnixSend(sock, buf, length, flag)) <= 0) {
3396 Error(
"SendRaw",
"cannot send buffer");
3407 if (sock < 0)
return -1;
3411 if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)&val,
sizeof(val)) == -1) {
3412 SysError(
"SetSockOpt",
"setsockopt(SO_SNDBUF)");
3417 if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)&val,
sizeof(val)) == -1) {
3418 SysError(
"SetSockOpt",
"setsockopt(SO_RCVBUF)");
3423 if (setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)&val,
sizeof(val)) == -1) {
3424 SysError(
"SetSockOpt",
"setsockopt(SO_OOBINLINE)");
3429 if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)&val,
sizeof(val)) == -1) {
3430 SysError(
"SetSockOpt",
"setsockopt(SO_KEEPALIVE)");
3435 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)&val,
sizeof(val)) == -1) {
3436 SysError(
"SetSockOpt",
"setsockopt(SO_REUSEADDR)");
3441 if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)&val,
sizeof(val)) == -1) {
3442 SysError(
"SetSockOpt",
"setsockopt(TCP_NODELAY)");
3447 if (ioctl(sock, FIONBIO, (
char*)&val) == -1) {
3448 SysError(
"SetSockOpt",
"ioctl(FIONBIO)");
3454 if (ioctl(sock, SIOCSPGRP, (
char*)&val) == -1) {
3455 SysError(
"SetSockOpt",
"ioctl(SIOCSPGRP)");
3459 Error(
"SetSockOpt",
"ioctl(SIOCGPGRP) not supported on cygwin/gcc");
3466 Error(
"SetSockOpt",
"illegal option (%d)", opt);
3477 if (sock < 0)
return -1;
3479#if defined(USE_SOCKLEN_T) || defined(_AIX43)
3480 socklen_t optlen =
sizeof(*val);
3481#elif defined(USE_SIZE_T)
3482 size_t optlen =
sizeof(*val);
3484 int optlen =
sizeof(*val);
3489 if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)val, &optlen) == -1) {
3490 SysError(
"GetSockOpt",
"getsockopt(SO_SNDBUF)");
3495 if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)val, &optlen) == -1) {
3496 SysError(
"GetSockOpt",
"getsockopt(SO_RCVBUF)");
3501 if (getsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)val, &optlen) == -1) {
3502 SysError(
"GetSockOpt",
"getsockopt(SO_OOBINLINE)");
3507 if (getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)val, &optlen) == -1) {
3508 SysError(
"GetSockOpt",
"getsockopt(SO_KEEPALIVE)");
3513 if (getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)val, &optlen) == -1) {
3514 SysError(
"GetSockOpt",
"getsockopt(SO_REUSEADDR)");
3519 if (getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)val, &optlen) == -1) {
3520 SysError(
"GetSockOpt",
"getsockopt(TCP_NODELAY)");
3526 if ((flg = fcntl(sock, F_GETFL, 0)) == -1) {
3527 SysError(
"GetSockOpt",
"fcntl(F_GETFL)");
3530 *val = flg & O_NDELAY;
3533#if !defined(R__LYNXOS) && !defined(R__WINGCC)
3534 if (ioctl(sock, SIOCGPGRP, (
char*)val) == -1) {
3535 SysError(
"GetSockOpt",
"ioctl(SIOCGPGRP)");
3539 Error(
"GetSockOpt",
"ioctl(SIOCGPGRP) not supported on LynxOS and cygwin/gcc");
3544#if !defined(R__LYNXOS)
3545 if (ioctl(sock, SIOCATMARK, (
char*)val) == -1) {
3546 SysError(
"GetSockOpt",
"ioctl(SIOCATMARK)");
3550 Error(
"GetSockOpt",
"ioctl(SIOCATMARK) not supported on LynxOS");
3555#if !defined(R__LYNXOS)
3556 if (ioctl(sock, FIONREAD, (
char*)val) == -1) {
3557 SysError(
"GetSockOpt",
"ioctl(FIONREAD)");
3561 Error(
"GetSockOpt",
"ioctl(FIONREAD) not supported on LynxOS");
3566 Error(
"GetSockOpt",
"illegal option (%d)", opt);
3581static struct Signalmap_t {
3584 struct sigaction *fOldHandler;
3585 const char *fSigName;
3587 { SIGBUS, 0, 0,
"bus error" },
3588 { SIGSEGV, 0, 0,
"segmentation violation" },
3589 { SIGSYS, 0, 0,
"bad argument to system call" },
3590 { SIGPIPE, 0, 0,
"write on a pipe with no one to read it" },
3591 { SIGILL, 0, 0,
"illegal instruction" },
3592 { SIGQUIT, 0, 0,
"quit" },
3593 { SIGINT, 0, 0,
"interrupt" },
3594 { SIGWINCH, 0, 0,
"window size change" },
3595 { SIGALRM, 0, 0,
"alarm clock" },
3596 { SIGCHLD, 0, 0,
"death of a child" },
3597 { SIGURG, 0, 0,
"urgent data arrived on an I/O channel" },
3598 { SIGFPE, 0, 0,
"floating point exception" },
3599 { SIGTERM, 0, 0,
"termination signal" },
3600 { SIGUSR1, 0, 0,
"user-defined signal 1" },
3601 { SIGUSR2, 0, 0,
"user-defined signal 2" }
3652 Break(
"TUnixSystem::DispatchSignals",
"%s: printing stacktrace",
UnixSigname(sig));
3675 struct sigaction sigact;
3678 gSignalMap[sig].fOldHandler =
new struct sigaction();
3682#elif defined(R__SOLARIS)
3684#elif defined(R__LYNXOS)
3693 sigemptyset(&sigact.sa_mask);
3694 sigact.sa_flags = 0;
3695#if defined(SA_RESTART)
3696 sigact.sa_flags |= SA_RESTART;
3698 if (sigaction(
gSignalMap[sig].fCode, &sigact,
3700 ::SysError(
"TUnixSystem::UnixSignal",
"sigaction");
3711 TTHREAD_TLS_ARRAY(
struct sigaction,
kMAXSIGNALS,oldsigact);
3713 if (ignore != ignoreSig[sig]) {
3714 ignoreSig[sig] = ignore;
3716 struct sigaction sigact;
3718 sigact.sa_handler = (
void (*)())SIG_IGN;
3719#elif defined(R__SOLARIS)
3720 sigact.sa_handler = (
void (*)(int))SIG_IGN;
3722 sigact.sa_handler = SIG_IGN;
3724 sigemptyset(&sigact.sa_mask);
3725 sigact.sa_flags = 0;
3726 if (sigaction(
gSignalMap[sig].fCode, &sigact, &oldsigact[sig]) < 0)
3727 ::SysError(
"TUnixSystem::UnixIgnoreSignal",
"sigaction");
3729 if (sigaction(
gSignalMap[sig].fCode, &oldsigact[sig], 0) < 0)
3730 ::SysError(
"TUnixSystem::UnixIgnoreSignal",
"sigaction");
3746 struct sigaction sigact;
3749#elif defined(R__SOLARIS)
3751#elif defined(R__LYNXOS)
3760 sigemptyset(&sigact.sa_mask);
3761 sigact.sa_flags = 0;
3763#if defined(SA_INTERRUPT)
3764 sigact.sa_flags |= SA_INTERRUPT;
3767#if defined(SA_RESTART)
3768 sigact.sa_flags |= SA_RESTART;
3772 ::SysError(
"TUnixSystem::UnixSigAlarmInterruptsSyscalls",
"sigaction");
3792 ::SysError(
"TUnixSystem::UnixSignal",
"sigaction");
3815 static std::atomic<time_t> jan95{0};
3826 jan95 = mktime(&tp);
3827 if ((
int)jan95 == -1) {
3828 ::SysError(
"TUnixSystem::UnixNow",
"error converting 950001 0:00 to time_t");
3834 gettimeofday(&t, 0);
3843 struct itimerval itv;
3844 itv.it_value.tv_sec = 0;
3845 itv.it_value.tv_usec = 0;
3846 itv.it_interval.tv_sec = 0;
3847 itv.it_interval.tv_usec = 0;
3849 itv.it_value.tv_sec = time_t(
ms / 1000);
3850 itv.it_value.tv_usec = time_t((
ms % 1000) * 1000);
3852 int st = setitimer(ITIMER_REAL, &itv, 0);
3854 ::SysError(
"TUnixSystem::UnixSetitimer",
"setitimer");
3872 fd_set *rd = (readready) ? (fd_set*)readready->GetBits() : 0;
3873 fd_set *wr = (writeready) ? (fd_set*)writeready->GetBits() : 0;
3877 tv.tv_sec =
Int_t(timeout / 1000);
3878 tv.tv_usec = (timeout % 1000) * 1000;
3879 retcode = select(nfds, rd, wr, 0, &tv);
3881 retcode = select(nfds, rd, wr, 0, 0);
3883 if (retcode == -1) {
3914 pw = getpwnam(
name);
3923 pw = getpwuid(getuid());
3956 if (stat(edir, &finfo) < 0)
3959 if (!S_ISDIR(finfo.st_mode))
3962 return (
void*) opendir(edir);
3965#if defined(_POSIX_SOURCE)
3968# define REAL_DIR_ENTRY(dp) 1
3970# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
3978 DIR *dirp = (DIR*)dirp1;
4010#if defined(R__SEEK64)
4012 if (path && lstat64(path, &sbuf) == 0) {
4015 if (path && lstat(path, &sbuf) == 0) {
4017 buf.
fIsLink = S_ISLNK(sbuf.st_mode);
4019#if defined(R__SEEK64)
4020 if (stat64(path, &sbuf) == -1) {
4022 if (stat(path, &sbuf) == -1) {
4027 buf.
fDev = sbuf.st_dev;
4028 buf.
fIno = sbuf.st_ino;
4029 buf.
fMode = sbuf.st_mode;
4030 buf.
fUid = sbuf.st_uid;
4031 buf.
fGid = sbuf.st_gid;
4032 buf.
fSize = sbuf.st_size;
4033 buf.
fMtime = sbuf.st_mtime;
4052 struct statfs statfsbuf;
4053#if (defined(R__SOLARIS) && !defined(R__LINUX))
4054 if (statfs(path, &statfsbuf,
sizeof(
struct statfs), 0) == 0) {
4055 *
id = statfsbuf.f_fstyp;
4056 *bsize = statfsbuf.f_bsize;
4057 *blocks = statfsbuf.f_blocks;
4058 *bfree = statfsbuf.f_bfree;
4060 if (statfs((
char*)path, &statfsbuf) == 0) {
4066 if (!strcmp(statfsbuf.f_fstypename, MOUNT_FFS) ||
4067 !strcmp(statfsbuf.f_fstypename, MOUNT_MFS))
4069 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_NFS))
4071 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_MSDOS))
4073 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_EXT2FS))
4075 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_CD9660))
4077 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_NCPFS))
4082 *
id = statfsbuf.f_type;
4084 *bsize = statfsbuf.f_bsize;
4085 *blocks = statfsbuf.f_blocks;
4086 *bfree = statfsbuf.f_bavail;
4099 return (
int) waitpid(0, &status, WNOHANG);
4120 sport = htons(port);
4123 if (!addr.
IsValid())
return -1;
4126 struct sockaddr_in server;
4127 memset(&server, 0,
sizeof(server));
4128 memcpy(&server.sin_addr, &adr,
sizeof(adr));
4130 server.sin_port = sport;
4134 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4135 ::SysError(
"TUnixSystem::UnixTcpConnect",
"socket (%s:%d)",
4140 if (tcpwindowsize > 0) {
4145 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
4149 ::SysError(
"TUnixSystem::UnixTcpConnect",
"connect (%s:%d)",
4171 sport = htons(port);
4174 if (!addr.
IsValid())
return -1;
4177 struct sockaddr_in server;
4178 memset(&server, 0,
sizeof(server));
4179 memcpy(&server.sin_addr, &adr,
sizeof(adr));
4181 server.sin_port = sport;
4185 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
4186 ::SysError(
"TUnixSystem::UnixUdpConnect",
"socket (%s:%d)",
4191 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
4195 ::SysError(
"TUnixSystem::UnixUdpConnect",
"connect (%s:%d)",
4217 if (!sockpath || strlen(sockpath) <= 0) {
4218 ::SysError(
"TUnixSystem::UnixUnixConnect",
"socket path undefined");
4223 struct sockaddr_un unserver;
4224 unserver.sun_family = AF_UNIX;
4226 if (strlen(sockpath) >
sizeof(unserver.sun_path)-1) {
4227 ::Error(
"TUnixSystem::UnixUnixConnect",
"socket path %s, longer than max allowed length (%u)",
4228 sockpath, (
UInt_t)
sizeof(unserver.sun_path)-1);
4231 strcpy(unserver.sun_path, sockpath);
4234 if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
4235 ::SysError(
"TUnixSystem::UnixUnixConnect",
"socket");
4239 while (connect(sock, (
struct sockaddr*) &unserver, strlen(unserver.sun_path)+2) == -1) {
4243 ::SysError(
"TUnixSystem::UnixUnixConnect",
"connect");
4266 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
4267 short sport, tryport = kSOCKET_MINPORT;
4270 if (port == 0 && reuse) {
4271 ::Error(
"TUnixSystem::UnixTcpService",
"cannot do a port scan while reuse is true");
4278 sport = htons(port);
4282 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4283 ::SysError(
"TUnixSystem::UnixTcpService",
"socket");
4290 if (tcpwindowsize > 0) {
4295 struct sockaddr_in inserver;
4296 memset(&inserver, 0,
sizeof(inserver));
4297 inserver.sin_family = AF_INET;
4298 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
4299 inserver.sin_port = sport;
4303 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
4304 ::SysError(
"TUnixSystem::UnixTcpService",
"bind");
4311 inserver.sin_port = htons(tryport);
4312 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
4314 }
while (bret < 0 &&
GetErrno() == EADDRINUSE && tryport < kSOCKET_MAXPORT);
4316 ::SysError(
"TUnixSystem::UnixTcpService",
"bind (port scan)");
4323 if (::listen(sock, backlog)) {
4324 ::SysError(
"TUnixSystem::UnixTcpService",
"listen");
4341 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
4342 short sport, tryport = kSOCKET_MINPORT;
4348 sport = htons(port);
4352 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
4353 ::SysError(
"TUnixSystem::UnixUdpService",
"socket");
4357 struct sockaddr_in inserver;
4358 memset(&inserver, 0,
sizeof(inserver));
4359 inserver.sin_family = AF_INET;
4360 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
4361 inserver.sin_port = sport;
4365 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
4366 ::SysError(
"TUnixSystem::UnixUdpService",
"bind");
4373 inserver.sin_port = htons(tryport);
4374 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
4376 }
while (bret < 0 &&
GetErrno() == EADDRINUSE && tryport < kSOCKET_MAXPORT);
4378 ::SysError(
"TUnixSystem::UnixUdpService",
"bind (port scan)");
4385 if (::listen(sock, backlog)) {
4386 ::SysError(
"TUnixSystem::UnixUdpService",
"listen");
4403 oldumask = umask(0);
4415 unlink(sockpath.
Data());
4426 if (!sockpath || strlen(sockpath) <= 0) {
4427 ::SysError(
"TUnixSystem::UnixUnixService",
"socket path undefined");
4431 struct sockaddr_un unserver;
4435 memset(&unserver, 0,
sizeof(unserver));
4436 unserver.sun_family = AF_UNIX;
4438 if (strlen(sockpath) >
sizeof(unserver.sun_path)-1) {
4439 ::Error(
"TUnixSystem::UnixUnixService",
"socket path %s, longer than max allowed length (%u)",
4440 sockpath, (
UInt_t)
sizeof(unserver.sun_path)-1);
4443 strcpy(unserver.sun_path, sockpath);
4446 if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
4447 ::SysError(
"TUnixSystem::UnixUnixService",
"socket");
4451 if (::bind(sock, (
struct sockaddr*) &unserver, strlen(unserver.sun_path)+2)) {
4452 ::SysError(
"TUnixSystem::UnixUnixService",
"bind");
4458 if (::listen(sock, backlog)) {
4459 ::SysError(
"TUnixSystem::UnixUnixService",
"listen");
4478 if (sock < 0)
return -1;
4485 if (flag == MSG_PEEK)
4489 char *buf = (
char *)buffer;
4491 for (
n = 0;
n < length;
n += nrecv) {
4492 if ((nrecv = recv(sock, buf+
n, length-
n, flag)) <= 0) {
4495 if (flag == MSG_OOB) {
4526 if (sock < 0)
return -1;
4535 const char *buf = (
const char *)buffer;
4537 for (
n = 0;
n < length;
n += nsent) {
4538 if ((nsent = send(sock, buf+
n, length-
n, flag)) <= 0) {
4576 }
else if (reset || !initialized) {
4577 initialized =
kTRUE;
4586#elif defined(R__MACOSX)
4600 dynpath = ldpath; dynpath +=
":"; dynpath += rdynpath;
4610#if defined(R__WINGCC) || defined(R__MACOSX)
4611 if (!dynpath.
EndsWith(
":")) dynpath +=
":";
4612 dynpath +=
"/usr/local/lib:/usr/X11R6/lib:/usr/lib:/lib:";
4613 dynpath +=
"/lib/x86_64-linux-gnu:/usr/local/lib64:/usr/lib64:/lib64:";
4616 std::string cmd(
"LD_DEBUG=libs LD_PRELOAD=DOESNOTEXIST ls 2>&1");
4617 FILE *pf = popen(cmd.c_str (),
"r");
4618 std::string result =
"";
4621 if (fgets(buffer, 128, pf) != NULL)
4625 std::size_t from = result.find(
"search path=", result.find(
"(LD_LIBRARY_PATH)"));
4626 std::size_t to = result.find(
"(system search path)");
4627 if (from != std::string::npos && to != std::string::npos) {
4629 std::string sys_path = result.substr(from, to-from);
4630 sys_path.erase(std::remove_if(sys_path.begin(), sys_path.end(), isspace), sys_path.end());
4631 if (!dynpath.
EndsWith(
":")) dynpath +=
":";
4632 dynpath += sys_path.c_str();
4636 if (
gDebug > 0) std::cout <<
"dynpath = " << dynpath.
Data() << std::endl;
4682 char buf[PATH_MAX + 1];
4683 char *res = realpath(sLib.
Data(), buf);
4684 if (res) sLib = buf;
4690 const char* lib = sLib.
Data();
4692 if (len > 3 && (!strcmp(lib+len-3,
".so") ||
4693 !strcmp(lib+len-3,
".dl") ||
4694 !strcmp(lib+len-4,
".dll") ||
4695 !strcmp(lib+len-4,
".DLL") ||
4696 !strcmp(lib+len-6,
".dylib") ||
4697 !strcmp(lib+len-3,
".sl") ||
4698 !strcmp(lib+len-2,
".a"))) {
4703 Error(
"FindDynamicLibrary",
4707 static const char* exts[] = {
4708 ".so",
".dll",
".dylib",
".sl",
".dl",
".a", 0 };
4709 const char** ext = exts;
4721 Error(
"FindDynamicLibrary",
4722 "%s[.so | .dll | .dylib | .sl | .dl | .a] does not exist in %s",
4730#if defined(R__MACOSX)
4731#include <sys/resource.h>
4732#include <mach/mach.h>
4733#include <mach/mach_error.h>
4738static void GetDarwinSysInfo(
SysInfo_t *sysinfo)
4740 FILE *p =
gSystem->
OpenPipe(
"sysctl -n kern.ostype hw.model hw.ncpu hw.cpufrequency "
4741 "hw.busfrequency hw.l2cachesize hw.memsize",
"r");
4748 sysinfo->
fCpus =
s.Atoi();
4763 if (
s.BeginsWith(
"Processor type: ")) {
4774static void ReadDarwinCpu(
long *ticks)
4776 mach_msg_type_number_t count;
4778 host_cpu_load_info_data_t cpu;
4780 ticks[0] = ticks[1] = ticks[2] = ticks[3] = 0;
4782 count = HOST_CPU_LOAD_INFO_COUNT;
4783 kr = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&cpu, &count);
4784 if (kr != KERN_SUCCESS) {
4785 ::Error(
"TUnixSystem::ReadDarwinCpu",
"host_statistics: %s", mach_error_string(kr));
4787 ticks[0] = cpu.cpu_ticks[CPU_STATE_USER];
4788 ticks[1] = cpu.cpu_ticks[CPU_STATE_SYSTEM];
4789 ticks[2] = cpu.cpu_ticks[CPU_STATE_IDLE];
4790 ticks[3] = cpu.cpu_ticks[CPU_STATE_NICE];
4798static void GetDarwinCpuInfo(
CpuInfo_t *cpuinfo,
Int_t sampleTime)
4801 if (getloadavg(avg,
sizeof(avg)) < 0) {
4802 ::Error(
"TUnixSystem::GetDarwinCpuInfo",
"getloadavg failed");
4809 Long_t cpu_ticks1[4], cpu_ticks2[4];
4810 ReadDarwinCpu(cpu_ticks1);
4812 ReadDarwinCpu(cpu_ticks2);
4814 Long_t userticks = (cpu_ticks2[0] + cpu_ticks2[3]) -
4815 (cpu_ticks1[0] + cpu_ticks1[3]);
4816 Long_t systicks = cpu_ticks2[1] - cpu_ticks1[1];
4817 Long_t idleticks = cpu_ticks2[2] - cpu_ticks1[2];
4818 if (userticks < 0) userticks = 0;
4819 if (systicks < 0) systicks = 0;
4820 if (idleticks < 0) idleticks = 0;
4821 Long_t totalticks = userticks + systicks + idleticks;
4833static void GetDarwinMemInfo(
MemInfo_t *meminfo)
4835 static Int_t pshift = 0;
4837 vm_statistics_data_t vm_info;
4838 mach_msg_type_number_t count;
4843 count = HOST_VM_INFO_COUNT;
4844 kr = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vm_info, &count);
4845 if (kr != KERN_SUCCESS) {
4846 ::Error(
"TUnixSystem::GetDarwinMemInfo",
"host_statistics: %s", mach_error_string(kr));
4850 for (
int psize = getpagesize(); psize > 1; psize >>= 1)
4854 used = (
Long64_t)(vm_info.active_count + vm_info.inactive_count + vm_info.wire_count) << pshift;
4856 total = (
Long64_t)(vm_info.active_count + vm_info.inactive_count + vm_info.free_count + vm_info.wire_count) << pshift;
4859 swap_used = vm_info.pageouts << pshift;
4862 dirp = opendir(
"/private/var/vm");
4867 while ((dp = readdir(dirp)) != 0) {
4869 char fname [MAXNAMLEN];
4870 if (strncmp(dp->d_name,
"swapfile", 8))
4872 strlcpy(fname,
"/private/var/vm/",MAXNAMLEN);
4873 strlcat (fname, dp->d_name,MAXNAMLEN);
4874 if (stat(fname, &sb) < 0)
4876 swap_total += sb.st_size;
4896static void GetDarwinProcInfo(
ProcInfo_t *procinfo)
4899#define vm_region vm_region_64
4903#define GLOBAL_SHARED_TEXT_SEGMENT 0x90000000U
4904#define GLOBAL_SHARED_DATA_SEGMENT 0xA0000000U
4905#define SHARED_TEXT_REGION_SIZE 0x10000000
4906#define SHARED_DATA_REGION_SIZE 0x10000000
4909 if (getrusage(RUSAGE_SELF, &ru) < 0) {
4910 ::SysError(
"TUnixSystem::GetDarwinProcInfo",
"getrusage failed");
4913 ((
Float_t)(ru.ru_utime.tv_usec) / 1000000.);
4915 ((
Float_t)(ru.ru_stime.tv_usec) / 1000000.);
4918 task_basic_info_data_t ti;
4919 mach_msg_type_number_t count;
4922 task_t a_task = mach_task_self();
4924 count = TASK_BASIC_INFO_COUNT;
4925 kr = task_info(a_task, TASK_BASIC_INFO, (task_info_t)&ti, &count);
4926 if (kr != KERN_SUCCESS) {
4927 ::Error(
"TUnixSystem::GetDarwinProcInfo",
"task_info: %s", mach_error_string(kr));
4932 mach_port_t object_name;
4933 vm_address_t address;
4934 vm_region_top_info_data_t info;
4935 vm_size_t vsize, vprvt, rsize, size;
4936 rsize = ti.resident_size;
4937 vsize = ti.virtual_size;
4939 for (address = 0; ; address += size) {
4941 count = VM_REGION_TOP_INFO_COUNT;
4942 if (vm_region(a_task, &address, &size,
4943 VM_REGION_TOP_INFO, (vm_region_info_t)&info, &count,
4944 &object_name) != KERN_SUCCESS) {
4949 if (address >= GLOBAL_SHARED_TEXT_SEGMENT &&
4950 address < (GLOBAL_SHARED_DATA_SEGMENT + SHARED_DATA_REGION_SIZE)) {
4955 if (info.share_mode == SM_EMPTY) {
4956 vm_region_basic_info_data_64_t b_info;
4957 count = VM_REGION_BASIC_INFO_COUNT_64;
4958 if (vm_region_64(a_task, &address,
4959 &size, VM_REGION_BASIC_INFO,
4960 (vm_region_info_t)&b_info, &count,
4961 &object_name) != KERN_SUCCESS) {
4965 if (b_info.reserved) {
4966 vsize -= (SHARED_TEXT_REGION_SIZE + SHARED_DATA_REGION_SIZE);
4973 if (info.share_mode != SM_PRIVATE) {
4977 switch (info.share_mode) {
4979 if (info.ref_count == 1) {
4982 vprvt += info.private_pages_resident * getpagesize();
5002#if defined(R__LINUX)
5006static void GetLinuxSysInfo(
SysInfo_t *sysinfo)
5009 FILE *
f = fopen(
"/proc/cpuinfo",
"r");
5012 if (
s.BeginsWith(
"model name")) {
5016 if (
s.BeginsWith(
"cpu MHz")) {
5020 if (
s.BeginsWith(
"cache size")) {
5024 if (
s.BeginsWith(
"processor")) {
5026 sysinfo->
fCpus =
s.Atoi();
5033 f = fopen(
"/proc/meminfo",
"r");
5036 if (
s.BeginsWith(
"MemTotal")) {
5049 s.Tokenize(sysinfo->
fOS, from);
5058static void ReadLinuxCpu(
long *ticks)
5060 ticks[0] = ticks[1] = ticks[2] = ticks[3] = 0;
5063 FILE *
f = fopen(
"/proc/stat",
"r");
5067 sscanf(
s.Data(),
"%*s %ld %ld %ld %ld", &ticks[0], &ticks[3], &ticks[1], &ticks[2]);
5077 Double_t avg[3] = { -1., -1., -1. };
5079 if (getloadavg(avg,
sizeof(avg)) < 0) {
5080 ::Error(
"TUnixSystem::GetLinuxCpuInfo",
"getloadavg failed");
5089 Long_t cpu_ticks1[4], cpu_ticks2[4];
5090 ReadLinuxCpu(cpu_ticks1);
5092 ReadLinuxCpu(cpu_ticks2);
5094 Long_t userticks = (cpu_ticks2[0] + cpu_ticks2[3]) -
5095 (cpu_ticks1[0] + cpu_ticks1[3]);
5096 Long_t systicks = cpu_ticks2[1] - cpu_ticks1[1];
5097 Long_t idleticks = cpu_ticks2[2] - cpu_ticks1[2];
5098 if (userticks < 0) userticks = 0;
5099 if (systicks < 0) systicks = 0;
5100 if (idleticks < 0) idleticks = 0;
5101 Long_t totalticks = userticks + systicks + idleticks;
5113static void GetLinuxMemInfo(
MemInfo_t *meminfo)
5116 FILE *
f = fopen(
"/proc/meminfo",
"r");
5119 if (
s.BeginsWith(
"MemTotal")) {
5123 if (
s.BeginsWith(
"MemFree")) {
5127 if (
s.BeginsWith(
"SwapTotal")) {
5131 if (
s.BeginsWith(
"SwapFree")) {
5145static void GetLinuxProcInfo(
ProcInfo_t *procinfo)
5148 if (getrusage(RUSAGE_SELF, &ru) < 0) {
5149 ::SysError(
"TUnixSystem::GetLinuxProcInfo",
"getrusage failed");
5152 ((
Float_t)(ru.ru_utime.tv_usec) / 1000000.);
5154 ((
Float_t)(ru.ru_stime.tv_usec) / 1000000.);
5165 sscanf(
s.Data(),
"%ld %ld", &
total, &rss);
5179 if (!info)
return -1;
5183 if (!sysinfo.
fCpus) {
5184#if defined(R__MACOSX)
5185 GetDarwinSysInfo(&sysinfo);
5186#elif defined(R__LINUX)
5187 GetLinuxSysInfo(&sysinfo);
5203 if (!info)
return -1;
5205#if defined(R__MACOSX)
5206 GetDarwinCpuInfo(info, sampleTime);
5207#elif defined(R__LINUX)
5208 GetLinuxCpuInfo(info, sampleTime);
5220 if (!info)
return -1;
5222#if defined(R__MACOSX)
5223 GetDarwinMemInfo(info);
5224#elif defined(R__LINUX)
5225 GetLinuxMemInfo(info);
5237 if (!info)
return -1;
5239#if defined(R__MACOSX)
5240 GetDarwinProcInfo(info);
5241#elif defined(R__LINUX)
5242 GetLinuxProcInfo(info);
The file contains utilities which are foundational and could be used across the core component of ROO...
R__EXTERN TApplication * gApplication
void SysError(const char *location, const char *msgfmt,...)
void Break(const char *location, const char *msgfmt,...)
void Fatal(const char *location, const char *msgfmt,...)
static unsigned int total
R__EXTERN TInterpreter * gCling
Binding & operator=(OUT(*fun)(void))
char * Form(const char *fmt,...)
void Printf(const char *fmt,...)
char * StrDup(const char *str)
Duplicate the string str.
int EscChar(const char *src, char *dst, int dstlen, char *specchars, char escchar)
Escape specchars in src with escchar and copy to dst.
@ kSigSegmentationViolation
R__EXTERN const char * gProgName
R__EXTERN TVirtualMutex * gSystemMutex
typedef void((*Func_t)())
R__EXTERN const char * gRootDir
R__EXTERN TSystem * gSystem
R__EXTERN TFileHandler * gXDisplay
R__EXTERN const char * gProgPath
static void sighandler(int sig)
Call the signal handler associated with the signal.
static void SigHandler(ESignals sig)
Unix signal handler.
#define REAL_DIR_ENTRY(dp)
const char * kProtocolName
static struct Signalmap_t gSignalMap[kMAXSIGNALS]
static const char * GetExePath()
static const char * DynamicPath(const char *newpath=0, Bool_t reset=kFALSE)
Get shared library search path. Static utility function.
void(* SigHandler_t)(ESignals)
#define R__LOCKGUARD2(mutex)
virtual void HandleException(Int_t sig)
Handle exceptions (kSigBus, kSigSegmentationViolation, kSigIllegalInstruction and kSigFloatingExcepti...
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
virtual Bool_t Notify()
Notify when event occurred on descriptor associated with this handler.
virtual Bool_t HasReadInterest()
True if handler is interested in read events.
virtual Bool_t WriteNotify()
Notify when something can be written to the descriptor associated with this handler.
virtual Bool_t HasWriteInterest()
True if handler is interested in write events.
virtual Bool_t ReadNotify()
Notify when something can be read from the descriptor associated with this handler.
This class represents an Internet Protocol (IP) address.
void AddAlias(const char *alias)
Add alias to list of aliases.
void AddAddress(UInt_t addr)
Add alternative address to list of addresses.
UInt_t GetAddress() const
virtual const char * GetSTLIncludePath() const
TObject * At(Int_t idx) const
Collectable string class.
virtual const char * GetName() const
Returns name of object.
virtual void SysError(const char *method, const char *msgfmt,...) const
Issue system error message.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Iterator of ordered collection.
TObject * Next()
Return next object in collection.
Int_t Substitute(TString &s, const TString &replace, const TString &mods="", Int_t start=0, Int_t nMatchMax=10)
Substitute replaces the string s by a new string in which matching patterns are replaced by the repla...
static void ShutDown()
Shut down ROOT.
static const TString & GetEtcDir()
Get the sysconfig directory in the installation. Static utility function.
static const TString & GetLibDir()
Get the library directory in the installation. Static utility function.
Regular expression class.
virtual Bool_t Notify()
Notify when signal occurs.
ESignals GetSignal() const
Bool_t Gets(FILE *fp, Bool_t chop=kTRUE)
Read one line from the stream, including the , or until EOF.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Swap(TString &other)
TString & Remove(Ssiz_t pos)