[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 19/24] xenstored: support running in minios stubdom



A previous versions of this patch has been sent to xen-devel. See
http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01655.html

Signed-off-by: Diego Ongaro <diego.ongaro@xxxxxxxxxx>
Signed-off-by: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>
Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
---
 tools/xenstore/Makefile           |    9 ++++-
 tools/xenstore/utils.h            |    2 +
 tools/xenstore/xenstored_core.c   |   74 +++++++++++++++++++++++-------------
 tools/xenstore/xenstored_domain.c |   11 +++++
 4 files changed, 68 insertions(+), 28 deletions(-)

diff --git a/tools/xenstore/Makefile b/tools/xenstore/Makefile
index 4facb62..be892fd 100644
--- a/tools/xenstore/Makefile
+++ b/tools/xenstore/Makefile
@@ -28,6 +28,10 @@ endif
 
 ALL_TARGETS = libxenstore.so libxenstore.a clients xs_tdb_dump xenstored
 
+ifdef CONFIG_STUBDOM
+CFLAGS += -DNO_SOCKETS=1
+endif
+
 .PHONY: all
 all: $(ALL_TARGETS)
 
@@ -45,10 +49,13 @@ xenstored_probes.o: xenstored_solaris.o
 
 CFLAGS += -DHAVE_DTRACE=1
 endif
- 
+
 xenstored: $(XENSTORED_OBJS)
        $(CC) $(LDFLAGS) $^ $(LDLIBS_libxenctrl) $(SOCKET_LIBS) -o $@ 
$(APPEND_LDFLAGS)
 
+xenstored.a: $(XENSTORED_OBJS)
+       $(AR) cr $@ $^
+
 $(CLIENTS): xenstore
        ln -f xenstore $@
 
diff --git a/tools/xenstore/utils.h b/tools/xenstore/utils.h
index f378343..2effd17 100644
--- a/tools/xenstore/utils.h
+++ b/tools/xenstore/utils.h
@@ -19,7 +19,9 @@ static inline bool strends(const char *a, const char *b)
        return streq(a + strlen(a) - strlen(b), b);
 }
 
+#ifndef ARRAY_SIZE
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#endif
 
 void barf(const char *fmt, ...) __attribute__((noreturn));
 void barf_perror(const char *fmt, ...) __attribute__((noreturn));
diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 4b12cf2..0b9d4f2 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -224,7 +224,6 @@ static void reopen_log(void)
        }
 }
 
