mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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>
82 lines
1.3 KiB
C
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;
|
|
}
|