#include "kvstore.h" #include "kvs_rw_tools.h" #include #include #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 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; }