* [PATCH] tools: xenbackendd for NetBSD
@ 2009-07-22 13:25 Christoph Egger
0 siblings, 0 replies; only message in thread
From: Christoph Egger @ 2009-07-22 13:25 UTC (permalink / raw)
To: xen-devel; +Cc: Keir Fraser
[-- Attachment #1: Type: text/plain, Size: 852 bytes --]
Hi!
Attached patch introduces xenbackendd. It is used on NetBSD
to launch the hotplug scripts.
Later xenbackendd can be improved to also launch qemu-dm
as child process and will notice when qemu-dm crashes.
The changes the patch makes:
- rename hotplug scripts as xenbackendd expects them
(current names were taken from pkgsrc)
- install hotplug scripts as executable scripts
- introduce xenbackendd
- build & install xenbackendd on NetBSD only for now
- make xend launch xenbackendd on NetBSD only for now
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
--
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Karl-Hammerschmidt-Str. 34, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Thomas M. McCoy, Giuliano Meroni
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632
[-- Attachment #2: xen_tools_backendd.diff --]
[-- Type: text/x-diff, Size: 19049 bytes --]
diff -r 054c8395b15d tools/Makefile
--- a/tools/Makefile Tue Jul 21 15:47:41 2009 +0100
+++ b/tools/Makefile Wed Jul 22 15:12:39 2009 +0200
@@ -25,6 +25,7 @@ SUBDIRS-$(CONFIG_Linux) += blktap
SUBDIRS-$(CONFIG_Linux) += blktap2
SUBDIRS-$(CONFIG_NetBSD) += libaio
SUBDIRS-$(CONFIG_NetBSD) += blktap2
+SUBDIRS-$(CONFIG_NetBSD) += xenbackendd
SUBDIRS-y += libfsimage
SUBDIRS-$(LIBXENAPI_BINDINGS) += libxen
SUBDIRS-$(CONFIG_Linux) += fs-back
diff -r 054c8395b15d tools/hotplug/NetBSD/Makefile
--- a/tools/hotplug/NetBSD/Makefile Tue Jul 21 15:47:41 2009 +0100
+++ b/tools/hotplug/NetBSD/Makefile Wed Jul 22 15:12:39 2009 +0200
@@ -3,9 +3,9 @@ include $(XEN_ROOT)/tools/Rules.mk
# Xen script dir and scripts to go there.
XEN_SCRIPTS =
-XEN_SCRIPTS += block-nbsd
-XEN_SCRIPTS += vif-bridge-nbsd
-XEN_SCRIPTS += vif-ip-nbsd
+XEN_SCRIPTS += block
+XEN_SCRIPTS += vif-bridge
+XEN_SCRIPTS += vif-ip
XEN_SCRIPT_DATA =
@@ -23,7 +23,7 @@ install-scripts:
$(INSTALL_DIR) $(DESTDIR)$(XEN_SCRIPT_DIR)
set -e; for i in $(XEN_SCRIPTS); \
do \
- $(INSTALL_DATA) $$i $(DESTDIR)$(XEN_SCRIPT_DIR); \
+ $(INSTALL_PROG) $$i $(DESTDIR)$(XEN_SCRIPT_DIR); \
done
set -e; for i in $(XEN_SCRIPT_DATA); \
do \
diff -r 054c8395b15d tools/hotplug/NetBSD/block
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/hotplug/NetBSD/block Wed Jul 22 15:12:39 2009 +0200
@@ -0,0 +1,91 @@
+#!/bin/sh -e
+
+# $NetBSD: block-nbsd,v 1.1.1.1 2008/08/07 20:26:57 cegger Exp $
+# Called by xenbackendd
+# Usage: block xsdir_backend_path state
+
+DIR=$(dirname "$0")
+. "${DIR}/hotplugpath.sh"
+
+PATH=${BINDIR}:${SBINDIR}:${LIBEXEC}:${PRIVATE_BINDIR}:/bin:/usr/bin:/sbin:/usr/sbin
+export PATH
+
+error() {
+ echo "$@" >&2
+ xenstore_write $xpath/hotplug-status error
+ exit 1
+}
+
+
+xpath=$1
+xstatus=$2
+xtype=$(xenstore-read "$xpath/type")
+xparams=$(xenstore-read "$xpath/params")
+
+case $xstatus in
+6)
+ # device removed
+ case $xtype in
+ file)
+ vnd=$(xenstore-read "$xpath/vnd" || echo none)
+ if [ $vnd != none ]; then
+ vnconfig -u $vnd
+ fi
+ ;;
+ phy)
+ ;;
+ *)
+ echo "unknown type $xtype" >&2
+ ;;
+ esac
+ xenstore-rm $xpath
+ exit 0
+ ;;
+2)
+ case $xtype in
+ file)
+ # Store the list of available vnd(4) devices in
+ #``available_disks'', and mark them as ``free''.
+ list=`ls -1 /dev/vnd[0-9]*d | sed "s,/dev/vnd,,;s,d,," | sort -n`
+ for i in $list; do
+ disk="vnd$i"
+ available_disks="$available_disks $disk"
+ eval $disk=free
+ done
+ # Mark the used vnd(4) devices as ``used''.
+ for disk in `sysctl hw.disknames`; do
+ case $disk in
+ vnd[0-9]*) eval $disk=used ;;
+ esac
+ done
+ # Configure the first free vnd(4) device.
+ for disk in $available_disks; do
+ eval status=\$$disk
+ if [ "$status" = "free" ] && \
+ vnconfig /dev/${disk}d $xparams >/dev/null; then
+ device=/dev/${disk}d
+ echo vnconfig /dev/${disk}d $xparams
+ break
+ fi
+ done
+ if [ x$device = x ] ; then
+ error "no available vnd device"
+ fi
+ echo xenstore-write $xpath/vnd $device
+ xenstore-write $xpath/vnd $device
+ ;;
+ phy)
+ device=$xparams
+ ;;
+ esac
+ physical_device=$(stat -f '%r' "$device")
+ echo xenstore-write $xpath/physical-device $physical_device
+ xenstore-write $xpath/physical-device $physical_device
+ echo xenstore-write $xpath/hotplug-status connected
+ xenstore-write $xpath/hotplug-status connected
+ exit 0
+ ;;
+*)
+ exit 0
+ ;;
+esac
diff -r 054c8395b15d tools/hotplug/NetBSD/block-nbsd
--- a/tools/hotplug/NetBSD/block-nbsd Tue Jul 21 15:47:41 2009 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-#!/bin/sh -e
-
-# $NetBSD: block-nbsd,v 1.1.1.1 2008/08/07 20:26:57 cegger Exp $
-# Called by xenbackendd
-# Usage: block xsdir_backend_path state
-
-DIR=$(dirname "$0")
-. "${DIR}/hotplugpath.sh"
-
-PATH=${BINDIR}:${SBINDIR}:${LIBEXEC}:${PRIVATE_BINDIR}:/bin:/usr/bin:/sbin:/usr/sbin
-export PATH
-
-error() {
- echo "$@" >&2
- xenstore_write $xpath/hotplug-status error
- exit 1
-}
-
-
-xpath=$1
-xstatus=$2
-xtype=$(xenstore-read "$xpath/type")
-xparams=$(xenstore-read "$xpath/params")
-
-case $xstatus in
-6)
- # device removed
- case $xtype in
- file)
- vnd=$(xenstore-read "$xpath/vnd" || echo none)
- if [ $vnd != none ]; then
- vnconfig -u $vnd
- fi
- ;;
- phy)
- ;;
- *)
- echo "unknown type $xtype" >&2
- ;;
- esac
- xenstore-rm $xpath
- exit 0
- ;;
-2)
- case $xtype in
- file)
- # Store the list of available vnd(4) devices in
- #``available_disks'', and mark them as ``free''.
- list=`ls -1 /dev/vnd[0-9]*d | sed "s,/dev/vnd,,;s,d,," | sort -n`
- for i in $list; do
- disk="vnd$i"
- available_disks="$available_disks $disk"
- eval $disk=free
- done
- # Mark the used vnd(4) devices as ``used''.
- for disk in `sysctl hw.disknames`; do
- case $disk in
- vnd[0-9]*) eval $disk=used ;;
- esac
- done
- # Configure the first free vnd(4) device.
- for disk in $available_disks; do
- eval status=\$$disk
- if [ "$status" = "free" ] && \
- vnconfig /dev/${disk}d $xparams >/dev/null; then
- device=/dev/${disk}d
- echo vnconfig /dev/${disk}d $xparams
- break
- fi
- done
- if [ x$device = x ] ; then
- error "no available vnd device"
- fi
- echo xenstore-write $xpath/vnd $device
- xenstore-write $xpath/vnd $device
- ;;
- phy)
- device=$xparams
- ;;
- esac
- physical_device=$(stat -f '%r' "$device")
- echo xenstore-write $xpath/physical-device $physical_device
- xenstore-write $xpath/physical-device $physical_device
- echo xenstore-write $xpath/hotplug-status connected
- xenstore-write $xpath/hotplug-status connected
- exit 0
- ;;
-*)
- exit 0
- ;;
-esac
diff -r 054c8395b15d tools/hotplug/NetBSD/vif-bridge
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/hotplug/NetBSD/vif-bridge Wed Jul 22 15:12:39 2009 +0200
@@ -0,0 +1,38 @@
+#!/bin/sh -e
+
+# $NetBSD: vif-bridge-nbsd,v 1.1.1.1 2008/08/07 20:26:57 cegger Exp $
+# Called by xenbackendd
+# Usage: vif-bridge xsdir_backend_path state
+
+DIR=$(dirname "$0")
+. "${DIR}/hotplugpath.sh"
+
+PATH=${BINDIR}:${SBINDIR}:${LIBEXEC}:${PRIVATE_BINDIR}:/bin:/usr/bin:/sbin:/usr/sbin
+export PATH
+
+xpath=$1
+xstatus=$2
+
+case $xstatus in
+6)
+ # device removed
+ xenstore-rm $xpath
+ exit 0
+ ;;
+2)
+ xbridge=$(xenstore-read "$xpath/bridge")
+ xfid=$(xenstore-read "$xpath/frontend-id")
+ xhandle=$(xenstore-read "$xpath/handle")
+ iface=xvif$xfid.$xhandle
+ echo ifconfig $iface up
+ ifconfig $iface up
+ brconfig $xbridge add $iface
+ echo brconfig $xbridge add $iface
+ xenstore-write $xpath/hotplug-status connected
+ echo xenstore-write $xpath/hotplug-status connected
+ exit 0
+ ;;
+*)
+ exit 0
+ ;;
+esac
diff -r 054c8395b15d tools/hotplug/NetBSD/vif-bridge-nbsd
--- a/tools/hotplug/NetBSD/vif-bridge-nbsd Tue Jul 21 15:47:41 2009 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-#!/bin/sh -e
-
-# $NetBSD: vif-bridge-nbsd,v 1.1.1.1 2008/08/07 20:26:57 cegger Exp $
-# Called by xenbackendd
-# Usage: vif-bridge xsdir_backend_path state
-
-DIR=$(dirname "$0")
-. "${DIR}/hotplugpath.sh"
-
-PATH=${BINDIR}:${SBINDIR}:${LIBEXEC}:${PRIVATE_BINDIR}:/bin:/usr/bin:/sbin:/usr/sbin
-export PATH
-
-xpath=$1
-xstatus=$2
-
-case $xstatus in
-6)
- # device removed
- xenstore-rm $xpath
- exit 0
- ;;
-2)
- xbridge=$(xenstore-read "$xpath/bridge")
- xfid=$(xenstore-read "$xpath/frontend-id")
- xhandle=$(xenstore-read "$xpath/handle")
- iface=xvif$xfid.$xhandle
- echo ifconfig $iface up
- ifconfig $iface up
- brconfig $xbridge add $iface
- echo brconfig $xbridge add $iface
- xenstore-write $xpath/hotplug-status connected
- echo xenstore-write $xpath/hotplug-status connected
- exit 0
- ;;
-*)
- exit 0
- ;;
-esac
diff -r 054c8395b15d tools/hotplug/NetBSD/vif-ip
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/hotplug/NetBSD/vif-ip Wed Jul 22 15:12:39 2009 +0200
@@ -0,0 +1,36 @@
+#!/bin/sh -e
+
+# $NetBSD: vif-ip-nbsd,v 1.1.1.1 2008/08/07 20:26:57 cegger Exp $
+# Called by xenbackendd
+# Usage: vif-ip xsdir_backend_path state
+
+DIR=$(dirname "$0")
+. "${DIR}/hotplugpath.sh"
+
+PATH=${BINDIR}:${SBINDIR}:${LIBEXEC}:${PRIVATE_BINDIR}:/bin:/usr/bin:/sbin:/usr/sbin
+export PATH
+
+xpath=$1
+xstatus=$2
+
+case $xstatus in
+6)
+ # device removed
+ xenstore-rm $xpath
+ exit 0
+ ;;
+2)
+ xip=$(xenstore-read "$xpath/ip")
+ xfid=$(xenstore-read "$xpath/frontend-id")
+ xhandle=$(xenstore-read "$xpath/handle")
+ iface=xvif$xfid.$xhandle
+ echo ifconfig $iface $xip up
+ ifconfig $iface $xip up
+ xenstore-write $xpath/hotplug-status connected
+ echo xenstore-write $xpath/hotplug-status connected
+ exit 0
+ ;;
+*)
+ exit 0
+ ;;
+esac
diff -r 054c8395b15d tools/hotplug/NetBSD/vif-ip-nbsd
--- a/tools/hotplug/NetBSD/vif-ip-nbsd Tue Jul 21 15:47:41 2009 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-#!/bin/sh -e
-
-# $NetBSD: vif-ip-nbsd,v 1.1.1.1 2008/08/07 20:26:57 cegger Exp $
-# Called by xenbackendd
-# Usage: vif-ip xsdir_backend_path state
-
-DIR=$(dirname "$0")
-. "${DIR}/hotplugpath.sh"
-
-PATH=${BINDIR}:${SBINDIR}:${LIBEXEC}:${PRIVATE_BINDIR}:/bin:/usr/bin:/sbin:/usr/sbin
-export PATH
-
-xpath=$1
-xstatus=$2
-
-case $xstatus in
-6)
- # device removed
- xenstore-rm $xpath
- exit 0
- ;;
-2)
- xip=$(xenstore-read "$xpath/ip")
- xfid=$(xenstore-read "$xpath/frontend-id")
- xhandle=$(xenstore-read "$xpath/handle")
- iface=xvif$xfid.$xhandle
- echo ifconfig $iface $xip up
- ifconfig $iface $xip up
- xenstore-write $xpath/hotplug-status connected
- echo xenstore-write $xpath/hotplug-status connected
- exit 0
- ;;
-*)
- exit 0
- ;;
-esac
diff -r 054c8395b15d tools/misc/xend
--- a/tools/misc/xend Tue Jul 21 15:47:41 2009 +0100
+++ b/tools/misc/xend Wed Jul 22 15:12:39 2009 +0200
@@ -107,6 +107,14 @@ def start_consoled():
def start_blktapctrl():
start_daemon("blktapctrl", "")
+def start_xenbackendd():
+ XENBACKENDD_DEBUG = os.getenv("XENBACKENDD_DEBUG")
+ args = ""
+ if XENBACKENDD_DEBUG:
+ args += "-d"
+ if os.uname()[0] == 'NetBSD':
+ start_daemon("xenbackendd", args)
+
def main():
try:
check_logging()
@@ -121,11 +129,13 @@ def main():
if os.uname()[0] != "SunOS":
start_xenstored()
start_consoled()
+ start_xenbackendd()
start_blktapctrl()
return daemon.start()
elif sys.argv[1] == 'trace_start':
start_xenstored()
start_consoled()
+ start_xenbackendd()
start_blktapctrl()
return daemon.start(trace=1)
elif sys.argv[1] == 'stop':
@@ -135,6 +145,7 @@ def main():
elif sys.argv[1] == 'restart':
start_xenstored()
start_consoled()
+ start_xenbackendd()
start_blktapctrl()
return daemon.stop() or daemon.start()
elif sys.argv[1] == 'status':
diff -r 054c8395b15d tools/xenbackendd/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/xenbackendd/Makefile Wed Jul 22 15:12:39 2009 +0200
@@ -0,0 +1,41 @@
+# Copyright (c) 2009 Advanced Micro Devices, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; under version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+XEN_ROOT=../..
+include $(XEN_ROOT)/tools/Rules.mk
+
+CFLAGS += -Werror
+CFLAGS += $(CFLAGS_libxenstore)
+CPPFLAGS += -DXEN_SCRIPT_DIR="\"$(XEN_SCRIPT_DIR)\""
+LDFLAGS += $(LDFLAGS_libxenstore)
+
+SBIN = xenbackendd
+
+.PHONY: all
+all: build
+
+.PHONY: build
+build: $(SBIN)
+
+.PHONY: install
+install: build
+ $(INSTALL_DIR) $(DESTDIR)$(SBINDIR)
+ $(INSTALL_PROG) xenbackendd $(DESTDIR)$(SBINDIR)
+
+.PHONY: clean
+clean:
+ rm -f $(SBIN) $(DEPS)
+
+
+%: %.c Makefile
+ $(CC) $(CFLAGS) $(CPPFLAGS) $< $(LDFLAGS) -o $@
+
+-include $(DEPS)
diff -r 054c8395b15d tools/xenbackendd/xenbackendd.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/xenbackendd/xenbackendd.c Wed Jul 22 15:12:39 2009 +0200
@@ -0,0 +1,319 @@
+/* $NetBSD: xenbackendd.c,v 1.1.1.1 2008/08/07 20:26:57 cegger Exp $ */
+/*
+ * Copyright (C) 2006 Manuel Bouyer <bouyer@netbsd.org>
+ * Copyright (C) 2009 Christoph Egger <Christoph.Egger@amd.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; under version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <syslog.h>
+
+#include <xs.h>
+
+#define DEVTYPE_UNKNOWN 0
+#define DEVTYPE_VIF 1
+#define DEVTYPE_VBD 2
+
+#define DOMAIN_PATH "/local/domain/0"
+
+#ifndef XEN_SCRIPT_DIR
+#error XEN_SCRIPT_DIR not defined
+#endif
+
+#ifndef VBD_SCRIPT
+#define VBD_SCRIPT XEN_SCRIPT_DIR"/block"
+#endif
+#ifndef LOG_FILE
+#define LOG_FILE "/var/log/xen/xenbackendd.log"
+#endif
+#ifndef PID_FILE
+#define PID_FILE "/var/run/xenbackendd.pid"
+#endif
+
+
+struct xs_handle *xs;
+
+int fflag = 0;
+int dflag = 0;
+
+const char *vbd_script = NULL;
+const char *log_file = NULL;
+const char *pidfile = NULL;
+
+static void
+dolog(int pri, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ va_start(ap, fmt);
+ vsyslog(pri, fmt, ap);
+ va_end(ap);
+}
+
+static void
+dodebug(const char *fmt, ...)
+{
+ va_list ap;
+
+ if (dflag == 0)
+ return;
+ va_start(ap, fmt);
+ vfprintf(stdout, fmt, ap);
+ va_end(ap);
+ printf("\n");
+ fflush(stdout);
+}
+
+static void
+doexec(const char *cmd, const char *arg1, const char *arg2)
+{
+ dodebug("exec %s %s %s", cmd, arg1, arg2);
+ switch(vfork()) {
+ case -1:
+ dolog(LOG_ERR, "can't vfork: %s", strerror(errno));
+ break;
+ case 0:
+ execl(cmd, cmd, arg1, arg2, NULL);
+ dolog(LOG_ERR, "can't exec %s: %s", cmd, strerror(errno));
+ exit(EXIT_FAILURE);
+ /* NOTREACHED */
+ break;
+ default:
+ wait(NULL);
+ break;
+ }
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr,
+ "usage: %s [-d] [-f] [-l log_file] [-p pif_file] [-s vbd_script]\n",
+ getprogname());
+ exit(EXIT_FAILURE);
+}
+
+static int
+xen_setup(void)
+{
+ xs = xs_daemon_open();
+ if (xs == NULL) {
+ dolog(LOG_ERR,
+ "Failed to contact xenstore (%s). Is it running?",
+ strerror(errno));
+ goto out;
+ }
+
+ if (!xs_watch(xs, DOMAIN_PATH, "backend")) {
+ dolog(LOG_ERR, "xenstore watch on backend fails.");
+ goto out;
+ }
+ return 0;
+
+ out:
+ if (xs) {
+ xs_daemon_close(xs);
+ xs = NULL;
+ }
+ return -1;
+}
+
+int
+main(int argc, char * const argv[])
+{
+ char **vec;
+ unsigned int num;
+ char *s;
+ int state;
+ char *sstate;
+ char *p;
+ char buf[80];
+ int type = DEVTYPE_UNKNOWN;
+ int ch;
+ int debug_fd;
+ FILE *pidfile_f;
+
+ while ((ch = getopt(argc, argv, "dfl:p:s:")) != -1) {
+ switch (ch) {
+ case 'd':
+ dflag = 1;
+ break;
+ case 'f':
+ fflag = 1;
+ break;
+ case 'l':
+ log_file = optarg;
+ break;
+ case 'p':
+ pidfile = pidfile;
+ case 's':
+ vbd_script = optarg;
+ break;
+ default:
+ usage();
+ }
+ }
+
+ if (vbd_script == NULL)
+ vbd_script = VBD_SCRIPT;
+ if (pidfile == NULL)
+ pidfile = PID_FILE;
+ if (log_file == NULL)
+ log_file = LOG_FILE;
+
+ openlog("xenbackendd", LOG_PID | LOG_NDELAY, LOG_DAEMON);
+
+ if (fflag == 0) {
+ /* open log file */
+ debug_fd = open(log_file, O_RDWR | O_CREAT | O_TRUNC, 0644);
+ if (debug_fd == -1) {
+ dolog(LOG_ERR, "can't open %s: %s",
+ log_file, strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ if (fflag == 0) {
+ /* daemonize */
+ pidfile_f = fopen(pidfile, "w");
+ if (pidfile_f == NULL) {
+ dolog(LOG_ERR, "can't open %s: %s",
+ pidfile, strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ if (daemon(0, 0) < 0) {
+ dolog(LOG_ERR, "can't daemonize: %s",
+ strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ fprintf(pidfile_f, "%d\n", (int)getpid());
+ fclose(pidfile_f);
+
+ /* redirect stderr to log file */
+ if (dup2(debug_fd, STDERR_FILENO) < 0) {
+ dolog(LOG_ERR, "can't redirect stderr to %s: %s\n",
+ log_file, strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ /* also redirect stdout if we're in debug mode */
+ if (dflag) {
+ if (dup2(debug_fd, STDOUT_FILENO) < 0) {
+ dolog(LOG_ERR,
+ "can't redirect stdout to %s: %s\n",
+ log_file, strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ close(debug_fd);
+ debug_fd = -1;
+ }
+
+ if (xen_setup() < 0)
+ exit(EXIT_FAILURE);
+
+ for (;;) {
+ vec = xs_read_watch(xs, &num);
+ if (!vec) {
+ dolog(LOG_ERR, "xs_read_watch: NULL\n");
+ continue;
+ }
+
+ if (strlen(vec[XS_WATCH_PATH]) < sizeof("state"))
+ goto next1;
+
+ /* find last component of path, check if it's "state" */
+ p = &vec[XS_WATCH_PATH][
+ strlen(vec[XS_WATCH_PATH]) - sizeof("state")];
+ if (p[0] != '/')
+ goto next1;
+ p[0] = '\0';
+ p++;
+ if (strcmp(p, "state") != 0)
+ goto next1;
+
+ snprintf(buf, sizeof(buf), "%s/state", vec[XS_WATCH_PATH]);
+ sstate = xs_read(xs, XBT_NULL, buf, 0);
+ if (sstate == NULL) {
+ dolog(LOG_ERR,
+ "Failed to read %s (%s)", buf, strerror(errno));
+ goto next1;
+ }
+
+ state = atoi(sstate);
+ snprintf(buf, sizeof(buf), "%s/hotplug-status",
+ vec[XS_WATCH_PATH]);
+ s = xs_read(xs, XBT_NULL, buf, 0);
+ if (s != NULL && state != 6 /* XenbusStateClosed */)
+ goto next2;
+
+ if (strncmp(vec[XS_WATCH_PATH],
+ DOMAIN_PATH "/backend/vif",
+ strlen(DOMAIN_PATH "/backend/vif")) == 0)
+ type = DEVTYPE_VIF;
+
+ if (strncmp(vec[XS_WATCH_PATH],
+ DOMAIN_PATH "/backend/vbd",
+ strlen(DOMAIN_PATH "/backend/vbd")) == 0)
+ type = DEVTYPE_VBD;
+
+ switch(type) {
+ case DEVTYPE_VIF:
+ if (s)
+ free(s);
+ snprintf(buf, sizeof(buf), "%s/script",
+ vec[XS_WATCH_PATH]);
+ s = xs_read(xs, XBT_NULL, buf, 0);
+ if (s == NULL) {
+ dolog(LOG_ERR,
+ "Failed to read %s (%s)", buf,
+ strerror(errno));
+ goto next2;
+ }
+ doexec(s, vec[XS_WATCH_PATH], sstate);
+ break;
+
+ case DEVTYPE_VBD:
+ doexec(vbd_script, vec[XS_WATCH_PATH], sstate);
+ break;
+
+ default:
+ break;
+ }
+
+next2:
+ if (s)
+ free(s);
+ free(sstate);
+
+next1:
+ free(vec);
+ }
+
+ return 0;
+}
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-07-22 13:25 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-22 13:25 [PATCH] tools: xenbackendd for NetBSD Christoph Egger
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.