-
 static bool write_messages(struct connection *conn)
 {
        int ret;
@@ -327,7 +326,8 @@ static int initialize_set(fd_set *inset, fd_set *outset, 
int sock, int ro_sock,
                set_fd(sock, inset, &max);
        if (ro_sock != -1)
                set_fd(ro_sock, inset, &max);
-       set_fd(reopen_log_pipe[0], inset, &max);
+       if (reopen_log_pipe[0] != -1)
+               set_fd(reopen_log_pipe[0], inset, &max);
 
        if (xce_handle != NULL)
                set_fd(xc_evtchn_fd(xce_handle), inset, &max);
@@ -1664,6 +1664,19 @@ static void corrupt(struct connection *conn, const char 
*fmt, ...)
 }
 
 
+#ifdef __MINIOS__
+static void write_pidfile(const char *pidfile)
+{
+}
+
+static void daemonize(void)
+{
+}
+
+static void finish_daemonize(void)
+{
+}
+#else
 static void write_pidfile(const char *pidfile)
 {
        char buf[100];
@@ -1711,6 +1724,19 @@ static void daemonize(void)
        umask(0);
 }
 
+static void finish_daemonize(void)
+{
+       int devnull = open("/dev/null", O_RDWR);
+       if (devnull == -1)
+               barf_perror("Could not open /dev/null\n");
+       dup2(devnull, STDIN_FILENO);
+       dup2(devnull, STDOUT_FILENO);
+       dup2(devnull, STDERR_FILENO);
+       close(devnull);
+       xprintf = trace;
+}
+#endif
+
 #ifdef NO_SOCKETS
 static void init_sockets(int **psock, int **pro_sock)
 {
@@ -1822,6 +1848,11 @@ int main(int argc, char *argv[])
        int evtchn_fd = -1;
        struct timeval *timeout;
 
+#ifdef __MINIOS__
+       /* minios always uses internal DB */
+       tdb_flags = TDB_INTERNAL|TDB_NOLOCK;
+#endif
+
        while ((opt = getopt_long(argc, argv, "DE:F:HNPS:t:T:RLVW:", options,
                                  NULL)) != -1) {
                switch (opt) {
@@ -1874,20 +1905,10 @@ int main(int argc, char *argv[])
 
        reopen_log();
 
-       /* make sure xenstored directory exists */
-       if (mkdir(xs_daemon_rundir(), 0755)) {
-               if (errno != EEXIST) {
-                       perror("error: mkdir daemon rundir");
-                       exit(-1);
-               }
-       }
-
-       if (mkdir(xs_daemon_rootdir(), 0755)) {
-               if (errno != EEXIST) {
-                       perror("error: mkdir daemon rootdir");
-                       exit(-1);
-               }
-       }
+       /* make sure xenstored directories exist */
+       /* Errors ignored here, will be reported when we open files */
+       mkdir(xs_daemon_rundir(), 0755);
+       mkdir(xs_daemon_rootdir(), 0755);
 
        if (dofork) {
                openlog("xenstored", 0, LOG_DAEMON);
@@ -1905,9 +1926,14 @@ int main(int argc, char *argv[])
 
        init_sockets(&sock, &ro_sock);
 
+#ifdef __MINIOS__
+       reopen_log_pipe[0] = -1;
+       reopen_log_pipe[1] = -1;
+#else
        if (pipe(reopen_log_pipe)) {
                barf_perror("pipe");
        }
+#endif
 
        /* Setup the database */
        setup_structure();
@@ -1925,16 +1951,8 @@ int main(int argc, char *argv[])
        }
 
        /* redirect to /dev/null now we're ready to accept connections */
-       if (dofork) {
-               int devnull = open("/dev/null", O_RDWR);
-               if (devnull == -1)
-                       barf_perror("Could not open /dev/null\n");
-               dup2(devnull, STDIN_FILENO);
-               dup2(devnull, STDOUT_FILENO);
-               dup2(devnull, STDERR_FILENO);
-               close(devnull);
-               xprintf = trace;
-       }
+       if (dofork)
+               finish_daemonize();
 
        signal(SIGHUP, trigger_reopen_log);
 
@@ -1944,8 +1962,10 @@ int main(int argc, char *argv[])
        /* Get ready to listen to the tools. */
        max = initialize_set(&inset, &outset, *sock, *ro_sock, &timeout);
 
+#ifndef __MINIOS__
        /* Tell the kernel we're up and running. */
        xenbus_notify_running();
+#endif
 
        /* Main loop. */
        for (;;) {
@@ -1957,7 +1977,7 @@ int main(int argc, char *argv[])
                        barf_perror("Select failed");
                }
 
-               if (FD_ISSET(reopen_log_pipe[0], &inset)) {
+               if (reopen_log_pipe[0] != -1 && FD_ISSET(reopen_log_pipe[0], 
&inset)) {
                        char c;
                        if (read(reopen_log_pipe[0], &c, 1) != 1)
                                barf_perror("read failed");
diff --git a/tools/xenstore/xenstored_domain.c 
b/tools/xenstore/xenstored_domain.c
index c521e52..4243f91 100644
--- a/tools/xenstore/xenstored_domain.c
+++ b/tools/xenstore/xenstored_domain.c
@@ -197,12 +197,16 @@ static int destroy_domain(void *_domain)
        }
 
        if (domain->interface) {
+#ifdef __MINIOS__
+               unmap_interface(domain->interface);
+#else
                /* Domain 0 was mapped by dom0_init, so it must be unmapped
                   using munmap() and not the grant unmap call. */
                if (domain->domid == 0)
                        munmap(domain->interface, getpagesize());
                else
                        unmap_interface(domain->interface);
+#endif
        }
 
        fire_watches(NULL, "@releaseDomain", false);
@@ -597,6 +601,12 @@ void restore_existing_connections(void)
 {
 }
 
+#ifdef __MINIOS__
+static int dom0_init(void)
+{
+       return 0;
+}
+#else
 static int dom0_init(void) 
 { 
        evtchn_port_t port;
@@ -620,6 +630,7 @@ static int dom0_init(void)
 
        return 0; 
 }
+#endif
 
 void domain_init(void)
 {
-- 
1.7.7.6


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.