diff --git a/tools/xenstore/xenstored_control.c b/tools/xenstore/xenstored_control.c index 72a03c99d4..63b1f9a8b7 100644 --- a/tools/xenstore/xenstored_control.c +++ b/tools/xenstore/xenstored_control.c @@ -41,6 +41,7 @@ Interactive commands for Xen Store Daemon. #define MAP_ANONYMOUS MAP_ANON #endif +#ifndef NO_LIVE_UPDATE struct live_update { /* For verification the correct connection is acting. */ struct connection *conn; @@ -90,6 +91,7 @@ static const char *lu_begin(struct connection *conn) return NULL; } +#endif struct cmd_s { char *cmd; @@ -214,6 +216,7 @@ static int do_control_print(void *ctx, struct connection *conn, return 0; } +#ifndef NO_LIVE_UPDATE static const char *lu_abort(const void *ctx, struct connection *conn) { syslog(LOG_INFO, "live-update: abort\n"); @@ -559,6 +562,7 @@ static int do_control_lu(void *ctx, struct connection *conn, send_reply(conn, XS_CONTROL, resp, strlen(resp) + 1); return 0; } +#endif static int do_control_help(void *, struct connection *, char **, int); @@ -566,6 +570,7 @@ static struct cmd_s cmds[] = { { "check", do_control_check, "" }, { "log", do_control_log, "on|off" }, +#ifndef NO_LIVE_UPDATE /* * The parameters are those of the xenstore-control utility! * Depending on environment (Mini-OS or daemon) the live-update @@ -585,6 +590,7 @@ static struct cmd_s cmds[] = { { "live-update", do_control_lu, "[-c ] [-F] [-t ] \n" " Default timeout is 60 seconds.", 4 }, +#endif #ifdef __MINIOS__ { "memreport", do_control_memreport, "" }, #else diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index 97f9f0ffa9..2ef4534de7 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -198,7 +198,8 @@ void reopen_log(void) if (tracefile) { close_log(); - tracefd = open(tracefile, O_WRONLY|O_CREAT|O_APPEND, 0600); + tracefd = open(tracefile, + O_WRONLY | O_CREAT | O_APPEND | O_CLOEXEC, 0600); if (tracefd < 0) perror("Could not open tracefile"); @@ -1696,7 +1697,8 @@ static void setup_structure(void) if (!(tdb_flags & TDB_INTERNAL)) unlink(tdbname); - tdb_ctx = tdb_open_ex(tdbname, 7919, tdb_flags, O_RDWR|O_CREAT|O_EXCL, + tdb_ctx = tdb_open_ex(tdbname, 7919, tdb_flags, + O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC, 0640, &tdb_logger, NULL); if (!tdb_ctx) barf_perror("Could not create tdb file %s", tdbname); diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h index 22287ddfe9..c7567eaf0b 100644 --- a/tools/xenstore/xenstored_core.h +++ b/tools/xenstore/xenstored_core.h @@ -35,6 +35,14 @@ #include "tdb.h" #include "hashtable.h" +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +/* O_CLOEXEC support is needed for Live Update in the daemon case. */ +#ifndef __MINIOS__ +#define NO_LIVE_UPDATE +#endif +#endif + /* DEFAULT_BUFFER_SIZE should be large enough for each errno string. */ #define DEFAULT_BUFFER_SIZE 16 diff --git a/tools/xenstore/xenstored_domain.c b/tools/xenstore/xenstored_domain.c index 919a4d98cf..38d250fbed 100644 --- a/tools/xenstore/xenstored_domain.c +++ b/tools/xenstore/xenstored_domain.c @@ -743,7 +743,7 @@ void domain_init(void) talloc_set_destructor(xgt_handle, close_xgt_handle); - xce_handle = xenevtchn_open(NULL, 0); + xce_handle = xenevtchn_open(NULL, XENEVTCHN_NO_CLOEXEC); if (xce_handle == NULL) barf_perror("Failed to open evtchn device"); diff --git a/tools/xenstore/xenstored_posix.c b/tools/xenstore/xenstored_posix.c index 1f9603fea2..ae3e63e07f 100644 --- a/tools/xenstore/xenstored_posix.c +++ b/tools/xenstore/xenstored_posix.c @@ -90,9 +90,21 @@ void finish_daemonize(void) void init_pipe(int reopen_log_pipe[2]) { + int flags; + unsigned int i; + if (pipe(reopen_log_pipe)) { barf_perror("pipe"); } + + for (i = 0; i < 2; i++) { + flags = fcntl(reopen_log_pipe[i], F_GETFD); + if (flags < 0) + barf_perror("pipe get flags"); + flags |= FD_CLOEXEC; + if (fcntl(reopen_log_pipe[i], F_SETFD, flags) < 0) + barf_perror("pipe set flags"); + } } void unmap_xenbus(void *interface)