From ab4911e4db4ea80deeb730435d6eeabcd82d8f19 Mon Sep 17 00:00:00 2001
From: Weronika Lewandowska <weronika.lewandowska@intel.com>
Date: Mon, 12 Oct 2020 13:21:59 +0200
Subject: [PATCH] pmem2: add source get fd/handle

---
 src/include/libpmem2.h         |  4 ++++
 src/libpmem2/libpmem2.def      |  1 +
 src/libpmem2/libpmem2.link.in  |  1 +
 src/libpmem2/source_posix.c    | 20 ++++++++++++++++++++
 src/libpmem2/source_windows.c  | 20 ++++++++++++++++++++
 src/test/scope/out13.log.match |  1 +
 src/test/scope/out14.log.match |  1 +
 7 files changed, 48 insertions(+)

diff --git a/src/include/libpmem2.h b/src/include/libpmem2.h
index 752fb1cca..4d2e6027c 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 c8bdbc39d..ccda52c72 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 0bb0edafe..320b7e7e3 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 422d48d9f..92f618609 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 ea7d03a90..fb813273e 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 8a9fdb4b0..0bf8d66c2 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 eb93f12f1..3c80cd799 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
-- 
GitLab