[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v11 27/27] tools/xenstore: activate new binary for live update
Add activation of the new binary for live update. The daemon case is handled completely, while for stubdom we only add stubs. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- V7: - added unbinding dom0 and virq event channels V8: - no longer close dom0 evtchn (Julien Grall) V10: - remember original argc and argv (taken from deleted patch) --- tools/xenstore/xenstored_control.c | 61 +++++++++++++++++++++++++++++- tools/xenstore/xenstored_core.c | 5 +++ tools/xenstore/xenstored_core.h | 3 ++ tools/xenstore/xenstored_domain.c | 6 +++ tools/xenstore/xenstored_domain.h | 1 + 5 files changed, 75 insertions(+), 1 deletion(-) diff --git a/tools/xenstore/xenstored_control.c b/tools/xenstore/xenstored_control.c index 900b82bd40..906beae1f9 100644 --- a/tools/xenstore/xenstored_control.c +++ b/tools/xenstore/xenstored_control.c @@ -16,6 +16,7 @@ Interactive commands for Xen Store Daemon. along with this program; If not, see <http://www.gnu.org/licenses/>. */ +#include <ctype.h> #include <errno.h> #include <stdarg.h> #include <stdio.h> @@ -335,6 +336,11 @@ static void lu_get_dump_state(struct lu_dump_state *state) static void lu_close_dump_state(struct lu_dump_state *state) { } + +static char *lu_exec(const void *ctx, int argc, char **argv) +{ + return "NYI"; +} #else static const char *lu_binary(const void *ctx, struct connection *conn, const char *filename) @@ -434,6 +440,14 @@ static void lu_close_dump_state(struct lu_dump_state *state) unlink(filename); talloc_free(filename); } + +static char *lu_exec(const void *ctx, int argc, char **argv) +{ + argv[0] = lu_status->filename; + execvp(argv[0], argv); + + return "Error activating new binary."; +} #endif static bool lu_check_lu_allowed(void) @@ -572,7 +586,52 @@ void lu_read_state(void) static const char *lu_activate_binary(const void *ctx) { - return "Not yet implemented."; + int argc; + char **argv; + unsigned int i; + + if (lu_status->cmdline) { + argc = 4; /* At least one arg + progname + "-U" + NULL. */ + for (i = 0; lu_status->cmdline[i]; i++) + if (isspace(lu_status->cmdline[i])) + argc++; + argv = talloc_array(ctx, char *, argc); + if (!argv) + return "Allocation failure."; + + i = 0; + argc = 1; + argv[1] = strtok(lu_status->cmdline, " \t"); + while (argv[argc]) { + if (!strcmp(argv[argc], "-U")) + i = 1; + argc++; + argv[argc] = strtok(NULL, " \t"); + } + + if (!i) { + argv[argc++] = "-U"; + argv[argc] = NULL; + } + } else { + for (i = 0; i < orig_argc; i++) + if (!strcmp(orig_argv[i], "-U")) + break; + + argc = orig_argc; + argv = talloc_array(ctx, char *, orig_argc + 2); + if (!argv) + return "Allocation failure."; + + memcpy(argv, orig_argv, orig_argc * sizeof(*argv)); + if (i == orig_argc) + argv[argc++] = "-U"; + argv[argc] = NULL; + } + + domain_deinit(); + + return lu_exec(ctx, argc, argv); } static bool do_lu_start(struct delayed_request *req) diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index 3e133b475c..f6980478dd 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -73,6 +73,9 @@ static unsigned int delayed_requests; static int sock = -1; +int orig_argc; +char **orig_argv; + static bool verbose = false; LIST_HEAD(connections); int tracefd = -1; @@ -2070,6 +2073,8 @@ int main(int argc, char *argv[]) const char *pidfile = NULL; int timeout; + orig_argc = argc; + orig_argv = argv; while ((opt = getopt_long(argc, argv, "DE:F:HNPS:t:A:M:T:RVW:U", options, NULL)) != -1) { diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h index 6ac5a6fbfa..589699e833 100644 --- a/tools/xenstore/xenstored_core.h +++ b/tools/xenstore/xenstored_core.h @@ -222,6 +222,9 @@ void dtrace_io(const struct connection *conn, const struct buffered_data *data, void reopen_log(void); void close_log(void); +extern int orig_argc; +extern char **orig_argv; + extern char *tracefile; extern int tracefd; diff --git a/tools/xenstore/xenstored_domain.c b/tools/xenstore/xenstored_domain.c index cbeb2a309c..3d4d0649a2 100644 --- a/tools/xenstore/xenstored_domain.c +++ b/tools/xenstore/xenstored_domain.c @@ -783,6 +783,12 @@ void domain_init(int evtfd) virq_port = rc; } +void domain_deinit(void) +{ + if (virq_port) + xenevtchn_unbind(xce_handle, virq_port); +} + void domain_entry_inc(struct connection *conn, struct node *node) { struct domain *d; diff --git a/tools/xenstore/xenstored_domain.h b/tools/xenstore/xenstored_domain.h index 1cc1c03ed8..dc97591713 100644 --- a/tools/xenstore/xenstored_domain.h +++ b/tools/xenstore/xenstored_domain.h @@ -46,6 +46,7 @@ int do_reset_watches(struct connection *conn, struct buffered_data *in); void domain_init(int evtfd); void dom0_init(void); +void domain_deinit(void); /* Returns the implicit path of a connection (only domains have this) */ const char *get_implicit_path(const struct connection *conn); -- 2.26.2
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |