tools/xenstore: add basic live-update command parsing

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>
This commit is contained in:
Juergen Gross committed 2021-01-21 17:29:46 +01:00
1 parent 7f97193e6a
commit fecab256d4
1 file changed
+104 -1
+104 -1
View 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;
resp = talloc_strdup(ctx, "NYI");
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;
}
if (!ret)
ret = "OK";
resp = talloc_strdup(ctx, ret);
send_reply(conn, XS_CONTROL, resp, strlen(resp) + 1);
return 0;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.