Files
xen/tools/xenstore/utils.c
T
Juergen Gross ed6eebf17d tools/xenstore: dump the xenstore state for live update
Dump the complete Xenstore status to a file (daemon case) or memory
(stubdom case).

As we don't know the exact length of the needed area in advance we are
using an anonymous rather large mapping in stubdom case, which will
use only virtual address space until accessed. And as we are writing
the area in a sequential manner this is fine. As the initial size we
are choosing the double size of the memory allocated via talloc(),
which should be more than enough.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Paul Durrant <paul@xen.org>
Acked-by: Julien Grall <jgrall@amazon.com>
Acked-by: Wei Liu <wl@xen.org>
2021-01-21 17:31:36 +01:00

82 lines
1.3 KiB
C

#define _GNU_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <signal.h>
#include "utils.h"
static void default_xprintf(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
fflush(stderr);
}
void (*xprintf)(const char *fmt, ...) = default_xprintf;
void barf(const char *fmt, ...)
{
char *str;
int bytes;
va_list arglist;
xprintf("FATAL: ");
va_start(arglist, fmt);
bytes = vasprintf(&str, fmt, arglist);
va_end(arglist);
if (bytes >= 0) {
syslog(LOG_CRIT, "%s\n", str);
xprintf("%s\n", str);
free(str);
}
exit(1);
}
void barf_perror(const char *fmt, ...)
{
char *str;
int bytes, err = errno;
va_list arglist;
xprintf("FATAL: ");
va_start(arglist, fmt);
bytes = vasprintf(&str, fmt, arglist);
va_end(arglist);
if (bytes >= 0) {
syslog(LOG_CRIT, "%s: %s\n", str, strerror(err));
xprintf("%s: %s\n", str, strerror(err));
free(str);
}
exit(1);
}
const char *dump_state_align(FILE *fp)
{
long len;
static char nul[8] = {};
len = ftell(fp);
if (len < 0)
return "Dump state align error";
len &= 7;
if (!len)
return NULL;
if (fwrite(nul, 8 - len, 1, fp) != 1)
return "Dump state align error";
return NULL;
}