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)
454static void SetRootSys()
459 void *addr = (
void *)SetRootSys;
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";
503#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
507 if (!realpath(lib, respath)) {
519 if (!realpath(lib, respath)) {
521 ::SysError(
"TUnixSystem::DylibAdded",
"error getting realpath of libCore, please set ROOTSYS in the shell");
536 if (lib.
EndsWith(
"/libSystem.B.dylib"))
541 sovers =
"\\.[0-9]+\\.*[0-9]*\\.so";
547 dyvers =
"\\.[0-9]+\\.*[0-9]*\\.dylib";
548 idx = lib.
Index(dyvers);
554 if (linkedDylibs.
Length())
609#if defined(R__MACOSX)
612 _dyld_register_func_for_add_image(DylibAdded);
613#elif defined(HAVE_DLADDR)
656 char *tty = ::ttyname(0);
663 STRUCT_UTMP *utmp_entry = utmp.SearchUtmpEntry(tty);
665 if (utmp_entry->ut_host[0]) {
666 if (strchr(utmp_entry->ut_host,
':')) {
667 Setenv(
"DISPLAY", utmp_entry->ut_host);
668 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
669 utmp_entry->ut_host);
672 snprintf(disp,
sizeof(disp),
"%s:0.0", utmp_entry->ut_host);
674 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
679 else if (utmp_entry->ut_addr) {
681 struct sockaddr_in addr;
682 addr.sin_family = AF_INET;
684 memcpy(&addr.sin_addr, &utmp_entry->ut_addr,
sizeof(addr.sin_addr));
685 memset(&addr.sin_zero[0], 0,
sizeof(addr.sin_zero));
686 struct sockaddr *sa = (
struct sockaddr *) &addr;
688 char hbuf[NI_MAXHOST + 4];
689 if (getnameinfo(sa,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, NI_NAMEREQD) == 0) {
690 assert( strlen(hbuf) < NI_MAXHOST );
691 strcat(hbuf,
":0.0");
693 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
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);
2149 gROOT->EndOfProcessCleanups();
2171#include <mach/mach.h>
2179 typedef CSTypeRef CSSymbolicatorRef;
2180 typedef CSTypeRef CSSourceInfoRef;
2181 typedef CSTypeRef CSSymbolOwnerRef;
2182 typedef CSTypeRef CSSymbolRef;
2184 CSSymbolicatorRef CSSymbolicatorCreateWithPid(pid_t pid);
2185 CSSymbolRef CSSymbolicatorGetSymbolWithAddressAtTime(CSSymbolicatorRef cs, vm_address_t addr, uint64_t time);
2186 CSSourceInfoRef CSSymbolicatorGetSourceInfoWithAddressAtTime(CSSymbolicatorRef cs, vm_address_t addr, uint64_t time);
2187 const char* CSSymbolGetName(CSSymbolRef
sym);
2188 CSSymbolOwnerRef CSSymbolGetSymbolOwner(CSSymbolRef
sym);
2189 const char* CSSymbolOwnerGetPath(CSSymbolOwnerRef symbol);
2190 const char* CSSourceInfoGetPath(CSSourceInfoRef info);
2191 int CSSourceInfoGetLineNumber(CSSourceInfoRef info);
2194bool CSTypeRefIdValid(CSTypeRef ref) {
2195 return ref.csCppData || ref.csCppObj;
2198void macosx_backtrace() {
2199void* addrlist[kMAX_BACKTRACE_DEPTH];
2201 int numstacks = backtrace( addrlist,
sizeof( addrlist ) /
sizeof(
void* ));
2203 CSSymbolicatorRef symbolicator = CSSymbolicatorCreateWithPid(getpid());
2206 static const int skipFrames = 2;
2207 for (
int i = skipFrames; i < numstacks; ++i) {
2209 CSSymbolRef
sym = CSSymbolicatorGetSymbolWithAddressAtTime(symbolicator,
2210 (vm_address_t)addrlist[i],
2212 CSSymbolOwnerRef symOwner = CSSymbolGetSymbolOwner(
sym);
2214 if (
const char* libPath = CSSymbolOwnerGetPath(symOwner)) {
2215 printf(
"[%s]", libPath);
2217 printf(
"[<unknown binary>]");
2220 if (
const char* symname = CSSymbolGetName(
sym)) {
2221 printf(
" %s", symname);
2224 CSSourceInfoRef sourceInfo
2225 = CSSymbolicatorGetSourceInfoWithAddressAtTime(symbolicator,
2226 (vm_address_t)addrlist[i],
2228 if (
const char* sourcePath = CSSourceInfoGetPath(sourceInfo)) {
2229 printf(
" %s:%d", sourcePath, (
int)CSSourceInfoGetLineNumber(sourceInfo));
2231 printf(
" (no debug info)");
2248 gdbscript = gdbscript.
Strip();
2249 if (gdbscript !=
"") {
2251 fprintf(stderr,
"Root.StacktraceScript %s does not exist\n", gdbscript.
Data());
2255 if (gdbscript ==
"") {
2256 gdbscript =
"gdb-backtrace.sh";
2259 fprintf(stderr,
"Error in <TUnixSystem::StackTrace> script %s is missing\n", gdbscript.
Data());
2266 gdbmess = gdbmess.
Strip();
2274 int fd = STDERR_FILENO;
2276 const char *message =
" Generating stack trace...\n";
2278 if (fd && message) { }
2281 Getlinem(kCleanUp, 0);
2283#if defined(USE_GDB_STACK_TRACE)
2286 fprintf(stderr,
"gdb not found, need it for stack trace\n");
2291 TString gdbmessf =
"gdb-message";
2292 if (gdbmess !=
"") {
2294 fprintf(
f,
"%s\n", gdbmess.
Data());
2302 if (gdbmess !=
"") {
2304 gdbscript += gdbmessf;
2306 gdbscript +=
" 1>&2";
2311#elif defined(R__AIX)
2312 TString script =
"procstack ";
2316#elif defined(R__SOLARIS)
2327#elif defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_DLADDR)
2335 const char *cppfilt =
"c++filt";
2336 const char *cppfiltarg =
"";
2338 const char *format1 =
" 0x%016lx in %.200s %s 0x%lx from %.200s\n";
2340 const char *format2 =
" 0x%016lx in %.200s\n";
2342 const char *format2 =
" 0x%016lx in %.200s at %.200s from %.200s\n";
2344 const char *format3 =
" 0x%016lx in %.200s from %.200s\n";
2345 const char *format4 =
" 0x%016lx in <unknown function>\n";
2347 const char *format1 =
" 0x%08lx in %.200s %s 0x%lx from %.200s\n";
2349 const char *format2 =
" 0x%08lx in %.200s\n";
2351 const char *format2 =
" 0x%08lx in %.200s at %.200s from %.200s\n";
2353 const char *format3 =
" 0x%08lx in %.200s from %.200s\n";
2354 const char *format4 =
" 0x%08lx in <unknown function>\n";
2366 while (help.
Gets(p)) {
2368 cppfiltarg =
"--format=gnu-v3";
2370 }
else if (help.
Index(
"gnu-new-abi") !=
kNPOS) {
2371 cppfiltarg =
"--format=gnu-new-abi";
2380#if (defined(R__LINUX) && !defined(R__WINGCC))
2383#ifdef PR_SET_PTRACER
2384 prctl(PR_SET_PTRACER, getpid(), 0, 0, 0);
2390 TString gdbmessf =
"gdb-message";
2391 if (gdbmess !=
"") {
2393 fprintf(
f,
"%s\n", gdbmess.
Data());
2403 if (gdbmess !=
"") {
2405 gdbscript += gdbmessf;
2407 gdbscript +=
" 1>&2";
2420 if (write(fd, message, strlen(message)) < 0)
2425 TString tmpf1 =
"gdb-backtrace";
2426 std::ofstream file1;
2432 Error(
"StackTrace",
"could not open file %s", tmpf1.
Data());
2444 void *trace[kMAX_BACKTRACE_DEPTH];
2445 int depth = backtrace(trace, kMAX_BACKTRACE_DEPTH);
2446 for (
int n = 5;
n < depth;
n++) {
2450 if (dladdr(trace[
n], &info) && info.dli_fname && info.dli_fname[0]) {
2451 const char *libname = info.dli_fname;
2452 const char *symname = (info.dli_sname && info.dli_sname[0]) ?
2453 info.dli_sname :
"<unknown>";
2456 Bool_t gte = (addr >= symaddr);
2457 ULong_t diff = (gte) ? addr - symaddr : symaddr - addr;
2458 if (addr2line && symaddr) {
2462#if defined(MAC_OS_X_VERSION_10_10)
2463 snprintf(buffer,
sizeof(buffer),
"%s -p %d 0x%016lx", addr2line,
GetPid(), addr);
2464#elif defined(MAC_OS_X_VERSION_10_9)
2466 snprintf(buffer,
sizeof(buffer),
"%s -d -p %d 0x%016lx", addr2line,
GetPid(), addr);
2468 snprintf(buffer,
sizeof(buffer),
"%s -p %d 0x%016lx", addr2line,
GetPid(), addr);
2471 ULong_t offset = (addr >= libaddr) ? addr - libaddr :
2477 if (
name.Contains(
".so") ||
name.Contains(
".sl")) noShare =
kFALSE;
2478 if (noShare) offset = addr;
2479 if (noPath)
name =
"`which " +
name +
"`";
2480 snprintf(buffer,
sizeof(buffer),
"%s -e %s 0x%016lx", addr2line,
name.Data(), offset);
2482 if (FILE *pf = ::popen(buffer,
"r")) {
2484 if (fgets(buf, 2048, pf)) {
2485 buf[strlen(buf)-1] = 0;
2486 if (strncmp(buf,
"??", 2)) {
2488 snprintf(buffer,
sizeof(buffer), format2, addr, buf);
2490 snprintf(buffer,
sizeof(buffer), format2, addr, symname, buf, libname);
2498 snprintf(buffer,
sizeof(buffer), format1, addr, symname,
2499 gte ?
"+" :
"-", diff, libname);
2502 snprintf(buffer,
sizeof(buffer), format1, addr, symname,
2503 gte ?
"+" :
"-", diff, libname);
2505 snprintf(buffer,
sizeof(buffer), format3, addr, symname, libname);
2508 snprintf(buffer,
sizeof(buffer), format4, addr);
2514 if (write(fd, buffer, ::strlen(buffer)) < 0)
2519 TString tmpf2 =
"gdb-backtrace";
2523 snprintf(buffer,
sizeof(buffer),
"%s %s < %s > %s", filter, cppfiltarg, tmpf1.
Data(), tmpf2.
Data());
2525 std::ifstream file2(tmpf2);
2529 line.ReadString(file2);
2530 if (write(fd,
line.Data(),
line.Length()) < 0)
2538 delete [] addr2line;
2541#elif defined(HAVE_EXCPT_H) && defined(HAVE_PDSC_H) && \
2542 defined(HAVE_RLD_INTERFACE_H)
2551 exc_capture_context (&context);
2552 while (!rc && context.sc_pc) {
2554 pdsc_crd *func, *base, *crd
2555 = exc_remote_lookup_function_entry(0, 0, context.sc_pc, 0, &func, &base);
2556 Elf32_Addr addr = PDSC_CRD_BEGIN_ADDRESS(base, func);
2558 const char *
name =
"<unknown function>";
2559 sprintf(buffer,
" 0x%012lx %.200s + 0x%lx\n",
2560 context.sc_pc,
name, context.sc_pc - addr);
2561 write(fd, buffer, ::strlen(buffer));
2562 rc = exc_virtual_unwind(0, &context);
2607 ::openlog(
name, options, fac);
2617 ::syslog(level,
"%s", mess);
2657 const char *tty = ttyname(STDOUT_FILENO);
2661 if ((xh->
fStdOutDup = dup(STDOUT_FILENO)) < 0) {
2669 const char *tty = ttyname(STDERR_FILENO);
2673 if ((xh->
fStdErrDup = dup(STDERR_FILENO)) < 0) {
2675 if (outdone && dup2(xh->
fStdOutDup, STDOUT_FILENO) < 0) {
2676 Warning(
"RedirectOutput",
"could not restore stdout (back to original redirected"
2685 const char *
m = (mode[0] ==
'a' || mode[0] ==
'w') ? mode :
"a";
2698 if (freopen(
file,
m, stdout) == 0) {
2702 if (freopen(
file,
m, stderr) == 0) {
2718 if (
close(STDOUT_FILENO) != 0) {
2720 "problems closing STDOUT_FILENO (%d) before 'dup2' (errno: %d)",
2724 if (dup2(xh->
fStdOutDup, STDOUT_FILENO) < 0) {
2725 SysError(
"RedirectOutput",
"could not restore stdout (back to original redirected"
2731 "problems closing temporary 'out' descriptor %d (errno: %d)",
2744 if (
close(STDERR_FILENO) != 0) {
2746 "problems closing STDERR_FILENO (%d) before 'dup2' (errno: %d)",
2750 if (dup2(xh->
fStdErrDup, STDERR_FILENO) < 0) {
2751 SysError(
"RedirectOutput",
"could not restore stderr (back to original redirected"
2757 "problems closing temporary 'err' descriptor %d (errno: %d)",
2802 Error(
"ListSymbols",
"not yet implemented");
2824 if (!linkedLibs.
IsNull())
2830#if !defined(R__MACOSX)
2836#if defined(R__MACOSX)
2838 linkedLibs = gLinkedDylibs;
2842 while (otool.
Gets(p)) {
2847 if (!linkedLibs.
IsNull())
2849 linkedLibs += dylib;
2857#elif defined(R__LINUX) || defined(R__SOLARIS) || defined(R__AIX)
2858#if defined(R__WINGCC )
2859 const char *cLDD=
"cygcheck";
2860 const char *cSOEXT=
".dll";
2861 size_t lenexe = strlen(exe);
2862 if (strcmp(exe + lenexe - 4,
".exe")
2863 && strcmp(exe + lenexe - 4,
".dll")) {
2866 char* longerexe =
new char[lenexe + 5];
2867 strlcpy(longerexe, exe,lenexe+5);
2868 strlcat(longerexe,
".exe",lenexe+5);
2872 TRegexp sovers =
"\\.so\\.[0-9]+";
2874 const char *cLDD=
"ldd";
2876 const char *cSOEXT=
".a";
2877 TRegexp sovers =
"\\.a\\.[0-9]+";
2879 const char *cSOEXT=
".so";
2880 TRegexp sovers =
"\\.so\\.[0-9]+";
2886 while (ldd.
Gets(p)) {
2905 if (!linkedLibs.
IsNull())
2907 linkedLibs += solib;
2952 if (mode && t->
IsSync()) {
2955 }
else if (!mode && t->
IsAsync()) {
3009 struct addrinfo hints;
3010 struct addrinfo *result, *rp;
3011 memset(&hints, 0,
sizeof(
struct addrinfo));
3012 hints.ai_family = AF_INET;
3013 hints.ai_socktype = 0;
3014 hints.ai_protocol = 0;
3015 hints.ai_flags = AI_CANONNAME;
3020 size_t lenHostname = strlen(hostname);
3021 std::string hostnameWithoutLocal{hostname};
3022 if (lenHostname > 6 && !strcmp(hostname + lenHostname - 6,
".local")) {
3023 hostnameWithoutLocal.erase(lenHostname - 6);
3024 hostname = hostnameWithoutLocal.c_str();
3029 int rc = getaddrinfo(hostname,
nullptr, &hints, &result);
3031 if (rc == EAI_NONAME) {
3032 if (
gDebug > 0)
Error(
"GetHostByName",
"unknown host '%s'", hostname);
3035 Error(
"GetHostByName",
"getaddrinfo failed for '%s': %s", hostname, gai_strerror(rc));
3041 std::string hostcanon(result->ai_canonname ? result->ai_canonname : hostname);
3043 ia.
fFamily = result->ai_family;
3044 ia.
fAddresses[0] = ntohl(((
struct sockaddr_in *)(result->ai_addr))->sin_addr.s_addr);
3046 if (hostcanon.compare(hostname) != 0) ia.
AddAlias(hostname);
3049 char tmp[
sizeof(
struct in_addr)];
3050 if (inet_pton(AF_INET, hostcanon.data(), tmp) == 1) {
3051 char hbuf[NI_MAXHOST];
3052 if (getnameinfo(result->ai_addr, result->ai_addrlen, hbuf,
sizeof(hbuf),
nullptr, 0, 0) == 0)
3057 rp = result->ai_next;
3058 for (; rp !=
nullptr; rp = rp->ai_next) {
3059 UInt_t arp = ntohl(((
struct sockaddr_in *)(rp->ai_addr))->sin_addr.s_addr);
3064 freeaddrinfo(result);
3073 struct sockaddr addr;
3074#if defined(USE_SIZE_T)
3075 size_t len =
sizeof(addr);
3076#elif defined(USE_SOCKLEN_T)
3077 socklen_t len =
sizeof(addr);
3079 int len =
sizeof(addr);
3083 if (getsockname(sock, &addr, &len) == -1) {
3084 SysError(
"GetSockName",
"getsockname failed");
3088 if (addr.sa_family != AF_INET)
return ia;
3090 struct sockaddr_in *addrin = (
struct sockaddr_in *)&addr;
3091 ia.
fPort = ntohs(addrin->sin_port);
3092 ia.
fAddresses[0] = ntohl(addrin->sin_addr.s_addr);
3094 char hbuf[NI_MAXHOST];
3095 if (getnameinfo(&addr,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, 0) != 0) {
3096 Error(
"GetSockName",
"getnameinfo failed");
3109 struct sockaddr addr;
3110#if defined(USE_SIZE_T)
3111 size_t len =
sizeof(addr);
3112#elif defined(USE_SOCKLEN_T)
3113 socklen_t len =
sizeof(addr);
3115 int len =
sizeof(addr);
3119 if (getpeername(sock, &addr, &len) == -1) {
3120 SysError(
"GetPeerName",
"getpeername failed");
3124 if (addr.sa_family != AF_INET)
return ia;
3126 struct sockaddr_in *addrin = (
struct sockaddr_in *)&addr;
3127 ia.
fPort = ntohs(addrin->sin_port);
3128 ia.
fAddresses[0] = ntohl(addrin->sin_addr.s_addr);
3130 char hbuf[NI_MAXHOST];
3131 if (getnameinfo(&addr,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, 0) != 0) {
3132 Error(
"GetPeerName",
"getnameinfo failed");
3147 if ((sp = getservbyname(servicename,
kProtocolName)) == 0) {
3148 Error(
"GetServiceByName",
"no service \"%s\" with protocol \"%s\"\n",
3152 return ntohs(sp->s_port);
3162 if ((sp = getservbyport(htons(port),
kProtocolName)) == 0) {
3165 return Form(
"%d", port);
3174 int tcpwindowsize,
const char *protocol)
3176 if (!strcmp(servername,
"unix")) {
3182 if (!strcmp(protocol,
"udp")){
3252 while ((soc = ::accept(sock, 0, 0)) == -1 &&
GetErrno() == EINTR)
3259 SysError(
"AcceptConnection",
"accept");
3272 if (sock < 0)
return;
3274#if !defined(R__AIX) || defined(_AIX41) || defined(_AIX43)
3276 ::shutdown(sock, 2);
3292 if (
UnixRecv(sock, &header,
sizeof(header), 0) > 0) {
3293 int count = ntohl(header);
3295 if (count > length) {
3296 Error(
"RecvBuf",
"record header exceeds buffer size");
3298 }
else if (count > 0) {
3299 if (
UnixRecv(sock, buf, count, 0) < 0) {
3300 Error(
"RecvBuf",
"cannot receive buffer");
3315 Int_t header = htonl(length);
3317 if (
UnixSend(sock, &header,
sizeof(header), 0) < 0) {
3318 Error(
"SendBuf",
"cannot send header");
3322 if (
UnixSend(sock, buf, length, 0) < 0) {
3323 Error(
"SendBuf",
"cannot send buffer");
3363 if ((
n =
UnixRecv(sock, buf, length, flag)) <= 0) {
3365 Error(
"RecvRaw",
"cannot receive buffer");
3398 if ((
n =
UnixSend(sock, buf, length, flag)) <= 0) {
3400 Error(
"SendRaw",
"cannot send buffer");
3411 if (sock < 0)
return -1;
3415 if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)&val,
sizeof(val)) == -1) {
3416 SysError(
"SetSockOpt",
"setsockopt(SO_SNDBUF)");
3421 if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)&val,
sizeof(val)) == -1) {
3422 SysError(
"SetSockOpt",
"setsockopt(SO_RCVBUF)");
3427 if (setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)&val,
sizeof(val)) == -1) {
3428 SysError(
"SetSockOpt",
"setsockopt(SO_OOBINLINE)");
3433 if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)&val,
sizeof(val)) == -1) {
3434 SysError(
"SetSockOpt",
"setsockopt(SO_KEEPALIVE)");
3439 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)&val,
sizeof(val)) == -1) {
3440 SysError(
"SetSockOpt",
"setsockopt(SO_REUSEADDR)");
3445 if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)&val,
sizeof(val)) == -1) {
3446 SysError(
"SetSockOpt",
"setsockopt(TCP_NODELAY)");
3451 if (ioctl(sock, FIONBIO, (
char*)&val) == -1) {
3452 SysError(
"SetSockOpt",
"ioctl(FIONBIO)");
3458 if (ioctl(sock, SIOCSPGRP, (
char*)&val) == -1) {
3459 SysError(
"SetSockOpt",
"ioctl(SIOCSPGRP)");
3463 Error(
"SetSockOpt",
"ioctl(SIOCGPGRP) not supported on cygwin/gcc");
3470 Error(
"SetSockOpt",
"illegal option (%d)", opt);
3481 if (sock < 0)
return -1;
3483#if defined(USE_SOCKLEN_T) || defined(_AIX43)
3484 socklen_t optlen =
sizeof(*val);
3485#elif defined(USE_SIZE_T)
3486 size_t optlen =
sizeof(*val);
3488 int optlen =
sizeof(*val);
3493 if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)val, &optlen) == -1) {
3494 SysError(
"GetSockOpt",
"getsockopt(SO_SNDBUF)");
3499 if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)val, &optlen) == -1) {
3500 SysError(
"GetSockOpt",
"getsockopt(SO_RCVBUF)");
3505 if (getsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)val, &optlen) == -1) {
3506 SysError(
"GetSockOpt",
"getsockopt(SO_OOBINLINE)");
3511 if (getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)val, &optlen) == -1) {
3512 SysError(
"GetSockOpt",
"getsockopt(SO_KEEPALIVE)");
3517 if (getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)val, &optlen) == -1) {
3518 SysError(
"GetSockOpt",
"getsockopt(SO_REUSEADDR)");
3523 if (getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)val, &optlen) == -1) {
3524 SysError(
"GetSockOpt",
"getsockopt(TCP_NODELAY)");
3530 if ((flg = fcntl(sock, F_GETFL, 0)) == -1) {
3531 SysError(
"GetSockOpt",
"fcntl(F_GETFL)");
3534 *val = flg & O_NDELAY;
3537#if !defined(R__LYNXOS) && !defined(R__WINGCC)
3538 if (ioctl(sock, SIOCGPGRP, (
char*)val) == -1) {
3539 SysError(
"GetSockOpt",
"ioctl(SIOCGPGRP)");
3543 Error(
"GetSockOpt",
"ioctl(SIOCGPGRP) not supported on LynxOS and cygwin/gcc");
3548#if !defined(R__LYNXOS)
3549 if (ioctl(sock, SIOCATMARK, (
char*)val) == -1) {
3550 SysError(
"GetSockOpt",
"ioctl(SIOCATMARK)");
3554 Error(
"GetSockOpt",
"ioctl(SIOCATMARK) not supported on LynxOS");
3559#if !defined(R__LYNXOS)
3560 if (ioctl(sock, FIONREAD, (
char*)val) == -1) {
3561 SysError(
"GetSockOpt",
"ioctl(FIONREAD)");
3565 Error(
"GetSockOpt",
"ioctl(FIONREAD) not supported on LynxOS");
3570 Error(
"GetSockOpt",
"illegal option (%d)", opt);
3585static struct Signalmap_t {
3588 struct sigaction *fOldHandler;
3589 const char *fSigName;
3591 { SIGBUS, 0, 0,
"bus error" },
3592 { SIGSEGV, 0, 0,
"segmentation violation" },
3593 { SIGSYS, 0, 0,
"bad argument to system call" },
3594 { SIGPIPE, 0, 0,
"write on a pipe with no one to read it" },
3595 { SIGILL, 0, 0,
"illegal instruction" },
3596 { SIGQUIT, 0, 0,
"quit" },
3597 { SIGINT, 0, 0,
"interrupt" },
3598 { SIGWINCH, 0, 0,
"window size change" },
3599 { SIGALRM, 0, 0,
"alarm clock" },
3600 { SIGCHLD, 0, 0,
"death of a child" },
3601 { SIGURG, 0, 0,
"urgent data arrived on an I/O channel" },
3602 { SIGFPE, 0, 0,
"floating point exception" },
3603 { SIGTERM, 0, 0,
"termination signal" },
3604 { SIGUSR1, 0, 0,
"user-defined signal 1" },
3605 { SIGUSR2, 0, 0,
"user-defined signal 2" }
3656 Break(
"TUnixSystem::DispatchSignals",
"%s: printing stacktrace",
UnixSigname(sig));
3679 struct sigaction sigact;
3682 gSignalMap[sig].fOldHandler =
new struct sigaction();
3686#elif defined(R__SOLARIS)
3688#elif defined(R__LYNXOS)
3697 sigemptyset(&sigact.sa_mask);
3698 sigact.sa_flags = 0;
3699#if defined(SA_RESTART)
3700 sigact.sa_flags |= SA_RESTART;
3702 if (sigaction(
gSignalMap[sig].fCode, &sigact,
3704 ::SysError(
"TUnixSystem::UnixSignal",
"sigaction");
3715 TTHREAD_TLS_ARRAY(
struct sigaction,
kMAXSIGNALS,oldsigact);
3717 if (ignore != ignoreSig[sig]) {
3718 ignoreSig[sig] = ignore;
3720 struct sigaction sigact;
3722 sigact.sa_handler = (
void (*)())SIG_IGN;
3723#elif defined(R__SOLARIS)
3724 sigact.sa_handler = (
void (*)(int))SIG_IGN;
3726 sigact.sa_handler = SIG_IGN;
3728 sigemptyset(&sigact.sa_mask);
3729 sigact.sa_flags = 0;
3730 if (sigaction(
gSignalMap[sig].fCode, &sigact, &oldsigact[sig]) < 0)
3731 ::SysError(
"TUnixSystem::UnixIgnoreSignal",
"sigaction");
3733 if (sigaction(
gSignalMap[sig].fCode, &oldsigact[sig], 0) < 0)
3734 ::SysError(
"TUnixSystem::UnixIgnoreSignal",
"sigaction");
3750 struct sigaction sigact;
3753#elif defined(R__SOLARIS)
3755#elif defined(R__LYNXOS)
3764 sigemptyset(&sigact.sa_mask);
3765 sigact.sa_flags = 0;
3767#if defined(SA_INTERRUPT)
3768 sigact.sa_flags |= SA_INTERRUPT;
3771#if defined(SA_RESTART)
3772 sigact.sa_flags |= SA_RESTART;
3776 ::SysError(
"TUnixSystem::UnixSigAlarmInterruptsSyscalls",
"sigaction");
3796 ::SysError(
"TUnixSystem::UnixSignal",
"sigaction");
3819 static std::atomic<time_t> jan95{0};
3830 jan95 = mktime(&tp);
3831 if ((
int)jan95 == -1) {
3832 ::SysError(
"TUnixSystem::UnixNow",
"error converting 950001 0:00 to time_t");
3838 gettimeofday(&t, 0);
3847 struct itimerval itv;
3848 itv.it_value.tv_sec = 0;
3849 itv.it_value.tv_usec = 0;
3850 itv.it_interval.tv_sec = 0;
3851 itv.it_interval.tv_usec = 0;
3853 itv.it_value.tv_sec = time_t(
ms / 1000);
3854 itv.it_value.tv_usec = time_t((
ms % 1000) * 1000);
3856 int st = setitimer(ITIMER_REAL, &itv, 0);
3858 ::SysError(
"TUnixSystem::UnixSetitimer",
"setitimer");
3876 fd_set *rd = (readready) ? (fd_set*)readready->GetBits() : 0;
3877 fd_set *wr = (writeready) ? (fd_set*)writeready->GetBits() : 0;
3881 tv.tv_sec =
Int_t(timeout / 1000);
3882 tv.tv_usec = (timeout % 1000) * 1000;
3883 retcode = select(nfds, rd, wr, 0, &tv);
3885 retcode = select(nfds, rd, wr, 0, 0);
3887 if (retcode == -1) {
3918 pw = getpwnam(
name);
3927 pw = getpwuid(getuid());
3960 if (stat(edir, &finfo) < 0)
3963 if (!S_ISDIR(finfo.st_mode))
3966 return (
void*) opendir(edir);
3969#if defined(_POSIX_SOURCE)
3972# define REAL_DIR_ENTRY(dp) 1
3974# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
3982 DIR *dirp = (DIR*)dirp1;
4014#if defined(R__SEEK64)
4016 if (path && lstat64(path, &sbuf) == 0) {
4019 if (path && lstat(path, &sbuf) == 0) {
4021 buf.
fIsLink = S_ISLNK(sbuf.st_mode);
4023#if defined(R__SEEK64)
4024 if (stat64(path, &sbuf) == -1) {
4026 if (stat(path, &sbuf) == -1) {
4031 buf.
fDev = sbuf.st_dev;
4032 buf.
fIno = sbuf.st_ino;
4033 buf.
fMode = sbuf.st_mode;
4034 buf.
fUid = sbuf.st_uid;
4035 buf.
fGid = sbuf.st_gid;
4036 buf.
fSize = sbuf.st_size;
4037 buf.
fMtime = sbuf.st_mtime;
4056 struct statfs statfsbuf;
4057#if (defined(R__SOLARIS) && !defined(R__LINUX))
4058 if (statfs(path, &statfsbuf,
sizeof(
struct statfs), 0) == 0) {
4059 *
id = statfsbuf.f_fstyp;
4060 *bsize = statfsbuf.f_bsize;
4061 *blocks = statfsbuf.f_blocks;
4062 *bfree = statfsbuf.f_bfree;
4064 if (statfs((
char*)path, &statfsbuf) == 0) {
4070 if (!strcmp(statfsbuf.f_fstypename, MOUNT_FFS) ||
4071 !strcmp(statfsbuf.f_fstypename, MOUNT_MFS))
4073 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_NFS))
4075 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_MSDOS))
4077 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_EXT2FS))
4079 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_CD9660))
4081 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_NCPFS))
4086 *
id = statfsbuf.f_type;
4088 *bsize = statfsbuf.f_bsize;
4089 *blocks = statfsbuf.f_blocks;
4090 *bfree = statfsbuf.f_bavail;
4103 return (
int) waitpid(0, &status, WNOHANG);
4124 sport = htons(port);
4127 if (!addr.
IsValid())
return -1;
4130 struct sockaddr_in server;
4131 memset(&server, 0,
sizeof(server));
4132 memcpy(&server.sin_addr, &adr,
sizeof(adr));
4134 server.sin_port = sport;
4138 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4139 ::SysError(
"TUnixSystem::UnixTcpConnect",
"socket (%s:%d)",
4144 if (tcpwindowsize > 0) {
4149 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
4153 ::SysError(
"TUnixSystem::UnixTcpConnect",
"connect (%s:%d)",
4175 sport = htons(port);
4178 if (!addr.
IsValid())
return -1;
4181 struct sockaddr_in server;
4182 memset(&server, 0,
sizeof(server));
4183 memcpy(&server.sin_addr, &adr,
sizeof(adr));
4185 server.sin_port = sport;
4189 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
4190 ::SysError(
"TUnixSystem::UnixUdpConnect",
"socket (%s:%d)",
4195 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
4199 ::SysError(
"TUnixSystem::UnixUdpConnect",
"connect (%s:%d)",
4221 if (!sockpath || strlen(sockpath) <= 0) {
4222 ::SysError(
"TUnixSystem::UnixUnixConnect",
"socket path undefined");
4227 struct sockaddr_un unserver;
4228 unserver.sun_family = AF_UNIX;
4230 if (strlen(sockpath) >
sizeof(unserver.sun_path)-1) {
4231 ::Error(
"TUnixSystem::UnixUnixConnect",
"socket path %s, longer than max allowed length (%u)",
4232 sockpath, (
UInt_t)
sizeof(unserver.sun_path)-1);
4235 strcpy(unserver.sun_path, sockpath);
4238 if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
4239 ::SysError(
"TUnixSystem::UnixUnixConnect",
"socket");
4243 while (connect(sock, (
struct sockaddr*) &unserver, strlen(unserver.sun_path)+2) == -1) {
4247 ::SysError(
"TUnixSystem::UnixUnixConnect",
"connect");
4270 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
4271 short sport, tryport = kSOCKET_MINPORT;
4274 if (port == 0 && reuse) {
4275 ::Error(
"TUnixSystem::UnixTcpService",
"cannot do a port scan while reuse is true");
4282 sport = htons(port);
4286 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4287 ::SysError(
"TUnixSystem::UnixTcpService",
"socket");
4294 if (tcpwindowsize > 0) {
4299 struct sockaddr_in inserver;
4300 memset(&inserver, 0,
sizeof(inserver));
4301 inserver.sin_family = AF_INET;
4302 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
4303 inserver.sin_port = sport;
4307 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
4308 ::SysError(
"TUnixSystem::UnixTcpService",
"bind");
4315 inserver.sin_port = htons(tryport);
4316 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
4318 }
while (bret < 0 &&
GetErrno() == EADDRINUSE && tryport < kSOCKET_MAXPORT);
4320 ::SysError(
"TUnixSystem::UnixTcpService",
"bind (port scan)");
4327 if (::listen(sock, backlog)) {
4328 ::SysError(
"TUnixSystem::UnixTcpService",
"listen");
4345 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
4346 short sport, tryport = kSOCKET_MINPORT;
4352 sport = htons(port);
4356 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
4357 ::SysError(
"TUnixSystem::UnixUdpService",
"socket");
4361 struct sockaddr_in inserver;
4362 memset(&inserver, 0,
sizeof(inserver));
4363 inserver.sin_family = AF_INET;
4364 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
4365 inserver.sin_port = sport;
4369 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
4370 ::SysError(
"TUnixSystem::UnixUdpService",
"bind");
4377 inserver.sin_port = htons(tryport);
4378 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
4380 }
while (bret < 0 &&
GetErrno() == EADDRINUSE && tryport < kSOCKET_MAXPORT);
4382 ::SysError(
"TUnixSystem::UnixUdpService",
"bind (port scan)");
4389 if (::listen(sock, backlog)) {
4390 ::SysError(
"TUnixSystem::UnixUdpService",
"listen");
4407 oldumask = umask(0);
4419 unlink(sockpath.
Data());
4430 if (!sockpath || strlen(sockpath) <= 0) {
4431 ::SysError(
"TUnixSystem::UnixUnixService",
"socket path undefined");
4435 struct sockaddr_un unserver;
4439 memset(&unserver, 0,
sizeof(unserver));
4440 unserver.sun_family = AF_UNIX;
4442 if (strlen(sockpath) >
sizeof(unserver.sun_path)-1) {
4443 ::Error(
"TUnixSystem::UnixUnixService",
"socket path %s, longer than max allowed length (%u)",
4444 sockpath, (
UInt_t)
sizeof(unserver.sun_path)-1);
4447 strcpy(unserver.sun_path, sockpath);
4450 if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
4451 ::SysError(
"TUnixSystem::UnixUnixService",
"socket");
4455 if (::bind(sock, (
struct sockaddr*) &unserver, strlen(unserver.sun_path)+2)) {
4456 ::SysError(
"TUnixSystem::UnixUnixService",
"bind");
4462 if (::listen(sock, backlog)) {
4463 ::SysError(
"TUnixSystem::UnixUnixService",
"listen");
4482 if (sock < 0)
return -1;
4489 if (flag == MSG_PEEK)
4493 char *buf = (
char *)buffer;
4495 for (
n = 0;
n < length;
n += nrecv) {
4496 if ((nrecv = recv(sock, buf+
n, length-
n, flag)) <= 0) {
4499 if (flag == MSG_OOB) {
4509 ::
SysError(
"TUnixSystem::UnixRecv",
"recv");
4530 if (sock < 0)
return -1;
4539 const char *buf = (
const char *)buffer;
4541 for (
n = 0;
n < length;
n += nsent) {
4542 if ((nsent = send(sock, buf+
n, length-
n, flag)) <= 0) {
4549 ::
SysError(
"TUnixSystem::UnixSend",
"send");
4580 }
else if (reset || !initialized) {
4581 initialized =
kTRUE;
4590#elif defined(R__MACOSX)
4604 dynpath = ldpath; dynpath +=
":"; dynpath += rdynpath;
4614#if defined(R__WINGCC) || defined(R__MACOSX)
4615 if (!dynpath.
EndsWith(
":")) dynpath +=
":";
4616 dynpath +=
"/usr/local/lib:/usr/X11R6/lib:/usr/lib:/lib:";
4617 dynpath +=
"/lib/x86_64-linux-gnu:/usr/local/lib64:/usr/lib64:/lib64:";
4620 std::string cmd(
"LD_DEBUG=libs LD_PRELOAD=DOESNOTEXIST ls 2>&1");
4621 FILE *pf = popen(cmd.c_str (),
"r");
4622 std::string result =
"";
4625 if (fgets(buffer, 128, pf) != NULL)
4629 std::size_t from = result.find(
"search path=", result.find(
"(LD_LIBRARY_PATH)"));
4630 std::size_t to = result.find(
"(system search path)");
4631 if (from != std::string::npos && to != std::string::npos) {
4633 std::string sys_path = result.substr(from, to-from);
4634 sys_path.erase(std::remove_if(sys_path.begin(), sys_path.end(), isspace), sys_path.end());
4635 if (!dynpath.
EndsWith(
":")) dynpath +=
":";
4636 dynpath += sys_path.c_str();
4640 if (
gDebug > 0) std::cout <<
"dynpath = " << dynpath.
Data() << std::endl;
4686 char buf[PATH_MAX + 1];
4687 char *res = realpath(sLib.
Data(), buf);
4688 if (res) sLib = buf;
4694 const char* lib = sLib.
Data();
4696 if (len > 3 && (!strcmp(lib+len-3,
".so") ||
4697 !strcmp(lib+len-3,
".dl") ||
4698 !strcmp(lib+len-4,
".dll") ||
4699 !strcmp(lib+len-4,
".DLL") ||
4700 !strcmp(lib+len-6,
".dylib") ||
4701 !strcmp(lib+len-3,
".sl") ||
4702 !strcmp(lib+len-2,
".a"))) {
4707 Error(
"FindDynamicLibrary",
4711 static const char* exts[] = {
4712 ".so",
".dll",
".dylib",
".sl",
".dl",
".a", 0 };
4713 const char** ext = exts;
4725 Error(
"FindDynamicLibrary",
4726 "%s[.so | .dll | .dylib | .sl | .dl | .a] does not exist in %s",
4734#if defined(R__MACOSX)
4735#include <sys/resource.h>
4736#include <mach/mach.h>
4737#include <mach/mach_error.h>
4742static void GetDarwinSysInfo(
SysInfo_t *sysinfo)
4744 FILE *p =
gSystem->
OpenPipe(
"sysctl -n kern.ostype hw.model hw.ncpu hw.cpufrequency "
4745 "hw.busfrequency hw.l2cachesize hw.memsize",
"r");
4752 sysinfo->
fCpus =
s.Atoi();
4767 if (
s.BeginsWith(
"Processor type: ")) {
4778static void ReadDarwinCpu(
long *ticks)
4780 mach_msg_type_number_t count;
4782 host_cpu_load_info_data_t cpu;
4784 ticks[0] = ticks[1] = ticks[2] = ticks[3] = 0;
4786 count = HOST_CPU_LOAD_INFO_COUNT;
4787 kr = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&cpu, &count);
4788 if (kr != KERN_SUCCESS) {
4789 ::Error(
"TUnixSystem::ReadDarwinCpu",
"host_statistics: %s", mach_error_string(kr));
4791 ticks[0] = cpu.cpu_ticks[CPU_STATE_USER];
4792 ticks[1] = cpu.cpu_ticks[CPU_STATE_SYSTEM];
4793 ticks[2] = cpu.cpu_ticks[CPU_STATE_IDLE];
4794 ticks[3] = cpu.cpu_ticks[CPU_STATE_NICE];
4802static void GetDarwinCpuInfo(
CpuInfo_t *cpuinfo,
Int_t sampleTime)
4805 if (getloadavg(avg,
sizeof(avg)) < 0) {
4806 ::Error(
"TUnixSystem::GetDarwinCpuInfo",
"getloadavg failed");
4813 Long_t cpu_ticks1[4], cpu_ticks2[4];
4814 ReadDarwinCpu(cpu_ticks1);
4816 ReadDarwinCpu(cpu_ticks2);
4818 Long_t userticks = (cpu_ticks2[0] + cpu_ticks2[3]) -
4819 (cpu_ticks1[0] + cpu_ticks1[3]);
4820 Long_t systicks = cpu_ticks2[1] - cpu_ticks1[1];
4821 Long_t idleticks = cpu_ticks2[2] - cpu_ticks1[2];
4822 if (userticks < 0) userticks = 0;
4823 if (systicks < 0) systicks = 0;
4824 if (idleticks < 0) idleticks = 0;
4825 Long_t totalticks = userticks + systicks + idleticks;
4837static void GetDarwinMemInfo(
MemInfo_t *meminfo)
4839 static Int_t pshift = 0;
4841 vm_statistics_data_t vm_info;
4842 mach_msg_type_number_t count;
4847 count = HOST_VM_INFO_COUNT;
4848 kr = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vm_info, &count);
4849 if (kr != KERN_SUCCESS) {
4850 ::Error(
"TUnixSystem::GetDarwinMemInfo",
"host_statistics: %s", mach_error_string(kr));
4854 for (
int psize = getpagesize(); psize > 1; psize >>= 1)
4858 used = (
Long64_t)(vm_info.active_count + vm_info.inactive_count + vm_info.wire_count) << pshift;
4860 total = (
Long64_t)(vm_info.active_count + vm_info.inactive_count + vm_info.free_count + vm_info.wire_count) << pshift;
4863 swap_used = vm_info.pageouts << pshift;
4866 dirp = opendir(
"/private/var/vm");
4871 while ((dp = readdir(dirp)) != 0) {
4873 char fname [MAXNAMLEN];
4874 if (strncmp(dp->d_name,
"swapfile", 8))
4876 strlcpy(fname,
"/private/var/vm/",MAXNAMLEN);
4877 strlcat (fname, dp->d_name,MAXNAMLEN);
4878 if (stat(fname, &sb) < 0)
4880 swap_total += sb.st_size;
4900static void GetDarwinProcInfo(
ProcInfo_t *procinfo)
4903#define vm_region vm_region_64
4907#define GLOBAL_SHARED_TEXT_SEGMENT 0x90000000U
4908#define GLOBAL_SHARED_DATA_SEGMENT 0xA0000000U
4909#define SHARED_TEXT_REGION_SIZE 0x10000000
4910#define SHARED_DATA_REGION_SIZE 0x10000000
4913 if (getrusage(RUSAGE_SELF, &ru) < 0) {
4914 ::SysError(
"TUnixSystem::GetDarwinProcInfo",
"getrusage failed");
4917 ((
Float_t)(ru.ru_utime.tv_usec) / 1000000.);
4919 ((
Float_t)(ru.ru_stime.tv_usec) / 1000000.);
4922 task_basic_info_data_t ti;
4923 mach_msg_type_number_t count;
4926 task_t a_task = mach_task_self();
4928 count = TASK_BASIC_INFO_COUNT;
4929 kr = task_info(a_task, TASK_BASIC_INFO, (task_info_t)&ti, &count);
4930 if (kr != KERN_SUCCESS) {
4931 ::Error(
"TUnixSystem::GetDarwinProcInfo",
"task_info: %s", mach_error_string(kr));
4936 mach_port_t object_name;
4937 vm_address_t address;
4938 vm_region_top_info_data_t info;
4939 vm_size_t vsize, vprvt, rsize, size;
4940 rsize = ti.resident_size;
4941 vsize = ti.virtual_size;
4943 for (address = 0; ; address += size) {
4945 count = VM_REGION_TOP_INFO_COUNT;
4946 if (vm_region(a_task, &address, &size,
4947 VM_REGION_TOP_INFO, (vm_region_info_t)&info, &count,
4948 &object_name) != KERN_SUCCESS) {
4953 if (address >= GLOBAL_SHARED_TEXT_SEGMENT &&
4954 address < (GLOBAL_SHARED_DATA_SEGMENT + SHARED_DATA_REGION_SIZE)) {
4959 if (info.share_mode == SM_EMPTY) {
4960 vm_region_basic_info_data_64_t b_info;
4961 count = VM_REGION_BASIC_INFO_COUNT_64;
4962 if (vm_region_64(a_task, &address,
4963 &size, VM_REGION_BASIC_INFO,
4964 (vm_region_info_t)&b_info, &count,
4965 &object_name) != KERN_SUCCESS) {
4969 if (b_info.reserved) {
4970 vsize -= (SHARED_TEXT_REGION_SIZE + SHARED_DATA_REGION_SIZE);
4977 if (info.share_mode != SM_PRIVATE) {
4981 switch (info.share_mode) {
4983 if (info.ref_count == 1) {
4986 vprvt += info.private_pages_resident * getpagesize();
5006#if defined(R__LINUX)
5010static void GetLinuxSysInfo(
SysInfo_t *sysinfo)
5013 FILE *
f = fopen(
"/proc/cpuinfo",
"r");
5016 if (
s.BeginsWith(
"model name")) {
5020 if (
s.BeginsWith(
"cpu MHz")) {
5024 if (
s.BeginsWith(
"cache size")) {
5028 if (
s.BeginsWith(
"processor")) {
5030 sysinfo->
fCpus =
s.Atoi();
5037 f = fopen(
"/proc/meminfo",
"r");
5040 if (
s.BeginsWith(
"MemTotal")) {
5053 s.Tokenize(sysinfo->
fOS, from);
5062static void ReadLinuxCpu(
long *ticks)
5064 ticks[0] = ticks[1] = ticks[2] = ticks[3] = 0;
5067 FILE *
f = fopen(
"/proc/stat",
"r");
5071 sscanf(
s.Data(),
"%*s %ld %ld %ld %ld", &ticks[0], &ticks[3], &ticks[1], &ticks[2]);
5081 Double_t avg[3] = { -1., -1., -1. };
5083 if (getloadavg(avg,
sizeof(avg)) < 0) {
5084 ::Error(
"TUnixSystem::GetLinuxCpuInfo",
"getloadavg failed");
5093 Long_t cpu_ticks1[4], cpu_ticks2[4];
5094 ReadLinuxCpu(cpu_ticks1);
5096 ReadLinuxCpu(cpu_ticks2);
5098 Long_t userticks = (cpu_ticks2[0] + cpu_ticks2[3]) -
5099 (cpu_ticks1[0] + cpu_ticks1[3]);
5100 Long_t systicks = cpu_ticks2[1] - cpu_ticks1[1];
5101 Long_t idleticks = cpu_ticks2[2] - cpu_ticks1[2];
5102 if (userticks < 0) userticks = 0;
5103 if (systicks < 0) systicks = 0;
5104 if (idleticks < 0) idleticks = 0;
5105 Long_t totalticks = userticks + systicks + idleticks;
5117static void GetLinuxMemInfo(
MemInfo_t *meminfo)
5120 FILE *
f = fopen(
"/proc/meminfo",
"r");
5123 if (
s.BeginsWith(
"MemTotal")) {
5127 if (
s.BeginsWith(
"MemFree")) {
5131 if (
s.BeginsWith(
"SwapTotal")) {
5135 if (
s.BeginsWith(
"SwapFree")) {
5149static void GetLinuxProcInfo(
ProcInfo_t *procinfo)
5152 if (getrusage(RUSAGE_SELF, &ru) < 0) {
5153 ::SysError(
"TUnixSystem::GetLinuxProcInfo",
"getrusage failed");
5156 ((
Float_t)(ru.ru_utime.tv_usec) / 1000000.);
5158 ((
Float_t)(ru.ru_stime.tv_usec) / 1000000.);
5169 sscanf(
s.Data(),
"%ld %ld", &
total, &rss);
5183 if (!info)
return -1;
5187 if (!sysinfo.
fCpus) {
5188#if defined(R__MACOSX)
5189 GetDarwinSysInfo(&sysinfo);
5190#elif defined(R__LINUX)
5191 GetLinuxSysInfo(&sysinfo);
5207 if (!info)
return -1;
5209#if defined(R__MACOSX)
5210 GetDarwinCpuInfo(info, sampleTime);
5211#elif defined(R__LINUX)
5212 GetLinuxCpuInfo(info, sampleTime);
5224 if (!info)
return -1;
5226#if defined(R__MACOSX)
5227 GetDarwinMemInfo(info);
5228#elif defined(R__LINUX)
5229 GetLinuxMemInfo(info);
5241 if (!info)
return -1;
5243#if defined(R__MACOSX)
5244 GetDarwinProcInfo(info);
5245#elif defined(R__LINUX)
5246 GetLinuxProcInfo(info);
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,...)
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 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
static constexpr double ms
static constexpr double s
Short_t Max(Short_t a, Short_t b)
#define org(otri, vertexptr)
#define sym(otri1, otri2)