mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
tools/xenstore: handle CLOEXEC flag for local files and pipes
For support of live update the locally used files need to have the "close on exec" flag set. Fortunately the used Xen libraries are already doing this, so only the logging and tdb related files and pipes are affected. openlog() has the close on exec attribute, too. In order to be able to keep the event channels open specify the XENEVTCHN_NO_CLOEXEC flag when calling xenevtchn_open(). Signed-off-by: Juergen Gross <jgross@suse.com> Acked-by: Julien Grall <julien.grall@amazon.com> Acked-by: Wei Liu <wl@xen.org>
This commit is contained in:
1 parent
ed6eebf17d
commit
cd831ee438
5 files changed
+31
-3
No files matched your search
@@ -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 <cmdline>] [-F] [-t <timeout>] <file>\n"
|
||||
" Default timeout is 60 seconds.", 4 },
|
||||
#endif
|
||||
#ifdef __MINIOS__
|
||||
{ "memreport", do_control_memreport, "" },
|
||||
#else
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||