20 #include "RConfigure.h" 47 #include <sys/types.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> 70 #if defined(R__LINUX) || defined(R__HURD) 72 # define SIGSYS SIGUNUSED // SIGSYS does not exist in linux ?? 75 #if defined(R__MACOSX) 76 # include <mach-o/dyld.h> 77 # include <sys/mount.h> 78 extern "C" int statfs(
const char *
file,
struct statfs *buffer);
79 #elif defined(R__LINUX) || defined(R__HURD) 81 #elif defined(R__FBSD) || defined(R__OBSD) 82 # include <sys/param.h> 83 # include <sys/mount.h> 85 # include <sys/statfs.h> 93 #include <sys/param.h> 97 #include <sys/resource.h> 100 #include <sys/time.h> 101 #include <sys/file.h> 102 #include <sys/socket.h> 103 #include <netinet/in.h> 104 #include <netinet/tcp.h> 106 # define _XOPEN_EXTENDED_SOURCE 107 # include <arpa/inet.h> 108 # undef _XOPEN_EXTENDED_SOURCE 109 # if !defined(_AIX41) && !defined(_AIX43) 111 # define HASNOT_INETATON 114 # include <arpa/inet.h> 119 #if defined(R__SOLARIS) 120 # include <sys/systeminfo.h> 121 # include <sys/filio.h> 122 # include <sys/sockio.h> 123 # define HASNOT_INETATON 125 # define INADDR_NONE (UInt_t)-1 129 #if defined(R__SOLARIS) 130 # define HAVE_UTMPX_H 131 # define UTMP_NO_ADDR 134 #if defined(MAC_OS_X_VERSION_10_5) 135 # define HAVE_UTMPX_H 136 # define UTMP_NO_ADDR 140 # include <sys/param.h> 141 # if __FreeBSD_version >= 900007 142 # define HAVE_UTMPX_H 146 #if defined(R__AIX) || defined(R__FBSD) || \ 147 defined(R__OBSD) || defined(R__LYNXOS) || \ 148 (defined(R__MACOSX) && !defined(MAC_OS_X_VERSION_10_5)) 149 # define UTMP_NO_ADDR 152 #if (defined(R__AIX) && !defined(_AIX43)) || \ 153 (defined(R__SUNGCC3) && !defined(__arch64__)) 155 #elif defined(R__GLIBC) || defined(R__FBSD) || \ 156 (defined(R__SUNGCC3) && defined(__arch64__)) || \ 157 defined(R__OBSD) || defined(MAC_OS_X_VERSION_10_4) || \ 158 (defined(R__AIX) && defined(_AIX43)) || \ 159 (defined(R__SOLARIS) && defined(_SOCKLEN_T)) 160 # define USE_SOCKLEN_T 163 #if defined(R__LYNXOS) 165 extern int putenv(
const char *);
166 extern int inet_aton(
const char *,
struct in_addr *);
172 #define STRUCT_UTMP struct utmpx 175 #define STRUCT_UTMP struct utmp 177 #if !defined(UTMP_FILE) && defined(_PATH_UTMP) // 4.4BSD 178 #define UTMP_FILE _PATH_UTMP 180 #if defined(UTMPX_FILE) // Solaris, SysVr4 182 #define UTMP_FILE UTMPX_FILE 185 #define UTMP_FILE "/etc/utmp" 189 #if (defined(R__LINUX) || defined(R__HURD)) && !defined(R__WINGCC) 190 # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 191 # define HAVE_BACKTRACE_SYMBOLS_FD 195 #if defined(R__MACOSX) 196 # define HAVE_BACKTRACE_SYMBOLS_FD 200 #ifdef HAVE_BACKTRACE_SYMBOLS_FD 201 # include <execinfo.h> 210 #ifdef HAVE_BACKTRACE_SYMBOLS_FD 213 static const int kMAX_BACKTRACE_DEPTH = 128;
217 #if (defined(R__LINUX) && !defined(R__WINGCC)) 218 #include <fpu_control.h> 220 #include <sys/prctl.h> 223 #if defined(R__MACOSX) && defined(__SSE2__) 224 #include <xmmintrin.h> 227 #if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \ 228 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \ 232 #include <ucontext.h> 235 #include <mach/thread_status.h> 237 #define fegetenvd(x) asm volatile("mffs %0" : "=f" (x)); 238 #define fesetenvd(x) asm volatile("mtfsf 255,%0" : : "f" (x)); 241 FE_ENABLE_INEXACT = 0x00000008,
242 FE_ENABLE_DIVBYZERO = 0x00000010,
243 FE_ENABLE_UNDERFLOW = 0x00000020,
244 FE_ENABLE_OVERFLOW = 0x00000040,
245 FE_ENABLE_INVALID = 0x00000080,
246 FE_ENABLE_ALL_EXCEPT = 0x000000F8
250 #if defined(R__MACOSX) && !defined(__SSE2__) && \ 251 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__)) 263 template<typename U = T, typename std::enable_if<std::is_member_pointer<decltype(&U::ut_name)>::value,
int>
::type = 0>
264 static char getValue(U* ue,
int) {
265 return ue->ut_name[0];
268 template<typename U = T, typename std::enable_if<std::is_member_pointer<decltype(&U::ut_user)>::value,
int>::type = 0>
269 static char getValue(U* ue,
long) {
270 return ue->ut_user[0];
276 return ut_name<STRUCT_UTMP>::getValue(ue, 0);
280 struct TUtmpContent {
284 TUtmpContent() : fUtmpContents(0), fEntries(0) {}
285 ~TUtmpContent() {
free(fUtmpContents); }
295 if (get_ut_name(ue) && !strncmp(tty, ue->ut_line,
sizeof(ue->ut_line)))
307 struct stat file_stats;
318 if (fstat(fileno(utmp), &file_stats) == -1) {
322 size = file_stats.st_size;
329 if (!fUtmpContents) {
334 n_read = fread(fUtmpContents, 1, size, utmp);
336 if (fclose(utmp) != EOF && n_read == size) {
355 # define HOWMANY(x, y) (((x)+((y)-1))/(y)) 370 TFdSet() { memset(fds_bits, 0,
sizeof(fds_bits)); }
371 TFdSet(
const TFdSet &
org) { memcpy(fds_bits, org.fds_bits,
sizeof(org.fds_bits)); }
372 TFdSet &operator=(
const TFdSet &rhs) {
if (
this != &rhs) { memcpy(fds_bits, rhs.fds_bits,
sizeof(rhs.fds_bits));}
return *
this; }
373 void Zero() { memset(fds_bits, 0,
sizeof(fds_bits)); }
415 TTHREAD_TLS_DECL(
TString,exepath);
417 #if defined(R__MACOSX) 418 exepath = _dyld_get_image_name(0);
419 #elif defined(R__LINUX) || defined(R__SOLARIS) || defined(R__FBSD) 423 #if defined(R__LINUX) 424 int ret = readlink(
"/proc/self/exe", buf,
kMAXPATHLEN);
425 #elif defined(R__SOLARIS) 426 int ret = readlink(
"/proc/self/path/a.out", buf,
kMAXPATHLEN);
427 #elif defined(R__FBSD) 428 int ret = readlink(
"/proc/curproc/file", buf,
kMAXPATHLEN);
456 #if defined(HAVE_DLADDR) && !defined(R__MACOSX) 459 static void SetRootSys()
462 void *addr = (
void *)SetRootSys;
464 if (dladdr(addr, &info) && info.dli_fname && info.dli_fname[0]) {
466 if (!realpath(info.dli_fname, respath)) {
468 ::
SysError(
"TUnixSystem::SetRootSys",
"error getting realpath of libCore, please set ROOTSYS in the shell");
480 #if defined(R__MACOSX) 485 static void DylibAdded(
const struct mach_header *mh, intptr_t )
494 gLinkedDylibs = linkedDylibs;
498 TString lib = _dyld_get_image_name(i++);
500 TRegexp sovers =
"libCore\\.[0-9]+\\.*[0-9]*\\.so";
501 TRegexp dyvers =
"libCore\\.[0-9]+\\.*[0-9]*\\.dylib";
504 #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR 508 if (!realpath(lib, respath)) {
520 if (!realpath(lib, respath)) {
522 ::
SysError(
"TUnixSystem::DylibAdded",
"error getting realpath of libCore, please set ROOTSYS in the shell");
535 if (lib.
EndsWith(
"/libSystem.B.dylib"))
540 sovers =
"\\.[0-9]+\\.*[0-9]*\\.so";
546 dyvers =
"\\.[0-9]+\\.*[0-9]*\\.dylib";
547 idx = lib.
Index(dyvers);
553 if (linkedDylibs.
Length())
590 fReadmask =
new TFdSet;
591 fWritemask =
new TFdSet;
592 fReadready =
new TFdSet;
593 fWriteready =
new TFdSet;
594 fSignals =
new TFdSet;
608 #if defined(R__MACOSX) 611 _dyld_register_func_for_add_image(DylibAdded);
612 #elif defined(HAVE_DLADDR) 642 if (!name || !*name) {
648 char *w = Which(Getenv(
"PATH"),
gProgName);
659 if (!Getenv(
"DISPLAY")) {
660 char *tty = ::ttyname(0);
667 STRUCT_UTMP *utmp_entry = utmp.SearchUtmpEntry(tty);
669 if (utmp_entry->ut_host[0]) {
670 if (strchr(utmp_entry->ut_host,
':')) {
671 Setenv(
"DISPLAY", utmp_entry->ut_host);
672 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
673 utmp_entry->ut_host);
676 snprintf(disp,
sizeof(disp),
"%s:0.0", utmp_entry->ut_host);
677 Setenv(
"DISPLAY", disp);
678 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
683 else if (utmp_entry->ut_addr) {
685 struct sockaddr_in addr;
686 addr.sin_family = AF_INET;
688 memcpy(&addr.sin_addr, &utmp_entry->ut_addr,
sizeof(addr.sin_addr));
689 memset(&addr.sin_zero[0], 0,
sizeof(addr.sin_zero));
690 struct sockaddr *sa = (
struct sockaddr *) &addr;
692 char hbuf[NI_MAXHOST];
693 if (getnameinfo(sa,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, NI_NAMEREQD) == 0) {
695 snprintf(disp,
sizeof(disp),
"%s:0.0", hbuf);
696 Setenv(
"DISPLAY", disp);
697 Warning(
"SetDisplay",
"DISPLAY not set, setting it to %s",
713 if (err == 0 && GetLastErrorString() !=
"")
714 return GetLastErrorString();
716 #if defined(R__SOLARIS) || defined (R__LINUX) || defined(R__AIX) || \ 717 defined(R__FBSD) || defined(R__OBSD) || defined(R__HURD) 718 return strerror(err);
720 if (err < 0 || err >= sys_nerr)
721 return Form(
"errno out of range %d", err);
722 return sys_errlist[err];
731 if (fHostname ==
"") {
733 #if defined(R__SOLARIS) 734 sysinfo(SI_HOSTNAME, hn,
sizeof(hn));
736 gethostname(hn,
sizeof(hn));
740 return (
const char *)fHostname;
780 TIter next(fFileHandler);
786 int fd = th->
GetFd();
826 TIter next(fSignalHandler);
845 UnixResetSignal(sig);
864 UnixIgnoreSignal(sig, ignore);
877 UnixSigAlarmInterruptsSyscalls(
set);
887 #if defined(R__LINUX) && !defined(__powerpc__) 888 #if defined(__GLIBC__) && (__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1) 890 #if __GLIBC_MINOR__>=3 892 Int_t oldmask = fegetexcept();
899 Int_t oldmask = ~oldenv;
901 Int_t oldmask = ~oldenv.__control_word;
905 if (oldmask & FE_INVALID ) mask |=
kInvalid;
906 if (oldmask & FE_DIVBYZERO) mask |=
kDivByZero;
907 if (oldmask & FE_OVERFLOW ) mask |=
kOverflow;
908 if (oldmask & FE_UNDERFLOW) mask |=
kUnderflow;
910 if (oldmask & FE_INEXACT ) mask |=
kInexact;
915 #if defined(R__MACOSX) && defined(__SSE2__) 917 Int_t oldmask = ~_MM_GET_EXCEPTION_MASK();
919 if (oldmask & _MM_MASK_INVALID ) mask |=
kInvalid;
920 if (oldmask & _MM_MASK_DIV_ZERO ) mask |=
kDivByZero;
921 if (oldmask & _MM_MASK_OVERFLOW ) mask |=
kOverflow;
922 if (oldmask & _MM_MASK_UNDERFLOW) mask |=
kUnderflow;
923 if (oldmask & _MM_MASK_INEXACT ) mask |=
kInexact;
926 #if defined(R__MACOSX) && !defined(__SSE2__) && \ 927 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__)) 932 Int_t oldmask = ~oldenv.__fpscr;
933 #elif defined(__arm64__) 934 Int_t oldmask = ~oldenv.__fpcr;
936 Int_t oldmask = ~oldenv.__control;
939 if (oldmask & FE_INVALID ) mask |=
kInvalid;
940 if (oldmask & FE_DIVBYZERO) mask |=
kDivByZero;
941 if (oldmask & FE_OVERFLOW ) mask |=
kOverflow;
942 if (oldmask & FE_UNDERFLOW) mask |=
kUnderflow;
943 if (oldmask & FE_INEXACT ) mask |=
kInexact;
946 #if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \ 947 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \ 952 if (oldmask & FE_ENABLE_INVALID ) mask |=
kInvalid;
953 if (oldmask & FE_ENABLE_DIVBYZERO) mask |=
kDivByZero;
954 if (oldmask & FE_ENABLE_OVERFLOW ) mask |=
kOverflow;
955 if (oldmask & FE_ENABLE_UNDERFLOW) mask |=
kUnderflow;
956 if (oldmask & FE_ENABLE_INEXACT ) mask |=
kInexact;
970 Int_t old = GetFPEMask();
972 #if defined(R__LINUX) && !defined(__powerpc__) 973 #if defined(__GLIBC__) && (__GLIBC__>2 || __GLIBC__==2 && __GLIBC_MINOR__>=1) 975 if (mask &
kInvalid ) newm |= FE_INVALID;
977 if (mask &
kOverflow ) newm |= FE_OVERFLOW;
980 if (mask &
kInexact ) newm |= FE_INEXACT;
983 #if __GLIBC_MINOR__>=3 986 feclearexcept(FE_ALL_EXCEPT);
987 fedisableexcept(FE_ALL_EXCEPT);
988 feenableexcept(newm);
997 cur.__control_word &= ~newm;
1005 #if defined(R__MACOSX) && defined(__SSE2__) 1008 if (mask & kInvalid ) newm |= _MM_MASK_INVALID;
1009 if (mask & kDivByZero) newm |= _MM_MASK_DIV_ZERO;
1010 if (mask & kOverflow ) newm |= _MM_MASK_OVERFLOW;
1011 if (mask & kUnderflow) newm |= _MM_MASK_UNDERFLOW;
1012 if (mask & kInexact ) newm |= _MM_MASK_INEXACT;
1014 _MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~newm);
1017 #if defined(R__MACOSX) && !defined(__SSE2__) && \ 1018 (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__arm64__)) 1020 if (mask & kInvalid ) newm |= FE_INVALID;
1021 if (mask & kDivByZero) newm |= FE_DIVBYZERO;
1022 if (mask & kOverflow ) newm |= FE_OVERFLOW;
1023 if (mask & kUnderflow) newm |= FE_UNDERFLOW;
1024 if (mask & kInexact ) newm |= FE_INEXACT;
1028 #if defined(__arm__) 1029 cur.__fpscr &= ~newm;
1030 #elif defined(__arm64__) 1031 cur.__fpcr &= ~newm;
1033 cur.__control &= ~newm;
1038 #if defined(R__MACOSX) && !defined(__SSE2__) && !defined(__xlC__) && \ 1039 !defined(__i386__) && !defined(__x86_64__) && !defined(__arm__) && \ 1042 if (mask & kInvalid ) newm |= FE_ENABLE_INVALID;
1043 if (mask & kDivByZero) newm |= FE_ENABLE_DIVBYZERO;
1044 if (mask & kOverflow ) newm |= FE_ENABLE_OVERFLOW;
1045 if (mask & kUnderflow) newm |= FE_ENABLE_UNDERFLOW;
1046 if (mask & kInexact ) newm |= FE_ENABLE_INEXACT;
1050 curmask = (curmask & ~FE_ENABLE_ALL_EXCEPT) | newm;
1062 Bool_t pollOnce = pendingOnly;
1071 if (!pendingOnly)
return;
1075 if (fNfd > 0 && fFileHandler && fFileHandler->GetSize() > 0)
1076 if (CheckDescriptors())
1077 if (!pendingOnly)
return;
1080 fWriteready->Zero();
1082 if (pendingOnly && !pollOnce)
1086 if (fSigcnt > 0 && fSignalHandler->GetSize() > 0)
1087 if (CheckSignals(
kTRUE))
1088 if (!pendingOnly)
return;
1094 if (fTimers && fTimers->GetSize() > 0)
1095 if (DispatchTimers(
kTRUE)) {
1097 nextto = NextTimeOut(
kTRUE);
1103 nextto = NextTimeOut(
kTRUE);
1105 if (fFileHandler && fFileHandler->GetSize() == 0)
1112 *fReadready = *fReadmask;
1113 *fWriteready = *fWritemask;
1119 if (mxfd == 0 && nextto == -1)
1122 fNfd = UnixSelect(mxfd, fReadready, fWriteready, nextto);
1123 if (fNfd < 0 && fNfd != -2) {
1126 for (fd = 0; fd < mxfd; fd++) {
1128 if (fReadmask->IsSet(fd)) {
1129 rc = UnixSelect(fd+1, &t, 0, 0);
1130 if (rc < 0 && rc != -2) {
1131 SysError(
"DispatchOneEvent",
"select: read error on %d", fd);
1135 if (fWritemask->IsSet(fd)) {
1136 rc = UnixSelect(fd+1, 0, &t, 0);
1137 if (rc < 0 && rc != -2) {
1138 SysError(
"DispatchOneEvent",
"select: write error on %d", fd);
1139 fWritemask->Clr(fd);
1155 tv.tv_sec = milliSec / 1000;
1156 tv.tv_usec = (milliSec % 1000) * 1000;
1158 select(0, 0, 0, 0, &tv);
1192 rc = UnixSelect(mxfd+1, &rd, &wr, to);
1233 rc = UnixSelect(mxfd+1, &rd, &wr, to);
1261 if (sync == sh->
IsSync()) {
1263 if ((fSignals->IsSet(sig) && sigdone == -1) || sigdone == sig) {
1264 if (sigdone == -1) {
1288 while ((pid = UnixWaitchild()) > 0) {
1289 TIter next(zombieHandler);
1290 register UnixPtty *pty;
1291 while ((pty = (UnixPtty*) next()))
1292 if (pty->GetPid() == pid) {
1293 zombieHandler->RemovePtr(pty);
1312 if ((fd <= fMaxrfd && fReadready->IsSet(fd) && fddone == -1) ||
1313 (fddone == fd && read)) {
1315 fReadready->Clr(fd);
1323 if ((fd <= fMaxwfd && fWriteready->IsSet(fd) && fddone == -1) ||
1324 (fddone == fd && !read)) {
1326 fWriteready->Clr(fd);
1349 TSystem *helper = FindHelper(name);
1353 return UnixMakedir(name);
1361 TSystem *helper = FindHelper(name);
1365 return UnixOpendir(name);
1373 TSystem *helper = FindHelper(0, dirp);
1380 ::closedir((DIR*)dirp);
1388 TSystem *helper = FindHelper(0, dirp);
1393 return UnixGetdirentry(dirp);
1424 return fWdpath.Data();
1434 return std::string(cwd);
1443 Error(
"WorkingDirectory",
"getcwd() failed");
1452 return UnixHomedirectory(userName);
1461 return std::string(UnixHomedirectory(userName, path, mydir));
1488 char *
b = ConcatFileName(dir ? dir : TempDirectory(), base);
1493 char *arg =
StrDup(base);
1494 int fd = mkstemp(arg);
1502 FILE *fp = fdopen(fd,
"w+");
1504 SysError(
"TempFileName",
"converting filedescriptor (%d)", fd);
1514 if (name.
IsNull() || name ==
".") {
1517 if (dir[strlen(dir) - 1] !=
'/')
1523 if (!dir || !dir[0]) dir =
"/";
1524 else if (dir[strlen(dir) - 1] !=
'/')
1540 TSystem *helper = FindHelper(path);
1544 if (::access(StripOffProto(path,
"file:"), mode) == 0)
1546 GetLastErrorString() = GetError();
1559 if (!AccessPathName(t) && !overwrite)
1562 FILE *from = fopen(f,
"r");
1566 FILE *to = fopen(t,
"w");
1572 const int bufsize = 1024;
1575 while (!ret && !feof(from)) {
1576 size_t numread = fread (buf,
sizeof(
char), bufsize, from);
1577 size_t numwritten = fwrite(buf,
sizeof(
char), numread, to);
1578 if (numread != numwritten)
1593 int ret = ::rename(f, t);
1594 GetLastErrorString() = GetError();
1604 TSystem *helper = FindHelper(path);
1619 TSystem *helper = FindHelper(path);
1623 return UnixFilestat(path, buf);
1638 return UnixFSstat(path,
id, bsize, blocks, bfree);
1647 return ::link(from, to);
1657 return ::symlink((
char*)from, (
char*)to);
1659 return ::symlink(from, to);
1669 TSystem *helper = FindHelper(name);
1671 return helper->
Unlink(name);
1673 #if defined(R__SEEK64) 1674 struct stat64 finfo;
1675 if (lstat64(name, &finfo) < 0)
1678 if (lstat(name, &finfo) < 0)
1682 if (S_ISDIR(finfo.st_mode))
1683 return ::rmdir(name);
1685 return ::unlink(name);
1694 kShellEscape =
'\\',
1695 *kShellStuff =
"(){}<>\"'",
1700 #ifndef G__OLDEXPAND 1710 const char *p, *patbuf = (
const char *)path;
1713 while (*patbuf ==
' ')
1717 for (p = patbuf; *p; p++)
1728 return ExpandFileName(path);
1742 const char *patbuf = (
const char *)patbuf0;
1751 while (*patbuf ==
' ')
1755 for (p = patbuf; *p; p++)
1767 EscChar(patbuf, stuffedPat,
sizeof(stuffedPat), (
char*)kShellStuff, kShellEscape);
1772 if (stuffedPat[0] ==
'~') {
1773 if (stuffedPat[1] !=
'\0' && stuffedPat[1] !=
'/') {
1775 for (p = &stuffedPat[1], q = name; *p && *p !=
'/';)
1778 hd = UnixHomedirectory(name);
1786 hd = UnixHomedirectory(0);
1788 GetLastErrorString() = GetError();
1792 cmd += &stuffedPat[1];
1797 if ((pf = ::popen(cmd.
Data(),
"r")) == 0) {
1798 GetLastErrorString() = GetError();
1808 for (ch = fgetc(pf); ch != EOF && ch !=
' ' && ch !=
'\n'; ch = fgetc(pf)) {
1814 if (cnt == 0 && ch == EOF)
goto again;
1820 if (ch ==
' ' || ch ==
'\t') {
1821 GetLastErrorString() =
"expression ambigous";
1844 if (ExpandPathName(patbuf))
1854 return ::chmod(file, mode);
1862 return ::umask(mask);
1875 t.actime = (time_t)actime;
1876 t.modtime = (time_t)modtime;
1877 return ::utime(file, &t);
1890 show.
Form(
"Which: %s =", wfil.
Data());
1894 if (wfil[0] ==
'/') {
1895 #if defined(R__SEEK64) 1896 struct stat64 finfo;
1897 if (access(wfil.
Data(), mode) == 0 &&
1898 stat64(wfil.
Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1901 if (access(wfil.
Data(), mode) == 0 &&
1902 stat(wfil.
Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1919 for (
const char* ptr = search; *ptr;) {
1921 if (*ptr !=
'/' && *ptr !=
'$' && *ptr !=
'~')
1923 const char* posEndOfPart = strchr(ptr,
':');
1925 name.
Append(ptr, posEndOfPart - ptr);
1926 ptr = posEndOfPart + 1;
1937 #if defined(R__SEEK64) 1938 struct stat64 finfo;
1939 if (access(name.
Data(), mode) == 0 &&
1940 stat64(name.
Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1943 if (access(name.
Data(), mode) == 0 &&
1944 stat(name.
Data(), &finfo) == 0 && S_ISREG(finfo.st_mode)) {
1966 if (!user || !user[0])
1969 struct passwd *apwd = getpwnam(user);
1990 if (!group || !group[0])
1993 struct group *grp = getgrnam(group);
2016 static UserInfoCache_t gUserInfo;
2018 UserInfoCache_t::const_iterator iUserInfo = gUserInfo.find(uid);
2019 if (iUserInfo != gUserInfo.end())
2022 struct passwd *apwd = getpwuid(uid);
2035 gUserInfo[uid] = *ug;
2048 return GetUserInfo(GetUid(user));
2060 struct group *grp = getgrgid(gid);
2080 return GetGroupInfo(GetGid(group));
2090 ::setenv(name, value, 1);
2098 return ::getenv(name);
2116 return ::system(shellcmd);
2124 return ::popen(command, mode);
2132 return ::pclose(pipe);
2151 gROOT->EndOfProcessCleanups();
2173 #include <mach/mach.h> 2181 typedef CSTypeRef CSSymbolicatorRef;
2182 typedef CSTypeRef CSSourceInfoRef;
2183 typedef CSTypeRef CSSymbolOwnerRef;
2184 typedef CSTypeRef CSSymbolRef;
2186 CSSymbolicatorRef CSSymbolicatorCreateWithPid(pid_t pid);
2187 CSSourceInfoRef CSSymbolicatorGetSourceInfoWithAddressAtTime(CSSymbolicatorRef cs, vm_address_t addr, uint64_t time);
2188 CSSymbolRef CSSourceInfoGetSymbol(CSSourceInfoRef info);
2189 const char* CSSymbolGetName(CSSymbolRef
sym);
2190 CSSymbolOwnerRef CSSourceInfoGetSymbolOwner(CSSourceInfoRef info);
2191 const char* CSSymbolOwnerGetPath(CSSymbolOwnerRef symbol);
2192 const char* CSSourceInfoGetPath(CSSourceInfoRef info);
2193 int CSSourceInfoGetLineNumber(CSSourceInfoRef info);
2196 void macosx_backtrace() {
2197 void* addrlist[kMAX_BACKTRACE_DEPTH];
2199 int numstacks = backtrace( addrlist,
sizeof( addrlist ) /
sizeof(
void* ));
2201 CSSymbolicatorRef symbolicator = CSSymbolicatorCreateWithPid(getpid());
2204 static const int skipFrames = 2;
2205 for (
int i = skipFrames; i < numstacks; ++i) {
2206 CSSourceInfoRef sourceInfo
2207 = CSSymbolicatorGetSourceInfoWithAddressAtTime(symbolicator,
2208 (vm_address_t)addrlist[i],
2211 CSSymbolOwnerRef symOwner = CSSourceInfoGetSymbolOwner(sourceInfo);
2212 if (
const char* libPath = CSSymbolOwnerGetPath(symOwner)) {
2213 printf(
"[%s]", libPath);
2215 printf(
"[<unknown binary>]");
2218 CSSymbolRef
sym = CSSourceInfoGetSymbol(sourceInfo);
2219 if (
const char* symname = CSSymbolGetName(sym)) {
2220 printf(
" %s %s:%d", symname, CSSourceInfoGetPath(sourceInfo),
2221 (
int)CSSourceInfoGetLineNumber(sourceInfo));
2238 gdbscript = gdbscript.
Strip();
2239 if (gdbscript !=
"") {
2241 fprintf(stderr,
"Root.StacktraceScript %s does not exist\n", gdbscript.
Data());
2247 if (gdbscript ==
"") {
2249 gdbscript.
Form(
"%s/gdb-backtrace.sh", ROOTETCDIR);
2251 gdbscript.
Form(
"%s/etc/gdb-backtrace.sh", Getenv(
"ROOTSYS"));
2254 fprintf(stderr,
"Error in <TUnixSystem::StackTrace> script %s is missing\n", gdbscript.
Data());
2261 gdbmess = gdbmess.
Strip();
2269 int fd = STDERR_FILENO;
2271 const char *message =
" Generating stack trace...\n";
2273 if (fd && message) { }
2276 Getlinem(kCleanUp, 0);
2278 #if defined(USE_GDB_STACK_TRACE) 2281 fprintf(stderr,
"gdb not found, need it for stack trace\n");
2286 TString gdbmessf =
"gdb-message";
2287 if (gdbmess !=
"") {
2288 FILE *
f = TempFileName(gdbmessf);
2289 fprintf(f,
"%s\n", gdbmess.
Data());
2296 gdbscript += GetPid();
2297 if (gdbmess !=
"") {
2299 gdbscript += gdbmessf;
2301 gdbscript +=
" 1>&2";
2306 #elif defined(R__AIX) 2307 TString script =
"procstack ";
2311 #elif defined(R__SOLARIS) 2322 #elif defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_DLADDR) // linux + MacOS X >= 10.5 2330 const char *cppfilt =
"c++filt";
2331 const char *cppfiltarg =
"";
2333 const char *format1 =
" 0x%016lx in %.200s %s 0x%lx from %.200s\n";
2335 const char *format2 =
" 0x%016lx in %.200s\n";
2337 const char *format2 =
" 0x%016lx in %.200s at %.200s from %.200s\n";
2339 const char *format3 =
" 0x%016lx in %.200s from %.200s\n";
2340 const char *format4 =
" 0x%016lx in <unknown function>\n";
2342 const char *format1 =
" 0x%08lx in %.200s %s 0x%lx from %.200s\n";
2344 const char *format2 =
" 0x%08lx in %.200s\n";
2346 const char *format2 =
" 0x%08lx in %.200s at %.200s from %.200s\n";
2348 const char *format3 =
" 0x%08lx in %.200s from %.200s\n";
2349 const char *format4 =
" 0x%08lx in <unknown function>\n";
2361 while (help.
Gets(p)) {
2363 cppfiltarg =
"--format=gnu-v3";
2365 }
else if (help.
Index(
"gnu-new-abi") !=
kNPOS) {
2366 cppfiltarg =
"--format=gnu-new-abi";
2375 #if (defined(R__LINUX) && !defined(R__WINGCC)) 2378 #ifdef PR_SET_PTRACER 2379 prctl(PR_SET_PTRACER, getpid(), 0, 0, 0);
2385 TString gdbmessf =
"gdb-message";
2386 if (gdbmess !=
"") {
2387 FILE *
f = TempFileName(gdbmessf);
2388 fprintf(f,
"%s\n", gdbmess.
Data());
2397 gdbscript += GetPid();
2398 if (gdbmess !=
"") {
2400 gdbscript += gdbmessf;
2402 gdbscript +=
" 1>&2";
2415 if (
write(fd, message, strlen(message)) < 0)
2420 TString tmpf1 =
"gdb-backtrace";
2421 std::ofstream file1;
2423 FILE *
f = TempFileName(tmpf1);
2427 Error(
"StackTrace",
"could not open file %s", tmpf1.
Data());
2439 void *trace[kMAX_BACKTRACE_DEPTH];
2440 int depth = backtrace(trace, kMAX_BACKTRACE_DEPTH);
2441 for (
int n = 5;
n < depth;
n++) {
2445 if (dladdr(trace[
n], &info) && info.dli_fname && info.dli_fname[0]) {
2446 const char *libname = info.dli_fname;
2447 const char *symname = (info.dli_sname && info.dli_sname[0]) ?
2448 info.dli_sname :
"<unknown>";
2451 Bool_t gte = (addr >= symaddr);
2452 ULong_t diff = (gte) ? addr - symaddr : symaddr - addr;
2453 if (addr2line && symaddr) {
2457 #if defined(MAC_OS_X_VERSION_10_10) 2458 snprintf(buffer,
sizeof(buffer),
"%s -p %d 0x%016lx", addr2line, GetPid(), addr);
2459 #elif defined(MAC_OS_X_VERSION_10_9) 2461 snprintf(buffer,
sizeof(buffer),
"%s -d -p %d 0x%016lx", addr2line, GetPid(), addr);
2463 snprintf(buffer,
sizeof(buffer),
"%s -p %d 0x%016lx", addr2line, GetPid(), addr);
2466 ULong_t offset = (addr >= libaddr) ? addr - libaddr :
2471 if (name[0] !=
'/') noPath =
kTRUE;
2473 if (noShare) offset = addr;
2474 if (noPath) name =
"`which " + name +
"`";
2475 snprintf(buffer,
sizeof(buffer),
"%s -e %s 0x%016lx", addr2line, name.
Data(), offset);
2477 if (FILE *pf = ::popen(buffer,
"r")) {
2479 if (fgets(buf, 2048, pf)) {
2480 buf[strlen(buf)-1] = 0;
2481 if (strncmp(buf,
"??", 2)) {
2483 snprintf(buffer,
sizeof(buffer), format2, addr, buf);
2485 snprintf(buffer,
sizeof(buffer), format2, addr, symname, buf, libname);
2493 snprintf(buffer,
sizeof(buffer), format1, addr, symname,
2494 gte ?
"+" :
"-", diff, libname);
2497 snprintf(buffer,
sizeof(buffer), format1, addr, symname,
2498 gte ?
"+" :
"-", diff, libname);
2500 snprintf(buffer,
sizeof(buffer), format3, addr, symname, libname);
2503 snprintf(buffer,
sizeof(buffer), format4, addr);
2509 if (
write(fd, buffer, ::strlen(buffer)) < 0)
2514 TString tmpf2 =
"gdb-backtrace";
2515 FILE *
f = TempFileName(tmpf2);
2518 snprintf(buffer,
sizeof(buffer),
"%s %s < %s > %s", filter, cppfiltarg, tmpf1.
Data(), tmpf2.
Data());
2520 std::ifstream file2(tmpf2);
2533 delete [] addr2line;
2536 #elif defined(HAVE_EXCPT_H) && defined(HAVE_PDSC_H) && \ 2537 defined(HAVE_RLD_INTERFACE_H) // tru64 2546 exc_capture_context (&context);
2547 while (!rc && context.sc_pc) {
2549 pdsc_crd *
func, *base, *crd
2550 = exc_remote_lookup_function_entry(0, 0, context.sc_pc, 0, &func, &base);
2551 Elf32_Addr addr = PDSC_CRD_BEGIN_ADDRESS(base, func);
2553 const char *
name =
"<unknown function>";
2554 sprintf(buffer,
" 0x%012lx %.200s + 0x%lx\n",
2555 context.sc_pc, name, context.sc_pc - addr);
2556 write(fd, buffer, ::strlen(buffer));
2557 rc = exc_virtual_unwind(0, &context);
2602 ::openlog(name, options, fac);
2612 ::syslog(level,
"%s", mess);
2652 const char *tty = ttyname(STDOUT_FILENO);
2656 if ((xh->
fStdOutDup = dup(STDOUT_FILENO)) < 0) {
2664 const char *tty = ttyname(STDERR_FILENO);
2668 if ((xh->
fStdErrDup = dup(STDERR_FILENO)) < 0) {
2670 if (outdone && dup2(xh->
fStdOutDup, STDOUT_FILENO) < 0) {
2671 Warning(
"RedirectOutput",
"could not restore stdout (back to original redirected" 2680 const char *
m = (mode[0] ==
'a' || mode[0] ==
'w') ? mode :
"a";
2693 if (freopen(file, m, stdout) == 0) {
2697 if (freopen(file, m, stderr) == 0) {
2713 if (
close(STDOUT_FILENO) != 0) {
2715 "problems closing STDOUT_FILENO (%d) before 'dup2' (errno: %d)",
2719 if (dup2(xh->
fStdOutDup, STDOUT_FILENO) < 0) {
2720 SysError(
"RedirectOutput",
"could not restore stdout (back to original redirected" 2726 "problems closing temporary 'out' descriptor %d (errno: %d)",
2739 if (
close(STDERR_FILENO) != 0) {
2741 "problems closing STDERR_FILENO (%d) before 'dup2' (errno: %d)",
2745 if (dup2(xh->
fStdErrDup, STDERR_FILENO) < 0) {
2746 SysError(
"RedirectOutput",
"could not restore stderr (back to original redirected" 2752 "problems closing temporary 'err' descriptor %d (errno: %d)",
2797 Error(
"ListSymbols",
"not yet implemented");
2819 if (!linkedLibs.
IsNull())
2825 #if !defined(R__MACOSX) 2831 #if defined(R__MACOSX) 2833 linkedLibs = gLinkedDylibs;
2837 while (otool.
Gets(p)) {
2842 if (!linkedLibs.
IsNull())
2844 linkedLibs += dylib;
2852 #elif defined(R__LINUX) || defined(R__SOLARIS) || defined(R__AIX) 2853 #if defined(R__WINGCC ) 2854 const char *cLDD=
"cygcheck";
2855 const char *cSOEXT=
".dll";
2856 size_t lenexe = strlen(exe);
2857 if (strcmp(exe + lenexe - 4,
".exe")
2858 && strcmp(exe + lenexe - 4,
".dll")) {
2861 char* longerexe =
new char[lenexe + 5];
2862 strlcpy(longerexe, exe,lenexe+5);
2863 strlcat(longerexe,
".exe",lenexe+5);
2867 TRegexp sovers =
"\\.so\\.[0-9]+";
2869 const char *cLDD=
"ldd";
2871 const char *cSOEXT=
".a";
2872 TRegexp sovers =
"\\.a\\.[0-9]+";
2874 const char *cSOEXT=
".so";
2875 TRegexp sovers =
"\\.so\\.[0-9]+";
2881 while (ldd.
Gets(p)) {
2900 if (!linkedLibs.
IsNull())
2902 linkedLibs += solib;
2936 if (!fTimers)
return kFALSE;
2938 fInsideNotify =
kTRUE;
2947 if (mode && t->
IsSync()) {
2950 }
else if (!mode && t->
IsAsync()) {
2952 UnixSetitimer(NextTimeOut(
kFALSE));
2981 UnixSetitimer(NextTimeOut(
kFALSE));
2990 if (!fInsideNotify && ti && ti->
IsAsync())
2991 UnixSetitimer(NextTimeOut(
kFALSE));
3005 #ifdef HASNOT_INETATON 3006 isinaddr = (addr = (
UInt_t)inet_addr(hostname)) != INADDR_NONE) ?
kTRUE :
kFALSE;
3009 isinaddr = inet_aton(hostname, &ad);
3010 if (isinaddr) memcpy(&addr, &ad.s_addr,
sizeof(ad.s_addr));
3013 std::string host(hostname);
3015 struct sockaddr_in sin;
3016 sin.sin_family = AF_INET;
3018 memcpy(&sin.sin_addr.s_addr, &addr,
sizeof(sin.sin_addr.s_addr));
3019 memset(&sin.sin_zero[0], 0,
sizeof(sin.sin_zero));
3020 struct sockaddr *sa = (
struct sockaddr *) &sin;
3022 char hbuf[NI_MAXHOST];
3024 int rc = getnameinfo(sa,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
nullptr, 0, NI_NAMEREQD);
3026 if (rc == EAI_NONAME) {
3028 Error(
"GetHostByName",
"unknown host '%s'", hostname);
3031 Error(
"GetHostByName",
"getnameinfo failed for '%s': '%s'", hostname, gai_strerror(rc));
3039 struct addrinfo hints;
3040 memset(&hints, 0,
sizeof(
struct addrinfo));
3041 hints.ai_family = AF_INET;
3042 hints.ai_socktype = 0;
3043 hints.ai_flags = AI_CANONNAME;
3044 hints.ai_protocol = 0;
3045 hints.ai_canonname =
nullptr;
3046 hints.ai_addr =
nullptr;
3047 hints.ai_next =
nullptr;
3049 struct addrinfo *res;
3050 int rc = getaddrinfo(host.c_str(),
nullptr, &hints, &res);
3052 if (rc == EAI_NONAME) {
3054 Error(
"GetHostByName",
"unknown host '%s'", host.c_str());
3057 Error(
"GetHostByName",
"getaddrinfo failed for '%s': '%s'", host.c_str(), gai_strerror(rc));
3061 if (res[0].ai_canonname) host = res[0].ai_canonname;
3064 ntohl(((sockaddr_in *)(res[0].ai_addr))->sin_addr.s_addr),
3066 struct addrinfo *rp = res[0].ai_next;
3067 for (; rp !=
NULL; rp = rp->ai_next) {
3068 UInt_t arp = ntohl(((sockaddr_in *)(rp->ai_addr))->sin_addr.s_addr);
3069 std::vector<UInt_t> addrs =
a.GetAddresses();
3071 for (
UInt_t sad : addrs) {
3078 a.AddAddress(ntohl(((sockaddr_in *)(rp->ai_addr))->sin_addr.s_addr));
3079 if (rp->ai_canonname)
a.AddAlias(rp->ai_canonname);
3093 struct sockaddr_in addr;
3094 #if defined(USE_SIZE_T) 3095 size_t len =
sizeof(addr);
3096 #elif defined(USE_SOCKLEN_T) 3097 socklen_t len =
sizeof(addr);
3099 int len =
sizeof(addr);
3102 if (getsockname(sock, (
struct sockaddr *)&addr, &len) == -1) {
3103 SysError(
"GetSockName",
"getsockname");
3107 struct sockaddr *sa = (
struct sockaddr *) &addr;
3108 char hbuf[NI_MAXHOST];
3110 if ((rc = getnameinfo(sa,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
3111 nullptr, 0, 0)) == 0) {
3115 a.
fPort = ntohs(addr.sin_port);
3121 memcpy(&iaddr, &addr.sin_addr,
sizeof(addr.sin_addr));
3122 return TInetAddress(
"????", ntohl(iaddr), AF_INET, ntohs(addr.sin_port));
3130 struct sockaddr_in addr;
3131 #if defined(USE_SIZE_T) 3132 size_t len =
sizeof(addr);
3133 #elif defined(USE_SOCKLEN_T) 3134 socklen_t len =
sizeof(addr);
3136 int len =
sizeof(addr);
3139 if (getpeername(sock, (
struct sockaddr *)&addr, &len) == -1) {
3140 SysError(
"GetPeerName",
"getpeername");
3145 struct sockaddr *sa = (
struct sockaddr *) &addr;
3146 char hbuf[NI_MAXHOST];
3147 if ((rc = getnameinfo(sa,
sizeof(
struct sockaddr), hbuf,
sizeof(hbuf),
3148 nullptr, 0, 0)) == 0) {
3152 a.
fPort = ntohs(addr.sin_port);
3158 memcpy(&iaddr, &addr.sin_addr,
sizeof(addr.sin_addr));
3159 return TInetAddress(
"????", ntohl(iaddr), AF_INET, ntohs(addr.sin_port));
3169 if ((sp = getservbyname(servicename,
kProtocolName)) == 0) {
3170 Error(
"GetServiceByName",
"no service \"%s\" with protocol \"%s\"\n",
3174 return ntohs(sp->s_port);
3184 if ((sp = getservbyport(htons(port),
kProtocolName)) == 0) {
3187 return Form(
"%d", port);
3196 int tcpwindowsize,
const char *protocol)
3198 if (!strcmp(servername,
"unix")) {
3199 return UnixUnixConnect(port);
3201 return UnixUnixConnect(servername);
3204 if (!strcmp(protocol,
"udp")){
3205 return UnixUdpConnect(servername, port);
3208 return UnixTcpConnect(servername, port, tcpwindowsize);
3221 return ConnectService(server, port, tcpwindowsize, protocol);
3238 return UnixTcpService(port, reuse, backlog, tcpwindowsize);
3246 return UnixUdpService(port, backlog);
3254 return UnixUnixService(port, backlog);
3262 return UnixUnixService(sockpath, backlog);
3274 while ((soc = ::accept(sock, 0, 0)) == -1 &&
GetErrno() == EINTR)
3281 SysError(
"AcceptConnection",
"accept");
3294 if (sock < 0)
return;
3296 #if !defined(R__AIX) || defined(_AIX41) || defined(_AIX43) 3298 ::shutdown(sock, 2);
3314 if (UnixRecv(sock, &header,
sizeof(header), 0) > 0) {
3315 int count = ntohl(header);
3317 if (count > length) {
3318 Error(
"RecvBuf",
"record header exceeds buffer size");
3320 }
else if (count > 0) {
3321 if (UnixRecv(sock, buf, count, 0) < 0) {
3322 Error(
"RecvBuf",
"cannot receive buffer");
3337 Int_t header = htonl(length);
3339 if (UnixSend(sock, &header,
sizeof(header), 0) < 0) {
3340 Error(
"SendBuf",
"cannot send header");
3344 if (UnixSend(sock, buf, length, 0) < 0) {
3345 Error(
"SendBuf",
"cannot send buffer");
3385 if ((n = UnixRecv(sock, buf, length, flag)) <= 0) {
3386 if (n == -1 &&
GetErrno() != EINTR)
3387 Error(
"RecvRaw",
"cannot receive buffer");
3420 if ((n = UnixSend(sock, buf, length, flag)) <= 0) {
3421 if (n == -1 &&
GetErrno() != EINTR)
3422 Error(
"SendRaw",
"cannot send buffer");
3433 if (sock < 0)
return -1;
3437 if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)&val,
sizeof(val)) == -1) {
3438 SysError(
"SetSockOpt",
"setsockopt(SO_SNDBUF)");
3443 if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)&val,
sizeof(val)) == -1) {
3444 SysError(
"SetSockOpt",
"setsockopt(SO_RCVBUF)");
3449 if (setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)&val,
sizeof(val)) == -1) {
3450 SysError(
"SetSockOpt",
"setsockopt(SO_OOBINLINE)");
3455 if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)&val,
sizeof(val)) == -1) {
3456 SysError(
"SetSockOpt",
"setsockopt(SO_KEEPALIVE)");
3461 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)&val,
sizeof(val)) == -1) {
3462 SysError(
"SetSockOpt",
"setsockopt(SO_REUSEADDR)");
3467 if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)&val,
sizeof(val)) == -1) {
3468 SysError(
"SetSockOpt",
"setsockopt(TCP_NODELAY)");
3473 if (ioctl(sock, FIONBIO, (
char*)&val) == -1) {
3474 SysError(
"SetSockOpt",
"ioctl(FIONBIO)");
3480 if (ioctl(sock, SIOCSPGRP, (
char*)&val) == -1) {
3481 SysError(
"SetSockOpt",
"ioctl(SIOCSPGRP)");
3485 Error(
"SetSockOpt",
"ioctl(SIOCGPGRP) not supported on cygwin/gcc");
3492 Error(
"SetSockOpt",
"illegal option (%d)", opt);
3503 if (sock < 0)
return -1;
3505 #if defined(USE_SOCKLEN_T) || defined(_AIX43) 3506 socklen_t optlen =
sizeof(*val);
3507 #elif defined(USE_SIZE_T) 3508 size_t optlen =
sizeof(*val);
3510 int optlen =
sizeof(*val);
3515 if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)val, &optlen) == -1) {
3516 SysError(
"GetSockOpt",
"getsockopt(SO_SNDBUF)");
3521 if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)val, &optlen) == -1) {
3522 SysError(
"GetSockOpt",
"getsockopt(SO_RCVBUF)");
3527 if (getsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)val, &optlen) == -1) {
3528 SysError(
"GetSockOpt",
"getsockopt(SO_OOBINLINE)");
3533 if (getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)val, &optlen) == -1) {
3534 SysError(
"GetSockOpt",
"getsockopt(SO_KEEPALIVE)");
3539 if (getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)val, &optlen) == -1) {
3540 SysError(
"GetSockOpt",
"getsockopt(SO_REUSEADDR)");
3545 if (getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)val, &optlen) == -1) {
3546 SysError(
"GetSockOpt",
"getsockopt(TCP_NODELAY)");
3552 if ((flg = fcntl(sock, F_GETFL, 0)) == -1) {
3553 SysError(
"GetSockOpt",
"fcntl(F_GETFL)");
3556 *val = flg & O_NDELAY;
3559 #if !defined(R__LYNXOS) && !defined(R__WINGCC) 3560 if (ioctl(sock, SIOCGPGRP, (
char*)val) == -1) {
3561 SysError(
"GetSockOpt",
"ioctl(SIOCGPGRP)");
3565 Error(
"GetSockOpt",
"ioctl(SIOCGPGRP) not supported on LynxOS and cygwin/gcc");
3570 #if !defined(R__LYNXOS) 3571 if (ioctl(sock, SIOCATMARK, (
char*)val) == -1) {
3572 SysError(
"GetSockOpt",
"ioctl(SIOCATMARK)");
3576 Error(
"GetSockOpt",
"ioctl(SIOCATMARK) not supported on LynxOS");
3581 #if !defined(R__LYNXOS) 3582 if (ioctl(sock, FIONREAD, (
char*)val) == -1) {
3583 SysError(
"GetSockOpt",
"ioctl(FIONREAD)");
3587 Error(
"GetSockOpt",
"ioctl(FIONREAD) not supported on LynxOS");
3592 Error(
"GetSockOpt",
"illegal option (%d)", opt);
3607 static struct Signalmap_t {
3610 struct sigaction *fOldHandler;
3611 const char *fSigName;
3613 { SIGBUS, 0, 0,
"bus error" },
3614 { SIGSEGV, 0, 0,
"segmentation violation" },
3615 { SIGSYS, 0, 0,
"bad argument to system call" },
3616 { SIGPIPE, 0, 0,
"write on a pipe with no one to read it" },
3617 { SIGILL, 0, 0,
"illegal instruction" },
3618 { SIGQUIT, 0, 0,
"quit" },
3619 { SIGINT, 0, 0,
"interrupt" },
3620 { SIGWINCH, 0, 0,
"window size change" },
3621 { SIGALRM, 0, 0,
"alarm clock" },
3622 { SIGCHLD, 0, 0,
"death of a child" },
3623 { SIGURG, 0, 0,
"urgent data arrived on an I/O channel" },
3624 { SIGFPE, 0, 0,
"floating point exception" },
3625 { SIGTERM, 0, 0,
"termination signal" },
3626 { SIGUSR1, 0, 0,
"user-defined signal 1" },
3627 { SIGUSR2, 0, 0,
"user-defined signal 2" }
3660 Break(
"TUnixSystem::DispatchSignals",
"%s", UnixSigname(sig));
3672 Break(
"TUnixSystem::DispatchSignals",
"%s", UnixSigname(sig));
3684 if (fSigcnt > 0 && fSignalHandler->GetSize() > 0)
3697 struct sigaction sigact;
3700 gSignalMap[sig].fOldHandler =
new struct sigaction();
3704 #elif defined(R__SOLARIS) 3706 #elif defined(R__LYNXOS) 3715 sigemptyset(&sigact.sa_mask);
3716 sigact.sa_flags = 0;
3717 #if defined(SA_RESTART) 3718 sigact.sa_flags |= SA_RESTART;
3720 if (sigaction(
gSignalMap[sig].fCode, &sigact,
3722 ::SysError(
"TUnixSystem::UnixSignal",
"sigaction");
3733 TTHREAD_TLS_ARRAY(
struct sigaction,
kMAXSIGNALS,oldsigact);
3735 if (ignore != ignoreSig[sig]) {
3736 ignoreSig[sig] = ignore;
3738 struct sigaction sigact;
3740 sigact.sa_handler = (
void (*)())SIG_IGN;
3741 #elif defined(R__SOLARIS) 3742 sigact.sa_handler = (
void (*)(int))SIG_IGN;
3744 sigact.sa_handler = SIG_IGN;
3746 sigemptyset(&sigact.sa_mask);
3747 sigact.sa_flags = 0;
3748 if (sigaction(
gSignalMap[sig].fCode, &sigact, &oldsigact[sig]) < 0)
3749 ::SysError(
"TUnixSystem::UnixIgnoreSignal",
"sigaction");
3751 if (sigaction(
gSignalMap[sig].fCode, &oldsigact[sig], 0) < 0)
3752 ::SysError(
"TUnixSystem::UnixIgnoreSignal",
"sigaction");
3768 struct sigaction sigact;
3771 #elif defined(R__SOLARIS) 3773 #elif defined(R__LYNXOS) 3782 sigemptyset(&sigact.sa_mask);
3783 sigact.sa_flags = 0;
3785 #if defined(SA_INTERRUPT) // SunOS 3786 sigact.sa_flags |= SA_INTERRUPT;
3789 #if defined(SA_RESTART) 3790 sigact.sa_flags |= SA_RESTART;
3794 ::SysError(
"TUnixSystem::UnixSigAlarmInterruptsSyscalls",
"sigaction");
3814 ::SysError(
"TUnixSystem::UnixSignal",
"sigaction");
3837 static std::atomic<time_t> jan95{0};
3848 jan95 = mktime(&tp);
3849 if ((
int)jan95 == -1) {
3850 ::SysError(
"TUnixSystem::UnixNow",
"error converting 950001 0:00 to time_t");
3856 gettimeofday(&t, 0);
3865 struct itimerval itv;
3866 itv.it_value.tv_sec = 0;
3867 itv.it_value.tv_usec = 0;
3868 itv.it_interval.tv_sec = 0;
3869 itv.it_interval.tv_usec = 0;
3871 itv.it_value.tv_sec = time_t(ms / 1000);
3872 itv.it_value.tv_usec = time_t((ms % 1000) * 1000);
3874 int st = setitimer(ITIMER_REAL, &itv, 0);
3876 ::SysError(
"TUnixSystem::UnixSetitimer",
"setitimer");
3894 fd_set *rd = (readready) ? (fd_set*)readready->GetBits() : 0;
3895 fd_set *wr = (writeready) ? (fd_set*)writeready->GetBits() : 0;
3899 tv.tv_sec =
Int_t(timeout / 1000);
3900 tv.tv_usec = (timeout % 1000) * 1000;
3901 retcode = select(nfds, rd, wr, 0, &tv);
3903 retcode = select(nfds, rd, wr, 0, 0);
3905 if (retcode == -1) {
3926 return UnixHomedirectory(name, path, mydir);
3936 pw = getpwnam(name);
3945 pw = getpwuid(getuid());
3966 return ::mkdir(StripOffProto(dir,
"file:"), 0755);
3976 const char *edir = StripOffProto(dir,
"file:");
3978 if (stat(edir, &finfo) < 0)
3981 if (!S_ISDIR(finfo.st_mode))
3984 return (
void*) opendir(edir);
3987 #if defined(_POSIX_SOURCE) 3990 # define REAL_DIR_ENTRY(dp) 1 3992 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) 4000 DIR *dirp = (DIR*)dirp1;
4029 const char *path = StripOffProto(fpath,
"file:");
4032 #if defined(R__SEEK64) 4034 if (path && lstat64(path, &sbuf) == 0) {
4037 if (path && lstat(path, &sbuf) == 0) {
4039 buf.
fIsLink = S_ISLNK(sbuf.st_mode);
4041 #if defined(R__SEEK64) 4042 if (stat64(path, &sbuf) == -1) {
4044 if (stat(path, &sbuf) == -1) {
4049 buf.
fDev = sbuf.st_dev;
4050 buf.
fIno = sbuf.st_ino;
4051 buf.
fMode = sbuf.st_mode;
4052 buf.
fUid = sbuf.st_uid;
4053 buf.
fGid = sbuf.st_gid;
4054 buf.
fSize = sbuf.st_size;
4055 buf.
fMtime = sbuf.st_mtime;
4074 struct statfs statfsbuf;
4075 #if (defined(R__SOLARIS) && !defined(R__LINUX)) 4076 if (statfs(path, &statfsbuf,
sizeof(
struct statfs), 0) == 0) {
4077 *
id = statfsbuf.f_fstyp;
4078 *bsize = statfsbuf.f_bsize;
4079 *blocks = statfsbuf.f_blocks;
4080 *bfree = statfsbuf.f_bfree;
4082 if (statfs((
char*)path, &statfsbuf) == 0) {
4088 if (!strcmp(statfsbuf.f_fstypename, MOUNT_FFS) ||
4089 !strcmp(statfsbuf.f_fstypename, MOUNT_MFS))
4091 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_NFS))
4093 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_MSDOS))
4095 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_PROCFS))
4097 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_EXT2FS))
4099 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_CD9660))
4101 else if (!strcmp(statfsbuf.f_fstypename, MOUNT_NCPFS))
4106 *
id = statfsbuf.f_type;
4108 *bsize = statfsbuf.f_bsize;
4109 *blocks = statfsbuf.f_blocks;
4110 *bfree = statfsbuf.f_bavail;
4123 return (
int) waitpid(0, &status, WNOHANG);
4144 sport = htons(port);
4147 if (!addr.
IsValid())
return -1;
4150 struct sockaddr_in server;
4151 memset(&server, 0,
sizeof(server));
4152 memcpy(&server.sin_addr, &adr,
sizeof(adr));
4154 server.sin_port = sport;
4158 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4159 ::SysError(
"TUnixSystem::UnixTcpConnect",
"socket (%s:%d)",
4164 if (tcpwindowsize > 0) {
4169 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
4173 ::SysError(
"TUnixSystem::UnixTcpConnect",
"connect (%s:%d)",
4195 sport = htons(port);
4198 if (!addr.
IsValid())
return -1;
4201 struct sockaddr_in server;
4202 memset(&server, 0,
sizeof(server));
4203 memcpy(&server.sin_addr, &adr,
sizeof(adr));
4205 server.sin_port = sport;
4209 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
4210 ::SysError(
"TUnixSystem::UnixUdpConnect",
"socket (%s:%d)",
4215 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
4219 ::SysError(
"TUnixSystem::UnixUdpConnect",
"connect (%s:%d)",
4241 if (!sockpath || strlen(sockpath) <= 0) {
4242 ::SysError(
"TUnixSystem::UnixUnixConnect",
"socket path undefined");
4247 struct sockaddr_un unserver;
4248 unserver.sun_family = AF_UNIX;
4250 if (strlen(sockpath) >
sizeof(unserver.sun_path)-1) {
4251 ::Error(
"TUnixSystem::UnixUnixConnect",
"socket path %s, longer than max allowed length (%u)",
4252 sockpath, (
UInt_t)
sizeof(unserver.sun_path)-1);
4255 strcpy(unserver.sun_path, sockpath);
4258 if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
4259 ::SysError(
"TUnixSystem::UnixUnixConnect",
"socket");
4263 while (connect(sock, (
struct sockaddr*) &unserver, strlen(unserver.sun_path)+2) == -1) {
4267 ::SysError(
"TUnixSystem::UnixUnixConnect",
"connect");
4290 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
4291 short sport, tryport = kSOCKET_MINPORT;
4294 if (port == 0 && reuse) {
4295 ::Error(
"TUnixSystem::UnixTcpService",
"cannot do a port scan while reuse is true");
4302 sport = htons(port);
4306 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4307 ::SysError(
"TUnixSystem::UnixTcpService",
"socket");
4314 if (tcpwindowsize > 0) {
4319 struct sockaddr_in inserver;
4320 memset(&inserver, 0,
sizeof(inserver));
4321 inserver.sin_family = AF_INET;
4322 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
4323 inserver.sin_port = sport;
4327 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
4328 ::SysError(
"TUnixSystem::UnixTcpService",
"bind");
4335 inserver.sin_port = htons(tryport);
4336 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
4338 }
while (bret < 0 &&
GetErrno() == EADDRINUSE && tryport < kSOCKET_MAXPORT);
4340 ::SysError(
"TUnixSystem::UnixTcpService",
"bind (port scan)");
4347 if (::listen(sock, backlog)) {
4348 ::SysError(
"TUnixSystem::UnixTcpService",
"listen");
4365 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
4366 short sport, tryport = kSOCKET_MINPORT;
4372 sport = htons(port);
4376 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
4377 ::SysError(
"TUnixSystem::UnixUdpService",
"socket");
4381 struct sockaddr_in inserver;
4382 memset(&inserver, 0,
sizeof(inserver));
4383 inserver.sin_family = AF_INET;
4384 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
4385 inserver.sin_port = sport;
4389 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
4390 ::SysError(
"TUnixSystem::UnixUdpService",
"bind");
4397 inserver.sin_port = htons(tryport);
4398 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
4400 }
while (bret < 0 &&
GetErrno() == EADDRINUSE && tryport < kSOCKET_MAXPORT);
4402 ::SysError(
"TUnixSystem::UnixUdpService",
"bind (port scan)");
4409 if (::listen(sock, backlog)) {
4410 ::SysError(
"TUnixSystem::UnixUdpService",
"listen");
4427 oldumask = umask(0);
4439 unlink(sockpath.
Data());
4441 return UnixUnixService(sockpath, backlog);
4450 if (!sockpath || strlen(sockpath) <= 0) {
4451 ::SysError(
"TUnixSystem::UnixUnixService",
"socket path undefined");
4455 struct sockaddr_un unserver;
4459 memset(&unserver, 0,
sizeof(unserver));
4460 unserver.sun_family = AF_UNIX;
4462 if (strlen(sockpath) >
sizeof(unserver.sun_path)-1) {
4463 ::Error(
"TUnixSystem::UnixUnixService",
"socket path %s, longer than max allowed length (%u)",
4464 sockpath, (
UInt_t)
sizeof(unserver.sun_path)-1);
4467 strcpy(unserver.sun_path, sockpath);
4470 if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
4471 ::SysError(
"TUnixSystem::UnixUnixService",
"socket");
4475 if (::bind(sock, (
struct sockaddr*) &unserver, strlen(unserver.sun_path)+2)) {
4476 ::SysError(
"TUnixSystem::UnixUnixService",
"bind");
4482 if (::listen(sock, backlog)) {
4483 ::SysError(
"TUnixSystem::UnixUnixService",
"listen");
4502 if (sock < 0)
return -1;
4509 if (flag == MSG_PEEK)
4513 char *buf = (
char *)buffer;
4515 for (n = 0; n < length; n += nrecv) {
4516 if ((nrecv = recv(sock, buf+n, length-n, flag)) <= 0) {
4519 if (flag == MSG_OOB) {
4529 ::
SysError(
"TUnixSystem::UnixRecv",
"recv");
4550 if (sock < 0)
return -1;
4559 const char *buf = (
const char *)buffer;
4561 for (n = 0; n < length; n += nsent) {
4562 if ((nsent = send(sock, buf+n, length-n, flag)) <= 0) {
4569 ::
SysError(
"TUnixSystem::UnixSend",
"send");
4600 }
else if (reset || !initialized) {
4601 initialized =
kTRUE;
4606 rdynpath =
".:"; rdynpath += ROOTLIBDIR;
4608 rdynpath =
".:"; rdynpath +=
gRootDir; rdynpath +=
"/lib";
4612 #if defined (R__AIX) 4614 #elif defined(R__MACOSX) 4628 dynpath = ldpath; dynpath +=
":"; dynpath += rdynpath;
4632 if (!dynpath.
Contains(ROOTLIBDIR)) {
4633 dynpath +=
":"; dynpath += ROOTLIBDIR;
4637 dynpath +=
":"; dynpath +=
gRootDir; dynpath +=
"/lib";
4645 #if defined(R__WINGCC) || defined(R__MACOSX) 4646 if (!dynpath.
EndsWith(
":")) dynpath +=
":";
4647 dynpath +=
"/usr/local/lib:/usr/X11R6/lib:/usr/lib:/lib:";
4648 dynpath +=
"/lib/x86_64-linux-gnu:/usr/local/lib64:/usr/lib64:/lib64:";
4651 std::string cmd(
"LD_DEBUG=libs LD_PRELOAD=DOESNOTEXIST ls 2>&1");
4652 FILE *pf = popen(cmd.c_str (),
"r");
4656 if (fgets(buffer, 128, pf) !=
NULL)
4660 std::size_t from = result.find(
"search path=", result.find(
"(LD_LIBRARY_PATH)"));
4661 std::size_t to = result.find(
"(system search path)");
4662 if (from != std::string::npos && to != std::string::npos) {
4664 std::string sys_path = result.substr(from, to-from);
4665 sys_path.erase(std::remove_if(sys_path.begin(), sys_path.end(), isspace), sys_path.end());
4666 if (!dynpath.
EndsWith(
":")) dynpath +=
":";
4667 dynpath += sys_path.c_str();
4671 if (
gDebug > 0) std::cout <<
"dynpath = " << dynpath.
Data() << std::endl;
4717 char buf[PATH_MAX + 1];
4718 char *res = realpath(sLib.
Data(), buf);
4719 if (res) sLib = buf;
4725 const char* lib = sLib.
Data();
4727 if (len > 3 && (!strcmp(lib+len-3,
".so") ||
4728 !strcmp(lib+len-3,
".dl") ||
4729 !strcmp(lib+len-4,
".dll") ||
4730 !strcmp(lib+len-4,
".DLL") ||
4731 !strcmp(lib+len-6,
".dylib") ||
4732 !strcmp(lib+len-3,
".sl") ||
4733 !strcmp(lib+len-2,
".a"))) {
4738 Error(
"FindDynamicLibrary",
4739 "%s does not exist in %s", searchFor.
Data(), GetDynamicPath());
4742 static const char* exts[] = {
4743 ".so",
".dll",
".dylib",
".sl",
".dl",
".a", 0 };
4744 const char** ext = exts;
4756 Error(
"FindDynamicLibrary",
4757 "%s[.so | .dll | .dylib | .sl | .dl | .a] does not exist in %s",
4758 searchFor.
Data(), GetDynamicPath());
4765 #if defined(R__MACOSX) 4766 #include <sys/resource.h> 4767 #include <mach/mach.h> 4768 #include <mach/mach_error.h> 4773 static void GetDarwinSysInfo(
SysInfo_t *sysinfo)
4775 FILE *p =
gSystem->
OpenPipe(
"sysctl -n kern.ostype hw.model hw.ncpu hw.cpufrequency " 4776 "hw.busfrequency hw.l2cachesize hw.memsize",
"r");
4809 static void ReadDarwinCpu(
long *ticks)
4811 mach_msg_type_number_t count;
4813 host_cpu_load_info_data_t cpu;
4815 ticks[0] = ticks[1] = ticks[2] = ticks[3] = 0;
4817 count = HOST_CPU_LOAD_INFO_COUNT;
4818 kr = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&cpu, &count);
4819 if (kr != KERN_SUCCESS) {
4820 ::Error(
"TUnixSystem::ReadDarwinCpu",
"host_statistics: %s", mach_error_string(kr));
4822 ticks[0] = cpu.cpu_ticks[CPU_STATE_USER];
4823 ticks[1] = cpu.cpu_ticks[CPU_STATE_SYSTEM];
4824 ticks[2] = cpu.cpu_ticks[CPU_STATE_IDLE];
4825 ticks[3] = cpu.cpu_ticks[CPU_STATE_NICE];
4833 static void GetDarwinCpuInfo(
CpuInfo_t *cpuinfo,
Int_t sampleTime)
4836 if (getloadavg(avg,
sizeof(avg)) < 0) {
4837 ::Error(
"TUnixSystem::GetDarwinCpuInfo",
"getloadavg failed");
4844 Long_t cpu_ticks1[4], cpu_ticks2[4];
4845 ReadDarwinCpu(cpu_ticks1);
4847 ReadDarwinCpu(cpu_ticks2);
4849 Long_t userticks = (cpu_ticks2[0] + cpu_ticks2[3]) -
4850 (cpu_ticks1[0] + cpu_ticks1[3]);
4851 Long_t systicks = cpu_ticks2[1] - cpu_ticks1[1];
4852 Long_t idleticks = cpu_ticks2[2] - cpu_ticks1[2];
4853 if (userticks < 0) userticks = 0;
4854 if (systicks < 0) systicks = 0;
4855 if (idleticks < 0) idleticks = 0;
4856 Long_t totalticks = userticks + systicks + idleticks;
4868 static void GetDarwinMemInfo(
MemInfo_t *meminfo)
4870 static Int_t pshift = 0;
4872 vm_statistics_data_t vm_info;
4873 mach_msg_type_number_t count;
4878 count = HOST_VM_INFO_COUNT;
4879 kr = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vm_info, &count);
4880 if (kr != KERN_SUCCESS) {
4881 ::Error(
"TUnixSystem::GetDarwinMemInfo",
"host_statistics: %s", mach_error_string(kr));
4885 for (
int psize = getpagesize(); psize > 1; psize >>= 1)
4889 used = (
Long64_t)(vm_info.active_count + vm_info.inactive_count + vm_info.wire_count) << pshift;
4890 free = (
Long64_t)(vm_info.free_count) << pshift;
4891 total = (
Long64_t)(vm_info.active_count + vm_info.inactive_count + vm_info.free_count + vm_info.wire_count) << pshift;
4894 swap_used = vm_info.pageouts << pshift;
4897 dirp = opendir(
"/private/var/vm");
4902 while ((dp = readdir(dirp)) != 0) {
4904 char fname [MAXNAMLEN];
4905 if (strncmp(dp->d_name,
"swapfile", 8))
4907 strlcpy(fname,
"/private/var/vm/",MAXNAMLEN);
4908 strlcat (fname, dp->d_name,MAXNAMLEN);
4909 if (stat(fname, &sb) < 0)
4911 swap_total += sb.st_size;
4931 static void GetDarwinProcInfo(
ProcInfo_t *procinfo)
4934 #define vm_region vm_region_64 4938 #define GLOBAL_SHARED_TEXT_SEGMENT 0x90000000U 4939 #define GLOBAL_SHARED_DATA_SEGMENT 0xA0000000U 4940 #define SHARED_TEXT_REGION_SIZE 0x10000000 4941 #define SHARED_DATA_REGION_SIZE 0x10000000 4944 if (getrusage(RUSAGE_SELF, &ru) < 0) {
4945 ::SysError(
"TUnixSystem::GetDarwinProcInfo",
"getrusage failed");
4948 ((
Float_t)(ru.ru_utime.tv_usec) / 1000000.);
4950 ((
Float_t)(ru.ru_stime.tv_usec) / 1000000.);
4953 task_basic_info_data_t ti;
4954 mach_msg_type_number_t count;
4957 task_t a_task = mach_task_self();
4959 count = TASK_BASIC_INFO_COUNT;
4960 kr = task_info(a_task, TASK_BASIC_INFO, (task_info_t)&ti, &count);
4961 if (kr != KERN_SUCCESS) {
4962 ::Error(
"TUnixSystem::GetDarwinProcInfo",
"task_info: %s", mach_error_string(kr));
4967 mach_port_t object_name;
4968 vm_address_t address;
4969 vm_region_top_info_data_t info;
4970 vm_size_t vsize, vprvt, rsize, size;
4971 rsize = ti.resident_size;
4972 vsize = ti.virtual_size;
4974 for (address = 0; ; address += size) {
4976 count = VM_REGION_TOP_INFO_COUNT;
4977 if (vm_region(a_task, &address, &size,
4978 VM_REGION_TOP_INFO, (vm_region_info_t)&info, &count,
4979 &object_name) != KERN_SUCCESS) {
4984 if (address >= GLOBAL_SHARED_TEXT_SEGMENT &&
4985 address < (GLOBAL_SHARED_DATA_SEGMENT + SHARED_DATA_REGION_SIZE)) {
4990 if (info.share_mode == SM_EMPTY) {
4991 vm_region_basic_info_data_64_t b_info;
4992 count = VM_REGION_BASIC_INFO_COUNT_64;
4993 if (vm_region_64(a_task, &address,
4994 &size, VM_REGION_BASIC_INFO,
4995 (vm_region_info_t)&b_info, &count,
4996 &object_name) != KERN_SUCCESS) {
5000 if (b_info.reserved) {
5001 vsize -= (SHARED_TEXT_REGION_SIZE + SHARED_DATA_REGION_SIZE);
5008 if (info.share_mode != SM_PRIVATE) {
5012 switch (info.share_mode) {
5014 if (info.ref_count == 1) {
5017 vprvt += info.private_pages_resident * getpagesize();
5037 #if defined(R__LINUX) 5041 static void GetLinuxSysInfo(
SysInfo_t *sysinfo)
5044 FILE *
f = fopen(
"/proc/cpuinfo",
"r");
5068 f = fopen(
"/proc/meminfo",
"r");
5093 static void ReadLinuxCpu(
long *ticks)
5095 ticks[0] = ticks[1] = ticks[2] = ticks[3] = 0;
5098 FILE *
f = fopen(
"/proc/stat",
"r");
5102 sscanf(s.
Data(),
"%*s %ld %ld %ld %ld", &ticks[0], &ticks[3], &ticks[1], &ticks[2]);
5110 static void GetLinuxCpuInfo(
CpuInfo_t *cpuinfo,
Int_t sampleTime)
5112 Double_t avg[3] = { -1., -1., -1. };
5114 if (getloadavg(avg,
sizeof(avg)) < 0) {
5115 ::Error(
"TUnixSystem::GetLinuxCpuInfo",
"getloadavg failed");
5124 Long_t cpu_ticks1[4], cpu_ticks2[4];
5125 ReadLinuxCpu(cpu_ticks1);
5127 ReadLinuxCpu(cpu_ticks2);
5129 Long_t userticks = (cpu_ticks2[0] + cpu_ticks2[3]) -
5130 (cpu_ticks1[0] + cpu_ticks1[3]);
5131 Long_t systicks = cpu_ticks2[1] - cpu_ticks1[1];
5132 Long_t idleticks = cpu_ticks2[2] - cpu_ticks1[2];
5133 if (userticks < 0) userticks = 0;
5134 if (systicks < 0) systicks = 0;
5135 if (idleticks < 0) idleticks = 0;
5136 Long_t totalticks = userticks + systicks + idleticks;
5148 static void GetLinuxMemInfo(
MemInfo_t *meminfo)
5151 FILE *
f = fopen(
"/proc/meminfo",
"r");
5180 static void GetLinuxProcInfo(
ProcInfo_t *procinfo)
5183 if (getrusage(RUSAGE_SELF, &ru) < 0) {
5184 ::SysError(
"TUnixSystem::GetLinuxProcInfo",
"getrusage failed");
5187 ((
Float_t)(ru.ru_utime.tv_usec) / 1000000.);
5189 ((
Float_t)(ru.ru_stime.tv_usec) / 1000000.);
5200 sscanf(s.
Data(),
"%ld %ld", &
total, &rss);
5201 procinfo->
fMemVirtual = total * (getpagesize() / 1024);
5214 if (!info)
return -1;
5218 if (!sysinfo.
fCpus) {
5219 #if defined(R__MACOSX) 5220 GetDarwinSysInfo(&sysinfo);
5221 #elif defined(R__LINUX) 5222 GetLinuxSysInfo(&sysinfo);
5238 if (!info)
return -1;
5240 #if defined(R__MACOSX) 5241 GetDarwinCpuInfo(info, sampleTime);
5242 #elif defined(R__LINUX) 5243 GetLinuxCpuInfo(info, sampleTime);
5255 if (!info)
return -1;
5257 #if defined(R__MACOSX) 5258 GetDarwinMemInfo(info);
5259 #elif defined(R__LINUX) 5260 GetLinuxMemInfo(info);
5272 if (!info)
return -1;
5274 #if defined(R__MACOSX) 5275 GetDarwinProcInfo(info);
5276 #elif defined(R__LINUX) 5277 GetLinuxProcInfo(info);
Bool_t IsPathLocal(const char *path)
Returns TRUE if the url in 'path' points to the local file system.
const char * TempDirectory() const
Return a user configured or systemwide directory to create temporary files in.
void(* SigHandler_t)(ESignals)
int GetPid()
Get process id.
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
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.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
double read(const std::string &file_name)
reading
void AddTimer(TTimer *ti)
Add timer to list of system timers.
virtual void SetWriteReady()
void ListSymbols(const char *module, const char *re="")
List symbols in a shared library.
virtual int GetPid()
Get process id.
void StackTrace()
Print a stack trace.
Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
int GetErrno()
return errno
virtual Bool_t Notify()
Notify when event occurred on descriptor associated with this handler.
virtual Bool_t IsPathLocal(const char *path)
Returns TRUE if the url in 'path' points to the local file system.
int GetMemInfo(MemInfo_t *info) const
Returns ram and swap memory usage info into the MemInfo_t structure.
const char * GetError()
Return system error string.
virtual const char * WorkingDirectory()
Return working directory.
void Sleep(UInt_t milliSec)
Sleep milliSec milliseconds.
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.
static void UnixResetSignal(ESignals sig)
Restore old signal handler for specified signal.
Bool_t ExpandPathName(TString &patbuf)
Expand a pathname getting rid of special shell characters like ~.
double write(int n, const std::string &file_name, const std::string &vector_type, int compress=0)
writing
std::string GetWorkingDirectory() const
Return working directory.
virtual ~TUnixSystem()
Reset to original state.
static const char * GetExePath()
R__EXTERN TVirtualMutex * gSystemMutex
void Fatal(const char *location, const char *msgfmt,...)
Collectable string class.
int GetPathInfo(const char *path, FileStat_t &buf)
Get info about a file.
static int UnixFilestat(const char *path, FileStat_t &buf)
Get info about a file.
Int_t GetFPEMask()
Return the bitmap of conditions that trigger a floating point exception.
static int UnixTcpConnect(const char *hostname, int port, int tcpwindowsize)
Open a TCP/IP connection to server and connect to a service (i.e.
static int UnixRecv(int sock, void *buf, int len, int flag)
Receive exactly length bytes into buffer.
int GetSockOpt(int sock, int option, int *val)
Get socket option.
TString & ReplaceAll(const TString &s1, const TString &s2)
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.
Bool_t DispatchTimers(Bool_t mode)
Handle and dispatch timers.
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 demangle(char *_codeInfo, TString &_str)
demangle symbols
int Symlink(const char *from, const char *to)
Create a symlink from file1 to file2.
This class represents an Internet Protocol (IP) address.
virtual int MakeDirectory(const char *name)
Make a directory.
virtual void AddSignalHandler(TSignalHandler *sh)
Add a signal handler to list of system signal handlers.
int MakeDirectory(const char *name)
Make a Unix file system directory.
Regular expression class.
#define sym(otri1, otri2)
Int_t Select(TList *active, Long_t timeout)
Select on file descriptors.
Int_t GetGid(const char *group=0)
Returns the group's id. If group = 0, returns current user's group.
static Long64_t UnixNow()
Get current time in milliseconds since 0:00 Jan 1 1995.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
void SetProgname(const char *name)
Set the application name (from command line, argv[0]) and copy it in gProgName.
static struct Signalmap_t gSignalMap[kMAXSIGNALS]
TFileHandler * RemoveFileHandler(TFileHandler *fh)
Remove a file handler from the list of file handlers.
virtual const char * DirName(const char *pathname)
Return the directory name in pathname.
virtual TTimer * RemoveTimer(TTimer *t)
Remove timer from list of system timers.
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...
const char * HostName()
Return the system's host name.
int SendRaw(int sock, const void *buffer, int length, int flag)
Send exactly length bytes from buffer.
int Umask(Int_t mask)
Set the process file creation mode mask.
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
void Break(const char *location, const char *msgfmt,...)
void Syslog(ELogLevel level, const char *mess)
Send mess to syslog daemon.
virtual FILE * OpenPipe(const char *command, const char *mode)
Open a pipe.
#define REAL_DIR_ENTRY(dp)
virtual void ResetReadyMask()
TString & Prepend(const char *cs)
R__EXTERN TApplication * gApplication
Basic time type with millisecond precision.
static void UnixSigAlarmInterruptsSyscalls(Bool_t set)
When the argument is true the SIGALRM signal handler is set so that interrupted syscalls will not be ...
int ConnectService(const char *server, int port, int tcpwindowsize, const char *protocol="tcp")
Connect to service servicename on server servername.
const char * HomeDirectory(const char *userName=0)
Return the user's home directory.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
void Exit(int code, Bool_t mode=kTRUE)
Exit the application.
int Unlink(const char *name)
Unlink, i.e.
const char * kProtocolName
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...
virtual TFileHandler * RemoveFileHandler(TFileHandler *fh)
Remove a file handler from the list of file handlers.
void SysError(const char *location, const char *msgfmt,...)
virtual const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
static Int_t GetErrno()
Static function returning system error number.
const char * Data() const
virtual Bool_t Notify()
Notify when signal occurs.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual int Unlink(const char *name)
Unlink, i.e. remove, a file.
Int_t Exec(const char *shellcmd)
Execute a command.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString...
void DispatchOneEvent(Bool_t pendingOnly=kFALSE)
Dispatch a single event.
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
void AddSignalHandler(TSignalHandler *sh)
Add a signal handler to list of system signal handlers.
static int UnixSend(int sock, const void *buf, int len, int flag)
Send exactly length bytes from buffer.
const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
Int_t SetFPEMask(Int_t mask=kDefaultMask)
Set which conditions trigger a floating point exception.
static const char * DynamicPath(const char *newpath=0, Bool_t reset=kFALSE)
Get shared library search path. Static utility function.
TObject * Next()
Return next object in collection.
R__EXTERN TFileHandler * gXDisplay
static TString * ReadString(TBuffer &b, const TClass *clReq)
Read TString object from buffer.
static int UnixSetitimer(Long_t ms)
Set interval timer to time-out in ms milliseconds.
virtual const char * Getenv(const char *env)
Get environment variable.
virtual void ListLibraries(const char *regexp="")
List all loaded shared libraries.
static void UnixResetSignals()
Restore old signal handlers.
FILE * OpenPipe(const char *shellcmd, const char *mode)
Open a pipe.
TString & Append(const char *cs)
TInetAddress GetHostByName(const char *server)
Get Internet Protocol (IP) address of host.
int AcceptConnection(int sock)
Accept a connection.
Int_t Atoi() const
Return integer value of string.
virtual void Unload(const char *module)
Unload a shared library.
virtual TInetAddress GetHostByName(const char *server)
Get Internet Protocol (IP) address of host.
int CopyFile(const char *from, const char *to, Bool_t overwrite=kFALSE)
Copy a file.
void Error(const char *location, const char *msgfmt,...)
void ResetSignals()
Reset signals handlers to previous behaviour.
int SetSockOpt(int sock, int option, int val)
Set socket option.
UInt_t GetAddress() const
static void SigHandler(ESignals sig)
Unix signal handler.
TTimer * RemoveTimer(TTimer *ti)
Remove timer from list of system timers.
virtual Bool_t WriteNotify()
Notify when something can be written to the descriptor associated with this handler.
R__EXTERN const char * gProgName
int GetCpuInfo(CpuInfo_t *info, Int_t sampleTime=1000) const
Returns cpu load average and load info into the CpuInfo_t structure.
static const char * UnixHomedirectory(const char *user=0)
Returns the user's home directory.
static void sighandler(int sig)
Call the signal handler associated with the signal.
void FreeDirectory(void *dirp)
Close a Unix file system directory.
void ResetErrno()
reset errno
virtual void Setenv(const char *name, const char *value)
Set environment variable.
virtual Bool_t HasWriteInterest()
True if handler is interested in write events.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
virtual Bool_t Init()
Initialize the OS interface.
int Chmod(const char *file, UInt_t mode)
Set the file permission bits. Returns -1 in case or error, 0 otherwise.
R__EXTERN TSystem * gSystem
void FillWithCwd(char *cwd) const
Fill buffer with current working directory.
int Utime(const char *file, Long_t modtime, Long_t actime)
Set a files modification and access times.
virtual Int_t GetValue(const char *name, Int_t dflt)
Returns the integer value for a resource.
TInetAddress GetSockName(int sock)
Get Internet Protocol (IP) address of host and port #.
Bool_t Gets(FILE *fp, Bool_t chop=kTRUE)
Read one line from the stream, including the , or until EOF.
virtual void SetReadReady()
std::string GetHomeDirectory(const char *userName=0) const
Return the user's home directory.
void CloseConnection(int sock, Bool_t force=kFALSE)
Close socket.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
void Closelog()
Close connection to system log daemon.
char * Form(const char *fmt,...)
void SetDisplay()
Set DISPLAY environment variable based on utmp entry. Only for UNIX.
Handles synchronous and a-synchronous timer events.
Bool_t CheckTimer(const TTime &now)
Check if timer timed out.
Bool_t CheckDescriptors()
Check if there is activity on some file descriptors and call their Notify() member.
TSubString Strip(EStripType s=kTrailing, char c= ' ') const
Return a substring of self stripped at beginning and/or end.
Func_t DynFindSymbol(const char *module, const char *entry)
dynamic linking of module
static int UnixWaitchild()
Wait till child is finished.
void * OpenDirectory(const char *name)
Open a Unix file system directory. Returns 0 if directory does not exist.
static int UnixUnixService(int port, int backlog)
Open a socket, bind to it and start listening for Unix domain connections to it.
static const char * UnixSigname(ESignals sig)
Return the signal name associated with a signal.
Int_t RedirectOutput(const char *name, const char *mode="a", RedirectHandle_t *h=0)
Redirect standard output (stdout, stderr) to the specified file.
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 Warning(const char *location, const char *msgfmt,...)
const char * GetDynamicPath()
Return the dynamic path (used to find shared libraries).
virtual void FreeDirectory(void *dirp)
Free a directory.
virtual int ClosePipe(FILE *pipe)
Close the pipe.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Int_t GetUid(const char *user=0)
Returns the user's id. If user = 0, returns current user's id.
int GetProcInfo(ProcInfo_t *info) const
Returns cpu and memory used by this process into the ProcInfo_t structure.
void Unsetenv(const char *name)
Unset environment variable.
UserGroup_t * GetGroupInfo(Int_t gid)
Returns all group info in the UserGroup_t structure.
char * StrDup(const char *str)
Duplicate the string str.
#define R__LOCKGUARD2(mutex)
virtual int SetSockOpt(int sock, int kind, int val)
Set socket option.
static void UnixSignal(ESignals sig, SigHandler_t h)
Set a signal handler for a signal.
static unsigned int total
TString & Remove(Ssiz_t pos)
const char * Getenv(const char *name)
Get environment variable.
virtual TSignalHandler * RemoveSignalHandler(TSignalHandler *sh)
Remove a signal handler from list of signal handlers.
static int UnixMakedir(const char *name)
Make a Unix file system directory.
static int UnixUdpService(int port, int backlog)
Open a socket, bind to it and start listening for UDP connections on the port.
R__EXTERN const char * gProgPath
TString & Swap(TString &other)
Int_t GetEffectiveUid()
Returns the effective user id.
static int UnixUnixConnect(int port)
Connect to a Unix domain socket.
virtual Func_t DynFindSymbol(const char *module, const char *entry)
Find specific entry point in specified library.
virtual const char * GetName() const
Returns name of object.
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 RecvRaw(int sock, void *buffer, int length, int flag)
Receive exactly length bytes into buffer.
Long64_t Atoll() const
Return long long value of string.
int RecvBuf(int sock, void *buffer, int length)
Receive a buffer headed by a length indicator.
int Rename(const char *from, const char *to)
Rename a file. Returns 0 when successful, -1 in case of failure.
int AnnounceTcpService(int port, Bool_t reuse, int backlog, int tcpwindowsize=-1)
Announce TCP/IP service.
void CheckChilds()
Check if children have finished.
double func(double *x, double *p)
static void UnixIgnoreSignal(ESignals sig, Bool_t ignore)
If ignore is true ignore the specified signal, else restore previous behaviour.
static void * UnixOpendir(const char *name)
Open a directory.
Bool_t ChangeDirectory(const char *path)
Change directory. Returns kTRUE in case of success, kFALSE otherwise.
const char * GetLinkedLibraries()
Get list of shared libraries loaded at the start of the executable.
char * GetServiceByPort(int port)
Get name of internet service.
int EscChar(const char *src, char *dst, int dstlen, char *specchars, char escchar)
Escape specchars in src with escchar and copy to dst.
virtual void HandleException(Int_t sig)
Handle exceptions (kSigBus, kSigSegmentationViolation, kSigIllegalInstruction and kSigFloatingExcepti...
typedef void((*Func_t)())
void ResetSignal(ESignals sig, Bool_t reset=kTRUE)
If reset is true reset the signal handler for the specified signal to the default handler...
void IgnoreSignal(ESignals sig, Bool_t ignore=kTRUE)
If ignore is true ignore the specified signal, else restore previous behaviour.
static const char * UnixGetdirentry(void *dir)
Returns the next directory entry.
virtual void AddTimer(TTimer *t)
Add timer to list of system timers.
R__EXTERN const char * gRootDir
void ResetTimer(TTimer *ti)
Reset a-sync timer.
void AddDynamicPath(const char *lib)
Add a new directory to the dynamic path.
Short_t Max(Short_t a, Short_t b)
ESignals GetSignal() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
const char * GetDirEntry(void *dirp)
Get next Unix file system directory entry. Returns 0 if no more entries.
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...
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
TInetAddress GetPeerName(int sock)
Get Internet Protocol (IP) address of remote host and port #.
void AddFileHandler(TFileHandler *fh)
Add a file handler to the list of system file handlers.
FILE * TempFileName(TString &base, const char *dir=0)
Create a secure temporary file by appending a unique 6 letter string to base.
virtual void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
Iterator of ordered collection.
TSignalHandler * RemoveSignalHandler(TSignalHandler *sh)
Remove a signal handler from list of signal handlers.
int AnnounceUnixService(int port, int backlog)
Announce unix domain service on path "kServerPath/<port>".
virtual Bool_t ReadNotify()
Notify when something can be read from the descriptor associated with this handler.
int ClosePipe(FILE *pipe)
Close the pipe.
void SetDynamicPath(const char *lib)
Set the dynamic path to a new value.
int Link(const char *from, const char *to)
Create a link from file1 to file2.
void Abort(int code=0)
Abort the application.
void Unload(const char *module)
Unload a shared library.
virtual void AddFileHandler(TFileHandler *fh)
Add a file handler to the list of system file handlers.
void SigAlarmInterruptsSyscalls(Bool_t set)
When the argument is true the SIGALRM signal handler is set so that interrupted syscalls will not be ...
Int_t GetEffectiveGid()
Returns the effective group id.
Bool_t CheckSignals(Bool_t sync)
Check if some signals were raised and call their Notify() member.
static int UnixUdpConnect(const char *hostname, int port)
Creates a UDP socket connection Is called via the TSocket constructor.
int GetServiceByName(const char *service)
Get port # of internet service.
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
#define org(otri, vertexptr)
TTime Now()
Get current time in milliseconds since 0:00 Jan 1 1995.
TObject * At(Int_t idx) const
void Openlog(const char *name, Int_t options, ELogFacility facility)
Open connection to system log daemon.
R__EXTERN TInterpreter * gCling
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
virtual const char * GetSTLIncludePath() const
UserGroup_t * GetUserInfo(Int_t uid)
Returns all user info in the UserGroup_t structure.
Abstract base class defining a generic interface to the underlying Operating System.
void DispatchSignals(ESignals sig)
Handle and dispatch signals.
int SendBuf(int sock, const void *buffer, int length)
Send a buffer headed by a length indicator.
void ListLibraries(const char *regexp="")
List all loaded shared libraries.
const char * WorkingDirectory()
Return working directory.
int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
void Setenv(const char *name, const char *value)
Set environment variable.
int OpenConnection(const char *server, int port, int tcpwindowsize=-1, const char *protocol="tcp")
Open a connection to a service on a server.
virtual Bool_t HasReadInterest()
True if handler is interested in read events.
int AnnounceUdpService(int port, int backlog)
Announce UDP service.