@@ -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;
@@ -85,6 +86,7 @@ static const char *lu_begin(struct connection *conn)
return NULL;
}
+#endif
struct cmd_s {
char *cmd;
@@ -209,6 +211,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");
@@ -522,6 +525,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);
@@ -529,6 +533,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
@@ -548,6 +553,7 @@ static struct cmd_s cmds[] = {
{ "live-update", do_control_lu,
"[-c <cmdline>] [-F] [-t <timeout>] <file>\n"
" Default timeout is 60 seconds.", 4 },
+#endif
#ifdef __MINIOS__
{ "memreport", do_control_memreport, "" },
#else
@@ -197,7 +197,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");
@@ -1646,7 +1647,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);
@@ -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
@@ -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");
@@ -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)