#include <stdlib.h>
#include <syslog.h>
#include <time.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
#include "talloc.h"
#include "core.h"
#include "watch.h"
#ifndef NO_LIVE_UPDATE
+
+struct lu_dump_state {
+ void *buf;
+ unsigned int size;
+ int fd;
+ char *filename;
+};
+
struct live_update *lu_status;
static int lu_destroy(void *data)
{
- lu_destroy_arch(data);
lu_status = NULL;
return 0;
return lu_status != NULL;
}
+static void lu_get_dump_state(struct lu_dump_state *state)
+{
+ struct stat statbuf;
+
+ state->size = 0;
+
+ state->filename = talloc_asprintf(NULL, "%s/state_dump",
+ xenstore_rundir());
+ if (!state->filename)
+ barf("Allocation failure");
+
+ state->fd = open(state->filename, O_RDONLY);
+ if (state->fd < 0)
+ return;
+ if (fstat(state->fd, &statbuf) != 0)
+ goto out_close;
+ state->size = statbuf.st_size;
+
+ state->buf = mmap(NULL, state->size, PROT_READ, MAP_PRIVATE,
+ state->fd, 0);
+ if (state->buf == MAP_FAILED) {
+ state->size = 0;
+ goto out_close;
+ }
+
+ return;
+
+ out_close:
+ close(state->fd);
+}
+
+static void lu_close_dump_state(struct lu_dump_state *state)
+{
+ assert(state->filename != NULL);
+
+ munmap(state->buf, state->size);
+ close(state->fd);
+
+ unlink(state->filename);
+ talloc_free(state->filename);
+}
+
void lu_read_state(void)
{
struct lu_dump_state state = {};
return ret ? (const char *)ret : "Overlapping transactions";
}
+static FILE *lu_dump_open(const void *ctx)
+{
+ char *filename;
+ int fd;
+
+ filename = talloc_asprintf(ctx, "%s/state_dump",
+ xenstore_rundir());
+ if (!filename)
+ return NULL;
+
+ fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+ if (fd < 0)
+ return NULL;
+
+ return fdopen(fd, "w");
+}
+
+static void lu_dump_close(FILE *fp)
+{
+ fclose(fp);
+}
+
static const char *lu_dump_state(const void *ctx, struct connection *conn)
{
FILE *fp;
unsigned int kernel_size;
unsigned int kernel_off;
- void *dump_state;
- unsigned long dump_size;
-#else
- char *filename;
#endif
+ char *filename;
char *cmdline;
/* Start parameters. */
time_t started_at;
};
-struct lu_dump_state {
- void *buf;
- unsigned int size;
-#ifndef __MINIOS__
- int fd;
- char *filename;
-#endif
-};
-
extern struct live_update *lu_status;
struct connection *lu_get_connection(void);
int num);
/* Live update private interfaces. */
-void lu_get_dump_state(struct lu_dump_state *state);
-void lu_close_dump_state(struct lu_dump_state *state);
-FILE *lu_dump_open(const void *ctx);
-void lu_dump_close(FILE *fp);
char *lu_exec(const void *ctx, int argc, char **argv);
const char *lu_arch(const void *ctx, struct connection *conn, const char **vec,
int num);
const char *lu_begin(struct connection *conn);
-void lu_destroy_arch(void *data);
#else
static inline struct connection *lu_get_connection(void)
{
* Copyright (C) 2022 Juergen Gross, SUSE LLC
*/
-#include <assert.h>
-#include <stdio.h>
#include <syslog.h>
#include <sys/stat.h>
-#include <sys/mman.h>
-#include <xen-tools/xenstore-common.h>
#include "talloc.h"
#include "core.h"
#include "lu.h"
#ifndef NO_LIVE_UPDATE
-void lu_get_dump_state(struct lu_dump_state *state)
-{
- struct stat statbuf;
-
- state->size = 0;
-
- state->filename = talloc_asprintf(NULL, "%s/state_dump",
- xenstore_rundir());
- if (!state->filename)
- barf("Allocation failure");
-
- state->fd = open(state->filename, O_RDONLY);
- if (state->fd < 0)
- return;
- if (fstat(state->fd, &statbuf) != 0)
- goto out_close;
- state->size = statbuf.st_size;
-
- state->buf = mmap(NULL, state->size, PROT_READ, MAP_PRIVATE,
- state->fd, 0);
- if (state->buf == MAP_FAILED) {
- state->size = 0;
- goto out_close;
- }
-
- return;
-
- out_close:
- close(state->fd);
-}
-
-void lu_close_dump_state(struct lu_dump_state *state)
-{
- assert(state->filename != NULL);
-
- munmap(state->buf, state->size);
- close(state->fd);
-
- unlink(state->filename);
- talloc_free(state->filename);
-}
-
-FILE *lu_dump_open(const void *ctx)
-{
- char *filename;
- int fd;
-
- filename = talloc_asprintf(ctx, "%s/state_dump",
- xenstore_rundir());
- if (!filename)
- return NULL;
-
- fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
- if (fd < 0)
- return NULL;
-
- return fdopen(fd, "w");
-}
-
-void lu_dump_close(FILE *fp)
-{
- fclose(fp);
-}
-
char *lu_exec(const void *ctx, int argc, char **argv)
{
argv[0] = lu_status->filename;
return "Error activating new binary.";
}
-void lu_destroy_arch(void *data)
-{
-}
-
static const char *lu_binary(const void *ctx, struct connection *conn,
const char *filename)
{
* Copyright (C) 2022 Juergen Gross, SUSE LLC
*/
-#include <stdbool.h>
-#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>
-#include <sys/mman.h>
-#include <xenctrl.h>
-#include <xen-tools/common-macros.h>
#include "talloc.h"
#include "lu.h"
-/* Mini-OS only knows about MAP_ANON. */
-#ifndef MAP_ANONYMOUS
-#define MAP_ANONYMOUS MAP_ANON
-#endif
-
#ifndef NO_LIVE_UPDATE
-void lu_get_dump_state(struct lu_dump_state *state)
-{
-}
-
-void lu_close_dump_state(struct lu_dump_state *state)
-{
-}
-
-FILE *lu_dump_open(const void *ctx)
-{
- lu_status->dump_size = ROUNDUP(talloc_total_size(NULL) * 2,
- XC_PAGE_SHIFT);
- lu_status->dump_state = mmap(NULL, lu_status->dump_size,
- PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- if (lu_status->dump_state == MAP_FAILED)
- return NULL;
-
- return fmemopen(lu_status->dump_state, lu_status->dump_size, "w");
-}
-
-void lu_dump_close(FILE *fp)
-{
- size_t size;
-
- size = ftell(fp);
- size = ROUNDUP(size, XC_PAGE_SHIFT);
- munmap(lu_status->dump_state + size, lu_status->dump_size - size);
- lu_status->dump_size = size;
-
- fclose(fp);
-}
-
char *lu_exec(const void *ctx, int argc, char **argv)
{
return "NYI";
}
-void lu_destroy_arch(void *data)
-{
- if (lu_status->dump_state)
- munmap(lu_status->dump_state, lu_status->dump_size);
-}
-
static const char *lu_binary_alloc(const void *ctx, struct connection *conn,
unsigned long size)
{