147 lines
2.9 KiB
C
147 lines
2.9 KiB
C
#include "kvstore.h"
|
|
#include "kvs_rw_tools.h"
|
|
#include <arpa/inet.h>
|
|
#include <unistd.h>
|
|
|
|
#if ENABLE_ARRAY
|
|
extern kvs_array_t global_array;
|
|
#endif
|
|
|
|
#if ENABLE_RBTREE
|
|
extern kvs_rbtree_t global_rbtree;
|
|
#endif
|
|
|
|
#if ENABLE_HASH
|
|
extern kvs_hash_t global_hash;
|
|
#endif
|
|
|
|
extern int global_cmd_log_fd;
|
|
|
|
#include <errno.h>
|
|
int write_full(int fd, const void *buf, size_t len)
|
|
{
|
|
const uint8_t *p = buf;
|
|
|
|
while (len > 0) {
|
|
ssize_t n = write(fd, p, len);
|
|
if (n < 0) {
|
|
if (errno == EINTR)
|
|
continue;
|
|
return -1;
|
|
}
|
|
p += n;
|
|
len -= n;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// 1 read n suc, 0 eof, -1 error
|
|
int read_full(int fd, void *buf, size_t n)
|
|
{
|
|
uint8_t *p = (uint8_t *)buf;
|
|
size_t got = 0;
|
|
|
|
while (got < n) {
|
|
ssize_t r = read(fd, p + got, n - got);
|
|
if (r > 0) {
|
|
got += (size_t)r;
|
|
continue;
|
|
}
|
|
if (r == 0) {
|
|
return (got == 0) ? 0 : -1;
|
|
}
|
|
/* r < 0 */
|
|
if (errno == EINTR) {
|
|
continue;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
// 0 suc, -1 err
|
|
int kvs_need(const uint8_t *p, const uint8_t *end, size_t n) {
|
|
return (p + n <= end) ? 0 : -1;
|
|
}
|
|
|
|
// 注意u8类型不需要ntoh或者hton
|
|
// 0 suc, -1 err
|
|
int kvs_read_u8(const uint8_t **pp, const uint8_t *end, uint8_t *out) {
|
|
const uint8_t *p = *pp;
|
|
if (kvs_need(p, end, 1) < 0) return -1;
|
|
*out = *p;
|
|
*pp = p + 1;
|
|
return 0;
|
|
}
|
|
|
|
int kvs_read_u16(const uint8_t **pp, const uint8_t *end, uint16_t *out) {
|
|
const uint8_t *p = *pp;
|
|
if (kvs_need(p, end, 2) < 0) return -1;
|
|
uint16_t v;
|
|
memcpy(&v, p, 2);
|
|
*out = ntohs(v);
|
|
*pp = p + 2;
|
|
return 0;
|
|
}
|
|
|
|
int kvs_read_u32(const uint8_t **pp, const uint8_t *end, uint32_t *out) {
|
|
const uint8_t *p = *pp;
|
|
if (kvs_need(p, end, 4) < 0) return -1;
|
|
uint32_t v;
|
|
memcpy(&v, p, 4);
|
|
*out = ntohl(v);
|
|
*pp = p + 4;
|
|
return 0;
|
|
}
|
|
|
|
int kvs_write_u8(uint8_t **pp, const uint8_t *end, uint8_t v) {
|
|
uint8_t *p = *pp;
|
|
if (kvs_need(p, end, 1) < 0) return -1;
|
|
*p = v;
|
|
*pp = p + 1;
|
|
return 0;
|
|
}
|
|
|
|
int kvs_write_u16(uint8_t **pp, const uint8_t *end, uint16_t v) {
|
|
uint8_t *p = *pp;
|
|
if (kvs_need(p, end, 2) < 0) return -1;
|
|
uint16_t be = htons(v);
|
|
memcpy(p, &be, 2);
|
|
*pp = p + 2;
|
|
return 0;
|
|
}
|
|
|
|
int kvs_write_u32(uint8_t **pp, const uint8_t *end, uint32_t v) {
|
|
uint8_t *p = *pp;
|
|
if (kvs_need(p, end, 4) < 0) return -1;
|
|
uint32_t be = htonl(v);
|
|
memcpy(p, &be, 4);
|
|
*pp = p + 4;
|
|
return 0;
|
|
}
|
|
|
|
// -1 err, 0 suc
|
|
int kvs_write_file(FILE *fp, const void *buf, size_t n) {
|
|
const uint8_t *p = (const uint8_t *)buf;
|
|
while (n > 0) {
|
|
size_t w = fwrite(p, 1, n, fp);
|
|
if (w == 0) return -1;
|
|
p += w;
|
|
n -= w;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// -1 err, 0 suc
|
|
int kvs_read_file(FILE *fp, void *buf, size_t n){
|
|
uint8_t *p = (uint8_t *)buf;
|
|
while (n > 0) {
|
|
size_t r = fread(p, 1, n, fp);
|
|
if (r == 0) return -1; // EOF or error
|
|
p += r;
|
|
n -= r;
|
|
}
|
|
return 0;
|
|
}
|