From: MINAI Katsuhito <minai@jp.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [PATCH] [2/5] put xen console message into syslog
Date: Fri, 20 Oct 2006 21:48:48 +0900 [thread overview]
Message-ID: <20061020212550.C2E4.MINAI@jp.fujitsu.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 140 bytes --]
Hi,
[2/5] add xenlogd daemon for xen console logging
Signed-off-by: Katsuhito Minai <minai@jp.fujitsu.com>
Best Regards,
Katsuhito Minai
[-- Attachment #2: 2.xenlogd.patch --]
[-- Type: application/octet-stream, Size: 7654 bytes --]
diff -r 6ed4368b4a9e tools/misc/Makefile
--- a/tools/misc/Makefile Sun Oct 15 09:53:20 2006 +0100
+++ b/tools/misc/Makefile Wed Oct 11 11:37:34 2006 +0900
@@ -13,10 +13,10 @@ CFLAGS += $(INCLUDES)
HDRS = $(wildcard *.h)
-TARGETS = xenperf xc_shadow
+TARGETS = xenperf xc_shadow xenlogd
INSTALL_BIN = $(TARGETS) xencons
-INSTALL_SBIN = netfix xm xen-bugtool xend xenperf
+INSTALL_SBIN = netfix xm xen-bugtool xend xenperf xenlogd
.PHONY: all
all: build
diff -r 6ed4368b4a9e tools/misc/xenlogd.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/misc/xenlogd.c Fri Oct 20 21:05:43 2006 +0900
@@ -0,0 +1,307 @@
+/*
+ * xenlogd: daemon to put the xen message to syslog
+ */
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+
+#define XCDSIZE (32*1024)
+#define XENHEAD "(XEN) "
+#define PIDFILE "/var/run/xenlogd.pid"
+
+extern int xc_interface_open(void);
+extern int xc_readconsolering_index(int, unsigned int *, char **, int *);
+static char *cmdname;
+
+void
+quit(int xc, char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsyslog(LOG_KERN|LOG_ALERT, fmt, ap);
+ va_end(ap);
+ exit(xc);
+}
+
+int
+putsyslog(char *bp, int size)
+{
+ static char *prsvp = NULL;
+ static int prsvc = 0;
+ char *endp;
+ int offset;
+
+ if ((prsvp == NULL) && ((prsvp = malloc(XCDSIZE)) == NULL))
+ {
+ quit(1, "allocate buffer failed");
+ }
+
+ bp[size] = '\0';
+
+ for (endp = bp + size; bp < endp; bp++)
+ {
+ if (*bp == '\n')
+ {
+ prsvp[prsvc] = '\0';
+ if ((strncmp(prsvp, XENHEAD, strlen(XENHEAD)) == 0))
+ {
+ offset = strlen(XENHEAD);
+ }
+ else
+ {
+ offset = 0;
+ }
+ syslog(LOG_KERN|LOG_ALERT, "%s", prsvp + offset);
+ prsvc = 0;
+ }
+ else
+ {
+ prsvp[prsvc] = *bp;
+ prsvc++;
+ }
+ }
+ return(prsvc);
+}
+
+static void child_exit(int sig)
+{
+ while (waitpid(-1, NULL, WNOHANG) > 0);
+}
+
+static void term_daemon(int sig)
+{
+ unlink(PIDFILE);
+ exit(0);
+}
+
+void
+daemonize(void)
+{
+ pid_t pid;
+ int fd;
+ int len;
+ int i;
+ int pfd[2];
+ struct sigaction siga;
+ char buf[1024];
+
+ if (getppid() == 1)
+ return;
+
+ signal(SIGPIPE, SIG_IGN);
+
+ if (pipe(pfd) < 0)
+ quit(1, "open pipe failed");
+
+ if ((pid = fork()) > 0)
+ exit(0);
+
+ if (pid < 0)
+ quit(1, "fork failed: errno = %d", errno);
+
+ setsid();
+
+ if ((pid = fork()) > 0)
+ exit(0);
+
+ if (pid < 0)
+ quit(1, "fork failed: errno = %d", errno);
+
+ if ((fd = open("/dev/null",O_RDWR)) == -1)
+ quit(1, "open /dev/null failed: errno = %d", errno);
+
+ for (i = 0; i <= 2; i++)
+ {
+ close(i);
+ dup2(fd, i);
+ }
+
+ close(fd);
+ umask(027);
+
+ if (chdir("/") < 0)
+ quit(1, "change to root dir failed: errno = %d", errno);
+
+ pid = getpid();
+ snprintf(buf, sizeof(buf), "%s.%d", PIDFILE, pid);
+
+ fd = open(buf, O_RDWR | O_CREAT | O_EXCL);
+ if (fd < 0)
+ quit(1, "open %s failed: errno = %d", buf, errno);
+
+ if (link(buf, PIDFILE) < 0)
+ {
+ unlink(buf);
+ quit(1, "other logging daemon may keep alive");
+ }
+ unlink(buf);
+
+ len = sprintf(buf, "%d\n", pid);
+ if (write(fd, buf, len) < 0)
+ quit(1, "write %s failed: errno = %d", PIDFILE, errno);
+
+ siga.sa_handler = term_daemon;
+ sigemptyset(&siga.sa_mask);
+ sigaddset(&siga.sa_mask, SIGTERM);
+ siga.sa_flags = 0;
+
+ signal(SIGCHLD, child_exit);
+ signal(SIGTSTP, SIG_IGN);
+ signal(SIGTTOU, SIG_IGN);
+ signal(SIGTTIN, SIG_IGN);
+ sigaction(SIGTERM, &siga, NULL);
+
+ close(pfd[1]);
+ read(pfd[0], buf, sizeof(buf));
+ close(pfd[0]);
+}
+
+void
+kill_daemon(void)
+{
+ int fd, pid, len;
+ char buf[1024];
+ char *comm;
+
+ fd = open(PIDFILE, O_RDWR);
+ if (fd < 0)
+ {
+ if (errno == ENOENT)
+ {
+ fprintf(stderr,"%s: no other daemon exist\n", cmdname);
+ }
+ else
+ {
+ perror("open error: ");
+ }
+ goto delpidfile;
+ }
+ len = read(fd, buf, sizeof(buf));
+ if (len < 0)
+ {
+ perror("read error: ");
+ goto delpidfile;
+ }
+ close(fd);
+ buf[len] = '\0';
+ pid = atoi(buf);
+
+ if (pid)
+ {
+ snprintf(buf, sizeof(buf), "/proc/%d/stat", pid);
+ if ((fd = open(buf, O_RDONLY)) >= 0)
+ {
+ len = read(fd, buf, sizeof(buf));
+ strtok(buf, " ");
+ if (((comm = strtok(NULL, " ")) != NULL)
+ && (strcmp(comm, "(xenlogd)") == 0))
+ {
+ if (kill(pid, SIGTERM) < 0)
+ {
+ perror("kill error: ");
+ goto delpidfile;
+ }
+ while (kill(pid, SIGTERM) == 0);
+ if (errno != ESRCH)
+ perror("kill error: ");
+ }
+ }
+ }
+
+ delpidfile:
+ if ((fd = open(PIDFILE, O_RDWR)) >= 0) {
+ close(fd);
+ unlink(PIDFILE);
+ fprintf(stderr, "%s: lockfile existed but no daemon alive. it was deleted.\n", cmdname);
+ }
+}
+
+void usage(void)
+{
+ fprintf(stderr, "usage: %s [-h] [-n] [-k] [-r]\n", cmdname);
+ fprintf(stderr, " -h: print help\n");
+ fprintf(stderr, " -n: no daemonize\n");
+ fprintf(stderr, " -k: kill alive logging daemon\n");
+ fprintf(stderr, " -r: restart logging daemon after kill alive one\n");
+ exit(0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ uint indexc;
+ int rc, bufsize, opt, xcfd;
+ char *bufaddr;
+ int no_daemonize = 0;
+ int kill_d = 0;
+ int restart_d = 0;
+
+ cmdname = argv[0];
+
+ while ((opt = getopt(argc, argv, "hnkr")) != -1)
+ {
+ switch (opt)
+ {
+ case 'h':
+ case '?':
+ default:
+ usage();
+ break;
+ case 'n':
+ no_daemonize = 1;
+ break;
+ case 'r':
+ restart_d = 1;
+ /* fall through */
+ case 'k':
+ kill_d = 1;
+ break;
+ }
+ }
+
+ openlog(XENHEAD, LOG_NDELAY|LOG_CONS, LOG_KERN);
+
+ xcfd = xc_interface_open();
+ if (xcfd < 0)
+ quit(1, "failed to open xen interface");
+
+ if ((bufaddr = malloc(XCDSIZE)) ==NULL)
+ quit(1, "allocate buffer failed");
+
+ if (kill_d)
+ {
+ kill_daemon();
+ if (!restart_d)
+ exit(0);
+ }
+
+ if (!no_daemonize)
+ daemonize();
+
+ indexc = 0;
+
+ for (;;)
+ {
+ bufsize = XCDSIZE;
+
+ rc = xc_readconsolering_index(xcfd, &indexc, &bufaddr, &bufsize);
+ if (rc < 0)
+ quit(1, "error: read console ring: %d: errno %d", rc, errno);
+
+ putsyslog(bufaddr, bufsize);
+ if (bufsize)
+ continue;
+ sleep(1);
+ }
+}
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next reply other threads:[~2006-10-20 12:48 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-20 12:48 MINAI Katsuhito [this message]
2006-10-20 16:52 ` [PATCH] [2/5] put xen console message into syslog Daniel P. Berrange
2006-10-20 19:07 ` Keir Fraser
2006-10-20 19:29 ` Daniel P. Berrange
2006-10-20 16:59 ` Anthony Liguori
2006-10-21 7:51 ` Keir Fraser
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20061020212550.C2E4.MINAI@jp.fujitsu.com \
--to=minai@jp.fujitsu.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.