XRootD
XrdSysUtils Class Reference

#include <XrdSysUtils.hh>

+ Collaboration diagram for XrdSysUtils:

Public Member Functions

 XrdSysUtils ()
 Constructor and destructor. More...
 
 ~XrdSysUtils ()
 

Static Public Member Functions

static const char * ExecName ()
 
static int FmtUname (char *buff, int blen)
 
static int GetSigNum (const char *sname)
 
static bool SigBlock ()
 
static bool SigBlock (int numsig)
 

Detailed Description

Definition at line 36 of file XrdSysUtils.hh.

Constructor & Destructor Documentation

◆ XrdSysUtils()

XrdSysUtils::XrdSysUtils ( )
inline

Constructor and destructor.

Definition at line 96 of file XrdSysUtils.hh.

96 {}

◆ ~XrdSysUtils()

XrdSysUtils::~XrdSysUtils ( )
inline

Definition at line 97 of file XrdSysUtils.hh.

97 {}

Member Function Documentation

◆ ExecName()

const char * XrdSysUtils::ExecName ( )
static

Get the name of the current executable.

Returns
the full path of the executable invoked.

Definition at line 60 of file XrdSysUtils.cc.

61 {
62  static const char *myEname = 0;
63 
64 // If we have been here before, simply return what we discovered. This is
65 // relatively thread-safe as we might loose some memory but it will work.
66 // Anyway, this method is unlikely to be called by multiple threads. Also,
67 // according to gthe Condor team, this code will not be able to return the
68 // program name if the program is under the control of valgrind!
69 //
70  if (myEname) return myEname;
71 
72 // Get the exec name based on platform
73 //
74 #if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
75  {char epBuff[2048];
76  int epLen;
77  if ((epLen = readlink("/proc/self/exe", epBuff, sizeof(epBuff)-1)) > 0)
78  {epBuff[epLen] = 0;
79  myEname = strdup(epBuff);
80  return myEname;
81  }
82  }
83 #elif defined(__APPLE__)
84  {char epBuff[2048];
85  uint32_t epLen = sizeof(epBuff)-1;
86  if (!_NSGetExecutablePath(epBuff, &epLen))
87  {epBuff[epLen] = 0;
88  myEname = strdup(epBuff);
89  return myEname;
90  }
91  }
92 #elif defined(__solaris__)
93  {const char *epBuff = getexecname();
94  if (epBuff)
95  {if (*epBuff == '/') myEname = strdup(epBuff);
96  else {char *ename, *cwd = getcwd(0, MAXPATHLEN);
97  ename = (char *)malloc(strlen(cwd)+1+strlen(epBuff)+1);
98  sprintf(ename, "%s/%s", cwd, epBuff);
99  myEname = ename;
100  free(cwd);
101  }
102  return myEname;
103  }
104  }
105 #else
106 #endif
107 
108 // If got here then we don't have a valid program name. Return a null string.
109 //
110  return "";
111 }

Referenced by XrdCl::DefaultEnv::GetMonitor().

+ Here is the caller graph for this function:

◆ FmtUname()

int XrdSysUtils::FmtUname ( char *  buff,
int  blen 
)
static

Format the uname information

Parameters
buff- pointer to the buffer to hold the uname as: <sysname> <release> [<version>] [<machine>]
blen- length of the buffer.
Returns
the output of snprintf(buff, blen, ...);

Definition at line 117 of file XrdSysUtils.cc.

118 {
119 #if defined(WINDOWS)
120  return snprintf(buff, blen, "%s", "windows");
121 #else
122  struct utsname uInfo;
123 
124 // Obtain the uname inofmormation
125 //
126  if (uname(&uInfo) < 0) return snprintf(buff, blen, "%s", "unknown OS");
127 
128 // Format appropriate for certain platforms
129 // Linux and MacOs do not add usefull version information
130 //
131 #if defined(__linux__)
132  return snprintf(buff, blen, "%s %s", uInfo.sysname, uInfo.release);
133 #elif defined(__APPLE__) || defined(__FreeBSD__) || (defined(__FreeBSD__) || defined(__GLIBC__))
134  return snprintf(buff, blen, "%s %s %s", uInfo.sysname, uInfo.release,
135  uInfo.machine);
136 #else
137  return snprintf(buff, blen, "%s %s %s %s", uInfo.sysname, uInfo.release,
138  uInfo.version, uInfo.machine);
139 #endif
140 #endif
141 }

Referenced by XrdConfig::Configure().

+ Here is the caller graph for this function:

◆ GetSigNum()

int XrdSysUtils::GetSigNum ( const char *  sname)
static

Get common signal number.

Parameters
sname- the signal name as in sigxxx or just xxx (see kill).
Returns
=0 - unknown or unsupported signal.
!0 - the corresponding signal number.

Definition at line 165 of file XrdSysUtils.cc.

166 {
167  int i;
168 
169 // Trim off the "sig" in sname
170 //
171  if (!strncmp(sname, "sig", 3) || !strncmp(sname, "SIG", 3)) sname += 3;
172 
173 // Convert to signal number
174 //
175  for (i = 0; i < snum; i++)
176  {if (!strcmp(sname, sigtab[i].sname)) return sigtab[i].snum;}
177  return 0;
178 }

Referenced by XrdSysLogger::ParseKeep().

+ Here is the caller graph for this function:

◆ SigBlock() [1/2]

bool XrdSysUtils::SigBlock ( )
static

Block common signals. This must be called at program start.

Returns
true - common signals are blocked.
false - common signals not blocked, errno has the reason.

Definition at line 188 of file XrdSysUtils.cc.

189 {
190  sigset_t myset;
191 
192 // Ignore pipe signals and prepare to blocks others
193 //
194  signal(SIGPIPE, SIG_IGN); // Solaris optimization
195 
196 #ifdef ENABLE_COVERAGE
197  // Dump coverage information and exit upon receiving a TERM signal
198  signal(SIGTERM, [](int) { __gcov_dump(); _exit(EXIT_SUCCESS); });
199 #endif
200 
201 // Add the standard signals we normally always block
202 //
203  sigemptyset(&myset);
204  sigaddset(&myset, SIGPIPE);
205  sigaddset(&myset, SIGCHLD);
206 
207 // Block a couple of real-time signals if they are supported (async I/O)
208 //
209 #ifdef SIGRTMAX
210  sigaddset(&myset, SIGRTMAX);
211  sigaddset(&myset, SIGRTMAX-1);
212 #endif
213 
214 // Now turn off these signals
215 //
216  return pthread_sigmask(SIG_BLOCK, &myset, NULL) == 0;
217 }

Referenced by XrdSysLogger::Bind(), and main().

+ Here is the caller graph for this function:

◆ SigBlock() [2/2]

bool XrdSysUtils::SigBlock ( int  numsig)
static

Block a particular signal. This should be called at program start so that the block applies to all threads.

@aparam numsig - The signal value to be blocked.

Returns
true - signal is blocked.
false - signal not blocked, errno has the reason.

Definition at line 221 of file XrdSysUtils.cc.

222 {
223  sigset_t myset;
224 
225 // Ignore pipe signals and prepare to blocks others
226 //
227  if (sigemptyset(&myset) == -1 || sigaddset(&myset, numsig) == -1)
228  return false;
229 
230 // Now turn off these signals
231 //
232  return pthread_sigmask(SIG_BLOCK, &myset, NULL) == 0;
233 }

The documentation for this class was generated from the following files: