[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 26 of 29 RFC] xldeviced: new daemon to execute hotplug scripts
# HG changeset patch # User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx> # Date 1328179909 -3600 # Node ID e904f98a4445fee7489490b5ccc00b7bb62d796d # Parent 94532199f647fc03816fc5ae50ab53c8c5b80cd8 xldeviced: new daemon to execute hotplug scripts This patch introduces xldeviced, a new daemon that monitors /hotplug/<domid> and is in charge of attaching the passed devices to the desired DomU. Makes use of the previously introduced libxl hotplug functions. Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx> diff -r 94532199f647 -r e904f98a4445 tools/libxl/Makefile --- a/tools/libxl/Makefile Thu Feb 02 11:48:06 2012 +0100 +++ b/tools/libxl/Makefile Thu Feb 02 11:51:49 2012 +0100 @@ -13,7 +13,7 @@ XLUMINOR = 0 CFLAGS += -Werror -Wno-format-zero-length -Wmissing-declarations \ -Wno-declaration-after-statement -Wformat-nonliteral -CFLAGS += -I. -fPIC +CFLAGS += -I. -fPIC -g ifeq ($(CONFIG_Linux),y) LIBUUID_LIBS += -luuid @@ -60,12 +60,16 @@ LIBXLU_OBJS = libxlu_cfg_y.o libxlu_cfg_ libxlu_disk_l.o libxlu_disk.o $(LIBXLU_OBJS): CFLAGS += $(CFLAGS_libxenctrl) # For xentoollog.h -CLIENTS = xl testidl +CLIENTS = xl xldeviced testidl XL_OBJS = xl.o xl_cmdimpl.o xl_cmdtable.o $(XL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) # For xentoollog.h $(XL_OBJS): CFLAGS += $(CFLAGS_libxenlight) +XLDEVICED_OBJS = xldeviced.o +$(XLDEVICED_OBJS): CFLAGS += $(CFLAGS_libxenctrl) # For xentoollog.h +$(XLDEVICED_OBJS): CFLAGS += $(CFLAGS_libxenlight) + testidl.o: CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenlight) testidl.c: libxl_types.idl gentest.py libxl.h $(AUTOINCS) $(PYTHON) gentest.py libxl_types.idl testidl.c.new @@ -140,8 +144,12 @@ libxlutil.a: $(LIBXLU_OBJS) xl: $(XL_OBJS) libxlutil.so libxenlight.so $(CC) $(LDFLAGS) -o $@ $(XL_OBJS) libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) +xldeviced: $(XLDEVICED_OBJS) libxlutil.so libxenlight.so + $(CC) $(LDFLAGS) -o $@ $(XLDEVICED_OBJS) libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) + testidl: testidl.o libxlutil.so libxenlight.so $(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) + .PHONY: install install: all @@ -151,6 +159,7 @@ install: all $(INSTALL_DIR) $(DESTDIR)$(BASH_COMPLETION_DIR) $(INSTALL_DIR) $(DESTDIR)$(XEN_RUN_DIR) $(INSTALL_PROG) xl $(DESTDIR)$(SBINDIR) + $(INSTALL_PROG) xldeviced $(DESTDIR)$(SBINDIR) $(INSTALL_PROG) libxenlight.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR) ln -sf libxenlight.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libxenlight.so.$(MAJOR) ln -sf libxenlight.so.$(MAJOR) $(DESTDIR)$(LIBDIR)/libxenlight.so diff -r 94532199f647 -r e904f98a4445 tools/libxl/xldeviced.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/libxl/xldeviced.c Thu Feb 02 11:51:49 2012 +0100 @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2012 + * Author Roger Pau Monnà <roger.pau@xxxxxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 only. with the special + * exception on linking described in file 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 Lesser General Public License for more details. + */ + +#include "libxl_osdeps.h" + +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <assert.h> + +#include <xenctrl.h> +#include <xs.h> + +#include "libxl.h" +#include "libxl_utils.h" +#include "libxlutil.h" +#include "xldeviced.h" + +xentoollog_logger_stdiostream *logger; +libxl_ctx *ctx; + +static xentoollog_level minmsglevel = XTL_PROGRESS; +struct xs_handle *xs; + +libxl_device_disk_hotplug_actions disk_handler = { + .connect = libxl_device_disk_add, + .disconnect = libxl_device_disk_remove, + .force_disconnect = libxl_device_disk_destroy, +}; + +libxl_device_nic_hotplug_actions nic_handler = { + .connect = libxl_device_nic_add, + .disconnect = libxl_device_nic_remove, + .force_disconnect = libxl_device_nic_destroy, +}; + +static int create_pidfile(char *file) +{ + pid_t pid; + int rc, fd; + char *s; + + fd = open(file, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR); + if (fd < 0) { + LOG("unable to open pidfile %s", file); + return -1; + } + pid = getpid(); + rc = asprintf(&s, "%d\n", pid); + if (rc < 0) + return -1; + libxl_write_exactly(NULL, fd, s, rc, NULL, NULL); + + close(fd); + return 0; +} + +int main(int argc, char **argv) +{ + int opt = 0; + int daemonize = 1; + int status, rc = 0, ret = 0; + char *logfilename = "xldeviced"; + char *pidfile = PIDFILE; + int logfile; + + while ((opt = getopt(argc, argv, "+vfp:")) >= 0) { + switch (opt) { + case 'v': + if (minmsglevel > 0) minmsglevel--; + break; + case 'f': + daemonize = 0; + break; + case 'p': + pidfile = optarg; + break; + default: + fprintf(stderr, "unknown global option\n"); + exit(2); + } + } + + logger = xtl_createlogger_stdiostream(stderr, minmsglevel, 0); + if (!logger) exit(1); + + if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger*)logger)) { + fprintf(stderr, "cannot init xldeviced context\n"); + exit(1); + } + + if (daemonize) { + char *fullname; + pid_t child1, got_child; + int nullfd; + + child1 = libxl_fork(ctx); + if (child1) { + + for (;;) { + got_child = waitpid(child1, &status, 0); + if (got_child == child1) break; + assert(got_child == -1); + if (errno != EINTR) { + perror("failed to wait for daemonizing child"); + ret = ERROR_FAIL; + goto out; + } + } + if (status) { + libxl_report_child_exitstatus(ctx, XTL_ERROR, + "daemonizing child", child1, status); + ret = ERROR_FAIL; + goto out; + } + ret = 0; + goto out; + } + + rc = libxl_ctx_postfork(ctx); + if (rc) { + LOG("failed to reinitialise context after fork"); + exit(-1); + } + + rc = libxl_create_logfile(ctx, logfilename, &fullname); + if (rc) { + LOG("failed to open logfile %s: %s",fullname,strerror(errno)); + exit(-1); + } + + CHK_ERRNO(( logfile = open(fullname, O_WRONLY|O_CREAT|O_APPEND, + 0644) )<0); + free(fullname); + + CHK_ERRNO(( nullfd = open("/dev/null", O_RDONLY) )<0); + dup2(nullfd, 0); + dup2(logfile, 1); + dup2(logfile, 2); + + CHK_ERRNO(daemon(0, 1) < 0); + } + /* Write pid */ + if (create_pidfile(pidfile) < 0) { + LOG("unable to write pid to %s", pidfile); + goto out_clean; + } + + /* Watch /hotplug/<my_dom_id> for changes */ + ret = libxl_setup_hotplug_listener(ctx); + if (ret < 0) { + LOG("Failed to setup xenstore watches"); + goto out_clean; + } + + ret = libxl_hotplug_dispatch(ctx, &disk_handler, &nic_handler); + +out_clean: + unlink(pidfile); +out: + libxl_ctx_free(ctx); + xtl_logger_destroy((xentoollog_logger*)logger); + return ret; +} + +/* + * Local variables: + * mode: C + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff -r 94532199f647 -r e904f98a4445 tools/libxl/xldeviced.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/libxl/xldeviced.h Thu Feb 02 11:51:49 2012 +0100 @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2012 + * Author Roger Pau Monnà <roger.pau@xxxxxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 only. with the special + * exception on linking described in file 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 Lesser General Public License for more details. + */ + +#ifndef XLDEVICED_H +#define XLDEVICED_H + +#include "xentoollog.h" + +extern libxl_ctx *ctx; +extern xentoollog_logger_stdiostream *logger; +int logfile = 2; + +#define PIDFILE "/var/run/xldeviced.pid" + +#define LOG(_f, _a...) dolog(__FILE__, __LINE__, __func__, _f "\n", ##_a) + +static void dolog(const char *file, int line, const char *func, char *fmt, ...) + __attribute__((format(printf,4,5))); + +static void dolog(const char *file, int line, const char *func, char *fmt, ...) +{ + va_list ap; + char *s; + int rc; + + va_start(ap, fmt); + rc = vasprintf(&s, fmt, ap); + va_end(ap); + if (rc >= 0) + libxl_write_exactly(NULL, logfile, s, rc, NULL, NULL); +} + +#define CHK_ERRNO( call ) ({ \ + int chk_errno = (call); \ + if (chk_errno < 0) { \ + fprintf(stderr,"xl: fatal error: %s:%d: %s: %s\n", \ + __FILE__,__LINE__, strerror(chk_errno), #call); \ + exit(-ERROR_FAIL); \ + } \ + }) + +#endif /* XLDEVICED_H */ + +/* + * Local variables: + * mode: C + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |