/*
 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
 *
 * This document is the property of Apple Computer, Inc.
 * It is considered confidential and proprietary.
 *
 * This document may not be reproduced or transmitted in any form,
 * in whole or in part, without the express written permission of
 * Apple Computer, Inc.
 */
/*
 * Read-only support for iPod-style SysCfg data.
 */

#ifndef __SYSCFG_H
#define __SYSCFG_H

#include <sys/types.h>

__BEGIN_DECLS

/* where we expect to find the magic number in a bdev */
#define kSysCfgBdevOffset  0x4000

struct syscfgEntry {
	u_int32_t	seTag;
	u_int8_t	seData[16];
};

struct syscfgEntryCNTB {
	u_int32_t       seTag;	/* 'CTNB' */
	u_int32_t	seRealTag;
	u_int32_t	seDataSize;
	u_int32_t	seDataOffset;
	u_int32_t	reserved;
};

struct syscfgMemEntry {
	u_int32_t	seTag;
	u_int8_t	seData[16];
	u_int32_t	seDataSize;	
	u_int32_t	seDataOffset;
};

/*
 * Attempt to initialise SysCfg from (bdevName)
 *
 * Returns true if successful.
 */
bool	syscfgInitWithBdev(const char *bdevName);

/*
 * Copy the data for an entry by tag
 *
 * Look up the provided tag, then copy the upto the size
 * bytes into buffer.
 *
 * Returns -1 if the tag was not found, or the number of bytes copied.
 */
int syscfgCopyDataForTag(u_int32_t tag, u_int8_t *buffer, size_t size);

/*
 * Look up an entry by tag.
 *
 * Returns false if the tag was not found. If the tag was found, returns true
 * and copies the tag's entry into the provided pointer..
 */
bool	syscfgFindByTag(u_int32_t tag, struct syscfgMemEntry *entry);

/*
 * Look up an entry by index.
 *
 * Returns a pointer to a statically-allocated internal buffer, which
 * will remain valid until the next call to syscfgFindByTag or syscfgFindByIndex.
 *
 * Returns NULL if the index was not found or not valid.
 * Returns false if the index  was not found or not valid. If the index was found,
 * returns true and copies the tag's entry into the provided pointer..
 */
bool	syscfgFindByIndex(u_int32_t index, struct syscfgMemEntry *result);

/*
 * Gets a pointer to the data associated with an entry returned by
 * syscfgFindByTag or syscfgFindByIndex
 *
 * Returns NULL if the entry was invalid
 */
void *	syscfgGetData(struct syscfgMemEntry *entry);

/*
 * Gets the size in bytes of the data associated with an entry returned by
 * syscfgFindByTag or syscfgFindByIndex
 */
uint32_t	syscfgGetSize(struct syscfgMemEntry *entry);

/* Returns true if the tag is found and populates the given pointers if they are non-NULL */
bool		syscfg_find_tag(uint32_t tag, void **data_out, uint32_t *size_out);

__END_DECLS

#endif
