96 lines
2.6 KiB
C
96 lines
2.6 KiB
C
/*
|
|
* Copyright (c) 2018 The Fuchsia Authors
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef _KVSTORE_H_
|
|
#define _KVSTORE_H_
|
|
|
|
#include <common.h>
|
|
#include <stdlib.h>
|
|
|
|
typedef struct kvstore kvstore_t;
|
|
|
|
#define KVS_OK 0
|
|
#define KVS_ERR_INTERNAL -1
|
|
#define KVS_ERR_BAD_PARAM -2
|
|
#define KVS_ERR_OUT_OF_SPACE -3
|
|
#define KVS_ERR_NOT_FOUND -4
|
|
#define KVS_ERR_PARSE_HDR -5
|
|
#define KVS_ERR_PARSE_REC -6
|
|
#define KVS_ERR_PARSE_CRC -7
|
|
|
|
// KVStore API
|
|
// -----------
|
|
|
|
// Setup a new, empty kvstore, backed by buffer.
|
|
void kvs_init(kvstore_t* kvs, void* buffer, size_t buflen);
|
|
|
|
// Initialize a kvstore (read from disk, etc), backed by buffer.
|
|
int kvs_load(kvstore_t* kvs, void* buffer, size_t buflen);
|
|
|
|
// Prepare kvstore for saving (compute checksum & update header).
|
|
// On success kvs->data and kvs->datalen represents the data
|
|
// to write to storage.
|
|
int kvs_save(kvstore_t* kvs);
|
|
|
|
|
|
// Adds a new key and value, provided there is space.
|
|
// Does not check for duplicates.
|
|
int kvs_addn(kvstore_t* kvs, const void* key, size_t klen,
|
|
const void* val, size_t vlen);
|
|
|
|
// Adds a new key and value, provided there is space.
|
|
// Does not check for duplicates.
|
|
int kvs_add(kvstore_t* kvs, const char* key, const char* value);
|
|
|
|
|
|
// Locates key and returns its value and OK, else NOT_FOUND
|
|
// returned pointer is not guaranteed stable if kvstore is mutated.
|
|
int kvs_getn(kvstore_t* kvs, const void* key, size_t klen,
|
|
const void** val, size_t* vlen);
|
|
|
|
// Locates key and returns its value if found, otherwise returns fallback
|
|
// returned pointer is not guaranteed stable if kvstore is mutated.
|
|
const char* kvs_get(kvstore_t* kvs, const char* key, const char* fallback);
|
|
|
|
|
|
// Calls func() for each key/value pair.
|
|
// Return KVS_OK at the end, or stops and returns whatever func()
|
|
// returned. if func returns non-zero.
|
|
int kvs_foreach(kvstore_t* kvs, void *cookie,
|
|
int (*func)(void *cookie, const char* key, const char* val));
|
|
|
|
|
|
// KVStore Wire Format and Internals
|
|
// ---------------------------------
|
|
|
|
// <header> <kventry>* [ <signature> ]
|
|
//
|
|
// <header> := <u64:version> <u32:flags> <u32:length> <u32:crc32> <u32:reserved>
|
|
// <kventry> := <u8:klen> <u8:vlen> <u8[klen]:key> <u8:0> <u8[vlen]:value> <u8:0>
|
|
// <signature> := TBD
|
|
|
|
// echo -n "kvstore-version-1" | sha256sum (LSB)
|
|
#define KVSTORE_VERSION 0x540f19caa7bf19dcUL
|
|
|
|
#define KVSTORE_FLAG_SIGNED 1
|
|
|
|
struct kvstore {
|
|
void* data;
|
|
size_t datalen;
|
|
size_t datamax;
|
|
size_t kvcount;
|
|
};
|
|
|
|
typedef struct kvshdr {
|
|
uint64_t version;
|
|
uint32_t flags;
|
|
uint32_t length;
|
|
uint32_t reserved;
|
|
uint32_t crc;
|
|
} kvshdr_t;
|
|
|
|
#endif /* _KVSTORE_H_ */
|