diff --git a/src/include/libpmem2.h b/src/include/libpmem2.h index 752fb1cca74d02f7a1e83f8f65f2c8c494ccb642..4d2e6027cf4bd0d712757484f9292146f2d5abcc 100644 --- a/src/include/libpmem2.h +++ b/src/include/libpmem2.h @@ -70,6 +70,7 @@ extern "C" { #define PMEM2_E_NO_ACCESS (-100032) #define PMEM2_E_VM_RESERVATION_NOT_EMPTY (-100033) #define PMEM2_E_MAP_EXISTS (-100034) +#define PMEM2_E_FILE_DESCRIPTOR_NOT_SET (-100035) /* source setup */ @@ -79,6 +80,9 @@ int pmem2_source_from_fd(struct pmem2_source **src, int fd); int pmem2_source_from_anon(struct pmem2_source **src, size_t size); #ifdef _WIN32 int pmem2_source_from_handle(struct pmem2_source **src, HANDLE handle); +int pmem2_source_get_handle(const struct pmem2_source *src, HANDLE *h); +#else +int pmem2_source_get_fd(const struct pmem2_source *src, int *fd); #endif int pmem2_source_size(const struct pmem2_source *src, size_t *size); diff --git a/src/libpmem2/libpmem2.def b/src/libpmem2/libpmem2.def index c8bdbc39d9a68857a55200225a398d37fa22ee33..ccda52c7258a514d2d52d2ff0bbbe5d610093745 100644 --- a/src/libpmem2/libpmem2.def +++ b/src/libpmem2/libpmem2.def @@ -45,6 +45,7 @@ EXPORTS pmem2_source_from_anon pmem2_source_from_fd pmem2_source_from_handle + pmem2_source_get_handle pmem2_source_size pmem2_vm_reservation_delete pmem2_vm_reservation_get_address diff --git a/src/libpmem2/libpmem2.link.in b/src/libpmem2/libpmem2.link.in index 0bb0edafed1995fd4c3354882a602dd377466bb5..320b7e7e35a02e00db58cc7f2a5c10b6d1c38f3f 100644 --- a/src/libpmem2/libpmem2.link.in +++ b/src/libpmem2/libpmem2.link.in @@ -40,6 +40,7 @@ LIBPMEM2_1.0 { pmem2_source_from_anon; pmem2_source_from_fd; pmem2_source_from_handle; + pmem2_source_get_fd; pmem2_source_size; pmem2_vm_reservation_delete; pmem2_vm_reservation_get_address; diff --git a/src/libpmem2/source_posix.c b/src/libpmem2/source_posix.c index 422d48d9f568a5d373d53fb59dfec82a59a3c516..92f618609776dc6b7e201c6113eb5f55379b7192 100644 --- a/src/libpmem2/source_posix.c +++ b/src/libpmem2/source_posix.c @@ -174,3 +174,23 @@ pmem2_source_alignment(const struct pmem2_source *src, size_t *alignment) return 0; } + +/* + * pmem2_source_get_fd -- get file descriptor from provided source + */ +int +pmem2_source_get_fd(const struct pmem2_source *src, int *fd) +{ + LOG(3, "src type %d", src->type); + PMEM2_ERR_CLR(); + + if (src->type == PMEM2_SOURCE_FD) { + *fd = src->value.fd; + } else { + ERR( + "File descriptor is not set, source type does not support fd"); + return PMEM2_E_FILE_DESCRIPTOR_NOT_SET; + } + + return 0; +} diff --git a/src/libpmem2/source_windows.c b/src/libpmem2/source_windows.c index ea7d03a9011c40a20c921fb2592ca82dc143b3b3..fb813273e9c454d147024e80c157a81315476f0e 100644 --- a/src/libpmem2/source_windows.c +++ b/src/libpmem2/source_windows.c @@ -161,3 +161,23 @@ pmem2_source_alignment(const struct pmem2_source *src, size_t *alignment) return 0; } + +/* + * pmem2_source_get_handle -- get file handler from provided source + */ +int +pmem2_source_get_handle(const struct pmem2_source *src, HANDLE *h) +{ + LOG(3, "src type %d", src->type); + PMEM2_ERR_CLR(); + + if (src->type == PMEM2_SOURCE_HANDLE) { + *h = src->value.handle; + } else { + ERR( + "File handle is not set, source type does not support file handles"); + return PMEM2_E_FILE_HANDLE_NOT_SET; + } + + return 0; +} diff --git a/src/test/scope/out13.log.match b/src/test/scope/out13.log.match index 8a9fdb4b0f48e8b1c9a219e1d41937bf34073001..0bf8d66c22b8a8202b44b3f0ff97eed8a9270ca2 100644 --- a/src/test/scope/out13.log.match +++ b/src/test/scope/out13.log.match @@ -31,6 +31,7 @@ pmem2_source_device_id$(nW) pmem2_source_device_usc$(nW) pmem2_source_from_anon$(nW) pmem2_source_from_fd$(nW) +pmem2_source_get_fd$(nW) pmem2_source_size$(nW) pmem2_vm_reservation_delete$(nW) pmem2_vm_reservation_get_address$(nW) diff --git a/src/test/scope/out14.log.match b/src/test/scope/out14.log.match index eb93f12f1c7f112208e2d82bcfbdeacb34a65e40..3c80cd7997e39d07d5ba482a495e23895eed1658 100644 --- a/src/test/scope/out14.log.match +++ b/src/test/scope/out14.log.match @@ -36,6 +36,7 @@ pmem2_source_device_usc pmem2_source_from_anon pmem2_source_from_fd pmem2_source_from_handle +pmem2_source_get_handle pmem2_source_size pmem2_vm_reservation_delete pmem2_vm_reservation_get_address