All of lore.kernel.org
 help / color / mirror / Atom feed
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

             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.