[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen staging] tools/xenstore: activate new binary for live update



commit dbf22970f5df8d20b2a6b7107cb9d977630181a6
Author:     Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Wed Jan 13 14:00:21 2021 +0100
Commit:     Juergen Gross <jgross@xxxxxxxx>
CommitDate: Thu Jan 21 17:31:55 2021 +0100

    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>
    Acked-by: Wei Liu <wl@xxxxxxx>
---
 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 3c212cc4d4..1f733e0a04 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 a5c1a56c6c..65ecdd0568 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;
@@ -2077,6 +2080,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);
--
generated by git-patchbot for /home/xen/git/xen.git#staging



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.