20#include "RConfigure.h"
51#if defined(R__SUN) || defined(R__AIX) || \
52 defined(R__LINUX) || defined(R__SOLARIS) || \
53 defined(R__FBSD) || defined(R__OBSD) || \
54 defined(R__MACOSX) || defined(R__HURD)
62#if defined(ULTRIX) || defined(R__SUN)
65#if defined(R__AIX) || defined(R__LINUX) || \
66 defined(R__FBSD) || defined(R__OBSD) || \
67 defined(R__LYNXOS) || defined(R__MACOSX) || defined(R__HURD)
68# include <sys/ioctl.h>
70#if defined(R__AIX) || defined(R__SOLARIS)
71# include <sys/select.h>
74# include <mach-o/dyld.h>
75# include <sys/mount.h>
76 extern "C" int statfs(
const char *file,
struct statfs *buffer);
77#elif defined(R__LINUX) || defined(R__HURD)
79#elif defined(R__FBSD) || defined(R__OBSD)
80# include <sys/param.h>
81# include <sys/mount.h>
84# include <sys/types.h>
85# include <sys/param.h>
86# include <sys/queue.h>
87# include <libprocstat.h>
91# include <sys/statfs.h>
103#include <sys/resource.h>
108#include <sys/socket.h>
109#include <netinet/in.h>
110#include <netinet/tcp.h>
112# define _XOPEN_EXTENDED_SOURCE
113# include <arpa/inet.h>
114# undef _XOPEN_EXTENDED_SOURCE
115# if !defined(_AIX41) && !defined(_AIX43)
117# define HASNOT_INETATON
120# include <arpa/inet.h>
125#if defined(R__SOLARIS)
126# include <sys/systeminfo.h>
127# include <sys/filio.h>
128# include <sys/sockio.h>
129# define HASNOT_INETATON
131# define INADDR_NONE (UInt_t)-1
135#if defined(R__SOLARIS)
140#if defined(MAC_OS_X_VERSION_10_5)
146# include <sys/param.h>
147# if __FreeBSD_version >= 900007
152#if defined(R__AIX) || defined(R__FBSD) || \
153 defined(R__OBSD) || defined(R__LYNXOS) || \
154 (defined(R__MACOSX) && !defined(MAC_OS_X_VERSION_10_5))
158#if defined(R__LYNXOS)
160 extern int putenv(
const char *);
161 extern int inet_aton(
const char *,
struct in_addr *);
165#if defined(R__ARC4_STDLIB)
167#elif defined(R__ARC4_BSDLIB)
168#include <bsd/stdlib.h>
169#elif defined(R__GETRANDOM_CLIB)
170#include <sys/random.h>
175#define STRUCT_UTMP struct utmpx
178#define STRUCT_UTMP struct utmp
180#if !defined(UTMP_FILE) && defined(_PATH_UTMP)
181#define UTMP_FILE _PATH_UTMP
183#if defined(UTMPX_FILE)
185#define UTMP_FILE UTMPX_FILE
188#define UTMP_FILE "/etc/utmp"
192#if (defined(R__LINUX) || defined(R__HURD)) && !defined(R__WINGCC)
193# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 1
194# define HAVE_BACKTRACE_SYMBOLS_FD
198#if defined(R__MACOSX) || defined(R__FBSD)
199# define HAVE_BACKTRACE_SYMBOLS_FD
203#ifdef HAVE_BACKTRACE_SYMBOLS_FD
204# include <execinfo.h>
213#ifdef HAVE_BACKTRACE_SYMBOLS_FD
216 static const int kMAX_BACKTRACE_DEPTH = 128;
220#if (defined(R__LINUX) && !defined(R__WINGCC))
222#include <sys/prctl.h>
225#if defined(R__MACOSX) && defined(__SSE2__)
226#include <xmmintrin.h>
229#if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \
230 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \
237#include <mach/thread_status.h>
239#define fegetenvd(x) asm volatile("mffs %0" : "=f" (x));
240#define fesetenvd(x) asm volatile("mtfsf 255,%0" : : "f" (x));
243 FE_ENABLE_INEXACT = 0x00000008,
244 FE_ENABLE_DIVBYZERO = 0x00000010,
245 FE_ENABLE_UNDERFLOW = 0x00000020,
246 FE_ENABLE_OVERFLOW = 0x00000040,
247 FE_ENABLE_INVALID = 0x00000080,
248 FE_ENABLE_ALL_EXCEPT = 0x000000F8
252#if defined(R__MACOSX) && !defined(__SSE2__) && \
253 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__))
265 template<
typename U = T,
typename std::enable_if<std::is_member_po
inter<decltype(&U::ut_name)>::value,
int>::type = 0>
266 static char getValue(U* ue,
int) {
267 return ue->ut_name[0];
270 template<
typename U = T,
typename std::enable_if<std::is_member_po
inter<decltype(&U::ut_user)>::value,
int>::type = 0>
271 static char getValue(U* ue,
long) {
272 return ue->ut_user[0];
278 return ut_name<STRUCT_UTMP>::getValue(ue, 0);
297 if (get_ut_name(ue) && !strncmp(tty, ue->ut_line,
sizeof(ue->ut_line)))
309 struct stat file_stats;
320 if (fstat(fileno(utmp), &file_stats) == -1) {
324 size = file_stats.st_size;
338 if (fclose(utmp) != EOF && n_read ==
size) {
357# define HOWMANY(x, y) (((x)+((y)-1))/(y))
417 TTHREAD_TLS_DECL(
TString,exepath);
419#if defined(R__MACOSX)
420 exepath = _dyld_get_image_name(0);
421#elif defined(R__LINUX) || defined(R__SOLARIS) || defined(R__FBSD)
427#elif defined(R__SOLARIS)
429#elif defined(R__FBSD)
430 procstat* ps = procstat_open_sysctl();
431 kinfo_proc* kp = kinfo_getproc(getpid());
435 procstat_getpathname(ps, kp, buf,
sizeof(buf));
452 exepath =
gSystem->WorkingDirectory();
467#if defined(HAVE_DLADDR) && !defined(R__MACOSX)
470static void SetRootSys()
473 if (
gSystem->Getenv(
"ROOTIGNOREPREFIX")) {
475 void *addr = (
void *)SetRootSys;
477 if (dladdr(addr, &info) && info.dli_fname && info.dli_fname[0]) {
479 if (!realpath(info.dli_fname, respath)) {
480 if (!
gSystem->Getenv(
"ROOTSYS"))
481 ::SysError(
"TUnixSystem::SetRootSys",
"error getting realpath of libCore, please set ROOTSYS in the shell");
493#if defined(R__MACOSX)
498static void DylibAdded(
const struct mach_header *mh, intptr_t )
507 gLinkedDylibs = linkedDylibs;
511 TString lib = _dyld_get_image_name(i++);
513 TRegexp sovers =
"libCore\\.[0-9]+\\.*[0-9]*\\.*[0-9]*\\.so";
514 TRegexp dyvers =
"libCore\\.[0-9]+\\.*[0-9]*\\.*[0-9]*\\.dylib";
517 if (
gSystem->Getenv(
"ROOTIGNOREPREFIX")) {
522 if (!realpath(lib, respath)) {
523 if (!
gSystem->Getenv(
"ROOTSYS"))
524 ::SysError(
"TUnixSystem::DylibAdded",
"error getting realpath of libCore, please set ROOTSYS in the shell");
538 if (lib.
EndsWith(
"/libSystem.B.dylib")) {
540 if (linkedDylibs.
IsNull()) {
550 sovers =
"\\.[0-9]+\\.*[0-9]*\\.so";
556 dyvers =
"\\.[0-9]+\\.*[0-9]*\\.dylib";
557 idx = lib.
Index(dyvers);
563 if (linkedDylibs.
Length())
618#if defined(R__MACOSX)
621 _dyld_register_func_for_add_image(DylibAdded);
622#elif defined(HAVE_DLADDR)
665 char *tty = ::ttyname(0);
674 if (utmp_entry->ut_host[0]) {
676 for (
unsigned n = 0; (
n <
sizeof(utmp_entry->ut_host)) && utmp_entry->ut_host[
n];
n++)
677 disp.
Append(utmp_entry->ut_host[
n]);
681 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s", disp.
Data());
684 else if (utmp_entry->ut_addr) {
686 struct sockaddr_in addr;
687 addr.sin_family = AF_INET;
689 memcpy(&addr.sin_addr, &utmp_entry->ut_addr,
sizeof(addr.sin_addr));
690 memset(&addr.sin_zero[0], 0,
sizeof(addr.sin_zero));
691 struct sockaddr *sa = (
struct sockaddr *) &addr;
693 char hbuf[NI_MAXHOST + 4];
694 if (getnameinfo(sa,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, NI_NAMEREQD) == 0) {
695 assert( strlen(hbuf) < NI_MAXHOST );
696 strlcat(hbuf,
":0.0",
sizeof(hbuf));
698 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
706 if (!
gROOT->IsBatch() && !std::getenv(
"DISPLAY")) {
707 Error(
"SetDisplay",
"Can't figure out DISPLAY, set it manually\n"
708 "In case you run a remote ssh session, restart your ssh session with:\n"
709 "=========> ssh -Y");
724#if defined(R__SOLARIS) || defined (R__LINUX) || defined(R__AIX) || \
725 defined(R__FBSD) || defined(R__OBSD) || defined(R__HURD)
726 return strerror(
err);
729 return Form(
"errno out of range %d",
err);
730 return sys_errlist[
err];
741#if defined(R__SOLARIS)
742 sysinfo(SI_HOSTNAME, hn,
sizeof(hn));
744 gethostname(hn,
sizeof(hn));
764 if (
h->HasReadInterest()) {
768 if (
h->HasWriteInterest()) {
781 if (!
h)
return nullptr;
794 int fd = th->
GetFd();
826 if (!
h)
return nullptr;
895#if defined(R__LINUX) && !defined(__powerpc__)
896#if defined(__GLIBC__) && (__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1)
898#if __GLIBC_MINOR__>=3
900 Int_t oldmask = fegetexcept();
907 Int_t oldmask = ~oldenv;
909 Int_t oldmask = ~oldenv.__control_word;
913 if (oldmask & FE_INVALID ) mask |=
kInvalid;
914 if (oldmask & FE_DIVBYZERO) mask |=
kDivByZero;
915 if (oldmask & FE_OVERFLOW ) mask |=
kOverflow;
916 if (oldmask & FE_UNDERFLOW) mask |=
kUnderflow;
918 if (oldmask & FE_INEXACT ) mask |=
kInexact;
923#if defined(R__MACOSX) && defined(__SSE2__)
925 Int_t oldmask = ~_MM_GET_EXCEPTION_MASK();
927 if (oldmask & _MM_MASK_INVALID ) mask |=
kInvalid;
928 if (oldmask & _MM_MASK_DIV_ZERO ) mask |=
kDivByZero;
929 if (oldmask & _MM_MASK_OVERFLOW ) mask |=
kOverflow;
930 if (oldmask & _MM_MASK_UNDERFLOW) mask |=
kUnderflow;
931 if (oldmask & _MM_MASK_INEXACT ) mask |=
kInexact;
934#if defined(R__MACOSX) && !defined(__SSE2__) && \
935 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__))
940 Int_t oldmask = ~oldenv.__fpscr;
941#elif defined(__arm64__)
942 Int_t oldmask = ~oldenv.__fpcr;
944 Int_t oldmask = ~oldenv.__control;
947 if (oldmask & FE_INVALID ) mask |=
kInvalid;
948 if (oldmask & FE_DIVBYZERO) mask |=
kDivByZero;
949 if (oldmask & FE_OVERFLOW ) mask |=
kOverflow;
950 if (oldmask & FE_UNDERFLOW) mask |=
kUnderflow;
951 if (oldmask & FE_INEXACT ) mask |=
kInexact;
954#if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \
955 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \
960 if (oldmask & FE_ENABLE_INVALID ) mask |=
kInvalid;
961 if (oldmask & FE_ENABLE_DIVBYZERO) mask |=
kDivByZero;
962 if (oldmask & FE_ENABLE_OVERFLOW ) mask |=
kOverflow;
963 if (oldmask & FE_ENABLE_UNDERFLOW) mask |=
kUnderflow;
964 if (oldmask & FE_ENABLE_INEXACT ) mask |=
kInexact;
980#if defined(R__LINUX) && !defined(__powerpc__)
981#if defined(__GLIBC__) && (__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1)
983 if (mask &
kInvalid ) newm |= FE_INVALID;
985 if (mask &
kOverflow ) newm |= FE_OVERFLOW;
988 if (mask &
kInexact ) newm |= FE_INEXACT;
991#if __GLIBC_MINOR__>=3
994 feclearexcept(FE_ALL_EXCEPT);
995 fedisableexcept(FE_ALL_EXCEPT);
996 feenableexcept(newm);
1005 cur.__control_word &= ~newm;
1013#if defined(R__MACOSX) && defined(__SSE2__)
1016 if (mask &
kInvalid ) newm |= _MM_MASK_INVALID;
1017 if (mask &
kDivByZero) newm |= _MM_MASK_DIV_ZERO;
1018 if (mask &
kOverflow ) newm |= _MM_MASK_OVERFLOW;
1019 if (mask &
kUnderflow) newm |= _MM_MASK_UNDERFLOW;
1020 if (mask &
kInexact ) newm |= _MM_MASK_INEXACT;
1022 _MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~newm);
1025#if defined(R__MACOSX) && !defined(__SSE2__) && \
1026 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__))
1028 if (mask &
kInvalid ) newm |= FE_INVALID;
1030 if (mask &
kOverflow ) newm |= FE_OVERFLOW;
1032 if (mask &
kInexact ) newm |= FE_INEXACT;
1037 cur.__fpscr &= ~newm;
1038#elif defined(__arm64__)
1039 cur.__fpcr &= ~newm;
1041 cur.__control &= ~newm;
1046#if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \
1047 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \
1050 if (mask &
kInvalid ) newm |= FE_ENABLE_INVALID;
1051 if (mask &
kDivByZero) newm |= FE_ENABLE_DIVBYZERO;
1052 if (mask &
kOverflow ) newm |= FE_ENABLE_OVERFLOW;
1053 if (mask &
kUnderflow) newm |= FE_ENABLE_UNDERFLOW;
1054 if (mask &
kInexact ) newm |= FE_ENABLE_INEXACT;
1058 curmask = (curmask & ~FE_ENABLE_ALL_EXCEPT) | newm;
1070 Bool_t pollOnce = pendingOnly;
1079 if (!pendingOnly)
return;
1085 if (!pendingOnly)
return;
1090 if (pendingOnly && !pollOnce)
1096 if (!pendingOnly)
return;
1127 if (mxfd == 0 && nextto == -1)
1134 for (fd = 0; fd < mxfd; fd++) {
1138 if (rc < 0 && rc != -2) {
1139 SysError(
"DispatchOneEvent",
"select: read error on %d", fd);
1145 if (rc < 0 && rc != -2) {
1146 SysError(
"DispatchOneEvent",
"select: write error on %d", fd);
1163 tv.tv_sec = milliSec / 1000;
1164 tv.tv_usec = (milliSec % 1000) * 1000;
1166 select(0,
nullptr,
nullptr,
nullptr, &tv);
1188 if (
h->HasReadInterest()) {
1190 mxfd = std::max(mxfd, fd);
1192 if (
h->HasWriteInterest()) {
1194 mxfd = std::max(mxfd, fd);
1196 h->ResetReadyMask();
1235 if (
h->HasReadInterest())
1237 if (
h->HasWriteInterest())
1239 h->ResetReadyMask();
1269 if (sync == sh->
IsSync()) {
1271 if ((
fSignals->IsSet(sig) && sigdone == -1) || sigdone == sig) {
1272 if (sigdone == -1) {
1297 TIter next(zombieHandler);
1298 register UnixPtty *pty;
1299 while ((pty = (UnixPtty*) next()))
1300 if (pty->GetPid() == pid) {
1301 zombieHandler->RemovePtr(pty);
1320 if ((fd <= fMaxrfd && fReadready->IsSet(fd) && fddone == -1) ||
1321 (fddone == fd && read)) {
1331 if ((fd <= fMaxwfd && fWriteready->IsSet(fd) && fddone == -1) ||
1332 (fddone == fd && !read)) {
1388 ::closedir((DIR*)dirp);
1442 return std::string(cwd);
1451 Error(
"WorkingDirectory",
"getcwd() failed");
1470 if (res)
return std::string(res);
1471 else return std::string();
1480 const char *dir =
gSystem->Getenv(
"TMPDIR");
1502 const bool hasSuffix = suffix && *suffix;
1506 char *arg =
StrDup(base);
1507 int fd = hasSuffix ? mkstemps(arg, strlen(suffix)) : mkstemp(arg);
1515 FILE *fp = fdopen(fd,
"w+");
1517 SysError(
"TempFileName",
"converting filedescriptor (%d)", fd);
1527 if (
name.IsNull() ||
name ==
".") {
1530 if (dir[strlen(dir) - 1] !=
'/')
1536 if (!dir || !dir[0])
1538 else if (dir[strlen(dir) - 1] !=
'/')
1576 FILE *from = fopen(
f,
"r");
1580 FILE *to = fopen(t,
"w");
1586 const int bufsize = 1024;
1589 while (!
ret && !feof(from)) {
1590 size_t numread = fread (buf,
sizeof(
char), bufsize, from);
1591 size_t numwritten = fwrite(buf,
sizeof(
char), numread, to);
1592 if (numread != numwritten)
1607 int ret = ::rename(
f, t);
1652 return UnixFSstat(path,
id, bsize, blocks, bfree);
1661 return ::link(from, to);
1671 return ::symlink((
char*)from, (
char*)to);
1673 return ::symlink(from, to);
1687#if defined(R__SEEK64)
1688 struct stat64 finfo;
1689 if (lstat64(
name, &finfo) < 0)
1692 if (lstat(
name, &finfo) < 0)
1696 if (S_ISDIR(finfo.st_mode))
1697 return ::rmdir(
name);
1699 return ::unlink(
name);
1708 kShellEscape =
'\\',
1709 *kShellStuff =
"(){}<>\"'",
1724 const char *p, *patbuf = (
const char *)path;
1727 while (*patbuf ==
' ')
1731 for (p = patbuf; *p; p++)
1756 const char *patbuf = (
const char *)patbuf0;
1765 while (*patbuf ==
' ')
1769 for (p = patbuf; *p; p++)
1781 EscChar(patbuf, stuffedPat,
sizeof(stuffedPat), (
char*)kShellStuff, kShellEscape);
1786 if (stuffedPat[0] ==
'~') {
1787 if (stuffedPat[1] !=
'\0' && stuffedPat[1] !=
'/') {
1789 for (p = &stuffedPat[1],
q =
name; *p && *p !=
'/';)
1806 cmd += &stuffedPat[1];
1811 if ((pf = ::popen(cmd.Data(),
"r")) == 0) {
1822 for (ch = fgetc(pf); ch != EOF && ch !=
' ' && ch !=
'\n'; ch = fgetc(pf)) {
1828 if (cnt == 0 && ch == EOF)
goto again;
1834 if (ch ==
' ' || ch ==
'\t') {
1868 return ::chmod(file, mode);
1876 return ::umask(mask);
1889 t.actime = (time_t)actime;
1890 t.modtime = (time_t)modtime;
1891 return ::utime(file, &t);
1906 if (
gEnv->GetValue(
"Root.ShowPath", 0))
1907 show.
Form(
"Which: %s =", wfil.
Data());
1909 gSystem->ExpandPathName(wfil);
1911 if (wfil[0] ==
'/') {
1912#if defined(R__SEEK64)
1913 struct stat64 finfo;
1914 if (access(wfil.
Data(), mode) == 0 &&
1915 stat64(wfil.
Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1918 if (access(wfil.
Data(), mode) == 0 &&
1919 stat(wfil.
Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1936 for (
const char* ptr = search; *ptr;) {
1938 if (*ptr !=
'/' && *ptr !=
'$' && *ptr !=
'~')
1940 const char* posEndOfPart = strchr(ptr,
':');
1942 name.Append(ptr, posEndOfPart - ptr);
1943 ptr = posEndOfPart + 1;
1949 if (!
name.EndsWith(
"/"))
1954#if defined(R__SEEK64)
1955 struct stat64 finfo;
1956 if (access(
name.Data(), mode) == 0 &&
1957 stat64(
name.Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1960 if (access(
name.Data(), mode) == 0 &&
1961 stat(
name.Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1983 if (!user || !user[0])
1986 struct passwd *apwd = getpwnam(user);
2033 static UserInfoCache_t gUserInfo;
2035 UserInfoCache_t::const_iterator iUserInfo = gUserInfo.find(uid);
2036 if (iUserInfo != gUserInfo.end())
2039 struct passwd *apwd = getpwuid(uid);
2052 gUserInfo[uid] = *ug;
2077 struct group *grp = getgrgid(gid);
2107 ::setenv(
name, value, 1);
2115 return std::getenv(
name);
2133 return ::system(shellcmd);
2141 return ::popen(command, mode);
2149 return ::pclose(pipe);
2187#include <mach/mach.h>
2195 typedef CSTypeRef CSSymbolicatorRef;
2196 typedef CSTypeRef CSSourceInfoRef;
2197 typedef CSTypeRef CSSymbolOwnerRef;
2198 typedef CSTypeRef CSSymbolRef;
2200 CSSymbolicatorRef CSSymbolicatorCreateWithPid(pid_t pid);
2201 CSSymbolRef CSSymbolicatorGetSymbolWithAddressAtTime(CSSymbolicatorRef cs, vm_address_t addr, uint64_t time);
2202 CSSourceInfoRef CSSymbolicatorGetSourceInfoWithAddressAtTime(CSSymbolicatorRef cs, vm_address_t addr, uint64_t time);
2203 const char* CSSymbolGetName(CSSymbolRef sym);
2204 CSSymbolOwnerRef CSSymbolGetSymbolOwner(CSSymbolRef sym);
2205 const char* CSSymbolOwnerGetPath(CSSymbolOwnerRef symbol);
2206 const char* CSSourceInfoGetPath(CSSourceInfoRef info);
2207 int CSSourceInfoGetLineNumber(CSSourceInfoRef info);
2210bool CSTypeRefIdValid(CSTypeRef ref) {
2211 return ref.csCppData || ref.csCppObj;
2214void macosx_backtrace() {
2215void* addrlist[kMAX_BACKTRACE_DEPTH];
2217 int numstacks = backtrace( addrlist,
sizeof( addrlist ) /
sizeof(
void* ));
2219 CSSymbolicatorRef symbolicator = CSSymbolicatorCreateWithPid(getpid());
2222 static const int skipFrames = 2;
2223 for (
int i = skipFrames; i < numstacks; ++i) {
2225 CSSymbolRef sym = CSSymbolicatorGetSymbolWithAddressAtTime(symbolicator,
2226 (vm_address_t)addrlist[i],
2228 CSSymbolOwnerRef symOwner = CSSymbolGetSymbolOwner(sym);
2230 if (
const char* libPath = CSSymbolOwnerGetPath(symOwner)) {
2231 printf(
"[%s]", libPath);
2233 printf(
"[<unknown binary>]");
2236 if (
const char* symname = CSSymbolGetName(sym)) {
2237 printf(
" %s", symname);
2240 CSSourceInfoRef sourceInfo
2241 = CSSymbolicatorGetSourceInfoWithAddressAtTime(symbolicator,
2242 (vm_address_t)addrlist[i],
2244 if (
const char* sourcePath = CSSourceInfoGetPath(sourceInfo)) {
2245 printf(
" %s:%d", sourcePath, (
int)CSSourceInfoGetLineNumber(sourceInfo));
2247 printf(
" (no debug info)");
2259 if (!
gEnv->GetValue(
"Root.Stacktrace", 1))
2263 TString gdbscript =
gEnv->GetValue(
"Root.StacktraceScript",
"");
2264 gdbscript = gdbscript.
Strip();
2265 if (gdbscript !=
"") {
2267 fprintf(stderr,
"Root.StacktraceScript %s does not exist\n", gdbscript.
Data());
2271 if (gdbscript ==
"") {
2272 gdbscript =
"gdb-backtrace.sh";
2275 fprintf(stderr,
"Error in <TUnixSystem::StackTrace> script %s is missing\n", gdbscript.
Data());
2281 TString gdbmess =
gEnv->GetValue(
"Root.StacktraceMessage",
"");
2282 gdbmess = gdbmess.
Strip();
2290 int fd = STDERR_FILENO;
2292 const char *message =
" Generating stack trace...\n";
2294 if (fd && message) { }
2297 Getlinem(kCleanUp,
nullptr);
2299#if defined(USE_GDB_STACK_TRACE)
2302 fprintf(stderr,
"gdb not found, need it for stack trace\n");
2307 TString gdbmessf =
"gdb-message";
2308 if (gdbmess !=
"") {
2310 fprintf(
f,
"%s\n", gdbmess.
Data());
2318 if (gdbmess !=
"") {
2320 gdbscript += gdbmessf;
2322 gdbscript +=
" 1>&2";
2327#elif defined(R__AIX)
2328 TString script =
"procstack ";
2332#elif defined(R__SOLARIS)
2343#elif defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_DLADDR)
2351 const char *cppfilt =
"c++filt";
2352 const char *cppfiltarg =
"";
2354 const char *format1 =
" 0x%016lx in %.200s %s 0x%lx from %.200s\n";
2356 const char *format2 =
" 0x%016lx in %.200s\n";
2358 const char *format2 =
" 0x%016lx in %.200s at %.200s from %.200s\n";
2360 const char *format3 =
" 0x%016lx in %.200s from %.200s\n";
2361 const char *format4 =
" 0x%016lx in <unknown function>\n";
2363 const char *format1 =
" 0x%08lx in %.200s %s 0x%lx from %.200s\n";
2365 const char *format2 =
" 0x%08lx in %.200s\n";
2367 const char *format2 =
" 0x%08lx in %.200s at %.200s from %.200s\n";
2369 const char *format3 =
" 0x%08lx in %.200s from %.200s\n";
2370 const char *format4 =
" 0x%08lx in <unknown function>\n";
2382 while (help.
Gets(p)) {
2384 cppfiltarg =
"--format=gnu-v3";
2386 }
else if (help.
Index(
"gnu-new-abi") !=
kNPOS) {
2387 cppfiltarg =
"--format=gnu-new-abi";
2396#if (defined(R__LINUX) && !defined(R__WINGCC))
2399#ifdef PR_SET_PTRACER
2400 prctl(PR_SET_PTRACER, getpid(), 0, 0, 0);
2406 TString gdbmessf =
"gdb-message";
2407 if (gdbmess !=
"") {
2409 fprintf(
f,
"%s\n", gdbmess.
Data());
2419 if (gdbmess !=
"") {
2421 gdbscript += gdbmessf;
2423 gdbscript +=
" 1>&2";
2436 if (write(fd, message, strlen(message)) < 0)
2441 TString tmpf1 =
"gdb-backtrace";
2442 std::ofstream file1;
2448 Error(
"StackTrace",
"could not open file %s", tmpf1.
Data());
2460 void *trace[kMAX_BACKTRACE_DEPTH];
2461 int depth = backtrace(trace, kMAX_BACKTRACE_DEPTH);
2462 for (
int n = 5;
n < depth;
n++) {
2466 if (dladdr(trace[
n], &info) && info.dli_fname && info.dli_fname[0]) {
2467 const char *libname = info.dli_fname;
2468 const char *symname = (info.dli_sname && info.dli_sname[0]) ?
2469 info.dli_sname :
"<unknown>";
2472 Bool_t gte = (addr >= symaddr);
2473 ULong_t diff = (gte) ? addr - symaddr : symaddr - addr;
2474 if (addr2line && symaddr) {
2478#if defined(MAC_OS_X_VERSION_10_10)
2479 snprintf(buffer,
sizeof(buffer),
"%s -p %d 0x%016lx", addr2line,
GetPid(), addr);
2480#elif defined(MAC_OS_X_VERSION_10_9)
2482 snprintf(buffer,
sizeof(buffer),
"%s -d -p %d 0x%016lx", addr2line,
GetPid(), addr);
2484 snprintf(buffer,
sizeof(buffer),
"%s -p %d 0x%016lx", addr2line,
GetPid(), addr);
2487 ULong_t offset = (addr >= libaddr) ? addr - libaddr :
2493 if (
name.Contains(
".so") ||
name.Contains(
".sl")) noShare =
kFALSE;
2494 if (noShare) offset = addr;
2503 snprintf(buffer,
sizeof(buffer),
"%s -e %s 0x%016lx", addr2line,
name.Data(), offset);
2505 if (FILE *pf = ::popen(buffer,
"r")) {
2507 if (fgets(buf, 2048, pf)) {
2508 buf[strlen(buf)-1] = 0;
2509 if (strncmp(buf,
"??", 2)) {
2511 snprintf(buffer,
sizeof(buffer), format2, addr, buf);
2513 snprintf(buffer,
sizeof(buffer), format2, addr, symname, buf, libname);
2521 snprintf(buffer,
sizeof(buffer), format1, addr, symname,
2522 gte ?
"+" :
"-", diff, libname);
2525 snprintf(buffer,
sizeof(buffer), format1, addr, symname,
2526 gte ?
"+" :
"-", diff, libname);
2528 snprintf(buffer,
sizeof(buffer), format3, addr, symname, libname);
2531 snprintf(buffer,
sizeof(buffer), format4, addr);
2537 if (write(fd, buffer, ::strlen(buffer)) < 0)
2542 TString tmpf2 =
"gdb-backtrace";
2546 snprintf(buffer,
sizeof(buffer),
"%s %s < %s > %s", filter, cppfiltarg, tmpf1.
Data(), tmpf2.
Data());
2548 std::ifstream file2(tmpf2);
2552 line.ReadString(file2);
2553 if (write(fd,
line.Data(),
line.Length()) < 0)
2561 delete [] addr2line;
2564#elif defined(HAVE_EXCPT_H) && defined(HAVE_PDSC_H) && \
2565 defined(HAVE_RLD_INTERFACE_H)
2574 exc_capture_context (&context);
2575 while (!rc && context.sc_pc) {
2577 pdsc_crd *func, *base, *crd
2578 = exc_remote_lookup_function_entry(0, 0, context.sc_pc, 0, &func, &base);
2579 Elf32_Addr addr = PDSC_CRD_BEGIN_ADDRESS(base, func);
2581 const char *
name =
"<unknown function>";
2582 sprintf(buffer,
" 0x%012lx %.200s + 0x%lx\n",
2583 context.sc_pc,
name, context.sc_pc - addr);
2584 write(fd, buffer, ::strlen(buffer));
2585 rc = exc_virtual_unwind(0, &context);
2630 ::openlog(
name, options, fac);
2640 ::syslog(level,
"%s", mess);
2680 const char *tty = ttyname(STDOUT_FILENO);
2684 if ((xh->
fStdOutDup = dup(STDOUT_FILENO)) < 0) {
2692 const char *tty = ttyname(STDERR_FILENO);
2696 if ((xh->
fStdErrDup = dup(STDERR_FILENO)) < 0) {
2698 if (outdone && dup2(xh->
fStdOutDup, STDOUT_FILENO) < 0) {
2699 Warning(
"RedirectOutput",
"could not restore stdout (back to original redirected"
2708 const char *
m = (mode[0] ==
'a' || mode[0] ==
'w') ? mode :
"a";
2715 if (!
gSystem->GetPathInfo(file, st))
2721 if (freopen(file,
m, stdout) ==
nullptr) {
2725 if (freopen(file,
m, stderr) ==
nullptr) {
2741 if (close(STDOUT_FILENO) != 0) {
2743 "problems closing STDOUT_FILENO (%d) before 'dup2' (errno: %d)",
2747 if (dup2(xh->
fStdOutDup, STDOUT_FILENO) < 0) {
2748 SysError(
"RedirectOutput",
"could not restore stdout (back to original redirected"
2754 "problems closing temporary 'out' descriptor %d (errno: %d)",
2767 if (close(STDERR_FILENO) != 0) {
2769 "problems closing STDERR_FILENO (%d) before 'dup2' (errno: %d)",
2773 if (dup2(xh->
fStdErrDup, STDERR_FILENO) < 0) {
2774 SysError(
"RedirectOutput",
"could not restore stderr (back to original redirected"
2780 "problems closing temporary 'err' descriptor %d (errno: %d)",
2825 Error(
"ListSymbols",
"not yet implemented");
2847 if (!linkedLibs.
IsNull())
2853#if !defined(R__MACOSX)
2859#if defined(R__MACOSX)
2861 linkedLibs = gLinkedDylibs;
2865 while (otool.
Gets(p)) {
2870 if (!linkedLibs.
IsNull())
2872 linkedLibs += dylib;
2880#elif defined(R__LINUX) || defined(R__SOLARIS) || defined(R__AIX)
2881#if defined(R__WINGCC )
2882 const char *cLDD=
"cygcheck";
2883 const char *cSOEXT=
".dll";
2884 size_t lenexe = strlen(exe);
2885 if (strcmp(exe + lenexe - 4,
".exe")
2886 && strcmp(exe + lenexe - 4,
".dll")) {
2889 char* longerexe =
new char[lenexe + 5];
2890 strlcpy(longerexe, exe,lenexe+5);
2891 strlcat(longerexe,
".exe",lenexe+5);
2893 #error "unsupported platform, fix memory leak to use it"
2895 TRegexp sovers =
"\\.so\\.[0-9]+";
2897 const char *cLDD=
"ldd";
2899 const char *cSOEXT=
".a";
2900 TRegexp sovers =
"\\.a\\.[0-9]+";
2902 const char *cSOEXT=
".so";
2903 TRegexp sovers =
"\\.so\\.[0-9]+";
2909 while (ldd.
Gets(p)) {
2928 if (!linkedLibs.
IsNull())
2930 linkedLibs += solib;
2975 if (mode && t->
IsSync()) {
2978 }
else if (!mode && t->
IsAsync()) {
3003 if (!ti)
return nullptr;
3032 struct addrinfo hints;
3033 struct addrinfo *result, *rp;
3034 memset(&hints, 0,
sizeof(
struct addrinfo));
3035 hints.ai_family = AF_INET;
3036 hints.ai_socktype = 0;
3037 hints.ai_protocol = 0;
3038 hints.ai_flags = AI_CANONNAME;
3043 size_t lenHostname = strlen(hostname);
3044 std::string hostnameWithoutLocal{hostname};
3045 if (lenHostname > 6 && !strcmp(hostname + lenHostname - 6,
".local")) {
3046 hostnameWithoutLocal.erase(lenHostname - 6);
3047 hostname = hostnameWithoutLocal.c_str();
3052 int rc = getaddrinfo(hostname,
nullptr, &hints, &result);
3054 if (rc == EAI_NONAME) {
3055 if (
gDebug > 0)
Error(
"GetHostByName",
"unknown host '%s'", hostname);
3058 Error(
"GetHostByName",
"getaddrinfo failed for '%s': %s", hostname, gai_strerror(rc));
3064 std::string hostcanon(result->ai_canonname ? result->ai_canonname : hostname);
3066 ia.
fFamily = result->ai_family;
3067 ia.
fAddresses[0] = ntohl(((
struct sockaddr_in *)(result->ai_addr))->sin_addr.s_addr);
3069 if (hostcanon.compare(hostname) != 0) ia.
AddAlias(hostname);
3072 char tmp[
sizeof(
struct in_addr)];
3073 if (inet_pton(AF_INET, hostcanon.data(), tmp) == 1) {
3074 char hbuf[NI_MAXHOST];
3075 if (getnameinfo(result->ai_addr, result->ai_addrlen, hbuf,
sizeof(hbuf),
nullptr, 0, 0) == 0)
3080 rp = result->ai_next;
3081 for (; rp !=
nullptr; rp = rp->ai_next) {
3082 UInt_t arp = ntohl(((
struct sockaddr_in *)(rp->ai_addr))->sin_addr.s_addr);
3087 freeaddrinfo(result);
3096 struct sockaddr addr;
3097 socklen_t len =
sizeof(addr);
3100 if (getsockname(sock, &addr, &len) == -1) {
3101 SysError(
"GetSockName",
"getsockname failed");
3105 if (addr.sa_family != AF_INET)
return ia;
3107 struct sockaddr_in *addrin = (
struct sockaddr_in *)&addr;
3108 ia.
fPort = ntohs(addrin->sin_port);
3109 ia.
fAddresses[0] = ntohl(addrin->sin_addr.s_addr);
3111 char hbuf[NI_MAXHOST];
3112 if (getnameinfo(&addr,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, 0) != 0) {
3113 Error(
"GetSockName",
"getnameinfo failed");
3126 struct sockaddr addr;
3127 socklen_t len =
sizeof(addr);
3130 if (getpeername(sock, &addr, &len) == -1) {
3131 SysError(
"GetPeerName",
"getpeername failed");
3135 if (addr.sa_family != AF_INET)
return ia;
3137 struct sockaddr_in *addrin = (
struct sockaddr_in *)&addr;
3138 ia.
fPort = ntohs(addrin->sin_port);
3139 ia.
fAddresses[0] = ntohl(addrin->sin_addr.s_addr);
3141 char hbuf[NI_MAXHOST];
3142 if (getnameinfo(&addr,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, 0) != 0) {
3143 Error(
"GetPeerName",
"getnameinfo failed");
3158 if ((sp = getservbyname(servicename,
kProtocolName)) ==
nullptr) {
3159 Error(
"GetServiceByName",
"no service \"%s\" with protocol \"%s\"\n",
3163 return ntohs(sp->s_port);
3173 if ((sp = getservbyport(htons(port),
kProtocolName)) ==
nullptr) {
3176 return Form(
"%d", port);
3185 int tcpwindowsize,
const char *protocol)
3187 if (!strcmp(servername,
"unix")) {
3189 }
else if (!
gSystem->AccessPathName(servername) || servername[0] ==
'/') {
3193 if (!strcmp(protocol,
"udp")){
3227 return UnixTcpService(port, reuse, backlog, tcpwindowsize, socketBindOption);
3263 while ((soc = ::accept(sock,
nullptr,
nullptr)) == -1 &&
GetErrno() == EINTR)
3270 SysError(
"AcceptConnection",
"accept");
3283 if (sock < 0)
return;
3285#if !defined(R__AIX) || defined(_AIX41) || defined(_AIX43)
3287 ::shutdown(sock, 2);
3290 while (::close(sock) == -1 &&
GetErrno() == EINTR)
3303 if (
UnixRecv(sock, &header,
sizeof(header), 0) > 0) {
3304 int count = ntohl(header);
3306 if (count > length) {
3307 Error(
"RecvBuf",
"record header exceeds buffer size");
3309 }
else if (count > 0) {
3310 if (
UnixRecv(sock, buf, count, 0) < 0) {
3311 Error(
"RecvBuf",
"cannot receive buffer");
3326 Int_t header = htonl(length);
3328 if (
UnixSend(sock, &header,
sizeof(header), 0) < 0) {
3329 Error(
"SendBuf",
"cannot send header");
3333 if (
UnixSend(sock, buf, length, 0) < 0) {
3334 Error(
"SendBuf",
"cannot send buffer");
3374 if ((
n =
UnixRecv(sock, buf, length, flag)) <= 0) {
3376 Error(
"RecvRaw",
"cannot receive buffer");
3409 if ((
n =
UnixSend(sock, buf, length, flag)) <= 0) {
3411 Error(
"SendRaw",
"cannot send buffer");
3422 if (sock < 0)
return -1;
3426 if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)&val,
sizeof(val)) == -1) {
3427 SysError(
"SetSockOpt",
"setsockopt(SO_SNDBUF)");
3432 if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)&val,
sizeof(val)) == -1) {
3433 SysError(
"SetSockOpt",
"setsockopt(SO_RCVBUF)");
3438 if (setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)&val,
sizeof(val)) == -1) {
3439 SysError(
"SetSockOpt",
"setsockopt(SO_OOBINLINE)");
3444 if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)&val,
sizeof(val)) == -1) {
3445 SysError(
"SetSockOpt",
"setsockopt(SO_KEEPALIVE)");
3450 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)&val,
sizeof(val)) == -1) {
3451 SysError(
"SetSockOpt",
"setsockopt(SO_REUSEADDR)");
3456 if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)&val,
sizeof(val)) == -1) {
3457 SysError(
"SetSockOpt",
"setsockopt(TCP_NODELAY)");
3462 if (ioctl(sock, FIONBIO, (
char*)&val) == -1) {
3463 SysError(
"SetSockOpt",
"ioctl(FIONBIO)");
3469 if (ioctl(sock, SIOCSPGRP, (
char*)&val) == -1) {
3470 SysError(
"SetSockOpt",
"ioctl(SIOCSPGRP)");
3474 Error(
"SetSockOpt",
"ioctl(SIOCGPGRP) not supported on cygwin/gcc");
3481 Error(
"SetSockOpt",
"illegal option (%d)", opt);
3492 if (sock < 0)
return -1;
3494 socklen_t optlen =
sizeof(*val);
3498 if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)val, &optlen) == -1) {
3499 SysError(
"GetSockOpt",
"getsockopt(SO_SNDBUF)");
3504 if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)val, &optlen) == -1) {
3505 SysError(
"GetSockOpt",
"getsockopt(SO_RCVBUF)");
3510 if (getsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)val, &optlen) == -1) {
3511 SysError(
"GetSockOpt",
"getsockopt(SO_OOBINLINE)");
3516 if (getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)val, &optlen) == -1) {
3517 SysError(
"GetSockOpt",
"getsockopt(SO_KEEPALIVE)");
3522 if (getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)val, &optlen) == -1) {
3523 SysError(
"GetSockOpt",
"getsockopt(SO_REUSEADDR)");
3528 if (getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)val, &optlen) == -1) {
3529 SysError(
"GetSockOpt",
"getsockopt(TCP_NODELAY)");
3535 if ((flg = fcntl(sock, F_GETFL, 0)) == -1) {
3536 SysError(
"GetSockOpt",
"fcntl(F_GETFL)");
3539 *val = flg & O_NDELAY;
3542#if !defined(R__LYNXOS) && !defined(R__WINGCC)
3543 if (ioctl(sock, SIOCGPGRP, (
char*)val) == -1) {
3544 SysError(
"GetSockOpt",
"ioctl(SIOCGPGRP)");
3548 Error(
"GetSockOpt",
"ioctl(SIOCGPGRP) not supported on LynxOS and cygwin/gcc");
3553#if !defined(R__LYNXOS)
3554 if (ioctl(sock, SIOCATMARK, (
char*)val) == -1) {
3555 SysError(
"GetSockOpt",
"ioctl(SIOCATMARK)");
3559 Error(
"GetSockOpt",
"ioctl(SIOCATMARK) not supported on LynxOS");
3564#if !defined(R__LYNXOS)
3565 if (ioctl(sock, FIONREAD, (
char*)val) == -1) {
3566 SysError(
"GetSockOpt",
"ioctl(FIONREAD)");
3570 Error(
"GetSockOpt",
"ioctl(FIONREAD) not supported on LynxOS");
3575 Error(
"GetSockOpt",
"illegal option (%d)", opt);
3596 { SIGBUS,
nullptr,
nullptr,
"bus error" },
3597 { SIGSEGV,
nullptr,
nullptr,
"segmentation violation" },
3598 { SIGSYS,
nullptr,
nullptr,
"bad argument to system call" },
3599 { SIGPIPE,
nullptr,
nullptr,
"write on a pipe with no one to read it" },
3600 { SIGILL,
nullptr,
nullptr,
"illegal instruction" },
3601 { SIGABRT,
nullptr,
nullptr,
"abort" },
3602 { SIGQUIT,
nullptr,
nullptr,
"quit" },
3603 { SIGINT,
nullptr,
nullptr,
"interrupt" },
3604 { SIGWINCH,
nullptr,
nullptr,
"window size change" },
3605 { SIGALRM,
nullptr,
nullptr,
"alarm clock" },
3606 { SIGCHLD,
nullptr,
nullptr,
"death of a child" },
3607 { SIGURG,
nullptr,
nullptr,
"urgent data arrived on an I/O channel" },
3608 { SIGFPE,
nullptr,
nullptr,
"floating point exception" },
3609 { SIGTERM,
nullptr,
nullptr,
"termination signal" },
3610 { SIGUSR1,
nullptr,
nullptr,
"user-defined signal 1" },
3611 { SIGUSR2,
nullptr,
nullptr,
"user-defined signal 2" }
3669 Break(
"TUnixSystem::DispatchSignals",
"%s: printing stacktrace",
UnixSigname(sig));
3688 if (
gEnv && !
gEnv->GetValue(
"Root.ErrorHandlers", 1))
3692 struct sigaction sigact;
3695 gSignalMap[sig].fOldHandler =
new struct sigaction();
3699#elif defined(R__SOLARIS)
3701#elif defined(R__LYNXOS)
3705 sigact.sa_handler = (void (*)(...))
sighandler;
3710 sigemptyset(&sigact.sa_mask);
3711 sigact.sa_flags = 0;
3712#if defined(SA_RESTART)
3713 sigact.sa_flags |= SA_RESTART;
3715 if (sigaction(
gSignalMap[sig].fCode, &sigact,
3717 ::SysError(
"TUnixSystem::UnixSignal",
"sigaction");
3728 TTHREAD_TLS_ARRAY(
struct sigaction,
kMAXSIGNALS,oldsigact);
3730 if (ignore != ignoreSig[sig]) {
3731 ignoreSig[sig] = ignore;
3733 struct sigaction sigact;
3735 sigact.sa_handler = (void (*)())SIG_IGN;
3736#elif defined(R__SOLARIS)
3737 sigact.sa_handler = (void (*)(
int))SIG_IGN;
3739 sigact.sa_handler = SIG_IGN;
3741 sigemptyset(&sigact.sa_mask);
3742 sigact.sa_flags = 0;
3743 if (sigaction(
gSignalMap[sig].fCode, &sigact, &oldsigact[sig]) < 0)
3744 ::SysError(
"TUnixSystem::UnixIgnoreSignal",
"sigaction");
3746 if (sigaction(
gSignalMap[sig].fCode, &oldsigact[sig],
nullptr) < 0)
3747 ::SysError(
"TUnixSystem::UnixIgnoreSignal",
"sigaction");
3763 struct sigaction sigact;
3766#elif defined(R__SOLARIS)
3768#elif defined(R__LYNXOS)
3772 sigact.sa_handler = (void (*)(...))
sighandler;
3777 sigemptyset(&sigact.sa_mask);
3778 sigact.sa_flags = 0;
3780#if defined(SA_INTERRUPT)
3781 sigact.sa_flags |= SA_INTERRUPT;
3784#if defined(SA_RESTART)
3785 sigact.sa_flags |= SA_RESTART;
3789 ::SysError(
"TUnixSystem::UnixSigAlarmInterruptsSyscalls",
"sigaction");
3809 ::SysError(
"TUnixSystem::UnixSignal",
"sigaction");
3832 static std::atomic<time_t> jan95{0};
3843 jan95 = mktime(&tp);
3844 if ((
int)jan95 == -1) {
3845 ::SysError(
"TUnixSystem::UnixNow",
"error converting 950001 0:00 to time_t");
3851 gettimeofday(&t,
nullptr);
3860 struct itimerval itv;
3861 itv.it_value.tv_sec = 0;
3862 itv.it_value.tv_usec = 0;
3863 itv.it_interval.tv_sec = 0;
3864 itv.it_interval.tv_usec = 0;
3866 itv.it_value.tv_sec = time_t(ms / 1000);
3867 itv.it_value.tv_usec = time_t((ms % 1000) * 1000);
3869 int st = setitimer(ITIMER_REAL, &itv,
nullptr);
3871 ::SysError(
"TUnixSystem::UnixSetitimer",
"setitimer");
3889 fd_set *rd = (readready) ? (fd_set*)readready->
GetBits() :
nullptr;
3890 fd_set *wr = (writeready) ? (fd_set*)writeready->
GetBits() :
nullptr;
3894 tv.tv_sec =
Int_t(timeout / 1000);
3895 tv.tv_usec = (timeout % 1000) * 1000;
3896 retcode = select(nfds, rd, wr,
nullptr, &tv);
3898 retcode = select(nfds, rd, wr,
nullptr,
nullptr);
3900 if (retcode == -1) {
3931 pw = getpwnam(
name);
3940 pw = getpwuid(getuid());
3941 if (
gSystem->Getenv(
"HOME")) {
3945 }
else if (pw && pw->
pw_dir) {
3973 if (stat(edir, &finfo) < 0)
3976 if (!S_ISDIR(finfo.st_mode))
3979 return (
void*) opendir(edir);
3982#if defined(_POSIX_SOURCE)
3985# define REAL_DIR_ENTRY(dp) 1
3987# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
3995 DIR *dirp = (DIR*)dirp1;
4027#if defined(R__SEEK64)
4029 if (path && lstat64(path, &sbuf) == 0) {
4032 if (path && lstat(path, &sbuf) == 0) {
4034 buf.
fIsLink = S_ISLNK(sbuf.st_mode);
4036#if defined(R__SEEK64)
4037 if (stat64(path, &sbuf) == -1) {
4039 if (stat(path, &sbuf) == -1) {
4044 buf.
fDev = sbuf.st_dev;
4045 buf.
fIno = sbuf.st_ino;
4046 buf.
fMode = sbuf.st_mode;
4047 buf.
fUid = sbuf.st_uid;
4048 buf.
fGid = sbuf.st_gid;
4049 buf.
fSize = sbuf.st_size;
4050 buf.
fMtime = sbuf.st_mtime;
4069 struct statfs statfsbuf;
4070#if (defined(R__SOLARIS) && !defined(R__LINUX))
4071 if (statfs(path, &statfsbuf,
sizeof(
struct statfs), 0) == 0) {
4072 *
id = statfsbuf.f_fstyp;
4073 *bsize = statfsbuf.f_bsize;
4074 *blocks = statfsbuf.f_blocks;
4075 *bfree = statfsbuf.f_bfree;
4077 if (statfs((
char*)path, &statfsbuf) == 0) {
4083 if (!strcmp(statfsbuf.f_fstypename, MOUNT_FFS) ||
4084 !strcmp(statfsbuf.f_fstypename, MOUNT_MFS))
4086 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_NFS))
4088 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_MSDOS))
4090 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_EXT2FS))
4092 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_CD9660))
4094 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_NCPFS))
4099 *
id = statfsbuf.f_type;
4101 *bsize = statfsbuf.f_bsize;
4102 *blocks = statfsbuf.f_blocks;
4103 *bfree = statfsbuf.f_bavail;
4116 return (
int) waitpid(0, &status, WNOHANG);
4137 sport = htons(port);
4140 if (!addr.
IsValid())
return -1;
4143 struct sockaddr_in server;
4144 memset(&server, 0,
sizeof(server));
4145 memcpy(&server.sin_addr, &adr,
sizeof(adr));
4147 server.sin_port = sport;
4151 if ((sock =
socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4152 ::SysError(
"TUnixSystem::UnixTcpConnect",
"socket (%s:%d)",
4157 if (tcpwindowsize > 0) {
4162 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
4166 ::SysError(
"TUnixSystem::UnixTcpConnect",
"connect (%s:%d)",
4188 sport = htons(port);
4191 if (!addr.
IsValid())
return -1;
4194 struct sockaddr_in server;
4195 memset(&server, 0,
sizeof(server));
4196 memcpy(&server.sin_addr, &adr,
sizeof(adr));
4198 server.sin_port = sport;
4202 if ((sock =
socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
4203 ::SysError(
"TUnixSystem::UnixUdpConnect",
"socket (%s:%d)",
4208 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
4212 ::SysError(
"TUnixSystem::UnixUdpConnect",
"connect (%s:%d)",
4234 if (!sockpath || strlen(sockpath) <= 0) {
4235 ::SysError(
"TUnixSystem::UnixUnixConnect",
"socket path undefined");
4240 struct sockaddr_un unserver;
4241 unserver.sun_family = AF_UNIX;
4243 if (strlen(sockpath) >
sizeof(unserver.sun_path)-1) {
4244 ::Error(
"TUnixSystem::UnixUnixConnect",
"socket path %s, longer than max allowed length (%u)",
4245 sockpath, (
UInt_t)
sizeof(unserver.sun_path)-1);
4248 strlcpy(unserver.sun_path, sockpath,
sizeof(unserver.sun_path));
4251 if ((sock =
socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
4252 ::SysError(
"TUnixSystem::UnixUnixConnect",
"socket");
4256 while (connect(sock, (
struct sockaddr*) &unserver, strlen(unserver.sun_path)+2) == -1) {
4260 ::SysError(
"TUnixSystem::UnixUnixConnect",
"connect");
4285 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
4286 short sport, tryport = kSOCKET_MINPORT;
4289 if (port == 0 && reuse) {
4290 ::Error(
"TUnixSystem::UnixTcpService",
"cannot do a port scan while reuse is true");
4297 sport = htons(port);
4301 if ((sock =
socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4302 ::SysError(
"TUnixSystem::UnixTcpService",
"socket");
4309 if (tcpwindowsize > 0) {
4314 struct sockaddr_in inserver;
4315 memset(&inserver, 0,
sizeof(inserver));
4316 inserver.sin_family = AF_INET;
4318 inserver.sin_port = sport;
4322 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
4323 ::SysError(
"TUnixSystem::UnixTcpService",
"bind");
4330 inserver.sin_port = htons(tryport);
4331 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
4333 }
while (bret < 0 &&
GetErrno() == EADDRINUSE && tryport < kSOCKET_MAXPORT);
4335 ::SysError(
"TUnixSystem::UnixTcpService",
"bind (port scan)");
4342 if (::listen(sock, backlog)) {
4343 ::SysError(
"TUnixSystem::UnixTcpService",
"listen");
4362 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
4363 short sport, tryport = kSOCKET_MINPORT;
4369 sport = htons(port);
4373 if ((sock =
socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
4374 ::SysError(
"TUnixSystem::UnixUdpService",
"socket");
4378 struct sockaddr_in inserver;
4379 memset(&inserver, 0,
sizeof(inserver));
4380 inserver.sin_family = AF_INET;
4382 inserver.sin_port = sport;
4386 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
4387 ::SysError(
"TUnixSystem::UnixUdpService",
"bind");
4394 inserver.sin_port = htons(tryport);
4395 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
4397 }
while (bret < 0 &&
GetErrno() == EADDRINUSE && tryport < kSOCKET_MAXPORT);
4399 ::SysError(
"TUnixSystem::UnixUdpService",
"bind (port scan)");
4406 if (::listen(sock, backlog)) {
4407 ::SysError(
"TUnixSystem::UnixUdpService",
"listen");
4424 oldumask = umask(0);
4436 unlink(sockpath.
Data());
4447 if (!sockpath || strlen(sockpath) <= 0) {
4448 ::SysError(
"TUnixSystem::UnixUnixService",
"socket path undefined");
4452 struct sockaddr_un unserver;
4456 memset(&unserver, 0,
sizeof(unserver));
4457 unserver.sun_family = AF_UNIX;
4459 if (strlen(sockpath) >
sizeof(unserver.sun_path)-1) {
4460 ::Error(
"TUnixSystem::UnixUnixService",
"socket path %s, longer than max allowed length (%u)",
4461 sockpath, (
UInt_t)
sizeof(unserver.sun_path)-1);
4464 strlcpy(unserver.sun_path, sockpath,
sizeof(unserver.sun_path));
4467 if ((sock =
socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
4468 ::SysError(
"TUnixSystem::UnixUnixService",
"socket");
4472 if (::bind(sock, (
struct sockaddr*) &unserver, strlen(unserver.sun_path)+2)) {
4473 ::SysError(
"TUnixSystem::UnixUnixService",
"bind");
4479 if (::listen(sock, backlog)) {
4480 ::SysError(
"TUnixSystem::UnixUnixService",
"listen");
4499 if (sock < 0)
return -1;
4506 if (flag == MSG_PEEK)
4510 char *buf = (
char *)buffer;
4512 for (
n = 0;
n < length;
n += nrecv) {
4513 if ((nrecv = recv(sock, buf+
n, length-
n, flag)) <= 0) {
4516 if (flag == MSG_OOB) {
4547 if (sock < 0)
return -1;
4556 const char *buf = (
const char *)buffer;
4558 for (
n = 0;
n < length;
n += nsent) {
4559 if ((nsent = send(sock, buf+
n, length-
n, flag)) <= 0) {
4593 static std::atomic<bool> initialized(
kFALSE);
4594 static std::atomic<bool> seenCling(
kFALSE);
4598 if (newpath ==
nullptr && !reset && (seenCling || (initialized &&
gCling ==
nullptr)))
4599 return dynpath_full;
4604 dynpath_full = newpath;
4606 initialized =
kTRUE;
4614 return dynpath_full;
4620 if (!reset && (seenCling || (initialized &&
gCling ==
nullptr)))
4621 return dynpath_full;
4630 static TString dynpath_envpart;
4631 static TString dynpath_syspart;
4633 if (reset || !initialized) {
4635 dynpath_envpart =
gSystem->Getenv(
"ROOT_LIBRARY_PATH");
4636 TString rdynpath =
gEnv->GetValue(
"Root.DynamicPath",
nullptr);
4642 #if defined (R__AIX)
4643 ldpath =
gSystem->Getenv(
"LIBPATH");
4644 #elif defined(R__MACOSX)
4645 ldpath =
gSystem->Getenv(
"DYLD_LIBRARY_PATH");
4648 ldpath +=
gSystem->Getenv(
"LD_LIBRARY_PATH");
4651 ldpath +=
gSystem->Getenv(
"DYLD_FALLBACK_LIBRARY_PATH");
4653 ldpath =
gSystem->Getenv(
"LD_LIBRARY_PATH");
4656 if (!dynpath_envpart.
IsNull())
4657 dynpath_envpart +=
":";
4658 dynpath_envpart += ldpath;
4660 if (!rdynpath.
IsNull()) {
4661 if (!dynpath_envpart.
IsNull())
4662 dynpath_envpart +=
":";
4663 dynpath_envpart += rdynpath;
4669 #if defined(R__WINGCC) || defined(R__MACOSX)
4671 dynpath_syspart =
"/usr/local/lib:/usr/X11R6/lib:/usr/lib:/lib:";
4672 dynpath_syspart +=
"/lib/x86_64-linux-gnu:/usr/local/lib64:/usr/lib64:/lib64:";
4680 const auto ldsyspath = std::getenv(
"ROOT_LDSYSPATH");
4681 if (ldsyspath !=
nullptr) {
4682 dynpath_syspart = ldsyspath;
4685 std::string cmd(
"LD_DEBUG=libs LD_PRELOAD=DOESNOTEXIST ls 2>&1");
4686 FILE *pf = popen(cmd.c_str(),
"r");
4687 std::string result =
"";
4690 if (fgets(buffer, 128, pf) !=
nullptr)
4694 std::size_t from = result.find(
"search path=", result.find(
"(LD_LIBRARY_PATH)"));
4695 std::size_t to = result.find(
"(system search path)");
4696 if (from != std::string::npos && to != std::string::npos) {
4698 std::string sys_path = result.substr(from, to - from);
4699 sys_path.erase(std::remove_if(sys_path.begin(), sys_path.end(), isspace), sys_path.end());
4700 dynpath_syspart = sys_path.c_str();
4708 if (!initialized || (!seenCling &&
gCling)) {
4709 dynpath_full = dynpath_envpart;
4710 if (!dynpath_full.
EndsWith(
":")) dynpath_full +=
":";
4712 dynpath_full +=
gCling->GetSTLIncludePath();
4713 if (!dynpath_full.
EndsWith(
":")) dynpath_full +=
":";
4717 dynpath_full += dynpath_syspart;
4718 initialized =
kTRUE;
4720 if (
gDebug > 0) std::cout <<
"dynpath = " << dynpath_full.
Data() << std::endl;
4723 return dynpath_full;
4767 char buf[PATH_MAX + 1];
4768 char *res = realpath(sLib.
Data(), buf);
4769 if (res) sLib = buf;
4775 const char* lib = sLib.
Data();
4777 if (len > 3 && (!strcmp(lib+len-3,
".so") ||
4778 !strcmp(lib+len-3,
".dl") ||
4779 !strcmp(lib+len-4,
".dll") ||
4780 !strcmp(lib+len-4,
".DLL") ||
4781 !strcmp(lib+len-6,
".dylib") ||
4782 !strcmp(lib+len-3,
".sl") ||
4783 !strcmp(lib+len-2,
".a"))) {
4788 Error(
"FindDynamicLibrary",
4792 static const char* exts[] = {
4793 ".so",
".dll",
".dylib",
".sl",
".dl",
".a",
nullptr };
4794 const char** ext = exts;
4806 Error(
"FindDynamicLibrary",
4807 "%s[.so | .dll | .dylib | .sl | .dl | .a] does not exist in %s",
4819static void GetFreeBSDSysInfo(
SysInfo_t *sysinfo)
4823 FILE *p =
gSystem->OpenPipe(
"sysctl -n kern.ostype hw.model hw.ncpu "
4824 "hw.realmem dev.cpu.0.freq",
"r");
4841static void GetFreeBSDCpuInfo(CpuInfo_t*,
Int_t)
4843 Error(
"ListSymbols",
"not yet implemented");
4847#if defined(R__MACOSX)
4848#include <sys/resource.h>
4849#include <mach/mach.h>
4850#include <mach/mach_error.h>
4855static void GetDarwinSysInfo(SysInfo_t *sysinfo)
4857 FILE *p =
gSystem->OpenPipe(
"sysctl -n kern.ostype hw.model hw.ncpu hw.cpufrequency "
4858 "hw.busfrequency hw.l2cachesize hw.memsize",
"r");
4878 p =
gSystem->OpenPipe(
"hostinfo",
"r");
4881 TPRegexp(
"Processor type: ([^ ]+).*").Substitute(s,
"$1");
4891static void ReadDarwinCpu(
long *ticks)
4893 mach_msg_type_number_t count;
4895 host_cpu_load_info_data_t cpu;
4897 ticks[0] = ticks[1] = ticks[2] = ticks[3] = 0;
4899 count = HOST_CPU_LOAD_INFO_COUNT;
4900 kr = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&cpu, &count);
4901 if (kr != KERN_SUCCESS) {
4902 ::Error(
"TUnixSystem::ReadDarwinCpu",
"host_statistics: %s", mach_error_string(kr));
4904 ticks[0] = cpu.cpu_ticks[CPU_STATE_USER];
4905 ticks[1] = cpu.cpu_ticks[CPU_STATE_SYSTEM];
4906 ticks[2] = cpu.cpu_ticks[CPU_STATE_IDLE];
4907 ticks[3] = cpu.cpu_ticks[CPU_STATE_NICE];
4915static void GetDarwinCpuInfo(CpuInfo_t *cpuinfo,
Int_t sampleTime)
4918 if (getloadavg(avg,
sizeof(avg)) < 0) {
4919 ::Error(
"TUnixSystem::GetDarwinCpuInfo",
"getloadavg failed");
4926 Long_t cpu_ticks1[4], cpu_ticks2[4];
4927 ReadDarwinCpu(cpu_ticks1);
4929 ReadDarwinCpu(cpu_ticks2);
4931 Long_t userticks = (cpu_ticks2[0] + cpu_ticks2[3]) -
4932 (cpu_ticks1[0] + cpu_ticks1[3]);
4933 Long_t systicks = cpu_ticks2[1] - cpu_ticks1[1];
4934 Long_t idleticks = cpu_ticks2[2] - cpu_ticks1[2];
4935 if (userticks < 0) userticks = 0;
4936 if (systicks < 0) systicks = 0;
4937 if (idleticks < 0) idleticks = 0;
4938 Long_t totalticks = userticks + systicks + idleticks;
4950static void GetDarwinMemInfo(MemInfo_t *meminfo)
4952 static Int_t pshift = 0;
4954 mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
4955 vm_statistics_data_t vm_info;
4956 kern_return_t kr = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vm_info, &count);
4957 if (kr != KERN_SUCCESS) {
4958 ::Error(
"TUnixSystem::GetDarwinMemInfo",
"host_statistics: %s", mach_error_string(kr));
4962 for (
int psize = getpagesize(); psize > 1; psize >>= 1)
4967 DIR *dirp = opendir(
"/private/var/vm");
4973 while ((dp = readdir(dirp)) != 0) {
4975 char fname [MAXNAMLEN];
4976 if (strncmp(dp->d_name,
"swapfile", 8))
4978 strlcpy(fname,
"/private/var/vm/",MAXNAMLEN);
4979 strlcat (fname, dp->d_name,MAXNAMLEN);
4980 if (stat(fname, &sb) < 0)
4982 swap_total += sb.st_size;
4986 Long64_t used = (
Long64_t)(vm_info.active_count + vm_info.inactive_count + vm_info.wire_count) << pshift;
4988 Long64_t total = (
Long64_t)(vm_info.active_count + vm_info.inactive_count + vm_info.free_count + vm_info.wire_count) << pshift;
4989 Long64_t avail = (
Long64_t)(vm_info.inactive_count + vm_info.free_count) << pshift;
4992 Long64_t swap_used = vm_info.pageouts << pshift;
5011static void GetDarwinProcInfo(ProcInfo_t *procinfo)
5014#define vm_region vm_region_64
5018#define GLOBAL_SHARED_TEXT_SEGMENT 0x90000000U
5019#define GLOBAL_SHARED_DATA_SEGMENT 0xA0000000U
5020#define SHARED_TEXT_REGION_SIZE 0x10000000
5021#define SHARED_DATA_REGION_SIZE 0x10000000
5024 if (getrusage(RUSAGE_SELF, &ru) < 0) {
5025 ::SysError(
"TUnixSystem::GetDarwinProcInfo",
"getrusage failed");
5028 ((
Float_t)(ru.ru_utime.tv_usec) / 1000000.);
5030 ((
Float_t)(ru.ru_stime.tv_usec) / 1000000.);
5033 task_basic_info_data_t ti;
5034 mach_msg_type_number_t count;
5037 task_t a_task = mach_task_self();
5039 count = TASK_BASIC_INFO_COUNT;
5040 kr = task_info(a_task, TASK_BASIC_INFO, (task_info_t)&ti, &count);
5041 if (kr != KERN_SUCCESS) {
5042 ::Error(
"TUnixSystem::GetDarwinProcInfo",
"task_info: %s", mach_error_string(kr));
5047 mach_port_t object_name;
5048 vm_address_t address;
5049 vm_region_top_info_data_t info;
5050 vm_size_t vprvt, rsize,
size;
5051 rsize = ti.resident_size;
5053 for (address = 0; ; address +=
size) {
5055 count = VM_REGION_TOP_INFO_COUNT;
5056 if (vm_region(a_task, &address, &
size,
5057 VM_REGION_TOP_INFO, (vm_region_info_t)&info, &count,
5058 &object_name) != KERN_SUCCESS) {
5063 if (address >= GLOBAL_SHARED_TEXT_SEGMENT &&
5064 address < (GLOBAL_SHARED_DATA_SEGMENT + SHARED_DATA_REGION_SIZE)) {
5069 if (info.share_mode == SM_EMPTY) {
5070 vm_region_basic_info_data_64_t b_info;
5071 count = VM_REGION_BASIC_INFO_COUNT_64;
5072 if (vm_region_64(a_task, &address,
5073 &
size, VM_REGION_BASIC_INFO,
5074 (vm_region_info_t)&b_info, &count,
5075 &object_name) != KERN_SUCCESS) {
5082 if (info.share_mode != SM_PRIVATE) {
5086 switch (info.share_mode) {
5088 if (info.ref_count == 1) {
5091 vprvt += info.private_pages_resident * getpagesize();
5110#if defined(R__LINUX)
5113bool parseLine(TString &s,
const char *prefix,
Int_t &field)
5116 TPRegexp{
"^.+: *([^ ]+).*"}.Substitute(s,
"$1");
5117 field = (s.
Atoi() / 1024);
5127static void GetLinuxSysInfo(SysInfo_t *sysinfo)
5130 FILE *
f = fopen(
"/proc/cpuinfo",
"r");
5134 TPRegexp(
"^.+: *(.*$)").Substitute(s,
"$1");
5137 parseLine(s,
"cpu MHz", sysinfo->
fCpuSpeed);
5138 parseLine(s,
"cache size", sysinfo->
fL2Cache);
5139 if (parseLine(s,
"processor", sysinfo->
fCpus)) {
5146 f = fopen(
"/proc/meminfo",
"r");
5149 if (parseLine(s,
"MemTotal", sysinfo->
fPhysRam)) {
5156 f =
gSystem->OpenPipe(
"uname -s -p",
"r");
5169static void ReadLinuxCpu(
long *ticks)
5171 ticks[0] = ticks[1] = ticks[2] = ticks[3] = 0;
5174 FILE *
f = fopen(
"/proc/stat",
"r");
5178 sscanf(s.
Data(),
"%*s %ld %ld %ld %ld", &ticks[0], &ticks[3], &ticks[1], &ticks[2]);
5186static void GetLinuxCpuInfo(CpuInfo_t *cpuinfo,
Int_t sampleTime)
5188 Double_t avg[3] = { -1., -1., -1. };
5190 if (getloadavg(avg,
sizeof(avg)) < 0) {
5191 ::Error(
"TUnixSystem::GetLinuxCpuInfo",
"getloadavg failed");
5200 Long_t cpu_ticks1[4], cpu_ticks2[4];
5201 ReadLinuxCpu(cpu_ticks1);
5203 ReadLinuxCpu(cpu_ticks2);
5205 Long_t userticks = (cpu_ticks2[0] + cpu_ticks2[3]) -
5206 (cpu_ticks1[0] + cpu_ticks1[3]);
5207 Long_t systicks = cpu_ticks2[1] - cpu_ticks1[1];
5208 Long_t idleticks = cpu_ticks2[2] - cpu_ticks1[2];
5209 if (userticks < 0) userticks = 0;
5210 if (systicks < 0) systicks = 0;
5211 if (idleticks < 0) idleticks = 0;
5212 Long_t totalticks = userticks + systicks + idleticks;
5224static void GetLinuxMemInfo(MemInfo_t *meminfo)
5227 FILE *
f = fopen(
"/proc/meminfo",
"r");
5232 parseLine(s,
"MemTotal", meminfo->
fMemTotal);
5233 parseLine(s,
"MemFree", meminfo->
fMemFree);
5236 parseLine(s,
"Buffers", meminfo->
fMemBuffer);
5238 parseLine(s,
"SwapTotal", meminfo->
fSwapTotal);
5239 parseLine(s,
"SwapFree", meminfo->
fSwapFree);
5254 meminfo->
fMemUsed = (meminfo->
fMemTotal >= usedDiff) ? meminfo->
fMemTotal - usedDiff : meminfo->fMemTotal - meminfo->fMemFree;
5264static void GetLinuxProcInfo(ProcInfo_t *procinfo)
5267 if (getrusage(RUSAGE_SELF, &ru) < 0) {
5268 ::SysError(
"TUnixSystem::GetLinuxProcInfo",
"getrusage failed");
5271 ((
Float_t)(ru.ru_utime.tv_usec) / 1000000.);
5273 ((
Float_t)(ru.ru_stime.tv_usec) / 1000000.);
5284 sscanf(s.
Data(),
"%ld %ld", &
total, &rss);
5298 if (!info)
return -1;
5302 if (!sysinfo.
fCpus) {
5303#if defined(R__MACOSX)
5304 GetDarwinSysInfo(&sysinfo);
5305#elif defined(R__LINUX)
5306 GetLinuxSysInfo(&sysinfo);
5307#elif defined(R__FBSD)
5308 GetFreeBSDSysInfo(&sysinfo);
5324 if (!info)
return -1;
5326#if defined(R__MACOSX)
5327 GetDarwinCpuInfo(info, sampleTime);
5328#elif defined(R__LINUX)
5329 GetLinuxCpuInfo(info, sampleTime);
5330#elif defined(R__FBSD)
5331 GetFreeBSDCpuInfo(info, sampleTime);
5343 if (!info)
return -1;
5345#if defined(R__MACOSX)
5346 GetDarwinMemInfo(info);
5347#elif defined(R__LINUX)
5348 GetLinuxMemInfo(info);
5360 if (!info)
return -1;
5362#if defined(R__MACOSX)
5363 GetDarwinProcInfo(info);
5364#elif defined(R__LINUX)
5365 GetLinuxProcInfo(info);
The file contains utilities which are foundational and could be used across the core component of ROO...
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
int Int_t
Signed integer 4 bytes (int).
int Ssiz_t
String size (currently int).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
unsigned long ULong_t
Unsigned long integer 4 bytes (unsigned long). Size depends on architecture.
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
bool Bool_t
Boolean (0=false, 1=true) (bool).
double Double_t
Double 8 bytes.
constexpr Ssiz_t kNPOS
The equivalent of std::string::npos for the ROOT class TString.
long long Long64_t
Portable signed long integer 8 bytes.
float Float_t
Float 4 bytes (float).
@ kItimerResolution
interval-timer resolution in ms (used for TThread, TTimer, Emit, Connect, etc.)
externTApplication * gApplication
void SysError(const char *location, const char *msgfmt,...)
Use this function in case a system (OS or GUI) related error occurred.
void Break(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
void Fatal(const char *location, const char *msgfmt,...)
Use this function in case of a fatal error. It will abort the program.
R__EXTERN TExceptionHandler * gExceptionHandler
static unsigned int total
externTInterpreter * gCling
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
void Printf(const char *fmt,...)
Formats a string in a circular formatting buffer and prints the string.
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
externconst char * gRootDir
externconst char * gProgName
externTFileHandler * gXDisplay
externconst char * gProgPath
ESocketBindOption
Options for binging the sockets created.
@ kInaddrAny
Any address for socket binding.
externTVirtualMutex * gSystemMutex
static void sighandler(int sig)
Call the signal handler associated with the signal.
static const char * DynamicPath(const char *newpath=nullptr, Bool_t reset=kFALSE)
Get shared library search path.
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()
void(* SigHandler_t)(ESignals)
#define R__LOCKGUARD2(mutex)
TFdSet & operator=(const TFdSet &rhs)
ULong_t fds_bits[(((kFDSETSIZE)+((kNFDBITS) -1))/(kNFDBITS))]
TFdSet(const TFdSet &org)
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
TObject * Next() override
Return next object in the list. Returns 0 when no more objects in list.
TObject * At(Int_t idx) const override
Collectable string class.
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() override
Return next object in collection.
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.
Regular expression class.
Bool_t Notify() override
Notify when signal occurs.
ESignals GetSignal() const
Int_t Atoi() const
Return integer value of string.
Bool_t Gets(FILE *fp, Bool_t chop=kTRUE)
Read one line from the stream, including the \n, 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.
Ssiz_t First(char c) const
Find first occurrence of a character c.
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)
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Long64_t Atoll() const
Return long long value of string.
virtual void Unload(const char *module)
Unload a shared library.
TSeqCollection * fFileHandler
virtual void AddFileHandler(TFileHandler *fh)
Add a file handler to the list of system file handlers.
TString & GetLastErrorString()
Return the thread local storage for the custom last error message.
virtual Func_t DynFindSymbol(const char *module, const char *entry)
Find specific entry point in specified library.
static void ResetErrno()
Static function resetting system error number.
static Int_t GetErrno()
Static function returning system error number.
TFdSet * fReadmask
!Files that should be checked for read events
virtual const char * DirName(const char *pathname)
Return the directory name in pathname.
virtual void FreeDirectory(void *dirp)
Free a directory.
virtual void * OpenDirectory(const char *name)
Open a directory.
virtual Long_t NextTimeOut(Bool_t mode)
Time when next timer of mode (synchronous=kTRUE or asynchronous=kFALSE) will time-out (in ms).
TFdSet * fWritemask
!Files that should be checked for write events
TFdSet * fSignals
!Signals that were trapped
virtual Bool_t IsPathLocal(const char *path)
Returns TRUE if the url in 'path' points to the local file system.
virtual int mkdir(const char *name, Bool_t recursive=kFALSE)
Make a file system directory.
virtual int MakeDirectory(const char *name)
Make a directory.
virtual const char * ExpandFileName(const char *fname)
Expand a pathname getting rid of special shell characters like ~.
TSystem(const TSystem &)=delete
virtual TFileHandler * RemoveFileHandler(TFileHandler *fh)
Remove a file handler from the list of file handlers.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
virtual void ListLibraries(const char *regexp="")
List the loaded shared libraries.
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.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual Bool_t Init()
Initialize the OS interface.
virtual void AddTimer(TTimer *t)
Add timer to list of system timers.
TFdSet * fWriteready
!Files with writes waiting
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual void AddSignalHandler(TSignalHandler *sh)
Add a signal handler to list of system signal handlers.
TSeqCollection * fSignalHandler
TFdSet * fReadready
!Files with reads waiting
TSystem * FindHelper(const char *path, void *dirptr=nullptr)
Create helper TSystem to handle file and directory operations that might be special for remote file a...
std::atomic< Bool_t > fInsideNotify
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual TSignalHandler * RemoveSignalHandler(TSignalHandler *sh)
Remove a signal handler from list of signal handlers.
static const char * StripOffProto(const char *path, const char *proto)
Strip off protocol string from specified path.
virtual TTimer * RemoveTimer(TTimer *t)
Remove timer from list of system timers.
virtual int Unlink(const char *name)
Unlink, i.e.
Basic time type with millisecond precision.
Handles synchronous and a-synchronous timer events.
Bool_t CheckTimer(const TTime &now)
Check if timer timed out.
void AddTimer(TTimer *ti) override
Add timer to list of system timers.
int RecvRaw(int sock, void *buffer, int length, int flag) override
Receive exactly length bytes into buffer.
int OpenConnection(const char *server, int port, int tcpwindowsize=-1, const char *protocol="tcp") override
Open a connection to a service on a server.
int GetMemInfo(MemInfo_t *info) const override
Returns ram and swap memory usage info into the MemInfo_t structure.
Bool_t IsPathLocal(const char *path) override
Returns TRUE if the url in 'path' points to the local file system.
int Symlink(const char *from, const char *to) override
Create a symlink from file1 to file2.
const char * HomeDirectory(const char *userName=nullptr) override
Return the user's home directory.
Int_t GetGid(const char *group=nullptr) override
Returns the group's id. If group = 0, returns current user's group.
static int UnixUdpConnect(const char *hostname, int port)
Creates a UDP socket connection Is called via the TSocket constructor.
int CopyFile(const char *from, const char *to, Bool_t overwrite=kFALSE) override
Copy a file.
TTimer * RemoveTimer(TTimer *ti) override
Remove timer from list of system timers.
int AnnounceUnixService(int port, int backlog) override
Announce unix domain service on path "kServerPath/<port>".
static int UnixTcpConnect(const char *hostname, int port, int tcpwindowsize)
Open a TCP/IP connection to server and connect to a service (i.e.
Int_t SetFPEMask(Int_t mask=kDefaultMask) override
Set which conditions trigger a floating point exception.
static const char * UnixGetdirentry(void *dir)
Returns the next directory entry.
void Setenv(const char *name, const char *value) override
Set environment variable.
int ConnectService(const char *server, int port, int tcpwindowsize, const char *protocol="tcp")
Connect to service servicename on server servername.
Bool_t ChangeDirectory(const char *path) override
Change directory. Returns kTRUE in case of success, kFALSE otherwise.
static int UnixTcpService(int port, Bool_t reuse, int backlog, int tcpwindowsize, ESocketBindOption socketBindOption)
Open a socket, bind to it and start listening for TCP/IP connections on the port.
static const char * UnixHomedirectory(const char *user=nullptr)
Returns the user's home directory.
char * GetServiceByPort(int port) override
Get name of internet service.
Bool_t CheckSignals(Bool_t sync)
Check if some signals were raised and call their Notify() member.
static int UnixMakedir(const char *name)
Make a Unix file system directory.
static void UnixSigAlarmInterruptsSyscalls(Bool_t set)
When the argument is true the SIGALRM signal handler is set so that interrupted syscalls will not be ...
Int_t GetFPEMask() override
Return the bitmap of conditions that trigger a floating point exception.
static int UnixUnixConnect(int port)
Connect to a Unix domain socket.
int GetSysInfo(SysInfo_t *info) const override
Returns static system info, like OS type, CPU type, number of CPUs RAM size, etc into the SysInfo_t s...
void Exit(int code, Bool_t mode=kTRUE) override
Exit the application.
void AddDynamicPath(const char *lib) override
Add a new directory to the dynamic path.
void SetDynamicPath(const char *lib) override
Set the dynamic path to a new value.
int ClosePipe(FILE *pipe) override
Close the pipe.
std::string GetHomeDirectory(const char *userName=nullptr) const override
Return the user's home directory.
Int_t Select(TList *active, Long_t timeout) override
Select on file descriptors.
void Unsetenv(const char *name) override
Unset environment variable.
virtual ~TUnixSystem()
Reset to original state.
void Abort(int code=0) override
Abort the application.
void Syslog(ELogLevel level, const char *mess) override
Send mess to syslog daemon.
int AnnounceTcpService(int port, Bool_t reuse, int backlog, int tcpwindowsize=-1, ESocketBindOption socketBindOption=ESocketBindOption::kInaddrAny) override
Announce TCP/IP service.
UserGroup_t * GetGroupInfo(Int_t gid) override
Returns all group info in the UserGroup_t structure.
Int_t GetUid(const char *user=nullptr) override
Returns the user's id. If user = 0, returns current user's id.
Bool_t ExpandPathName(TString &patbuf) override
Expand a pathname getting rid of special shell characters like ~.
void Openlog(const char *name, Int_t options, ELogFacility facility) override
Open connection to system log daemon.
int AcceptConnection(int sock) override
Accept a connection.
TTime Now() override
Get current time in milliseconds since 0:00 Jan 1 1995.
static void UnixResetSignal(ESignals sig)
Restore old signal handler for specified signal.
int GetServiceByName(const char *service) override
Get port # of internet service.
const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists) override
Find location of file "wfil" in a search path.
void SigAlarmInterruptsSyscalls(Bool_t set) override
When the argument is true the SIGALRM signal handler is set so that interrupted syscalls will not be ...
int Utime(const char *file, Long_t modtime, Long_t actime) override
Set a files modification and access times.
const char * GetLinkedLibraries() override
Get list of shared libraries loaded at the start of the executable.
const char * GetError() override
Return system error string.
std::string GetWorkingDirectory() const override
Return working directory.
Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists) override
Returns FALSE if one can access a file using the specified access mode.
FILE * TempFileName(TString &base, const char *dir=nullptr, const char *suffix=nullptr) override
Create a secure temporary file by appending a unique 6 letter string to base.
void DispatchOneEvent(Bool_t pendingOnly=kFALSE) override
Dispatch a single event.
int Chmod(const char *file, UInt_t mode) override
Set the file permission bits. Returns -1 in case or error, 0 otherwise.
const char * PrependPathName(const char *dir, TString &name) override
Concatenate a directory and a file name.
Bool_t DispatchTimers(Bool_t mode)
Handle and dispatch timers.
void IgnoreSignal(ESignals sig, Bool_t ignore=kTRUE) override
If ignore is true ignore the specified signal, else restore previous behaviour.
void ListSymbols(const char *module, const char *re="") override
List symbols in a shared library.
int Load(const char *module, const char *entry="", Bool_t system=kFALSE) override
Load a shared library.
void StackTrace() override
Print a stack trace.
TInetAddress GetHostByName(const char *server) override
Get Internet Protocol (IP) address of host.
int SendBuf(int sock, const void *buffer, int length) override
Send a buffer headed by a length indicator.
const char * HostName() override
Return the system's host name.
void CheckChilds()
Check if children have finished.
int RecvBuf(int sock, void *buffer, int length) override
Receive a buffer headed by a length indicator.
static int UnixUnixService(int port, int backlog)
Open a socket, bind to it and start listening for Unix domain connections to it.
UserGroup_t * GetUserInfo(Int_t uid) override
Returns all user info in the UserGroup_t structure.
void SetDisplay() override
Set DISPLAY environment variable based on utmp entry. Only for UNIX.
TFileHandler * RemoveFileHandler(TFileHandler *fh) override
Remove a file handler from the list of file handlers.
static const char * UnixSigname(ESignals sig)
Return the signal name associated with a signal.
static Long64_t UnixNow()
Get current time in milliseconds since 0:00 Jan 1 1995.
static int UnixFSstat(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.
void ResetSignals() override
Reset signals handlers to previous behaviour.
TInetAddress GetSockName(int sock) override
Get Internet Protocol (IP) address of host and port #.
int Link(const char *from, const char *to) override
Create a link from file1 to file2.
int GetProcInfo(ProcInfo_t *info) const override
Returns cpu and memory used by this process into the ProcInfo_t structure.
int SetSockOpt(int sock, int option, int val) override
Set socket option.
static int UnixSetitimer(Long_t ms)
Set interval timer to time-out in ms milliseconds.
static int UnixSend(int sock, const void *buf, int len, int flag)
Send exactly length bytes from buffer.
TInetAddress GetPeerName(int sock) override
Get Internet Protocol (IP) address of remote host and port #.
static void UnixIgnoreSignal(ESignals sig, Bool_t ignore)
If ignore is true ignore the specified signal, else restore previous behaviour.
void DispatchSignals(ESignals sig)
Handle and dispatch signals.
void AddFileHandler(TFileHandler *fh) override
Add a file handler to the list of system file handlers.
int AnnounceUdpService(int port, int backlog, ESocketBindOption socketBindOption=ESocketBindOption::kInaddrAny) override
Announce UDP service.
void * OpenDirectory(const char *name) override
Open a Unix file system directory. Returns 0 if directory does not exist.
int Rename(const char *from, const char *to) override
Rename a file. Returns 0 when successful, -1 in case of failure.
const char * Getenv(const char *name) override
Get environment variable.
int GetPathInfo(const char *path, FileStat_t &buf) override
Get info about a file.
Int_t GetEffectiveGid() override
Returns the effective group id.
static int UnixSelect(Int_t nfds, TFdSet *readready, TFdSet *writeready, Long_t timeout)
Wait for events on the file descriptors specified in the readready and writeready masks or for timeou...
int GetPid() override
Get process id.
Int_t Exec(const char *shellcmd) override
Execute a command.
void ResetTimer(TTimer *ti) override
Reset a-sync timer.
TSignalHandler * RemoveSignalHandler(TSignalHandler *sh) override
Remove a signal handler from list of signal handlers.
static void UnixSignal(ESignals sig, SigHandler_t h)
Set a signal handler for a signal.
void CloseConnection(int sock, Bool_t force=kFALSE) override
Close socket.
Bool_t CheckDescriptors()
Check if there is activity on some file descriptors and call their Notify() member.
Bool_t Init() override
Initialize Unix system interface.
void Unload(const char *module) override
Unload a shared library.
int Umask(Int_t mask) override
Set the process file creation mode mask.
static int UnixFilestat(const char *path, FileStat_t &buf)
Get info about a file.
static int UnixRecv(int sock, void *buf, int len, int flag)
Receive exactly length bytes into buffer.
Int_t GetEffectiveUid() override
Returns the effective user id.
void FillWithCwd(char *cwd) const
Fill buffer with current working directory.
static int UnixWaitchild()
Wait till child is finished.
int Unlink(const char *name) override
Unlink, i.e.
void ListLibraries(const char *regexp="") override
List all loaded shared libraries.
void Closelog() override
Close connection to system log daemon.
Int_t RedirectOutput(const char *name, const char *mode="a", RedirectHandle_t *h=nullptr) override
Redirect standard output (stdout, stderr) to the specified file.
void Sleep(UInt_t milliSec) override
Sleep milliSec milliseconds.
void ResetSignal(ESignals sig, Bool_t reset=kTRUE) override
If reset is true reset the signal handler for the specified signal to the default handler,...
const char * TempDirectory() const override
Return a user configured or systemwide directory to create temporary files in.
Func_t DynFindSymbol(const char *module, const char *entry) override
dynamic linking of module
const char * GetDynamicPath() override
Return the dynamic path (used to find shared libraries).
FILE * OpenPipe(const char *shellcmd, const char *mode) override
Open a pipe.
void FreeDirectory(void *dirp) override
Close a Unix file system directory.
static void UnixResetSignals()
Restore old signal handlers.
int GetCpuInfo(CpuInfo_t *info, Int_t sampleTime=1000) const override
Returns cpu load average and load info into the CpuInfo_t structure.
void AddSignalHandler(TSignalHandler *sh) override
Add a signal handler to list of system signal handlers.
static void * UnixOpendir(const char *name)
Open a directory.
int SendRaw(int sock, const void *buffer, int length, int flag) override
Send exactly length bytes from buffer.
const char * WorkingDirectory() override
Return working directory.
int GetSockOpt(int sock, int option, int *val) override
Get socket option.
const char * FindDynamicLibrary(TString &lib, Bool_t quiet=kFALSE) override
Returns the path of a shared library (searches for library in the shared library search path).
void SetProgname(const char *name) override
Set the application name (from command line, argv[0]) and copy it in gProgName.
const char * GetDirEntry(void *dirp) override
Get next Unix file system directory entry. Returns 0 if no more entries.
int MakeDirectory(const char *name) override
Make a Unix file system directory.
static int UnixUdpService(int port, int backlog, ESocketBindOption socketBindOption)
Open a socket, bind to it and start listening for UDP connections on the port.
int GetFsInfo(const char *path, Long_t *id, Long_t *bsize, Long_t *blocks, Long_t *bfree) override
Get info about a file system: id, bsize, bfree, blocks.
const std::string & GetFallbackRootSys()
const char * GetExePath()
Returns the executable path name, used e.g. by SetRootSys().
struct sigaction * fOldHandler
struct utmp * fUtmpContents
struct utmp * SearchUtmpEntry(const char *tty)