33 #include <sys/types.h>
124 if ((sbP = Free)) Free = sbP->
Next;
137 const char *Host = 0;
147 if ((sbP = inQ)) inQ = sbP->
Next;
152 else if (theAddr.
Set(&(sbP->From.Addr))) Host = 0;
153 else Host = theAddr.
Name();
154 wLen = xP->
Format(Host, sbP->Data, obuff);
158 *(bP + sbP->Dlen) =
'\n';
163 {
do {rc =
write(STDOUT_FILENO, bP, wLen);}
164 while(rc < 0 && errno == EINTR);
165 wLen -= rc; bP += rc;
168 myMutex.Lock(); sbP->Next = Free; Free = sbP; myMutex.UnLock();
201 std::cerr <<
"\nUsage: mpxstats [-f {cgi|flat|xml}] -p <port> [-s]" <<std::endl;
209 int main(
int argc,
char *argv[])
212 extern int opterr,
optopt;
220 int Port = 0, retc, udpFD;
227 if (argc > 1 &&
'-' == *argv[1])
228 while ((c = getopt(argc,argv,
"df:p:s")) && ((
unsigned char)c != 0xff))
231 case 'd':
Debug =
true;
236 else {
Say.
Emsg(
":",
"Invalid format - ", optarg);
Usage(1);}
240 case 'p':
if (!(Port = atoi(optarg)))
241 {
Say.
Emsg(
":",
"Invalid port number - ", optarg);
Usage(1);}
245 default: sprintf(buff,
"'%c'",
optopt);
246 if (c ==
':')
Say.
Emsg(
":", buff,
"value not specified.");
247 else Say.
Emsg(0, buff,
"option is invalid");
255 if (!Port) {
Say.
Emsg(
":",
"Port has not been specified.");
Usage(1);}
259 signal(SIGPIPE, SIG_IGN);
261 sigaddset(&myset, SIGPIPE);
262 sigaddset(&myset, SIGCHLD);
263 pthread_sigmask(SIG_BLOCK, &myset, NULL);
274 udpFD = mySocket.
Detach();
284 {
Say.
Emsg(
":", retc,
"create output thread"); exit(4);}
288 fromLen =
sizeof(sbP->
From);
291 retc = recvfrom(udpFD, sbP->
Data,
sizeof(sbP->
Data), 0,
293 if (retc < 0) {
Say.
Emsg(
":", retc,
"recv udp message"); exit(8);}
int main(int argc, char *argv[])
void * mainOutput(void *parg)
ssize_t write(int fildes, const void *buf, size_t nbyte)
#define XRDSYSTHREAD_BIND
void * Run(XrdMpxXml *xP)
int Format(const char *Host, char *ibuff, char *obuff)
const char * Name(const char *eName=0, const char **eText=0)
const char * Set(const char *hSpec, int pNum=PortInSpec)
int Open(const char *path, int port=-1, int flags=0, int sockbuffsz=0)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
static void setStackSize(size_t stsz, bool force=false)
static const int addSender