Files
ldb/kvs_rw_tools.c

89 lines
1.6 KiB
C

#include "kvs_rw_tools.h"
#include "mem_pool/mem_pool.h"
#include "kvs_oplog.h"
#include <arpa/inet.h>
#include <unistd.h>
#include <string.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;
}
// -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;
}