Rusty Russell
6 years ago
12 changed files with 79 additions and 35 deletions
@ -0,0 +1,41 @@ |
|||||
|
#include <ccan/crc/crc.h> |
||||
|
#include <ccan/endian/endian.h> |
||||
|
#include <common/gossip_store.h> |
||||
|
#include <common/status.h> |
||||
|
#include <errno.h> |
||||
|
#include <inttypes.h> |
||||
|
#include <unistd.h> |
||||
|
|
||||
|
u8 *gossip_store_read(const tal_t *ctx, int gossip_store_fd, u64 offset) |
||||
|
{ |
||||
|
beint32_t hdr[2]; |
||||
|
u32 msglen, checksum; |
||||
|
u8 *msg; |
||||
|
|
||||
|
if (offset == 0) |
||||
|
status_failed(STATUS_FAIL_INTERNAL_ERROR, |
||||
|
"gossip_store: can't access offset %"PRIu64, |
||||
|
offset); |
||||
|
if (pread(gossip_store_fd, hdr, sizeof(hdr), offset) != sizeof(hdr)) { |
||||
|
status_failed(STATUS_FAIL_INTERNAL_ERROR, |
||||
|
"gossip_store: can't read hdr offset %"PRIu64 |
||||
|
": %s", |
||||
|
offset, strerror(errno)); |
||||
|
} |
||||
|
|
||||
|
msglen = be32_to_cpu(hdr[0]); |
||||
|
checksum = be32_to_cpu(hdr[1]); |
||||
|
msg = tal_arr(ctx, u8, msglen); |
||||
|
if (pread(gossip_store_fd, msg, msglen, offset + sizeof(hdr)) != msglen) |
||||
|
status_failed(STATUS_FAIL_INTERNAL_ERROR, |
||||
|
"gossip_store: can't read len %u offset %"PRIu64, |
||||
|
msglen, offset); |
||||
|
|
||||
|
if (checksum != crc32c(0, msg, msglen)) |
||||
|
status_failed(STATUS_FAIL_INTERNAL_ERROR, |
||||
|
"gossip_store: bad checksum offset %"PRIu64, |
||||
|
offset); |
||||
|
|
||||
|
return msg; |
||||
|
} |
||||
|
|
@ -0,0 +1,19 @@ |
|||||
|
#ifndef LIGHTNING_COMMON_GOSSIP_STORE_H |
||||
|
#define LIGHTNING_COMMON_GOSSIP_STORE_H |
||||
|
#include "config.h" |
||||
|
#include <ccan/short_types/short_types.h> |
||||
|
#include <ccan/tal/tal.h> |
||||
|
|
||||
|
/**
|
||||
|
* gossip_store -- On-disk storage related information |
||||
|
*/ |
||||
|
#define GOSSIP_STORE_VERSION 4 |
||||
|
|
||||
|
/**
|
||||
|
* Direct store accessor: loads gossip msg from store. |
||||
|
* |
||||
|
* Doesn't return; status_failed() on error. |
||||
|
*/ |
||||
|
u8 *gossip_store_read(const tal_t *ctx, int gossip_store_fd, u64 offset); |
||||
|
|
||||
|
#endif /* LIGHTNING_COMMON_GOSSIP_STORE_H */ |
Loading…
Reference in new issue