mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
bitkeeper revision 1.512 (3f8bcf2a0Vz2xXrdEA4lXWy2qRMaSg)
oops, forgot to click on xen_log to add it to repository.
This commit is contained in:
1 parent
0e0b83b5be
commit
1f3fa12e41
2 files changed
+172
No files matched your search
@@ -183,6 +183,7 @@
|
||||
3f5ef5a2dTZP0nnsFoeq2jRf3mWDDg tools/misc/xen-clone.README
|
||||
3f1668d4-FUY6Enc7MB3GcwUtfJ5HA tools/misc/xen-mkdevnodes
|
||||
3f870808zS6T6iFhqYPGelroZlVfGQ tools/misc/xen_cpuperf.c
|
||||
3f8bcf29ulZIC9rC4wM70H_q4s6VPg tools/misc/xen_log.c
|
||||
3f13d81eQ9Vz-h-6RDGFkNR9CRP95g tools/misc/xen_nat_enable
|
||||
3f13d81e6Z6806ihYYUw8GVKNkYnuw tools/misc/xen_nat_enable.README
|
||||
3f1668d4F29Jsw0aC0bJEIkOBiagiQ tools/misc/xen_read_console.c
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
#include <sys/types.h>
|
||||
#include <tcpd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <syslog.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <sys/wait.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "hypervisor-ifs/dom0_ops.h"
|
||||
#include "dom0_defs.h"
|
||||
#include "mem_defs.h"
|
||||
|
||||
#define SILENT_ERRORS_FROM_XEN
|
||||
#define SYSLOG 1
|
||||
#define SYSLOGTO LOG_LOCAL5
|
||||
|
||||
int logoutput;
|
||||
|
||||
void stripit(char *str)
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; str[i]; i++) {
|
||||
if (str[i] == '\n') str[i] = '\0';
|
||||
if (str[i] == '\r') str[i] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
void errexit(char *str)
|
||||
{
|
||||
if(logoutput == SYSLOG) {
|
||||
stripit(str);
|
||||
syslog(LOG_ERR, "%s failed: %d (%m)", str, errno);
|
||||
} else {
|
||||
printf("%s", str);
|
||||
}
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void log(char *str)
|
||||
{
|
||||
if(logoutput == SYSLOG) {
|
||||
stripit(str);
|
||||
syslog(LOG_INFO, "%s", str);
|
||||
} else {
|
||||
printf("%s", str);
|
||||
}
|
||||
}
|
||||
|
||||
void process()
|
||||
{
|
||||
dom0_op_t op;
|
||||
unsigned char buf[208], obuf[224];
|
||||
struct sockaddr_in addr, from;
|
||||
int fromlen = sizeof(from);
|
||||
int len, fd = socket(PF_INET, SOCK_DGRAM, 0);
|
||||
unsigned short int lastport = 0, curport = 0;
|
||||
|
||||
if ( fd < 0 )
|
||||
errexit("could not open datagram socket");
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sin_addr.s_addr = htonl(0xa9fe0100); /* 169.254.1.0 */
|
||||
addr.sin_port = htons(666);
|
||||
addr.sin_family = AF_INET;
|
||||
|
||||
if ( bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0 )
|
||||
errexit("could not bind to local address and port");
|
||||
|
||||
op.cmd = DOM0_GETDOMAININFO;
|
||||
|
||||
while ( (len = recvfrom(fd, buf, sizeof(buf), 0,
|
||||
(struct sockaddr *)&from, &fromlen)) >= 0 )
|
||||
{
|
||||
curport = ntohs(from.sin_port);
|
||||
if(lastport != curport) {
|
||||
op.u.getdominfo.domain = (int)curport;
|
||||
if ( do_dom0_op(&op) < 0 )
|
||||
log("Error resolving domain name\n");
|
||||
} else {
|
||||
lastport = curport;
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(obuf, "[%s] %s", op.u.getdominfo.name, curport, buf);
|
||||
log(obuf);
|
||||
|
||||
fromlen = sizeof(from);
|
||||
}
|
||||
}
|
||||
|
||||
void closeall(int fd)
|
||||
{
|
||||
int fdlimit = sysconf(_SC_OPEN_MAX);
|
||||
|
||||
while (fd < fdlimit)
|
||||
close(fd++);
|
||||
}
|
||||
|
||||
int daemon(int nochdir, int noclose)
|
||||
{
|
||||
switch (fork())
|
||||
{
|
||||
case 0: break;
|
||||
case -1: return -1;
|
||||
default: _exit(0);
|
||||
}
|
||||
|
||||
if (setsid() < 0)
|
||||
return -1;
|
||||
|
||||
switch (fork())
|
||||
{
|
||||
case 0: break;
|
||||
case -1: return -1;
|
||||
default: _exit(0);
|
||||
}
|
||||
|
||||
if (!nochdir)
|
||||
chdir("/");
|
||||
|
||||
if (!noclose)
|
||||
{
|
||||
closeall(0);
|
||||
open("/dev/null",O_RDWR);
|
||||
dup(0); dup(0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
logoutput = 0;
|
||||
int c;
|
||||
|
||||
opterr = 0;
|
||||
|
||||
while ((c = getopt (argc, argv, "dh")) != -1)
|
||||
{
|
||||
switch(c)
|
||||
{
|
||||
case 'd':
|
||||
logoutput = SYSLOG;
|
||||
if (daemon(0,0) < 0)
|
||||
{
|
||||
errno = 2;
|
||||
errexit("daemon");
|
||||
} else {
|
||||
openlog("xenolog", LOG_PID, SYSLOGTO);
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
printf("Usage: xenolog [options]\n");
|
||||
printf("Capture and display output of xen domains.\n\n");
|
||||
printf(" -d Daemonize and send output to syslog.\n");
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
process();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||