[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