/*
 * Copyright (C) 2011 by Philipp Marek <philipp.marek@linbit.com>
 *
 * This file may be redistributed under the terms of the
 * GNU Lesser General Public License.
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <inttypes.h>
#include <stddef.h>

#include "superblocks.h"


struct log_header_t {
	uint64_t magic;
	uint64_t version;

	unsigned char uuid[16];

	uint64_t flags;
} __attribute__((packed));


static int probe_drbdproxy_datalog(blkid_probe pr,
		const struct blkid_idmag *mag __attribute__((__unused__)))
{
	struct log_header_t *lh;

	lh = (struct log_header_t *) blkid_probe_get_buffer(pr, 0, sizeof(*lh));
	if (!lh)
		return errno ? -errno : 1;

	blkid_probe_set_uuid(pr, lh->uuid);
	blkid_probe_sprintf_version(pr, "v%jd", le64_to_cpu(lh->version));

	return 0;
}

const struct blkid_idinfo drbdproxy_datalog_idinfo =
{
	.name		= "drbdproxy_datalog",
	.usage		= BLKID_USAGE_FILESYSTEM,
	.probefunc	= probe_drbdproxy_datalog,
	.minsz		= 16*1024,
	.magics		=
	{
		{ .magic = "DRBDdlh*", .len = 8, .sboff = 0, .kboff = 0 },
		{ NULL }
	}
};
