@@ -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)
@@ -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) {
@@ -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;
@@ -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;
@@ -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);
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@suse.com> --- 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(-)