All of lore.kernel.org
 help / color / mirror / Atom feed
From: MINAI Katsuhito <minai@jp.fujitsu.com>
To: Akio Takebe <takebe_akio@jp.fujitsu.com>
Cc: Hans-Christian Armingeon <mog.johnny@gmx.net>,
	xen-devel@lists.xensource.com,
	Mark Williamson <mark.williamson@cl.cam.ac.uk>
Subject: [PATCH] [2/4] put xen console message into syslog but xm dmesg is not affected
Date: Fri, 07 Jul 2006 17:21:03 +0900	[thread overview]
Message-ID: <20060707170353.E3CB.MINAI@jp.fujitsu.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 105 bytes --]

[2/4] add xenlogd daemon for xen console logging

Signed-off-by: Katsuhito Minai <minai@jp.fujitsu.com>


[-- Attachment #2: 2.xenlogd.patch --]
[-- Type: application/octet-stream, Size: 6946 bytes --]

diff -r 8e55c5c11475 tools/misc/Makefile
--- a/tools/misc/Makefile	Wed Jul 05 18:48:41 2006 +0100
+++ b/tools/misc/Makefile	Fri Jul 07 16:40:48 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 8e55c5c11475 tools/misc/xenlogd.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/misc/xenlogd.c	Fri Jul 07 16:40:48 2006 +0900
@@ -0,0 +1,299 @@
+
+#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(int, char **, int *, 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);
+  quit(0, "logging ended normally.");
+}
+
+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[])
+{
+  int fd;
+  int rc;
+  int bufsize;
+  int opt;
+  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);
+
+  fd = xc_interface_open();
+  if (fd < 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();
+  }
+  
+  syslog(LOG_KERN|LOG_ALERT, "logging has been started.");
+
+  for (;;) {
+    bufsize = XCDSIZE;
+
+    rc = xc_readconsolering(fd, &bufaddr, &bufsize, -1);
+    if (rc < 0) {
+      quit(1, "error: read console ring: %d: errno %d", rc, errno);
+    }
+
+    if (bufsize) {
+      if (putsyslog(bufaddr, 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-07-07  8:21 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-07-07  8:21 MINAI Katsuhito [this message]
2006-07-10 15:02 ` [PATCH] [2/4] put xen console message into syslog but xm dmesg is not affected Keir Fraser
2006-07-11  6:41   ` [PATCH] [2/4] put xen console message into syslog butxm " MINAI Katsuhito
2006-07-11 12:30   ` [PATCH] [2/4] put xen console message into syslog but?xm " Horms
2006-07-11 15:13     ` Keir Fraser
2006-07-12  0:42       ` Horms

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=20060707170353.E3CB.MINAI@jp.fujitsu.com \
    --to=minai@jp.fujitsu.com \
    --cc=mark.williamson@cl.cam.ac.uk \
    --cc=mog.johnny@gmx.net \
    --cc=takebe_akio@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.