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