File xs-26-log-control.patch of Package xen.26348

commit 701a21876d359ebfd61d7641923e2d92cc75e06a
Author: Juergen Gross <jgross@suse.com>
Date:   Fri Feb 24 07:21:43 2017 +0100

    xenstore: add support for changing log functionality dynamically
    
    Today Xenstore supports logging only if specified at start of the
    Xenstore daemon. As it can't be disabled during runtime it is not
    recommended to start xenstored with logging enabled.
    
    Add support for switching logging on and off at runtime and to
    specify a (new) logfile. This is done via the XS_CONTROL wire command
    which can be sent with xenstore-control.
    
    To switch logging on just use:
    
    xenstore-control log on
    
    To switch it off again:
    
    xenstore-control log off
    
    To specify a (new) logfile:
    
    xenstore-control logfile <file>
    
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Wei Liu <wei.liu2@citrix.com>

Index: xen-4.7.2-testing/tools/xenstore/xenstored_control.c
===================================================================
--- xen-4.7.2-testing.orig/tools/xenstore/xenstored_control.c
+++ xen-4.7.2-testing/tools/xenstore/xenstored_control.c
@@ -44,6 +44,38 @@ static int do_control_check(void *ctx, s
 	return 0;
 }
 
+static int do_control_log(void *ctx, struct connection *conn,
+			  char **vec, int num)
+{
+	if (num != 1)
+		return EINVAL;
+
+	if (!strcmp(vec[0], "on"))
+		reopen_log();
+	else if (!strcmp(vec[0], "off"))
+		close_log();
+	else
+		return EINVAL;
+
+	send_ack(conn, XS_CONTROL);
+	return 0;
+}
+
+static int do_control_logfile(void *ctx, struct connection *conn,
+			      char **vec, int num)
+{
+	if (num != 1)
+		return EINVAL;
+
+	close_log();
+	talloc_free(tracefile);
+	tracefile = talloc_strdup(NULL, vec[0]);
+	reopen_log();
+
+	send_ack(conn, XS_CONTROL);
+	return 0;
+}
+
 static int do_control_print(void *ctx, struct connection *conn,
 			    char **vec, int num)
 {
@@ -60,6 +92,8 @@ static int do_control_help(void *, struc
 
 static struct cmd_s cmds[] = {
 	{ "check", do_control_check, "" },
+	{ "log", do_control_log, "on|off" },
+	{ "logfile", do_control_logfile, "<file>" },
 	{ "print", do_control_print, "<string>" },
 	{ "help", do_control_help, "" },
 };
Index: xen-4.7.2-testing/tools/xenstore/xenstored_core.c
===================================================================
--- xen-4.7.2-testing.orig/tools/xenstore/xenstored_core.c
+++ xen-4.7.2-testing/tools/xenstore/xenstored_core.c
@@ -81,7 +81,7 @@ static bool recovery = true;
 static bool remove_local = true;
 static int reopen_log_pipe[2];
 static int reopen_log_pipe0_pollfd_idx = -1;
-static char *tracefile = NULL;
+char *tracefile = NULL;
 static TDB_CONTEXT *tdb_ctx = NULL;
 static bool trigger_talloc_report = false;
 
@@ -206,12 +206,17 @@ static void trigger_reopen_log(int signa
 	dummy = write(reopen_log_pipe[1], &c, 1);
 }
 
+void close_log(void)
+{
+	if (tracefd >= 0)
+		close(tracefd);
+	tracefd = -1;
+}
 
-static void reopen_log(void)
+void reopen_log(void)
 {
 	if (tracefile) {
-		if (tracefd >= 0)
-			close(tracefd);
+		close_log();
 
 		tracefd = open(tracefile, O_WRONLY|O_CREAT|O_APPEND, 0600);
 
@@ -2150,6 +2155,8 @@ int main(int argc, char *argv[])
 		finish_daemonize();
 
 	signal(SIGHUP, trigger_reopen_log);
+	if (tracefile)
+		tracefile = talloc_strdup(NULL, tracefile);
 
 	/* Get ready to listen to the tools. */
 	initialize_fds(*sock, &sock_pollfd_idx, *ro_sock, &ro_sock_pollfd_idx,
Index: xen-4.7.2-testing/tools/xenstore/xenstored_core.h
===================================================================
--- xen-4.7.2-testing.orig/tools/xenstore/xenstored_core.h
+++ xen-4.7.2-testing/tools/xenstore/xenstored_core.h
@@ -174,7 +174,10 @@ void trace_create(const void *data, cons
 void trace_destroy(const void *data, const char *type);
 void trace(const char *fmt, ...);
 void dtrace_io(const struct connection *conn, const struct buffered_data *data, int out);
+void reopen_log(void);
+void close_log(void);
 
+extern char *tracefile;
 extern int dom0_domid;
 extern int dom0_event;
 extern int priv_domid;
openSUSE Build Service is sponsored by