#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <librpmem.h>
#define POOL_SIZE (32 * 1024 * 1024)
#define NLANES 64
#define SET_POOLSET_UUID 1
#define SET_UUID 2
#define SET_NEXT 3
#define SET_PREV 4
static void
default_attr(struct rpmem_pool_attr *attr)
{
memset(attr, 0, sizeof(*attr));
attr->major = 1;
strncpy(attr->signature, "EXAMPLE", RPMEM_POOL_HDR_SIG_LEN);
memset(attr->poolset_uuid, SET_POOLSET_UUID, RPMEM_POOL_HDR_UUID_LEN);
memset(attr->uuid, SET_UUID, RPMEM_POOL_HDR_UUID_LEN);
memset(attr->next_uuid, SET_NEXT, RPMEM_POOL_HDR_UUID_LEN);
memset(attr->prev_uuid, SET_PREV, RPMEM_POOL_HDR_UUID_LEN);
}
int
main(int argc, char *argv[])
{
int ret = 0;
if (argc < 4) {
fprintf(stderr, "usage: %s [create|open|remove]"
" <target> <pool_set> [options]\n", argv[0]);
return 1;
}
char *op = argv[1];
char *target = argv[2];
char *pool_set = argv[3];
unsigned nlanes = NLANES;
void *pool;
long align = sysconf(_SC_PAGESIZE);
if (align < 0) {
perror("sysconf");
return -1;
}
errno = posix_memalign(&pool, (size_t)align, POOL_SIZE);
if (errno) {
perror("posix_memalign");
return -1;
}
if (strcmp(op, "create") == 0) {
struct rpmem_pool_attr pool_attr;
default_attr(&pool_attr);
RPMEMpool *rpp = rpmem_create(target, pool_set,
pool, POOL_SIZE, &nlanes, &pool_attr);
if (!rpp) {
fprintf(stderr, "rpmem_create: %s\n",
rpmem_errormsg());
ret = 1;
goto end;
}
ret = rpmem_persist(rpp, 0, POOL_SIZE, 0);
if (ret)
fprintf(stderr, "rpmem_persist: %s\n",
rpmem_errormsg());
ret = rpmem_close(rpp);
if (ret)
fprintf(stderr, "rpmem_close: %s\n",
rpmem_errormsg());
} else if (strcmp(op, "open") == 0) {
struct rpmem_pool_attr def_attr;
default_attr(&def_attr);
struct rpmem_pool_attr pool_attr;
RPMEMpool *rpp = rpmem_open(target, pool_set,
pool, POOL_SIZE, &nlanes, &pool_attr);
if (!rpp) {
fprintf(stderr, "rpmem_open: %s\n",
rpmem_errormsg());
ret = 1;
goto end;
}
if (memcmp(&def_attr, &pool_attr, sizeof(def_attr))) {
fprintf(stderr, "remote pool not consistent\n");
}
ret = rpmem_persist(rpp, 0, POOL_SIZE, 0);
if (ret)
fprintf(stderr, "rpmem_persist: %s\n",
rpmem_errormsg());
ret = rpmem_close(rpp);
if (ret)
fprintf(stderr, "rpmem_close: %s\n",
rpmem_errormsg());
} else if (strcmp(op, "remove") == 0) {
ret = rpmem_remove(target, pool_set, 0);
if (ret)
fprintf(stderr, "removing pool failed: %s\n",
rpmem_errormsg());
} else {
fprintf(stderr, "unsupported operation -- '%s'\n", op);
ret = 1;
}
end:
free(pool);
return ret;
}