Tony Asleson
2014-06-26 23:08:17 UTC
V2: Bug fixes
Signed-off-by: Tony Asleson <***@redhat.com>
---
c_binding/include/libstoragemgmt/Makefile.am | 1 +
c_binding/include/libstoragemgmt/libstoragemgmt.h | 1 +
.../libstoragemgmt/libstoragemgmt_plug_interface.h | 40 ++++++++
.../libstoragemgmt/libstoragemgmt_targetport.h | 107 +++++++++++++++++++++
.../include/libstoragemgmt/libstoragemgmt_types.h | 13 +++
c_binding/lsm_convert.cpp | 41 ++++++++
c_binding/lsm_convert.hpp | 14 +++
c_binding/lsm_datatypes.cpp | 85 ++++++++++++++++
c_binding/lsm_datatypes.hpp | 16 +++
9 files changed, 318 insertions(+)
create mode 100644 c_binding/include/libstoragemgmt/libstoragemgmt_targetport.h
diff --git a/c_binding/include/libstoragemgmt/Makefile.am b/c_binding/include/libstoragemgmt/Makefile.am
index cec673b..2a947f6 100644
--- a/c_binding/include/libstoragemgmt/Makefile.am
+++ b/c_binding/include/libstoragemgmt/Makefile.am
@@ -20,6 +20,7 @@ lsminc_HEADERS = \
libstoragemgmt_pool.h \
libstoragemgmt_snapshot.h \
libstoragemgmt_systems.h \
+ libstoragemgmt_targetport.h \
libstoragemgmt_types.h \
libstoragemgmt_version.h \
libstoragemgmt_volumes.h
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt.h b/c_binding/include/libstoragemgmt/libstoragemgmt.h
index 0496cce..0a90de3 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt.h
@@ -33,6 +33,7 @@
#include "libstoragemgmt_pool.h"
#include "libstoragemgmt_snapshot.h"
#include "libstoragemgmt_systems.h"
+#include "libstoragemgmt_targetport.h"
#include "libstoragemgmt_volumes.h"
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h b/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
index a337c1a..bfc08e5 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
@@ -1314,6 +1314,46 @@ void LSM_DLL_EXPORT lsm_plug_nfs_export_search_filter(const char *search_key,
* @return Private data, else NULL
*/
const char LSM_DLL_EXPORT *lsm_nfs_export_plugin_data_get( lsm_nfs_export *exp);
+
+
+/**
+ * Allocate a target port
+ * @param id ID of target port
+ * @param port_type Port type
+ * @param service_address Service address
+ * @param network_address Network Address
+ * @param physical_address Physical address
+ * @param physical_name Physical name
+ * @param system_id System ID
+ * @param plugin_data Plug-in data
+ * @return valid lsm_target_port, else NULL on memory allocation failure
+ */
+lsm_target_port LSM_DLL_EXPORT *lsm_target_port_record_alloc(
+ const char *id,
+ lsm_target_port_type port_type,
+ const char *service_address,
+ const char *network_address,
+ const char *physical_address,
+ const char *physical_name,
+ const char *system_id,
+ const char *plugin_data);
+
+/**
+ * Retrieve the plug-in private data pointer
+ * @param tp Valid target port pointer
+ * @return Character pointer to string, NULL on error
+ */
+const char LSM_DLL_EXPORT *lsm_target_port_plugin_data_get(lsm_target_port *tp);
+
+/**
+ * Allocated an array of target pointers
+ * @param size Number of pointers to store
+ * @return Allocated memory, NULL on allocation errors
+ */
+lsm_target_port LSM_DLL_EXPORT **lsm_target_port_record_array_alloc(
+ uint32_t size );
+
+
#ifdef __cplusplus
}
#endif
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt_targetport.h b/c_binding/include/libstoragemgmt/libstoragemgmt_targetport.h
new file mode 100644
index 0000000..7902f56
--- /dev/null
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt_targetport.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2011-2014 Red Hat, Inc.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: tasleson
+ */
+
+#ifndef LIBSTORAGEMGMT_TARGET_PORT_H
+#define LIBSTORAGEMGMT_TARGET_PORT_H
+
+#include "libstoragemgmt_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Duplicated a target port record.
+ * NOTE: Make sure to free resources with a call to lsm_target_port_record_free
+ * @param tp Record to duplicate
+ * @return NULL on memory allocation failure, else duplicated record.
+ */
+lsm_target_port LSM_DLL_EXPORT *lsm_target_port_copy(lsm_target_port *tp);
+
+
+/**
+ * Frees the resources for a lsm_system
+ * @param s Record to release
+ * @return LSM_ERR_OK on success, else error reason.
+ */
+int LSM_DLL_EXPORT lsm_target_port_record_free(lsm_target_port *tp);
+
+/**
+ * Frees the resources for an array for lsm_target_port
+ * @param tp Array to release memory for
+ * @param size Number of elements.
+ * @return LSM_ERR_OK on success, else error reason.
+ * */
+int LSM_DLL_EXPORT lsm_target_port_record_array_free(lsm_target_port *tp[],
+ uint32_t size );
+
+/**
+ * Returns the ID of the target port
+ * @param tp lsm_target_port record
+ * @return ID, NULL on error
+ */
+const char LSM_DLL_EXPORT *lsm_target_port_id_get(lsm_target_port *tp);
+
+/**
+ * Returns the type of target port
+ * @param tp lsm_target_port record
+ * @return enumerated value
+ */
+lsm_target_port_type lsm_target_port_type_get(lsm_target_port *tp);
+
+/**
+ * Returns the service address
+ * @param tp lsm_target_port record
+ * @return Service address, NULL on error
+ */
+const char *lsm_target_port_service_address_get(lsm_target_port *tp);
+
+/**
+ * Returns the network address
+ * @param tp lsm_target_port record
+ * @return Network address, NULL on error
+ */
+const char *lsm_target_port_network_address_get(lsm_target_port *tp);
+
+/**
+ * Returns the physical address
+ * @param tp lsm_target_port record
+ * @return Physical address, NULL on error
+ */
+const char *lsm_target_port_physical_address_get(lsm_target_port *tp);
+
+/**
+ * Returns the physical name
+ * @param tp lsm_target_port record
+ * @return Physical name, NULL on error
+ */
+const char *lsm_target_port_physical_name_get(lsm_target_port *tp);
+
+/**
+ * Returns the system_id
+ * @param tp lsm_target_port record
+ * @return System id, NULL on error
+ */
+const char *lsm_target_port_system_id_get(lsm_target_port *tp);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt_types.h b/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
index 3691eda..5180441 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
@@ -109,6 +109,11 @@ typedef struct _lsm_disk lsm_disk;
*/
typedef struct _lsm_hash lsm_hash;
+/**
+ * Opaque data type for Target ports
+ */
+typedef struct _lsm_target_port lsm_target_port;
+
/**< \enum lsm_replication_type Different types of replications that can be created */
typedef enum {
LSM_VOLUME_REPLICATE_UNKNOWN = -1, /**< Unknown replicate */
@@ -299,6 +304,14 @@ typedef enum {
LSM_POOL_RAID_TYPE_MIXED = 23
} lsm_pool_raid_type;
+typedef enum {
+ LSM_PORT_TYPE_UNKNOWN = 0,
+ LSM_PORT_TYPE_OTHER = 1,
+ LSM_PORT_TYPE_FC = 2,
+ LSM_PORT_TYPE_FCOE = 3,
+ LSM_PORT_TYPE_ISCSI = 4
+} lsm_target_port_type;
+
#ifdef __cplusplus
}
#endif
diff --git a/c_binding/lsm_convert.cpp b/c_binding/lsm_convert.cpp
index 0656662..428cb16 100644
--- a/c_binding/lsm_convert.cpp
+++ b/c_binding/lsm_convert.cpp
@@ -579,3 +579,44 @@ Value capabilities_to_value(lsm_storage_capabilities *cap)
}
return Value();
}
+
+
+lsm_target_port *value_to_target_port(Value &tp)
+{
+ lsm_target_port *rc = NULL;
+ if( is_expected_object(tp, "TargetPort") ) {
+ rc = lsm_target_port_record_alloc(
+ tp["id"].asC_str(),
+ (lsm_target_port_type)tp["port_type"].asInt32_t(),
+ tp["service_address"].asC_str(),
+ tp["network_address"].asC_str(),
+ tp["physical_address"].asC_str(),
+ tp["physical_name"].asC_str(),
+ tp["system_id"].asC_str(),
+ tp["plugin_data"].asC_str());
+ }
+ return rc;
+}
+
+/**
+ * Converts a lsm_target_port to a value
+ * @param cap lsm_target_port to convert to value
+ * @return Value
+ */
+Value target_port_to_value(lsm_target_port *tp)
+{
+ if( LSM_IS_TARGET_PORT(tp) ) {
+ std::map<std::string, Value> p;
+ p["class"] = Value("TargetPort");
+ p["id"] = Value(tp->id);
+ p["port_type"] = Value(tp->port_type);
+ p["service_address"] = Value(tp->service_address);
+ p["network_address"] = Value(tp->network_address);
+ p["physical_address"] = Value(tp->physical_address);
+ p["physical_name"] = Value(tp->physical_name);
+ p["system_id"] = Value(tp->system_id);
+ p["plugin_data"] = Value(tp->plugin_data);
+ return Value(p);
+ }
+ return Value();
+}
diff --git a/c_binding/lsm_convert.hpp b/c_binding/lsm_convert.hpp
index f9d2cb1..afacf9b 100644
--- a/c_binding/lsm_convert.hpp
+++ b/c_binding/lsm_convert.hpp
@@ -231,4 +231,18 @@ lsm_storage_capabilities *value_to_capabilities(Value &exp);
*/
Value capabilities_to_value(lsm_storage_capabilities *cap);
+/**
+ * Convert a Value representation to lsm_target_port
+ * @param tp Value to convert to lsm_target_port
+ * @return lsm_target_port pointer or NULL on errors
+ */
+lsm_target_port *value_to_target_port(Value &tp);
+
+/**
+ * Converts a lsm_target_port to a value
+ * @param cap lsm_target_port to convert to value
+ * @return Value
+ */
+Value target_port_to_value(lsm_target_port *tp);
+
#endif
diff --git a/c_binding/lsm_datatypes.cpp b/c_binding/lsm_datatypes.cpp
index cb8bdeb..3cd6cd5 100644
--- a/c_binding/lsm_datatypes.cpp
+++ b/c_binding/lsm_datatypes.cpp
@@ -35,6 +35,7 @@
#include <libstoragemgmt/libstoragemgmt_pool.h>
#include <libstoragemgmt/libstoragemgmt_snapshot.h>
#include <libstoragemgmt/libstoragemgmt_systems.h>
+#include <libstoragemgmt/libstoragemgmt_targetport.h>
#include <libstoragemgmt/libstoragemgmt_types.h>
#include <libstoragemgmt/libstoragemgmt_volumes.h>
@@ -1808,6 +1809,90 @@ int lsm_hash_string_set(lsm_hash *op,
return LSM_ERR_INVALID_HASH;
}
+lsm_target_port *lsm_target_port_record_alloc( const char *id,
+ lsm_target_port_type port_type,
+ const char *service_address,
+ const char *network_address,
+ const char *physical_address,
+ const char *physical_name,
+ const char *system_id,
+ const char *plugin_data)
+{
+ lsm_target_port *rc = (lsm_target_port *) calloc(1, sizeof(lsm_target_port));
+ if( rc ) {
+ rc->magic = LSM_TARGET_PORT_MAGIC;
+ rc->id = strdup(id);
+ rc->port_type = port_type;
+ rc->service_address = strdup(service_address);
+ rc->network_address = strdup(network_address);
+ rc->physical_address = strdup(physical_address);
+ rc->physical_name = strdup(physical_name);
+ rc->system_id = strdup(system_id);
+ rc->plugin_data = (plugin_data) ? strdup(plugin_data) : NULL;
+
+ if( !rc->id || !rc->service_address || !rc->network_address ||
+ !rc->physical_address || !rc->physical_name ||
+ !rc->system_id || (plugin_data && !rc->plugin_data)) {
+ lsm_target_port_record_free(rc);
+ rc = NULL;
+ }
+ }
+ return rc;
+}
+
+int lsm_target_port_record_free(lsm_target_port *tp)
+{
+ if( LSM_IS_TARGET_PORT(tp) ) {
+ tp->magic = LSM_DEL_MAGIC(LSM_TARGET_PORT_MAGIC);
+ free(tp->plugin_data);
+ tp->plugin_data = NULL;
+ free(tp->system_id);
+ tp->system_id = NULL;
+ free(tp->physical_name);
+ tp->physical_name = NULL;
+ free(tp->physical_address);
+ tp->physical_address = NULL;
+ free(tp->network_address);
+ tp->network_address = NULL;
+ free(tp->service_address);
+ tp->service_address = NULL;
+ free(tp);
+ return LSM_ERR_OK;
+ }
+ return LSM_ERR_INVALID_ARGUMENT;
+}
+
+lsm_target_port LSM_DLL_EXPORT *lsm_target_port_copy(lsm_target_port *tp)
+{
+ lsm_target_port *rc = NULL;
+
+ if( LSM_IS_TARGET_PORT(tp) ) {
+ rc = lsm_target_port_record_alloc(tp->id, tp->port_type,
+ tp->service_address,
+ tp->network_address,
+ tp->physical_address,
+ tp->physical_name,
+ tp->system_id,
+ tp->plugin_data);
+ }
+ return NULL;
+}
+
+MEMBER_FUNC_GET(const char *, lsm_target_port_id_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, id, NULL)
+MEMBER_FUNC_GET(lsm_target_port_type, lsm_target_port_type_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, port_type, LSM_PORT_TYPE_UNKNOWN)
+MEMBER_FUNC_GET(const char *, lsm_target_port_service_address_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, service_address, NULL)
+MEMBER_FUNC_GET(const char *, lsm_target_port_network_address_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, network_address, NULL)
+MEMBER_FUNC_GET(const char *, lsm_target_port_physical_address_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, physical_address, NULL)
+MEMBER_FUNC_GET(const char *, lsm_target_port_physical_name_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, physical_name, NULL)
+MEMBER_FUNC_GET(const char *, lsm_target_port_system_id_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, system_id, NULL)
+
+CREATE_ALLOC_ARRAY_FUNC(lsm_target_port_record_array_alloc, lsm_target_port *)
+CREATE_FREE_ARRAY_FUNC(lsm_target_port_record_array_free,
+ lsm_target_port_record_free, lsm_target_port *,
+ LSM_ERR_INVALID_SS)
+
+
+
#ifdef __cplusplus
}
#endif
diff --git a/c_binding/lsm_datatypes.hpp b/c_binding/lsm_datatypes.hpp
index f04cb90..a1d62f5 100644
--- a/c_binding/lsm_datatypes.hpp
+++ b/c_binding/lsm_datatypes.hpp
@@ -296,6 +296,22 @@ struct LSM_DLL_LOCAL _lsm_hash {
GHashTable *data;
};
+
+#define LSM_TARGET_PORT_MAGIC 0xAA7A0012
+#define LSM_IS_TARGET_PORT(obj) MAGIC_CHECK(obj, LSM_TARGET_PORT_MAGIC)
+struct LSM_DLL_LOCAL _lsm_target_port {
+ uint32_t magic;
+ char *id;
+ lsm_target_port_type port_type;
+ char *service_address;
+ char *network_address;
+ char *physical_address;
+ char *physical_name;
+ char *system_id;
+ char *plugin_data;
+};
+
+
/**
* Returns a pointer to a newly created connection structure.
* @return NULL on memory exhaustion, else new connection.
Signed-off-by: Tony Asleson <***@redhat.com>
---
c_binding/include/libstoragemgmt/Makefile.am | 1 +
c_binding/include/libstoragemgmt/libstoragemgmt.h | 1 +
.../libstoragemgmt/libstoragemgmt_plug_interface.h | 40 ++++++++
.../libstoragemgmt/libstoragemgmt_targetport.h | 107 +++++++++++++++++++++
.../include/libstoragemgmt/libstoragemgmt_types.h | 13 +++
c_binding/lsm_convert.cpp | 41 ++++++++
c_binding/lsm_convert.hpp | 14 +++
c_binding/lsm_datatypes.cpp | 85 ++++++++++++++++
c_binding/lsm_datatypes.hpp | 16 +++
9 files changed, 318 insertions(+)
create mode 100644 c_binding/include/libstoragemgmt/libstoragemgmt_targetport.h
diff --git a/c_binding/include/libstoragemgmt/Makefile.am b/c_binding/include/libstoragemgmt/Makefile.am
index cec673b..2a947f6 100644
--- a/c_binding/include/libstoragemgmt/Makefile.am
+++ b/c_binding/include/libstoragemgmt/Makefile.am
@@ -20,6 +20,7 @@ lsminc_HEADERS = \
libstoragemgmt_pool.h \
libstoragemgmt_snapshot.h \
libstoragemgmt_systems.h \
+ libstoragemgmt_targetport.h \
libstoragemgmt_types.h \
libstoragemgmt_version.h \
libstoragemgmt_volumes.h
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt.h b/c_binding/include/libstoragemgmt/libstoragemgmt.h
index 0496cce..0a90de3 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt.h
@@ -33,6 +33,7 @@
#include "libstoragemgmt_pool.h"
#include "libstoragemgmt_snapshot.h"
#include "libstoragemgmt_systems.h"
+#include "libstoragemgmt_targetport.h"
#include "libstoragemgmt_volumes.h"
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h b/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
index a337c1a..bfc08e5 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt_plug_interface.h
@@ -1314,6 +1314,46 @@ void LSM_DLL_EXPORT lsm_plug_nfs_export_search_filter(const char *search_key,
* @return Private data, else NULL
*/
const char LSM_DLL_EXPORT *lsm_nfs_export_plugin_data_get( lsm_nfs_export *exp);
+
+
+/**
+ * Allocate a target port
+ * @param id ID of target port
+ * @param port_type Port type
+ * @param service_address Service address
+ * @param network_address Network Address
+ * @param physical_address Physical address
+ * @param physical_name Physical name
+ * @param system_id System ID
+ * @param plugin_data Plug-in data
+ * @return valid lsm_target_port, else NULL on memory allocation failure
+ */
+lsm_target_port LSM_DLL_EXPORT *lsm_target_port_record_alloc(
+ const char *id,
+ lsm_target_port_type port_type,
+ const char *service_address,
+ const char *network_address,
+ const char *physical_address,
+ const char *physical_name,
+ const char *system_id,
+ const char *plugin_data);
+
+/**
+ * Retrieve the plug-in private data pointer
+ * @param tp Valid target port pointer
+ * @return Character pointer to string, NULL on error
+ */
+const char LSM_DLL_EXPORT *lsm_target_port_plugin_data_get(lsm_target_port *tp);
+
+/**
+ * Allocated an array of target pointers
+ * @param size Number of pointers to store
+ * @return Allocated memory, NULL on allocation errors
+ */
+lsm_target_port LSM_DLL_EXPORT **lsm_target_port_record_array_alloc(
+ uint32_t size );
+
+
#ifdef __cplusplus
}
#endif
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt_targetport.h b/c_binding/include/libstoragemgmt/libstoragemgmt_targetport.h
new file mode 100644
index 0000000..7902f56
--- /dev/null
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt_targetport.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2011-2014 Red Hat, Inc.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: tasleson
+ */
+
+#ifndef LIBSTORAGEMGMT_TARGET_PORT_H
+#define LIBSTORAGEMGMT_TARGET_PORT_H
+
+#include "libstoragemgmt_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Duplicated a target port record.
+ * NOTE: Make sure to free resources with a call to lsm_target_port_record_free
+ * @param tp Record to duplicate
+ * @return NULL on memory allocation failure, else duplicated record.
+ */
+lsm_target_port LSM_DLL_EXPORT *lsm_target_port_copy(lsm_target_port *tp);
+
+
+/**
+ * Frees the resources for a lsm_system
+ * @param s Record to release
+ * @return LSM_ERR_OK on success, else error reason.
+ */
+int LSM_DLL_EXPORT lsm_target_port_record_free(lsm_target_port *tp);
+
+/**
+ * Frees the resources for an array for lsm_target_port
+ * @param tp Array to release memory for
+ * @param size Number of elements.
+ * @return LSM_ERR_OK on success, else error reason.
+ * */
+int LSM_DLL_EXPORT lsm_target_port_record_array_free(lsm_target_port *tp[],
+ uint32_t size );
+
+/**
+ * Returns the ID of the target port
+ * @param tp lsm_target_port record
+ * @return ID, NULL on error
+ */
+const char LSM_DLL_EXPORT *lsm_target_port_id_get(lsm_target_port *tp);
+
+/**
+ * Returns the type of target port
+ * @param tp lsm_target_port record
+ * @return enumerated value
+ */
+lsm_target_port_type lsm_target_port_type_get(lsm_target_port *tp);
+
+/**
+ * Returns the service address
+ * @param tp lsm_target_port record
+ * @return Service address, NULL on error
+ */
+const char *lsm_target_port_service_address_get(lsm_target_port *tp);
+
+/**
+ * Returns the network address
+ * @param tp lsm_target_port record
+ * @return Network address, NULL on error
+ */
+const char *lsm_target_port_network_address_get(lsm_target_port *tp);
+
+/**
+ * Returns the physical address
+ * @param tp lsm_target_port record
+ * @return Physical address, NULL on error
+ */
+const char *lsm_target_port_physical_address_get(lsm_target_port *tp);
+
+/**
+ * Returns the physical name
+ * @param tp lsm_target_port record
+ * @return Physical name, NULL on error
+ */
+const char *lsm_target_port_physical_name_get(lsm_target_port *tp);
+
+/**
+ * Returns the system_id
+ * @param tp lsm_target_port record
+ * @return System id, NULL on error
+ */
+const char *lsm_target_port_system_id_get(lsm_target_port *tp);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt_types.h b/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
index 3691eda..5180441 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
@@ -109,6 +109,11 @@ typedef struct _lsm_disk lsm_disk;
*/
typedef struct _lsm_hash lsm_hash;
+/**
+ * Opaque data type for Target ports
+ */
+typedef struct _lsm_target_port lsm_target_port;
+
/**< \enum lsm_replication_type Different types of replications that can be created */
typedef enum {
LSM_VOLUME_REPLICATE_UNKNOWN = -1, /**< Unknown replicate */
@@ -299,6 +304,14 @@ typedef enum {
LSM_POOL_RAID_TYPE_MIXED = 23
} lsm_pool_raid_type;
+typedef enum {
+ LSM_PORT_TYPE_UNKNOWN = 0,
+ LSM_PORT_TYPE_OTHER = 1,
+ LSM_PORT_TYPE_FC = 2,
+ LSM_PORT_TYPE_FCOE = 3,
+ LSM_PORT_TYPE_ISCSI = 4
+} lsm_target_port_type;
+
#ifdef __cplusplus
}
#endif
diff --git a/c_binding/lsm_convert.cpp b/c_binding/lsm_convert.cpp
index 0656662..428cb16 100644
--- a/c_binding/lsm_convert.cpp
+++ b/c_binding/lsm_convert.cpp
@@ -579,3 +579,44 @@ Value capabilities_to_value(lsm_storage_capabilities *cap)
}
return Value();
}
+
+
+lsm_target_port *value_to_target_port(Value &tp)
+{
+ lsm_target_port *rc = NULL;
+ if( is_expected_object(tp, "TargetPort") ) {
+ rc = lsm_target_port_record_alloc(
+ tp["id"].asC_str(),
+ (lsm_target_port_type)tp["port_type"].asInt32_t(),
+ tp["service_address"].asC_str(),
+ tp["network_address"].asC_str(),
+ tp["physical_address"].asC_str(),
+ tp["physical_name"].asC_str(),
+ tp["system_id"].asC_str(),
+ tp["plugin_data"].asC_str());
+ }
+ return rc;
+}
+
+/**
+ * Converts a lsm_target_port to a value
+ * @param cap lsm_target_port to convert to value
+ * @return Value
+ */
+Value target_port_to_value(lsm_target_port *tp)
+{
+ if( LSM_IS_TARGET_PORT(tp) ) {
+ std::map<std::string, Value> p;
+ p["class"] = Value("TargetPort");
+ p["id"] = Value(tp->id);
+ p["port_type"] = Value(tp->port_type);
+ p["service_address"] = Value(tp->service_address);
+ p["network_address"] = Value(tp->network_address);
+ p["physical_address"] = Value(tp->physical_address);
+ p["physical_name"] = Value(tp->physical_name);
+ p["system_id"] = Value(tp->system_id);
+ p["plugin_data"] = Value(tp->plugin_data);
+ return Value(p);
+ }
+ return Value();
+}
diff --git a/c_binding/lsm_convert.hpp b/c_binding/lsm_convert.hpp
index f9d2cb1..afacf9b 100644
--- a/c_binding/lsm_convert.hpp
+++ b/c_binding/lsm_convert.hpp
@@ -231,4 +231,18 @@ lsm_storage_capabilities *value_to_capabilities(Value &exp);
*/
Value capabilities_to_value(lsm_storage_capabilities *cap);
+/**
+ * Convert a Value representation to lsm_target_port
+ * @param tp Value to convert to lsm_target_port
+ * @return lsm_target_port pointer or NULL on errors
+ */
+lsm_target_port *value_to_target_port(Value &tp);
+
+/**
+ * Converts a lsm_target_port to a value
+ * @param cap lsm_target_port to convert to value
+ * @return Value
+ */
+Value target_port_to_value(lsm_target_port *tp);
+
#endif
diff --git a/c_binding/lsm_datatypes.cpp b/c_binding/lsm_datatypes.cpp
index cb8bdeb..3cd6cd5 100644
--- a/c_binding/lsm_datatypes.cpp
+++ b/c_binding/lsm_datatypes.cpp
@@ -35,6 +35,7 @@
#include <libstoragemgmt/libstoragemgmt_pool.h>
#include <libstoragemgmt/libstoragemgmt_snapshot.h>
#include <libstoragemgmt/libstoragemgmt_systems.h>
+#include <libstoragemgmt/libstoragemgmt_targetport.h>
#include <libstoragemgmt/libstoragemgmt_types.h>
#include <libstoragemgmt/libstoragemgmt_volumes.h>
@@ -1808,6 +1809,90 @@ int lsm_hash_string_set(lsm_hash *op,
return LSM_ERR_INVALID_HASH;
}
+lsm_target_port *lsm_target_port_record_alloc( const char *id,
+ lsm_target_port_type port_type,
+ const char *service_address,
+ const char *network_address,
+ const char *physical_address,
+ const char *physical_name,
+ const char *system_id,
+ const char *plugin_data)
+{
+ lsm_target_port *rc = (lsm_target_port *) calloc(1, sizeof(lsm_target_port));
+ if( rc ) {
+ rc->magic = LSM_TARGET_PORT_MAGIC;
+ rc->id = strdup(id);
+ rc->port_type = port_type;
+ rc->service_address = strdup(service_address);
+ rc->network_address = strdup(network_address);
+ rc->physical_address = strdup(physical_address);
+ rc->physical_name = strdup(physical_name);
+ rc->system_id = strdup(system_id);
+ rc->plugin_data = (plugin_data) ? strdup(plugin_data) : NULL;
+
+ if( !rc->id || !rc->service_address || !rc->network_address ||
+ !rc->physical_address || !rc->physical_name ||
+ !rc->system_id || (plugin_data && !rc->plugin_data)) {
+ lsm_target_port_record_free(rc);
+ rc = NULL;
+ }
+ }
+ return rc;
+}
+
+int lsm_target_port_record_free(lsm_target_port *tp)
+{
+ if( LSM_IS_TARGET_PORT(tp) ) {
+ tp->magic = LSM_DEL_MAGIC(LSM_TARGET_PORT_MAGIC);
+ free(tp->plugin_data);
+ tp->plugin_data = NULL;
+ free(tp->system_id);
+ tp->system_id = NULL;
+ free(tp->physical_name);
+ tp->physical_name = NULL;
+ free(tp->physical_address);
+ tp->physical_address = NULL;
+ free(tp->network_address);
+ tp->network_address = NULL;
+ free(tp->service_address);
+ tp->service_address = NULL;
+ free(tp);
+ return LSM_ERR_OK;
+ }
+ return LSM_ERR_INVALID_ARGUMENT;
+}
+
+lsm_target_port LSM_DLL_EXPORT *lsm_target_port_copy(lsm_target_port *tp)
+{
+ lsm_target_port *rc = NULL;
+
+ if( LSM_IS_TARGET_PORT(tp) ) {
+ rc = lsm_target_port_record_alloc(tp->id, tp->port_type,
+ tp->service_address,
+ tp->network_address,
+ tp->physical_address,
+ tp->physical_name,
+ tp->system_id,
+ tp->plugin_data);
+ }
+ return NULL;
+}
+
+MEMBER_FUNC_GET(const char *, lsm_target_port_id_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, id, NULL)
+MEMBER_FUNC_GET(lsm_target_port_type, lsm_target_port_type_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, port_type, LSM_PORT_TYPE_UNKNOWN)
+MEMBER_FUNC_GET(const char *, lsm_target_port_service_address_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, service_address, NULL)
+MEMBER_FUNC_GET(const char *, lsm_target_port_network_address_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, network_address, NULL)
+MEMBER_FUNC_GET(const char *, lsm_target_port_physical_address_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, physical_address, NULL)
+MEMBER_FUNC_GET(const char *, lsm_target_port_physical_name_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, physical_name, NULL)
+MEMBER_FUNC_GET(const char *, lsm_target_port_system_id_get, lsm_target_port *tp, tp, LSM_IS_TARGET_PORT, system_id, NULL)
+
+CREATE_ALLOC_ARRAY_FUNC(lsm_target_port_record_array_alloc, lsm_target_port *)
+CREATE_FREE_ARRAY_FUNC(lsm_target_port_record_array_free,
+ lsm_target_port_record_free, lsm_target_port *,
+ LSM_ERR_INVALID_SS)
+
+
+
#ifdef __cplusplus
}
#endif
diff --git a/c_binding/lsm_datatypes.hpp b/c_binding/lsm_datatypes.hpp
index f04cb90..a1d62f5 100644
--- a/c_binding/lsm_datatypes.hpp
+++ b/c_binding/lsm_datatypes.hpp
@@ -296,6 +296,22 @@ struct LSM_DLL_LOCAL _lsm_hash {
GHashTable *data;
};
+
+#define LSM_TARGET_PORT_MAGIC 0xAA7A0012
+#define LSM_IS_TARGET_PORT(obj) MAGIC_CHECK(obj, LSM_TARGET_PORT_MAGIC)
+struct LSM_DLL_LOCAL _lsm_target_port {
+ uint32_t magic;
+ char *id;
+ lsm_target_port_type port_type;
+ char *service_address;
+ char *network_address;
+ char *physical_address;
+ char *physical_name;
+ char *system_id;
+ char *plugin_data;
+};
+
+
/**
* Returns a pointer to a newly created connection structure.
* @return NULL on memory exhaustion, else new connection.
--
1.8.2.1
1.8.2.1