diff --git a/tools/xenstore/xenstored_control.c b/tools/xenstore/xenstored_control.c index e3f0d34528..7854b7f46f 100644 --- a/tools/xenstore/xenstored_control.c +++ b/tools/xenstore/xenstored_control.c @@ -28,6 +28,34 @@ #include "xenstored_core.h" #include "xenstored_control.h" +struct live_update { + /* For verification the correct connection is acting. */ + struct connection *conn; +}; + +static struct live_update *lu_status; + +static int lu_destroy(void *data) +{ + lu_status = NULL; + + return 0; +} + +static const char *lu_begin(struct connection *conn) +{ + if (lu_status) + return "live-update session already active."; + + lu_status = talloc_zero(conn, struct live_update); + if (!lu_status) + return "Allocation failure."; + lu_status->conn = conn; + talloc_set_destructor(lu_status, lu_destroy); + + return NULL; +} + struct cmd_s { char *cmd; int (*func)(void *, struct connection *, char **, int); @@ -154,6 +182,13 @@ static int do_control_print(void *ctx, struct connection *conn, static const char *lu_abort(const void *ctx, struct connection *conn) { syslog(LOG_INFO, "live-update: abort\n"); + + if (!lu_status) + return "No live-update session active."; + + /* Destructor will do the real abort handling. */ + talloc_free(lu_status); + return NULL; } @@ -161,6 +196,10 @@ static const char *lu_cmdline(const void *ctx, struct connection *conn, const char *cmdline) { syslog(LOG_INFO, "live-update: cmdline %s\n", cmdline); + + if (!lu_status || lu_status->conn != conn) + return "Not in live-update session."; + return NULL; } @@ -168,13 +207,23 @@ static const char *lu_cmdline(const void *ctx, struct connection *conn, static const char *lu_binary_alloc(const void *ctx, struct connection *conn, unsigned long size) { + const char *ret; + syslog(LOG_INFO, "live-update: binary size %lu\n", size); + + ret = lu_begin(conn); + if (ret) + return ret; + return NULL; } static const char *lu_binary_save(const void *ctx, struct connection *conn, unsigned int size, const char *data) { + if (!lu_status || lu_status->conn != conn) + return "Not in live-update session."; + return NULL; } @@ -193,7 +242,14 @@ static const char *lu_arch(const void *ctx, struct connection *conn, static const char *lu_binary(const void *ctx, struct connection *conn, const char *filename) { + const char *ret; + syslog(LOG_INFO, "live-update: binary %s\n", filename); + + ret = lu_begin(conn); + if (ret) + return ret; + return NULL; } @@ -212,6 +268,13 @@ static const char *lu_start(const void *ctx, struct connection *conn, bool force, unsigned int to) { syslog(LOG_INFO, "live-update: start, force=%d, to=%u\n", force, to); + + if (!lu_status || lu_status->conn != conn) + return "Not in live-update session."; + + /* Will be replaced by real live-update later. */ + talloc_free(lu_status); + return NULL; }