]> xenbits.xensource.com Git - xen.git/commitdiff
tools/xenstore: add basic live-update command parsing
authorJuergen Gross <jgross@suse.com>
Wed, 13 Jan 2021 13:00:17 +0000 (14:00 +0100)
committerJuergen Gross <jgross@suse.com>
Thu, 21 Jan 2021 16:29:46 +0000 (17:29 +0100)
Add the basic parts for parsing the live-update control command.

For now only add the parameter evaluation and calling appropriate
functions. Those function only print a message for now and return
success.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Paul Durrant <paul@xen.org>
Reviewed-by: Julien Grall <jgrall@amazon.com>
Acked-by: Wei Liu <wl@xen.org>
tools/xenstore/xenstored_control.c

index 00fda5acdba7d1ccf29b853fb275fa85b098b347..e3f0d345281e15946dd6d9882fff028c6e3ba346 100644 (file)
@@ -19,7 +19,9 @@
 #include <errno.h>
 #include <stdarg.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
+#include <syslog.h>
 
 #include "utils.h"
 #include "talloc.h"
@@ -149,12 +151,113 @@ static int do_control_print(void *ctx, struct connection *conn,
        return 0;
 }
 
+static const char *lu_abort(const void *ctx, struct connection *conn)
+{
+       syslog(LOG_INFO, "live-update: abort\n");
+       return NULL;
+}
+
+static const char *lu_cmdline(const void *ctx, struct connection *conn,
+                             const char *cmdline)
+{
+       syslog(LOG_INFO, "live-update: cmdline %s\n", cmdline);
+       return NULL;
+}
+
+#ifdef __MINIOS__
+static const char *lu_binary_alloc(const void *ctx, struct connection *conn,
+                                  unsigned long size)
+{
+       syslog(LOG_INFO, "live-update: binary size %lu\n", size);
+       return NULL;
+}
+
+static const char *lu_binary_save(const void *ctx, struct connection *conn,
+                                 unsigned int size, const char *data)
+{
+       return NULL;
+}
+
+static const char *lu_arch(const void *ctx, struct connection *conn,
+                          char **vec, int num)
+{
+       if (num == 2 && !strcmp(vec[0], "-b"))
+               return lu_binary_alloc(ctx, conn, atol(vec[1]));
+       if (num > 2 && !strcmp(vec[0], "-d"))
+               return lu_binary_save(ctx, conn, atoi(vec[1]), vec[2]);
+
+       errno = EINVAL;
+       return NULL;
+}
+#else
+static const char *lu_binary(const void *ctx, struct connection *conn,
+                            const char *filename)
+{
+       syslog(LOG_INFO, "live-update: binary %s\n", filename);
+       return NULL;
+}
+
+static const char *lu_arch(const void *ctx, struct connection *conn,
+                          char **vec, int num)
+{
+       if (num == 2 && !strcmp(vec[0], "-f"))
+               return lu_binary(ctx, conn, vec[1]);
+
+       errno = EINVAL;
+       return NULL;
+}
+#endif
+
+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);
+       return NULL;
+}
+
 static int do_control_lu(void *ctx, struct connection *conn,
                         char **vec, int num)
 {
        const char *resp;
+       const char *ret = NULL;
+       unsigned int i;
+       bool force = false;
+       unsigned int to = 0;
+
+       if (num < 1)
+               return EINVAL;
+
+       if (!strcmp(vec[0], "-a")) {
+               if (num == 1)
+                       ret = lu_abort(ctx, conn);
+               else
+                       return EINVAL;
+       } else if (!strcmp(vec[0], "-c")) {
+               if (num == 2)
+                       ret = lu_cmdline(ctx, conn, vec[1]);
+               else
+                       return EINVAL;
+       } else if (!strcmp(vec[0], "-s")) {
+               for (i = 1; i < num; i++) {
+                       if (!strcmp(vec[i], "-F"))
+                               force = true;
+                       else if (!strcmp(vec[i], "-t") && i < num - 1) {
+                               i++;
+                               to = atoi(vec[i]);
+                       } else
+                               return EINVAL;
+               }
+               ret = lu_start(ctx, conn, force, to);
+       } else {
+               errno = 0;
+               ret = lu_arch(ctx, conn, vec, num);
+               if (errno)
+                       return errno;
+       }
 
-       resp = talloc_strdup(ctx, "NYI");
+       if (!ret)
+               ret = "OK";
+       resp = talloc_strdup(ctx, ret);
        send_reply(conn, XS_CONTROL, resp, strlen(resp) + 1);
        return 0;
 }