20#include "RConfigure.h"
52#if defined(R__SUN) || defined(R__AIX) || \
53 defined(R__LINUX) || defined(R__SOLARIS) || \
54 defined(R__FBSD) || defined(R__OBSD) || \
55 defined(R__MACOSX) || defined(R__HURD)
63#if defined(ULTRIX) || defined(R__SUN)
66#if defined(R__AIX) || defined(R__LINUX) || \
67 defined(R__FBSD) || defined(R__OBSD) || \
68 defined(R__LYNXOS) || defined(R__MACOSX) || defined(R__HURD)
69# include <sys/ioctl.h>
71#if defined(R__AIX) || defined(R__SOLARIS)
72# include <sys/select.h>
75# include <mach-o/dyld.h>
76# include <sys/mount.h>
77 extern "C" int statfs(
const char *
file,
struct statfs *buffer);
78#elif defined(R__LINUX) || defined(R__HURD)
80#elif defined(R__FBSD) || defined(R__OBSD)
81# include <sys/param.h>
82# include <sys/mount.h>
84# include <sys/statfs.h>
96#include <sys/resource.h>
101#include <sys/socket.h>
102#include <netinet/in.h>
103#include <netinet/tcp.h>
105# define _XOPEN_EXTENDED_SOURCE
106# include <arpa/inet.h>
107# undef _XOPEN_EXTENDED_SOURCE
108# if !defined(_AIX41) && !defined(_AIX43)
110# define HASNOT_INETATON
113# include <arpa/inet.h>
118#if defined(R__SOLARIS)
119# include <sys/systeminfo.h>
120# include <sys/filio.h>
121# include <sys/sockio.h>
122# define HASNOT_INETATON
124# define INADDR_NONE (UInt_t)-1
128#if defined(R__SOLARIS)
133#if defined(MAC_OS_X_VERSION_10_5)
139# include <sys/param.h>
140# if __FreeBSD_version >= 900007
145#if defined(R__AIX) || defined(R__FBSD) || \
146 defined(R__OBSD) || defined(R__LYNXOS) || \
147 (defined(R__MACOSX) && !defined(MAC_OS_X_VERSION_10_5))
151#if defined(R__LYNXOS)
153 extern int putenv(
const char *);
154 extern int inet_aton(
const char *,
struct in_addr *);
160#define STRUCT_UTMP struct utmpx
163#define STRUCT_UTMP struct utmp
165#if !defined(UTMP_FILE) && defined(_PATH_UTMP)
166#define UTMP_FILE _PATH_UTMP
168#if defined(UTMPX_FILE)
170#define UTMP_FILE UTMPX_FILE
173#define UTMP_FILE "/etc/utmp"
177#if (defined(R__LINUX) || defined(R__HURD)) && !defined(R__WINGCC)
178# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 1
179# define HAVE_BACKTRACE_SYMBOLS_FD
183#if defined(R__MACOSX)
184# define HAVE_BACKTRACE_SYMBOLS_FD
188#ifdef HAVE_BACKTRACE_SYMBOLS_FD
189# include <execinfo.h>
198#ifdef HAVE_BACKTRACE_SYMBOLS_FD
201 static const int kMAX_BACKTRACE_DEPTH = 128;
205#if (defined(R__LINUX) && !defined(R__WINGCC))
207#include <sys/prctl.h>
210#if defined(R__MACOSX) && defined(__SSE2__)
211#include <xmmintrin.h>
214#if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \
215 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \
222#include <mach/thread_status.h>
224#define fegetenvd(x) asm volatile("mffs %0" : "=f" (x));
225#define fesetenvd(x) asm volatile("mtfsf 255,%0" : : "f" (x));
228 FE_ENABLE_INEXACT = 0x00000008,
229 FE_ENABLE_DIVBYZERO = 0x00000010,
230 FE_ENABLE_UNDERFLOW = 0x00000020,
231 FE_ENABLE_OVERFLOW = 0x00000040,
232 FE_ENABLE_INVALID = 0x00000080,
233 FE_ENABLE_ALL_EXCEPT = 0x000000F8
237#if defined(R__MACOSX) && !defined(__SSE2__) && \
238 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__))
250 template<
typename U = T,
typename std::enable_if<std::is_member_po
inter<decltype(&U::ut_name)>::value,
int>::type = 0>
251 static char getValue(U* ue,
int) {
252 return ue->ut_name[0];
255 template<
typename U = T,
typename std::enable_if<std::is_member_po
inter<decltype(&U::ut_user)>::value,
int>::type = 0>
256 static char getValue(U* ue,
long) {
257 return ue->ut_user[0];
263 return ut_name<STRUCT_UTMP>::getValue(ue, 0);
282 if (get_ut_name(ue) && !strncmp(tty, ue->ut_line,
sizeof(ue->ut_line)))
294 struct stat file_stats;
305 if (fstat(fileno(utmp), &file_stats) == -1) {
309 size = file_stats.st_size;
323 if (fclose(utmp) != EOF && n_read ==
size) {
342# define HOWMANY(x, y) (((x)+((y)-1))/(y))
402 TTHREAD_TLS_DECL(
TString,exepath);
404#if defined(R__MACOSX)
405 exepath = _dyld_get_image_name(0);
406#elif defined(R__LINUX) || defined(R__SOLARIS) || defined(R__FBSD)
411 int ret = readlink(
"/proc/self/exe", buf,
kMAXPATHLEN);
412#elif defined(R__SOLARIS)
413 int ret = readlink(
"/proc/self/path/a.out", buf,
kMAXPATHLEN);
414#elif defined(R__FBSD)
415 int ret = readlink(
"/proc/curproc/file", buf,
kMAXPATHLEN);
425 if (
p.BeginsWith(
"/"))
427 else if (
p.Contains(
"/")) {
443#if defined(HAVE_DLADDR) && !defined(R__MACOSX)
453 if (dladdr(addr, &info) && info.dli_fname && info.dli_fname[0]) {
455 if (!realpath(info.dli_fname, respath)) {
457 ::SysError(
"TUnixSystem::SetRootSys",
"error getting realpath of libCore, please set ROOTSYS in the shell");
469#if defined(R__MACOSX)
474static void DylibAdded(
const struct mach_header *mh, intptr_t )
483 gLinkedDylibs = linkedDylibs;
487 TString lib = _dyld_get_image_name(i++);
489 TRegexp sovers =
"libCore\\.[0-9]+\\.*[0-9]*\\.*[0-9]*\\.so";
490 TRegexp dyvers =
"libCore\\.[0-9]+\\.*[0-9]*\\.*[0-9]*\\.dylib";
498 if (!realpath(lib, respath)) {
500 ::SysError(
"TUnixSystem::DylibAdded",
"error getting realpath of libCore, please set ROOTSYS in the shell");
514 if (lib.
EndsWith(
"/libSystem.B.dylib")) {
516 if (linkedDylibs.
IsNull()) {
526 sovers =
"\\.[0-9]+\\.*[0-9]*\\.so";
532 dyvers =
"\\.[0-9]+\\.*[0-9]*\\.dylib";
533 idx = lib.
Index(dyvers);
539 if (linkedDylibs.
Length())
595#if defined(R__MACOSX)
598 _dyld_register_func_for_add_image(DylibAdded);
599#elif defined(HAVE_DLADDR)
642 char *tty = ::ttyname(0);
651 if (utmp_entry->ut_host[0]) {
653 for (
unsigned n = 0; (
n <
sizeof(utmp_entry->ut_host)) && utmp_entry->ut_host[
n];
n++)
654 disp.
Append(utmp_entry->ut_host[
n]);
658 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s", disp.
Data());
661 else if (utmp_entry->ut_addr) {
663 struct sockaddr_in addr;
664 addr.sin_family = AF_INET;
666 memcpy(&addr.sin_addr, &utmp_entry->ut_addr,
sizeof(addr.sin_addr));
667 memset(&addr.sin_zero[0], 0,
sizeof(addr.sin_zero));
668 struct sockaddr *sa = (
struct sockaddr *) &addr;
670 char hbuf[NI_MAXHOST + 4];
671 if (getnameinfo(sa,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, NI_NAMEREQD) == 0) {
672 assert( strlen(hbuf) < NI_MAXHOST );
673 strlcat(hbuf,
":0.0",
sizeof(hbuf));
675 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
683 if (!
gROOT->IsBatch() && !getenv(
"DISPLAY")) {
684 Error(
"SetDisplay",
"Can't figure out DISPLAY, set it manually\n"
685 "In case you run a remote ssh session, restart your ssh session with:\n"
686 "=========> ssh -Y");
701#if defined(R__SOLARIS) || defined (R__LINUX) || defined(R__AIX) || \
702 defined(R__FBSD) || defined(R__OBSD) || defined(R__HURD)
703 return strerror(err);
705 if (err < 0 || err >= sys_nerr)
706 return Form(
"errno out of range %d", err);
707 return sys_errlist[err];
718#if defined(R__SOLARIS)
719 sysinfo(SI_HOSTNAME, hn,
sizeof(hn));
721 gethostname(hn,
sizeof(hn));
741 if (
h->HasReadInterest()) {
745 if (
h->HasWriteInterest()) {
758 if (!
h)
return nullptr;
771 int fd = th->
GetFd();
803 if (!
h)
return nullptr;
872#if defined(R__LINUX) && !defined(__powerpc__)
873#if defined(__GLIBC__) && (__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1)
875#if __GLIBC_MINOR__>=3
877 Int_t oldmask = fegetexcept();
884 Int_t oldmask = ~oldenv;
886 Int_t oldmask = ~oldenv.__control_word;
900#if defined(R__MACOSX) && defined(__SSE2__)
902 Int_t oldmask = ~_MM_GET_EXCEPTION_MASK();
911#if defined(R__MACOSX) && !defined(__SSE2__) && \
912 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__))
917 Int_t oldmask = ~oldenv.__fpscr;
918#elif defined(__arm64__)
919 Int_t oldmask = ~oldenv.__fpcr;
921 Int_t oldmask = ~oldenv.__control;
931#if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \
932 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \
957#if defined(R__LINUX) && !defined(__powerpc__)
958#if defined(__GLIBC__) && (__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1)
968#if __GLIBC_MINOR__>=3
971 feclearexcept(FE_ALL_EXCEPT);
972 fedisableexcept(FE_ALL_EXCEPT);
973 feenableexcept(newm);
982 cur.__control_word &= ~newm;
990#if defined(R__MACOSX) && defined(__SSE2__)
999 _MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~newm);
1002#if defined(R__MACOSX) && !defined(__SSE2__) && \
1003 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__))
1014 cur.__fpscr &= ~newm;
1015#elif defined(__arm64__)
1016 cur.__fpcr &= ~newm;
1018 cur.__control &= ~newm;
1023#if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \
1024 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \
1035 curmask = (curmask & ~FE_ENABLE_ALL_EXCEPT) | newm;
1047 Bool_t pollOnce = pendingOnly;
1056 if (!pendingOnly)
return;
1062 if (!pendingOnly)
return;
1067 if (pendingOnly && !pollOnce)
1073 if (!pendingOnly)
return;
1104 if (mxfd == 0 && nextto == -1)
1111 for (fd = 0; fd < mxfd; fd++) {
1115 if (rc < 0 && rc != -2) {
1116 SysError(
"DispatchOneEvent",
"select: read error on %d", fd);
1122 if (rc < 0 && rc != -2) {
1123 SysError(
"DispatchOneEvent",
"select: write error on %d", fd);
1140 tv.tv_sec = milliSec / 1000;
1141 tv.tv_usec = (milliSec % 1000) * 1000;
1143 select(0,
nullptr,
nullptr,
nullptr, &tv);
1165 if (
h->HasReadInterest()) {
1169 if (
h->HasWriteInterest()) {
1173 h->ResetReadyMask();
1212 if (
h->HasReadInterest())
1214 if (
h->HasWriteInterest())
1216 h->ResetReadyMask();
1246 if (sync == sh->
IsSync()) {
1248 if ((
fSignals->
IsSet(sig) && sigdone == -1) || sigdone == sig) {
1249 if (sigdone == -1) {
1274 TIter next(zombieHandler);
1275 register UnixPtty *pty;
1276 while ((pty = (UnixPtty*) next()))
1277 if (pty->GetPid() == pid) {
1278 zombieHandler->RemovePtr(pty);
1297 if ((fd <= fMaxrfd && fReadready->IsSet(fd) && fddone == -1) ||
1298 (fddone == fd && read)) {
1308 if ((fd <= fMaxwfd && fWriteready->IsSet(fd) && fddone == -1) ||
1309 (fddone == fd && !read)) {
1365 ::closedir((DIR*)dirp);
1419 return std::string(cwd);
1428 Error(
"WorkingDirectory",
"getcwd() failed");
1447 if (res)
return std::string(res);
1448 else return std::string();
1480 char *arg =
StrDup(base);
1481 int fd = mkstemp(arg);
1489 FILE *fp = fdopen(fd,
"w+");
1491 SysError(
"TempFileName",
"converting filedescriptor (%d)", fd);
1501 if (
name.IsNull() ||
name ==
".") {
1504 if (dir[strlen(dir) - 1] !=
'/')
1510 if (!dir || !dir[0])
1512 else if (dir[strlen(dir) - 1] !=
'/')
1550 FILE *from = fopen(
f,
"r");
1554 FILE *to = fopen(t,
"w");
1560 const int bufsize = 1024;
1563 while (!ret && !feof(from)) {
1564 size_t numread = fread (buf,
sizeof(
char), bufsize, from);
1565 size_t numwritten = fwrite(buf,
sizeof(
char), numread, to);
1566 if (numread != numwritten)
1581 int ret = ::rename(
f, t);
1626 return UnixFSstat(path,
id, bsize, blocks, bfree);
1635 return ::link(from, to);
1645 return ::symlink((
char*)from, (
char*)to);
1647 return ::symlink(from, to);
1661#if defined(R__SEEK64)
1662 struct stat64 finfo;
1663 if (lstat64(
name, &finfo) < 0)
1666 if (lstat(
name, &finfo) < 0)
1670 if (S_ISDIR(finfo.st_mode))
1671 return ::rmdir(
name);
1673 return ::unlink(
name);
1682 kShellEscape =
'\\',
1683 *kShellStuff =
"(){}<>\"'",
1698 const char *
p, *patbuf = (
const char *)path;
1701 while (*patbuf ==
' ')
1705 for (
p = patbuf; *
p;
p++)
1730 const char *patbuf = (
const char *)patbuf0;
1739 while (*patbuf ==
' ')
1743 for (
p = patbuf; *
p;
p++)
1755 EscChar(patbuf, stuffedPat,
sizeof(stuffedPat), (
char*)kShellStuff, kShellEscape);
1760 if (stuffedPat[0] ==
'~') {
1761 if (stuffedPat[1] !=
'\0' && stuffedPat[1] !=
'/') {
1763 for (
p = &stuffedPat[1],
q =
name; *
p && *
p !=
'/';)
1780 cmd += &stuffedPat[1];
1785 if ((pf = ::popen(cmd.Data(),
"r")) == 0) {
1796 for (ch = fgetc(pf); ch != EOF && ch !=
' ' && ch !=
'\n'; ch = fgetc(pf)) {
1802 if (
cnt == 0 && ch == EOF)
goto again;
1808 if (ch ==
' ' || ch ==
'\t') {
1850 return ::umask(
mask);
1863 t.actime = (time_t)actime;
1864 t.modtime = (time_t)modtime;
1865 return ::utime(
file, &t);
1878 show.
Form(
"Which: %s =", wfil.
Data());
1882 if (wfil[0] ==
'/') {
1883#if defined(R__SEEK64)
1884 struct stat64 finfo;
1885 if (access(wfil.
Data(),
mode) == 0 &&
1886 stat64(wfil.
Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1889 if (access(wfil.
Data(),
mode) == 0 &&
1890 stat(wfil.
Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1907 for (
const char* ptr = search; *ptr;) {
1909 if (*ptr !=
'/' && *ptr !=
'$' && *ptr !=
'~')
1911 const char* posEndOfPart = strchr(ptr,
':');
1913 name.Append(ptr, posEndOfPart - ptr);
1914 ptr = posEndOfPart + 1;
1920 if (!
name.EndsWith(
"/"))
1925#if defined(R__SEEK64)
1926 struct stat64 finfo;
1927 if (access(
name.Data(),
mode) == 0 &&
1928 stat64(
name.Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1931 if (access(
name.Data(),
mode) == 0 &&
1932 stat(
name.Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1954 if (!user || !user[0])
1957 struct passwd *apwd = getpwnam(user);
2004 static UserInfoCache_t gUserInfo;
2006 UserInfoCache_t::const_iterator iUserInfo = gUserInfo.find(uid);
2007 if (iUserInfo != gUserInfo.end())
2010 struct passwd *apwd = getpwuid(uid);
2023 gUserInfo[uid] = *ug;
2048 struct group *grp = getgrgid(gid);
2086 return ::getenv(
name);
2104 return ::system(shellcmd);
2112 return ::popen(command,
mode);
2120 return ::pclose(pipe);
2158#include <mach/mach.h>
2166 typedef CSTypeRef CSSymbolicatorRef;
2167 typedef CSTypeRef CSSourceInfoRef;
2168 typedef CSTypeRef CSSymbolOwnerRef;
2169 typedef CSTypeRef CSSymbolRef;
2171 CSSymbolicatorRef CSSymbolicatorCreateWithPid(pid_t pid);
2172 CSSymbolRef CSSymbolicatorGetSymbolWithAddressAtTime(CSSymbolicatorRef cs, vm_address_t addr, uint64_t time);
2173 CSSourceInfoRef CSSymbolicatorGetSourceInfoWithAddressAtTime(CSSymbolicatorRef cs, vm_address_t addr, uint64_t time);
2174 const char* CSSymbolGetName(CSSymbolRef
sym);
2175 CSSymbolOwnerRef CSSymbolGetSymbolOwner(CSSymbolRef
sym);
2176 const char* CSSymbolOwnerGetPath(CSSymbolOwnerRef symbol);
2177 const char* CSSourceInfoGetPath(CSSourceInfoRef info);
2178 int CSSourceInfoGetLineNumber(CSSourceInfoRef info);
2181bool CSTypeRefIdValid(CSTypeRef ref) {
2182 return ref.csCppData || ref.csCppObj;
2185void macosx_backtrace() {
2186void* addrlist[kMAX_BACKTRACE_DEPTH];
2188 int numstacks = backtrace( addrlist,
sizeof( addrlist ) /
sizeof(
void* ));
2190 CSSymbolicatorRef symbolicator = CSSymbolicatorCreateWithPid(getpid());
2193 static const int skipFrames = 2;
2194 for (
int i = skipFrames; i < numstacks; ++i) {
2196 CSSymbolRef
sym = CSSymbolicatorGetSymbolWithAddressAtTime(symbolicator,
2197 (vm_address_t)addrlist[i],
2199 CSSymbolOwnerRef symOwner = CSSymbolGetSymbolOwner(
sym);
2201 if (
const char* libPath = CSSymbolOwnerGetPath(symOwner)) {
2202 printf(
"[%s]", libPath);
2204 printf(
"[<unknown binary>]");
2207 if (
const char* symname = CSSymbolGetName(
sym)) {
2208 printf(
" %s", symname);
2211 CSSourceInfoRef sourceInfo
2212 = CSSymbolicatorGetSourceInfoWithAddressAtTime(symbolicator,
2213 (vm_address_t)addrlist[i],
2215 if (
const char* sourcePath = CSSourceInfoGetPath(sourceInfo)) {
2216 printf(
" %s:%d", sourcePath, (
int)CSSourceInfoGetLineNumber(sourceInfo));
2218 printf(
" (no debug info)");
2235 gdbscript = gdbscript.
Strip();
2236 if (gdbscript !=
"") {
2238 fprintf(stderr,
"Root.StacktraceScript %s does not exist\n", gdbscript.
Data());
2242 if (gdbscript ==
"") {
2243 gdbscript =
"gdb-backtrace.sh";
2246 fprintf(stderr,
"Error in <TUnixSystem::StackTrace> script %s is missing\n", gdbscript.
Data());
2253 gdbmess = gdbmess.
Strip();
2261 int fd = STDERR_FILENO;
2263 const char *message =
" Generating stack trace...\n";
2265 if (fd && message) { }
2268 Getlinem(kCleanUp,
nullptr);
2270#if defined(USE_GDB_STACK_TRACE)
2273 fprintf(stderr,
"gdb not found, need it for stack trace\n");
2278 TString gdbmessf =
"gdb-message";
2279 if (gdbmess !=
"") {
2281 fprintf(
f,
"%s\n", gdbmess.
Data());
2289 if (gdbmess !=
"") {
2291 gdbscript += gdbmessf;
2293 gdbscript +=
" 1>&2";
2298#elif defined(R__AIX)
2299 TString script =
"procstack ";
2303#elif defined(R__SOLARIS)
2314#elif defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_DLADDR)
2322 const char *cppfilt =
"c++filt";
2323 const char *cppfiltarg =
"";
2325 const char *format1 =
" 0x%016lx in %.200s %s 0x%lx from %.200s\n";
2327 const char *format2 =
" 0x%016lx in %.200s\n";
2329 const char *format2 =
" 0x%016lx in %.200s at %.200s from %.200s\n";
2331 const char *format3 =
" 0x%016lx in %.200s from %.200s\n";
2332 const char *format4 =
" 0x%016lx in <unknown function>\n";
2334 const char *format1 =
" 0x%08lx in %.200s %s 0x%lx from %.200s\n";
2336 const char *format2 =
" 0x%08lx in %.200s\n";
2338 const char *format2 =
" 0x%08lx in %.200s at %.200s from %.200s\n";
2340 const char *format3 =
" 0x%08lx in %.200s from %.200s\n";
2341 const char *format4 =
" 0x%08lx in <unknown function>\n";
2353 while (help.
Gets(
p)) {
2355 cppfiltarg =
"--format=gnu-v3";
2357 }
else if (help.
Index(
"gnu-new-abi") !=
kNPOS) {
2358 cppfiltarg =
"--format=gnu-new-abi";
2367#if (defined(R__LINUX) && !defined(R__WINGCC))
2370#ifdef PR_SET_PTRACER
2371 prctl(PR_SET_PTRACER, getpid(), 0, 0, 0);
2377 TString gdbmessf =
"gdb-message";
2378 if (gdbmess !=
"") {
2380 fprintf(
f,
"%s\n", gdbmess.
Data());
2390 if (gdbmess !=
"") {
2392 gdbscript += gdbmessf;
2394 gdbscript +=
" 1>&2";
2407 if (write(fd, message, strlen(message)) < 0)
2412 TString tmpf1 =
"gdb-backtrace";
2413 std::ofstream file1;
2419 Error(
"StackTrace",
"could not open file %s", tmpf1.
Data());
2431 void *trace[kMAX_BACKTRACE_DEPTH];
2432 int depth = backtrace(trace, kMAX_BACKTRACE_DEPTH);
2433 for (
int n = 5;
n < depth;
n++) {
2437 if (dladdr(trace[
n], &info) && info.dli_fname && info.dli_fname[0]) {
2438 const char *libname = info.dli_fname;
2439 const char *symname = (info.dli_sname && info.dli_sname[0]) ?
2440 info.dli_sname :
"<unknown>";
2443 Bool_t gte = (addr >= symaddr);
2444 ULong_t diff = (gte) ? addr - symaddr : symaddr - addr;
2445 if (addr2line && symaddr) {
2449#if defined(MAC_OS_X_VERSION_10_10)
2450 snprintf(buffer,
sizeof(buffer),
"%s -p %d 0x%016lx", addr2line,
GetPid(), addr);
2451#elif defined(MAC_OS_X_VERSION_10_9)
2453 snprintf(buffer,
sizeof(buffer),
"%s -d -p %d 0x%016lx", addr2line,
GetPid(), addr);
2455 snprintf(buffer,
sizeof(buffer),
"%s -p %d 0x%016lx", addr2line,
GetPid(), addr);
2464 if (
name.Contains(
".so") ||
name.Contains(
".sl")) noShare =
kFALSE;
2465 if (noShare)
offset = addr;
2466 if (noPath)
name =
"`which " +
name +
"`";
2467 snprintf(buffer,
sizeof(buffer),
"%s -e %s 0x%016lx", addr2line,
name.Data(),
offset);
2469 if (FILE *pf = ::popen(buffer,
"r")) {
2471 if (fgets(buf, 2048, pf)) {
2472 buf[strlen(buf)-1] = 0;
2473 if (strncmp(buf,
"??", 2)) {
2475 snprintf(buffer,
sizeof(buffer), format2, addr, buf);
2477 snprintf(buffer,
sizeof(buffer), format2, addr, symname, buf, libname);
2485 snprintf(buffer,
sizeof(buffer), format1, addr, symname,
2486 gte ?
"+" :
"-", diff, libname);
2489 snprintf(buffer,
sizeof(buffer), format1, addr, symname,
2490 gte ?
"+" :
"-", diff, libname);
2492 snprintf(buffer,
sizeof(buffer), format3, addr, symname, libname);
2495 snprintf(buffer,
sizeof(buffer), format4, addr);
2501 if (write(fd, buffer, ::strlen(buffer)) < 0)
2506 TString tmpf2 =
"gdb-backtrace";
2510 snprintf(buffer,
sizeof(buffer),
"%s %s < %s > %s", filter, cppfiltarg, tmpf1.
Data(), tmpf2.
Data());
2512 std::ifstream file2(tmpf2);
2516 line.ReadString(file2);
2517 if (write(fd,
line.Data(),
line.Length()) < 0)
2525 delete [] addr2line;
2528#elif defined(HAVE_EXCPT_H) && defined(HAVE_PDSC_H) && \
2529 defined(HAVE_RLD_INTERFACE_H)
2538 exc_capture_context (&context);
2539 while (!rc && context.sc_pc) {
2541 pdsc_crd *func, *base, *crd
2542 = exc_remote_lookup_function_entry(0, 0, context.sc_pc, 0, &func, &base);
2543 Elf32_Addr addr = PDSC_CRD_BEGIN_ADDRESS(base, func);
2545 const char *
name =
"<unknown function>";
2546 sprintf(buffer,
" 0x%012lx %.200s + 0x%lx\n",
2547 context.sc_pc,
name, context.sc_pc - addr);
2548 write(fd, buffer, ::strlen(buffer));
2549 rc = exc_virtual_unwind(0, &context);
2594 ::openlog(
name, options, fac);
2604 ::syslog(level,
"%s", mess);
2644 const char *tty = ttyname(STDOUT_FILENO);
2648 if ((xh->
fStdOutDup = dup(STDOUT_FILENO)) < 0) {
2656 const char *tty = ttyname(STDERR_FILENO);
2660 if ((xh->
fStdErrDup = dup(STDERR_FILENO)) < 0) {
2662 if (outdone && dup2(xh->
fStdOutDup, STDOUT_FILENO) < 0) {
2663 Warning(
"RedirectOutput",
"could not restore stdout (back to original redirected"
2672 const char *
m = (
mode[0] ==
'a' ||
mode[0] ==
'w') ?
mode :
"a";
2685 if (freopen(
file,
m, stdout) ==
nullptr) {
2689 if (freopen(
file,
m, stderr) ==
nullptr) {
2705 if (
close(STDOUT_FILENO) != 0) {
2707 "problems closing STDOUT_FILENO (%d) before 'dup2' (errno: %d)",
2711 if (dup2(xh->
fStdOutDup, STDOUT_FILENO) < 0) {
2712 SysError(
"RedirectOutput",
"could not restore stdout (back to original redirected"
2718 "problems closing temporary 'out' descriptor %d (errno: %d)",
2731 if (
close(STDERR_FILENO) != 0) {
2733 "problems closing STDERR_FILENO (%d) before 'dup2' (errno: %d)",
2737 if (dup2(xh->
fStdErrDup, STDERR_FILENO) < 0) {
2738 SysError(
"RedirectOutput",
"could not restore stderr (back to original redirected"
2744 "problems closing temporary 'err' descriptor %d (errno: %d)",
2789 Error(
"ListSymbols",
"not yet implemented");
2811 if (!linkedLibs.
IsNull())
2817#if !defined(R__MACOSX)
2823#if defined(R__MACOSX)
2825 linkedLibs = gLinkedDylibs;
2829 while (otool.
Gets(
p)) {
2834 if (!linkedLibs.
IsNull())
2836 linkedLibs += dylib;
2844#elif defined(R__LINUX) || defined(R__SOLARIS) || defined(R__AIX)
2845#if defined(R__WINGCC )
2846 const char *cLDD=
"cygcheck";
2847 const char *cSOEXT=
".dll";
2848 size_t lenexe = strlen(exe);
2849 if (strcmp(exe + lenexe - 4,
".exe")
2850 && strcmp(exe + lenexe - 4,
".dll")) {
2853 char* longerexe =
new char[lenexe + 5];
2854 strlcpy(longerexe, exe,lenexe+5);
2855 strlcat(longerexe,
".exe",lenexe+5);
2857 #error "unsupported platform, fix memory leak to use it"
2859 TRegexp sovers =
"\\.so\\.[0-9]+";
2861 const char *cLDD=
"ldd";
2863 const char *cSOEXT=
".a";
2864 TRegexp sovers =
"\\.a\\.[0-9]+";
2866 const char *cSOEXT=
".so";
2867 TRegexp sovers =
"\\.so\\.[0-9]+";
2873 while (ldd.
Gets(
p)) {
2892 if (!linkedLibs.
IsNull())
2894 linkedLibs += solib;
2967 if (!ti)
return nullptr;
2996 struct addrinfo hints;
2997 struct addrinfo *
result, *rp;
2998 memset(&hints, 0,
sizeof(
struct addrinfo));
2999 hints.ai_family = AF_INET;
3000 hints.ai_socktype = 0;
3001 hints.ai_protocol = 0;
3002 hints.ai_flags = AI_CANONNAME;
3007 size_t lenHostname = strlen(hostname);
3008 std::string hostnameWithoutLocal{hostname};
3009 if (lenHostname > 6 && !strcmp(hostname + lenHostname - 6,
".local")) {
3010 hostnameWithoutLocal.erase(lenHostname - 6);
3011 hostname = hostnameWithoutLocal.c_str();
3016 int rc = getaddrinfo(hostname,
nullptr, &hints, &
result);
3018 if (rc == EAI_NONAME) {
3019 if (
gDebug > 0)
Error(
"GetHostByName",
"unknown host '%s'", hostname);
3022 Error(
"GetHostByName",
"getaddrinfo failed for '%s': %s", hostname, gai_strerror(rc));
3028 std::string hostcanon(
result->ai_canonname ?
result->ai_canonname : hostname);
3031 ia.
fAddresses[0] = ntohl(((
struct sockaddr_in *)(
result->ai_addr))->sin_addr.s_addr);
3033 if (hostcanon.compare(hostname) != 0) ia.
AddAlias(hostname);
3036 char tmp[
sizeof(
struct in_addr)];
3037 if (inet_pton(AF_INET, hostcanon.data(), tmp) == 1) {
3038 char hbuf[NI_MAXHOST];
3039 if (getnameinfo(
result->ai_addr,
result->ai_addrlen, hbuf,
sizeof(hbuf),
nullptr, 0, 0) == 0)
3045 for (; rp !=
nullptr; rp = rp->ai_next) {
3046 UInt_t arp = ntohl(((
struct sockaddr_in *)(rp->ai_addr))->sin_addr.s_addr);
3060 struct sockaddr addr;
3061 socklen_t
len =
sizeof(addr);
3064 if (getsockname(sock, &addr, &
len) == -1) {
3065 SysError(
"GetSockName",
"getsockname failed");
3069 if (addr.sa_family != AF_INET)
return ia;
3071 struct sockaddr_in *addrin = (
struct sockaddr_in *)&addr;
3072 ia.
fPort = ntohs(addrin->sin_port);
3073 ia.
fAddresses[0] = ntohl(addrin->sin_addr.s_addr);
3075 char hbuf[NI_MAXHOST];
3076 if (getnameinfo(&addr,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, 0) != 0) {
3077 Error(
"GetSockName",
"getnameinfo failed");
3090 struct sockaddr addr;
3091 socklen_t
len =
sizeof(addr);
3094 if (getpeername(sock, &addr, &
len) == -1) {
3095 SysError(
"GetPeerName",
"getpeername failed");
3099 if (addr.sa_family != AF_INET)
return ia;
3101 struct sockaddr_in *addrin = (
struct sockaddr_in *)&addr;
3102 ia.
fPort = ntohs(addrin->sin_port);
3103 ia.
fAddresses[0] = ntohl(addrin->sin_addr.s_addr);
3105 char hbuf[NI_MAXHOST];
3106 if (getnameinfo(&addr,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, 0) != 0) {
3107 Error(
"GetPeerName",
"getnameinfo failed");
3122 if ((sp = getservbyname(servicename,
kProtocolName)) ==
nullptr) {
3123 Error(
"GetServiceByName",
"no service \"%s\" with protocol \"%s\"\n",
3127 return ntohs(sp->s_port);
3137 if ((sp = getservbyport(htons(port),
kProtocolName)) ==
nullptr) {
3140 return Form(
"%d", port);
3149 int tcpwindowsize,
const char *protocol)
3151 if (!strcmp(servername,
"unix")) {
3157 if (!strcmp(protocol,
"udp")){
3227 while ((soc = ::accept(sock,
nullptr,
nullptr)) == -1 &&
GetErrno() == EINTR)
3234 SysError(
"AcceptConnection",
"accept");
3247 if (sock < 0)
return;
3249#if !defined(R__AIX) || defined(_AIX41) || defined(_AIX43)
3251 ::shutdown(sock, 2);
3267 if (
UnixRecv(sock, &header,
sizeof(header), 0) > 0) {
3268 int count = ntohl(header);
3271 Error(
"RecvBuf",
"record header exceeds buffer size");
3273 }
else if (count > 0) {
3274 if (
UnixRecv(sock, buf, count, 0) < 0) {
3275 Error(
"RecvBuf",
"cannot receive buffer");
3292 if (
UnixSend(sock, &header,
sizeof(header), 0) < 0) {
3293 Error(
"SendBuf",
"cannot send header");
3298 Error(
"SendBuf",
"cannot send buffer");
3340 Error(
"RecvRaw",
"cannot receive buffer");
3375 Error(
"SendRaw",
"cannot send buffer");
3386 if (sock < 0)
return -1;
3390 if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)&val,
sizeof(val)) == -1) {
3391 SysError(
"SetSockOpt",
"setsockopt(SO_SNDBUF)");
3396 if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)&val,
sizeof(val)) == -1) {
3397 SysError(
"SetSockOpt",
"setsockopt(SO_RCVBUF)");
3402 if (setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)&val,
sizeof(val)) == -1) {
3403 SysError(
"SetSockOpt",
"setsockopt(SO_OOBINLINE)");
3408 if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)&val,
sizeof(val)) == -1) {
3409 SysError(
"SetSockOpt",
"setsockopt(SO_KEEPALIVE)");
3414 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)&val,
sizeof(val)) == -1) {
3415 SysError(
"SetSockOpt",
"setsockopt(SO_REUSEADDR)");
3420 if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)&val,
sizeof(val)) == -1) {
3421 SysError(
"SetSockOpt",
"setsockopt(TCP_NODELAY)");
3426 if (ioctl(sock, FIONBIO, (
char*)&val) == -1) {
3427 SysError(
"SetSockOpt",
"ioctl(FIONBIO)");
3433 if (ioctl(sock, SIOCSPGRP, (
char*)&val) == -1) {
3434 SysError(
"SetSockOpt",
"ioctl(SIOCSPGRP)");
3438 Error(
"SetSockOpt",
"ioctl(SIOCGPGRP) not supported on cygwin/gcc");
3445 Error(
"SetSockOpt",
"illegal option (%d)", opt);
3456 if (sock < 0)
return -1;
3458 socklen_t optlen =
sizeof(*val);
3462 if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)val, &optlen) == -1) {
3463 SysError(
"GetSockOpt",
"getsockopt(SO_SNDBUF)");
3468 if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)val, &optlen) == -1) {
3469 SysError(
"GetSockOpt",
"getsockopt(SO_RCVBUF)");
3474 if (getsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)val, &optlen) == -1) {
3475 SysError(
"GetSockOpt",
"getsockopt(SO_OOBINLINE)");
3480 if (getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)val, &optlen) == -1) {
3481 SysError(
"GetSockOpt",
"getsockopt(SO_KEEPALIVE)");
3486 if (getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)val, &optlen) == -1) {
3487 SysError(
"GetSockOpt",
"getsockopt(SO_REUSEADDR)");
3492 if (getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)val, &optlen) == -1) {
3493 SysError(
"GetSockOpt",
"getsockopt(TCP_NODELAY)");
3499 if ((flg = fcntl(sock, F_GETFL, 0)) == -1) {
3500 SysError(
"GetSockOpt",
"fcntl(F_GETFL)");
3503 *val = flg & O_NDELAY;
3506#if !defined(R__LYNXOS) && !defined(R__WINGCC)
3507 if (ioctl(sock, SIOCGPGRP, (
char*)val) == -1) {
3508 SysError(
"GetSockOpt",
"ioctl(SIOCGPGRP)");
3512 Error(
"GetSockOpt",
"ioctl(SIOCGPGRP) not supported on LynxOS and cygwin/gcc");
3517#if !defined(R__LYNXOS)
3518 if (ioctl(sock, SIOCATMARK, (
char*)val) == -1) {
3519 SysError(
"GetSockOpt",
"ioctl(SIOCATMARK)");
3523 Error(
"GetSockOpt",
"ioctl(SIOCATMARK) not supported on LynxOS");
3528#if !defined(R__LYNXOS)
3529 if (ioctl(sock, FIONREAD, (
char*)val) == -1) {
3530 SysError(
"GetSockOpt",
"ioctl(FIONREAD)");
3534 Error(
"GetSockOpt",
"ioctl(FIONREAD) not supported on LynxOS");
3539 Error(
"GetSockOpt",
"illegal option (%d)", opt);
3560 { SIGBUS,
nullptr,
nullptr,
"bus error" },
3561 { SIGSEGV,
nullptr,
nullptr,
"segmentation violation" },
3562 { SIGSYS,
nullptr,
nullptr,
"bad argument to system call" },
3563 { SIGPIPE,
nullptr,
nullptr,
"write on a pipe with no one to read it" },
3564 { SIGILL,
nullptr,
nullptr,
"illegal instruction" },
3565 { SIGABRT,
nullptr,
nullptr,
"abort" },
3566 { SIGQUIT,
nullptr,
nullptr,
"quit" },
3567 { SIGINT,
nullptr,
nullptr,
"interrupt" },
3568 { SIGWINCH,
nullptr,
nullptr,
"window size change" },
3569 { SIGALRM,
nullptr,
nullptr,
"alarm clock" },
3570 { SIGCHLD,
nullptr,
nullptr,
"death of a child" },
3571 { SIGURG,
nullptr,
nullptr,
"urgent data arrived on an I/O channel" },
3572 { SIGFPE,
nullptr,
nullptr,
"floating point exception" },
3573 { SIGTERM,
nullptr,
nullptr,
"termination signal" },
3574 { SIGUSR1,
nullptr,
nullptr,
"user-defined signal 1" },
3575 { SIGUSR2,
nullptr,
nullptr,
"user-defined signal 2" }
3633 Break(
"TUnixSystem::DispatchSignals",
"%s: printing stacktrace",
UnixSigname(sig));
3656 struct sigaction sigact;
3663#elif defined(R__SOLARIS)
3665#elif defined(R__LYNXOS)
3674 sigemptyset(&sigact.sa_mask);
3675 sigact.sa_flags = 0;
3676#if defined(SA_RESTART)
3677 sigact.sa_flags |= SA_RESTART;
3679 if (sigaction(
gSignalMap[sig].fCode, &sigact,
3681 ::SysError(
"TUnixSystem::UnixSignal",
"sigaction");
3692 TTHREAD_TLS_ARRAY(
struct sigaction,
kMAXSIGNALS,oldsigact);
3694 if (ignore != ignoreSig[sig]) {
3695 ignoreSig[sig] = ignore;
3697 struct sigaction sigact;
3699 sigact.sa_handler = (
void (*)())SIG_IGN;
3700#elif defined(R__SOLARIS)
3701 sigact.sa_handler = (
void (*)(
int))SIG_IGN;
3703 sigact.sa_handler = SIG_IGN;
3705 sigemptyset(&sigact.sa_mask);
3706 sigact.sa_flags = 0;
3707 if (sigaction(
gSignalMap[sig].fCode, &sigact, &oldsigact[sig]) < 0)
3708 ::SysError(
"TUnixSystem::UnixIgnoreSignal",
"sigaction");
3710 if (sigaction(
gSignalMap[sig].fCode, &oldsigact[sig],
nullptr) < 0)
3711 ::SysError(
"TUnixSystem::UnixIgnoreSignal",
"sigaction");
3727 struct sigaction sigact;
3730#elif defined(R__SOLARIS)
3732#elif defined(R__LYNXOS)
3741 sigemptyset(&sigact.sa_mask);
3742 sigact.sa_flags = 0;
3744#if defined(SA_INTERRUPT)
3745 sigact.sa_flags |= SA_INTERRUPT;
3748#if defined(SA_RESTART)
3749 sigact.sa_flags |= SA_RESTART;
3753 ::SysError(
"TUnixSystem::UnixSigAlarmInterruptsSyscalls",
"sigaction");
3773 ::SysError(
"TUnixSystem::UnixSignal",
"sigaction");
3796 static std::atomic<time_t> jan95{0};
3807 jan95 = mktime(&tp);
3808 if ((
int)jan95 == -1) {
3809 ::SysError(
"TUnixSystem::UnixNow",
"error converting 950001 0:00 to time_t");
3815 gettimeofday(&t,
nullptr);
3824 struct itimerval itv;
3825 itv.it_value.tv_sec = 0;
3826 itv.it_value.tv_usec = 0;
3827 itv.it_interval.tv_sec = 0;
3828 itv.it_interval.tv_usec = 0;
3830 itv.it_value.tv_sec = time_t(
ms / 1000);
3831 itv.it_value.tv_usec = time_t((
ms % 1000) * 1000);
3833 int st = setitimer(ITIMER_REAL, &itv,
nullptr);
3835 ::SysError(
"TUnixSystem::UnixSetitimer",
"setitimer");
3853 fd_set *rd = (readready) ? (fd_set*)readready->
GetBits() :
nullptr;
3854 fd_set *wr = (writeready) ? (fd_set*)writeready->
GetBits() :
nullptr;
3858 tv.tv_sec =
Int_t(timeout / 1000);
3859 tv.tv_usec = (timeout % 1000) * 1000;
3860 retcode = select(nfds, rd, wr,
nullptr, &tv);
3862 retcode = select(nfds, rd, wr,
nullptr,
nullptr);
3864 if (retcode == -1) {
3895 pw = getpwnam(
name);
3904 pw = getpwuid(getuid());
3909 }
else if (pw && pw->
pw_dir) {
3937 if (stat(edir, &finfo) < 0)
3940 if (!S_ISDIR(finfo.st_mode))
3943 return (
void*) opendir(edir);
3946#if defined(_POSIX_SOURCE)
3949# define REAL_DIR_ENTRY(dp) 1
3951# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
3959 DIR *dirp = (DIR*)dirp1;
3991#if defined(R__SEEK64)
3993 if (path && lstat64(path, &sbuf) == 0) {
3996 if (path && lstat(path, &sbuf) == 0) {
3998 buf.
fIsLink = S_ISLNK(sbuf.st_mode);
4000#if defined(R__SEEK64)
4001 if (stat64(path, &sbuf) == -1) {
4003 if (stat(path, &sbuf) == -1) {
4008 buf.
fDev = sbuf.st_dev;
4009 buf.
fIno = sbuf.st_ino;
4010 buf.
fMode = sbuf.st_mode;
4011 buf.
fUid = sbuf.st_uid;
4012 buf.
fGid = sbuf.st_gid;
4013 buf.
fSize = sbuf.st_size;
4014 buf.
fMtime = sbuf.st_mtime;
4033 struct statfs statfsbuf;
4034#if (defined(R__SOLARIS) && !defined(R__LINUX))
4035 if (statfs(path, &statfsbuf,
sizeof(
struct statfs), 0) == 0) {
4036 *
id = statfsbuf.f_fstyp;
4037 *bsize = statfsbuf.f_bsize;
4038 *blocks = statfsbuf.f_blocks;
4039 *bfree = statfsbuf.f_bfree;
4041 if (statfs((
char*)path, &statfsbuf) == 0) {
4047 if (!strcmp(statfsbuf.f_fstypename, MOUNT_FFS) ||
4048 !strcmp(statfsbuf.f_fstypename, MOUNT_MFS))
4050 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_NFS))
4052 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_MSDOS))
4054 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_EXT2FS))
4056 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_CD9660))
4058 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_NCPFS))
4063 *
id = statfsbuf.f_type;
4065 *bsize = statfsbuf.f_bsize;
4066 *blocks = statfsbuf.f_blocks;
4067 *bfree = statfsbuf.f_bavail;
4080 return (
int) waitpid(0, &status, WNOHANG);
4101 sport = htons(port);
4104 if (!addr.
IsValid())
return -1;
4107 struct sockaddr_in server;
4108 memset(&server, 0,
sizeof(server));
4109 memcpy(&server.sin_addr, &adr,
sizeof(adr));
4111 server.sin_port = sport;
4115 if ((sock =
socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4116 ::SysError(
"TUnixSystem::UnixTcpConnect",
"socket (%s:%d)",
4121 if (tcpwindowsize > 0) {
4126 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
4130 ::SysError(
"TUnixSystem::UnixTcpConnect",
"connect (%s:%d)",
4152 sport = htons(port);
4155 if (!addr.
IsValid())
return -1;
4158 struct sockaddr_in server;
4159 memset(&server, 0,
sizeof(server));
4160 memcpy(&server.sin_addr, &adr,
sizeof(adr));
4162 server.sin_port = sport;
4166 if ((sock =
socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
4167 ::SysError(
"TUnixSystem::UnixUdpConnect",
"socket (%s:%d)",
4172 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
4176 ::SysError(
"TUnixSystem::UnixUdpConnect",
"connect (%s:%d)",
4198 if (!sockpath || strlen(sockpath) <= 0) {
4199 ::SysError(
"TUnixSystem::UnixUnixConnect",
"socket path undefined");
4204 struct sockaddr_un unserver;
4205 unserver.sun_family = AF_UNIX;
4207 if (strlen(sockpath) >
sizeof(unserver.sun_path)-1) {
4208 ::Error(
"TUnixSystem::UnixUnixConnect",
"socket path %s, longer than max allowed length (%u)",
4209 sockpath, (
UInt_t)
sizeof(unserver.sun_path)-1);
4212 strlcpy(unserver.sun_path, sockpath,
sizeof(unserver.sun_path));
4215 if ((sock =
socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
4216 ::SysError(
"TUnixSystem::UnixUnixConnect",
"socket");
4220 while (connect(sock, (
struct sockaddr*) &unserver, strlen(unserver.sun_path)+2) == -1) {
4224 ::SysError(
"TUnixSystem::UnixUnixConnect",
"connect");
4247 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
4248 short sport, tryport = kSOCKET_MINPORT;
4251 if (port == 0 && reuse) {
4252 ::Error(
"TUnixSystem::UnixTcpService",
"cannot do a port scan while reuse is true");
4259 sport = htons(port);
4263 if ((sock =
socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4264 ::SysError(
"TUnixSystem::UnixTcpService",
"socket");
4271 if (tcpwindowsize > 0) {
4276 struct sockaddr_in inserver;
4277 memset(&inserver, 0,
sizeof(inserver));
4278 inserver.sin_family = AF_INET;
4279 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
4280 inserver.sin_port = sport;
4284 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
4285 ::SysError(
"TUnixSystem::UnixTcpService",
"bind");
4292 inserver.sin_port = htons(tryport);
4293 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
4295 }
while (bret < 0 &&
GetErrno() == EADDRINUSE && tryport < kSOCKET_MAXPORT);
4297 ::SysError(
"TUnixSystem::UnixTcpService",
"bind (port scan)");
4304 if (::listen(sock, backlog)) {
4305 ::SysError(
"TUnixSystem::UnixTcpService",
"listen");
4322 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
4323 short sport, tryport = kSOCKET_MINPORT;
4329 sport = htons(port);
4333 if ((sock =
socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
4334 ::SysError(
"TUnixSystem::UnixUdpService",
"socket");
4338 struct sockaddr_in inserver;
4339 memset(&inserver, 0,
sizeof(inserver));
4340 inserver.sin_family = AF_INET;
4341 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
4342 inserver.sin_port = sport;
4346 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
4347 ::SysError(
"TUnixSystem::UnixUdpService",
"bind");
4354 inserver.sin_port = htons(tryport);
4355 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
4357 }
while (bret < 0 &&
GetErrno() == EADDRINUSE && tryport < kSOCKET_MAXPORT);
4359 ::SysError(
"TUnixSystem::UnixUdpService",
"bind (port scan)");
4366 if (::listen(sock, backlog)) {
4367 ::SysError(
"TUnixSystem::UnixUdpService",
"listen");
4384 oldumask = umask(0);
4396 unlink(sockpath.
Data());
4407 if (!sockpath || strlen(sockpath) <= 0) {
4408 ::SysError(
"TUnixSystem::UnixUnixService",
"socket path undefined");
4412 struct sockaddr_un unserver;
4416 memset(&unserver, 0,
sizeof(unserver));
4417 unserver.sun_family = AF_UNIX;
4419 if (strlen(sockpath) >
sizeof(unserver.sun_path)-1) {
4420 ::Error(
"TUnixSystem::UnixUnixService",
"socket path %s, longer than max allowed length (%u)",
4421 sockpath, (
UInt_t)
sizeof(unserver.sun_path)-1);
4424 strlcpy(unserver.sun_path, sockpath,
sizeof(unserver.sun_path));
4427 if ((sock =
socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
4428 ::SysError(
"TUnixSystem::UnixUnixService",
"socket");
4432 if (::bind(sock, (
struct sockaddr*) &unserver, strlen(unserver.sun_path)+2)) {
4433 ::SysError(
"TUnixSystem::UnixUnixService",
"bind");
4439 if (::listen(sock, backlog)) {
4440 ::SysError(
"TUnixSystem::UnixUnixService",
"listen");
4459 if (sock < 0)
return -1;
4466 if (flag == MSG_PEEK)
4470 char *buf = (
char *)buffer;
4473 if ((nrecv = recv(sock, buf+
n,
length-
n, flag)) <= 0) {
4476 if (flag == MSG_OOB) {
4507 if (sock < 0)
return -1;
4516 const char *buf = (
const char *)buffer;
4519 if ((nsent = send(sock, buf+
n,
length-
n, flag)) <= 0) {
4547 static std::atomic<bool> initialized(
kFALSE);
4548 static std::atomic<bool> seenCling(
kFALSE);
4552 if (newpath ==
nullptr && !reset && (seenCling || (initialized &&
gCling ==
nullptr)))
4553 return dynpath_full;
4558 dynpath_full = newpath;
4560 initialized =
kTRUE;
4568 return dynpath_full;
4574 if (!reset && (seenCling || (initialized &&
gCling ==
nullptr)))
4575 return dynpath_full;
4584 static TString dynpath_envpart;
4585 static TString dynpath_syspart;
4587 if (reset || !initialized) {
4596 #if defined (R__AIX)
4598 #elif defined(R__MACOSX)
4610 if (!dynpath_envpart.
IsNull())
4611 dynpath_envpart +=
":";
4612 dynpath_envpart += ldpath;
4614 if (!rdynpath.
IsNull()) {
4615 if (!dynpath_envpart.
IsNull())
4616 dynpath_envpart +=
":";
4617 dynpath_envpart += rdynpath;
4623 #if defined(R__WINGCC) || defined(R__MACOSX)
4625 dynpath_syspart =
"/usr/local/lib:/usr/X11R6/lib:/usr/lib:/lib:";
4626 dynpath_syspart +=
"/lib/x86_64-linux-gnu:/usr/local/lib64:/usr/lib64:/lib64:";
4629 std::string cmd(
"LD_DEBUG=libs LD_PRELOAD=DOESNOTEXIST ls 2>&1");
4630 FILE *pf = popen(cmd.c_str (),
"r");
4634 if (fgets(buffer, 128, pf) != NULL)
4638 std::size_t from =
result.find(
"search path=",
result.find(
"(LD_LIBRARY_PATH)"));
4639 std::size_t to =
result.find(
"(system search path)");
4640 if (from != std::string::npos && to != std::string::npos) {
4642 std::string sys_path =
result.substr(from, to-from);
4643 sys_path.erase(std::remove_if(sys_path.begin(), sys_path.end(), isspace), sys_path.end());
4644 dynpath_syspart = sys_path.c_str();
4651 if (!initialized || (!seenCling &&
gCling)) {
4652 dynpath_full = dynpath_envpart;
4653 if (!dynpath_full.
EndsWith(
":")) dynpath_full +=
":";
4656 if (!dynpath_full.
EndsWith(
":")) dynpath_full +=
":";
4660 dynpath_full += dynpath_syspart;
4661 initialized =
kTRUE;
4663 if (
gDebug > 0) std::cout <<
"dynpath = " << dynpath_full.
Data() << std::endl;
4666 return dynpath_full;
4710 char buf[PATH_MAX + 1];
4711 char *res = realpath(sLib.
Data(), buf);
4712 if (res) sLib = buf;
4718 const char* lib = sLib.
Data();
4720 if (
len > 3 && (!strcmp(lib+
len-3,
".so") ||
4721 !strcmp(lib+
len-3,
".dl") ||
4722 !strcmp(lib+
len-4,
".dll") ||
4723 !strcmp(lib+
len-4,
".DLL") ||
4724 !strcmp(lib+
len-6,
".dylib") ||
4725 !strcmp(lib+
len-3,
".sl") ||
4726 !strcmp(lib+
len-2,
".a"))) {
4731 Error(
"FindDynamicLibrary",
4735 static const char* exts[] = {
4736 ".so",
".dll",
".dylib",
".sl",
".dl",
".a",
nullptr };
4737 const char** ext = exts;
4749 Error(
"FindDynamicLibrary",
4750 "%s[.so | .dll | .dylib | .sl | .dl | .a] does not exist in %s",
4758#if defined(R__MACOSX)
4759#include <sys/resource.h>
4760#include <mach/mach.h>
4761#include <mach/mach_error.h>
4766static void GetDarwinSysInfo(
SysInfo_t *sysinfo)
4768 FILE *
p =
gSystem->
OpenPipe(
"sysctl -n kern.ostype hw.model hw.ncpu hw.cpufrequency "
4769 "hw.busfrequency hw.l2cachesize hw.memsize",
"r");
4776 sysinfo->
fCpus =
s.Atoi();
4791 if (
s.BeginsWith(
"Processor type: ")) {
4802static void ReadDarwinCpu(
long *ticks)
4804 mach_msg_type_number_t count;
4806 host_cpu_load_info_data_t cpu;
4808 ticks[0] = ticks[1] = ticks[2] = ticks[3] = 0;
4810 count = HOST_CPU_LOAD_INFO_COUNT;
4811 kr = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&cpu, &count);
4812 if (kr != KERN_SUCCESS) {
4813 ::Error(
"TUnixSystem::ReadDarwinCpu",
"host_statistics: %s", mach_error_string(kr));
4815 ticks[0] = cpu.cpu_ticks[CPU_STATE_USER];
4816 ticks[1] = cpu.cpu_ticks[CPU_STATE_SYSTEM];
4817 ticks[2] = cpu.cpu_ticks[CPU_STATE_IDLE];
4818 ticks[3] = cpu.cpu_ticks[CPU_STATE_NICE];
4826static void GetDarwinCpuInfo(
CpuInfo_t *cpuinfo,
Int_t sampleTime)
4829 if (getloadavg(avg,
sizeof(avg)) < 0) {
4830 ::Error(
"TUnixSystem::GetDarwinCpuInfo",
"getloadavg failed");
4837 Long_t cpu_ticks1[4], cpu_ticks2[4];
4838 ReadDarwinCpu(cpu_ticks1);
4840 ReadDarwinCpu(cpu_ticks2);
4842 Long_t userticks = (cpu_ticks2[0] + cpu_ticks2[3]) -
4843 (cpu_ticks1[0] + cpu_ticks1[3]);
4844 Long_t systicks = cpu_ticks2[1] - cpu_ticks1[1];
4845 Long_t idleticks = cpu_ticks2[2] - cpu_ticks1[2];
4846 if (userticks < 0) userticks = 0;
4847 if (systicks < 0) systicks = 0;
4848 if (idleticks < 0) idleticks = 0;
4849 Long_t totalticks = userticks + systicks + idleticks;
4861static void GetDarwinMemInfo(
MemInfo_t *meminfo)
4863 static Int_t pshift = 0;
4865 vm_statistics_data_t vm_info;
4866 mach_msg_type_number_t count;
4871 count = HOST_VM_INFO_COUNT;
4872 kr = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vm_info, &count);
4873 if (kr != KERN_SUCCESS) {
4874 ::Error(
"TUnixSystem::GetDarwinMemInfo",
"host_statistics: %s", mach_error_string(kr));
4878 for (
int psize = getpagesize(); psize > 1; psize >>= 1)
4882 used = (
Long64_t)(vm_info.active_count + vm_info.inactive_count + vm_info.wire_count) << pshift;
4884 total = (
Long64_t)(vm_info.active_count + vm_info.inactive_count + vm_info.free_count + vm_info.wire_count) << pshift;
4887 swap_used = vm_info.pageouts << pshift;
4890 dirp = opendir(
"/private/var/vm");
4895 while ((dp = readdir(dirp)) != 0) {
4897 char fname [MAXNAMLEN];
4898 if (strncmp(dp->d_name,
"swapfile", 8))
4900 strlcpy(fname,
"/private/var/vm/",MAXNAMLEN);
4901 strlcat (fname, dp->d_name,MAXNAMLEN);
4902 if (stat(fname, &sb) < 0)
4904 swap_total += sb.st_size;
4924static void GetDarwinProcInfo(
ProcInfo_t *procinfo)
4927#define vm_region vm_region_64
4931#define GLOBAL_SHARED_TEXT_SEGMENT 0x90000000U
4932#define GLOBAL_SHARED_DATA_SEGMENT 0xA0000000U
4933#define SHARED_TEXT_REGION_SIZE 0x10000000
4934#define SHARED_DATA_REGION_SIZE 0x10000000
4937 if (getrusage(RUSAGE_SELF, &ru) < 0) {
4938 ::SysError(
"TUnixSystem::GetDarwinProcInfo",
"getrusage failed");
4941 ((
Float_t)(ru.ru_utime.tv_usec) / 1000000.);
4943 ((
Float_t)(ru.ru_stime.tv_usec) / 1000000.);
4946 task_basic_info_data_t ti;
4947 mach_msg_type_number_t count;
4950 task_t a_task = mach_task_self();
4952 count = TASK_BASIC_INFO_COUNT;
4953 kr = task_info(a_task, TASK_BASIC_INFO, (task_info_t)&ti, &count);
4954 if (kr != KERN_SUCCESS) {
4955 ::Error(
"TUnixSystem::GetDarwinProcInfo",
"task_info: %s", mach_error_string(kr));
4960 mach_port_t object_name;
4961 vm_address_t address;
4962 vm_region_top_info_data_t info;
4963 vm_size_t vprvt, rsize,
size;
4964 rsize = ti.resident_size;
4966 for (address = 0; ; address +=
size) {
4968 count = VM_REGION_TOP_INFO_COUNT;
4969 if (vm_region(a_task, &address, &
size,
4970 VM_REGION_TOP_INFO, (vm_region_info_t)&info, &count,
4971 &object_name) != KERN_SUCCESS) {
4976 if (address >= GLOBAL_SHARED_TEXT_SEGMENT &&
4977 address < (GLOBAL_SHARED_DATA_SEGMENT + SHARED_DATA_REGION_SIZE)) {
4982 if (info.share_mode == SM_EMPTY) {
4983 vm_region_basic_info_data_64_t b_info;
4984 count = VM_REGION_BASIC_INFO_COUNT_64;
4985 if (vm_region_64(a_task, &address,
4986 &
size, VM_REGION_BASIC_INFO,
4987 (vm_region_info_t)&b_info, &count,
4988 &object_name) != KERN_SUCCESS) {
4995 if (info.share_mode != SM_PRIVATE) {
4999 switch (info.share_mode) {
5001 if (info.ref_count == 1) {
5004 vprvt += info.private_pages_resident * getpagesize();
5023#if defined(R__LINUX)
5027static void GetLinuxSysInfo(
SysInfo_t *sysinfo)
5030 FILE *
f = fopen(
"/proc/cpuinfo",
"r");
5033 if (
s.BeginsWith(
"model name")) {
5037 if (
s.BeginsWith(
"cpu MHz")) {
5041 if (
s.BeginsWith(
"cache size")) {
5045 if (
s.BeginsWith(
"processor")) {
5047 sysinfo->
fCpus =
s.Atoi();
5054 f = fopen(
"/proc/meminfo",
"r");
5057 if (
s.BeginsWith(
"MemTotal")) {
5070 s.Tokenize(sysinfo->
fOS, from);
5079static void ReadLinuxCpu(
long *ticks)
5081 ticks[0] = ticks[1] = ticks[2] = ticks[3] = 0;
5084 FILE *
f = fopen(
"/proc/stat",
"r");
5088 sscanf(
s.Data(),
"%*s %ld %ld %ld %ld", &ticks[0], &ticks[3], &ticks[1], &ticks[2]);
5098 Double_t avg[3] = { -1., -1., -1. };
5100 if (getloadavg(avg,
sizeof(avg)) < 0) {
5101 ::Error(
"TUnixSystem::GetLinuxCpuInfo",
"getloadavg failed");
5110 Long_t cpu_ticks1[4], cpu_ticks2[4];
5111 ReadLinuxCpu(cpu_ticks1);
5113 ReadLinuxCpu(cpu_ticks2);
5115 Long_t userticks = (cpu_ticks2[0] + cpu_ticks2[3]) -
5116 (cpu_ticks1[0] + cpu_ticks1[3]);
5117 Long_t systicks = cpu_ticks2[1] - cpu_ticks1[1];
5118 Long_t idleticks = cpu_ticks2[2] - cpu_ticks1[2];
5119 if (userticks < 0) userticks = 0;
5120 if (systicks < 0) systicks = 0;
5121 if (idleticks < 0) idleticks = 0;
5122 Long_t totalticks = userticks + systicks + idleticks;
5134static void GetLinuxMemInfo(
MemInfo_t *meminfo)
5137 FILE *
f = fopen(
"/proc/meminfo",
"r");
5140 if (
s.BeginsWith(
"MemTotal")) {
5144 if (
s.BeginsWith(
"MemFree")) {
5148 if (
s.BeginsWith(
"SwapTotal")) {
5152 if (
s.BeginsWith(
"SwapFree")) {
5166static void GetLinuxProcInfo(
ProcInfo_t *procinfo)
5169 if (getrusage(RUSAGE_SELF, &ru) < 0) {
5170 ::SysError(
"TUnixSystem::GetLinuxProcInfo",
"getrusage failed");
5173 ((
Float_t)(ru.ru_utime.tv_usec) / 1000000.);
5175 ((
Float_t)(ru.ru_stime.tv_usec) / 1000000.);
5186 sscanf(
s.Data(),
"%ld %ld", &
total, &rss);
5200 if (!info)
return -1;
5204 if (!sysinfo.
fCpus) {
5205#if defined(R__MACOSX)
5206 GetDarwinSysInfo(&sysinfo);
5207#elif defined(R__LINUX)
5208 GetLinuxSysInfo(&sysinfo);
5224 if (!info)
return -1;
5226#if defined(R__MACOSX)
5227 GetDarwinCpuInfo(info, sampleTime);
5228#elif defined(R__LINUX)
5229 GetLinuxCpuInfo(info, sampleTime);
5241 if (!info)
return -1;
5243#if defined(R__MACOSX)
5244 GetDarwinMemInfo(info);
5245#elif defined(R__LINUX)
5246 GetLinuxMemInfo(info);
5258 if (!info)
return -1;
5260#if defined(R__MACOSX)
5261 GetDarwinProcInfo(info);
5262#elif defined(R__LINUX)
5263 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
R__EXTERN TApplication * 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
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t mask
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t b
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char mode
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t org
R__EXTERN TInterpreter * 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.