[Ocfs2-tools-devel] [PATCH 1/5] Use cmap for getting cluster name

Goldwyn Rodrigues rgoldwyn at suse.de
Fri Jan 10 12:08:15 PST 2014


Use the cmap library to get the running cluster name from corosync.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn at suse.com>
---
 debugfs.ocfs2/Makefile |  2 +-
 libo2cb/o2cb_abi.c     | 79 +++++++++++++++++++++++++++-----------------------
 o2cb.pc.in             |  2 +-
 o2cb_ctl/Makefile      |  2 +-
 4 files changed, 46 insertions(+), 39 deletions(-)

diff --git a/debugfs.ocfs2/Makefile b/debugfs.ocfs2/Makefile
index ca4c9a4..30dfa5f 100644
--- a/debugfs.ocfs2/Makefile
+++ b/debugfs.ocfs2/Makefile
@@ -32,7 +32,7 @@ HFILES =				\
 OBJS = $(subst .c,.o,$(CFILES))
 
 LIBOCFS2_LIBS = -L$(TOPDIR)/libocfs2 -locfs2
-LIBO2CB_LIBS = -L$(TOPDIR)/libo2cb -lo2cb
+LIBO2CB_LIBS = -L$(TOPDIR)/libo2cb -lo2cb $(DL_LIBS)
 
 MANS = debugfs.ocfs2.8
 
diff --git a/libo2cb/o2cb_abi.c b/libo2cb/o2cb_abi.c
index ae03595..40f8176 100644
--- a/libo2cb/o2cb_abi.c
+++ b/libo2cb/o2cb_abi.c
@@ -35,6 +35,8 @@
 #include <errno.h>
 #include <limits.h>
 #include <ctype.h>
+#include <dlfcn.h>
+#include <corosync/cmap.h>
 
 #include <linux/types.h>
 
@@ -1966,52 +1968,57 @@ static errcode_t classic_list_clusters(char ***clusters)
 
 static errcode_t user_list_clusters(char ***clusters)
 {
-	errcode_t err = O2CB_ET_SERVICE_UNAVAILABLE;
-	int rc, fd = -1;
-	char buf[OCFS2_CONTROLD_MAXLINE];
+	errcode_t ret = O2CB_ET_SERVICE_UNAVAILABLE;
+	void *lib_handle = NULL;
+	char **list;
+	int rv;
 
-	rc = ocfs2_client_connect();
-	if (rc < 0) {
-		/* fprintf(stderr, "Unable to connect to ocfs2_controld: %s\n",
-			strerror(-rc)); */
-		switch (rc) {
-			case -EACCES:
-			case -EPERM:
-				err = O2CB_ET_PERMISSION_DENIED;
-				break;
+	cmap_handle_t handle;
+	static int (*initialize)(cmap_handle_t *handle);
+	static int (*get_string)(cmap_handle_t handle,
+			const char *string,
+			char **name);
+	static int (*finalize)(cmap_handle_t handle);
 
-			default:
-				err = O2CB_ET_SERVICE_UNAVAILABLE;
-				break;
-		}
+
+	lib_handle = dlopen("libcmap.so", RTLD_NOW | RTLD_LOCAL);
+	if (!lib_handle)
+		return ret;
+
+	initialize = dlsym(lib_handle, "cmap_initialize");
+	if (!initialize)
 		goto out;
-	}
-	fd = rc;
 
-	rc = send_message(fd, CM_LISTCLUSTERS);
-	if (rc) {
-		/* fprintf(stderr,
-			"Unable to send LISTCLUSTERS message: %s\n",
-			strerror(-rc)); */
-		err = O2CB_ET_IO;
+	get_string = dlsym(lib_handle, "cmap_get_string");
+	if (!get_string)
 		goto out;
-	}
 
-	rc = receive_list(fd, buf, clusters);
-	if (rc) {
-		/* fprintf(stderr, "Error reading from daemon: %s\n",
-			strerror(-rc)); */
-		err = O2CB_ET_IO;
+	finalize = dlsym(lib_handle, "cmap_finalize");
+	if (!finalize)
 		goto out;
-	}
 
-	err = 0;
+	rv = initialize(&handle);
+	if (rv != CS_OK)
+		goto out;
 
-out:
-	if (fd != -1)
-		close(fd);
+	list = (char **)malloc(sizeof(char *) * 2);
+	if (!list)
+		goto out;
 
-	return err;
+	rv = get_string(handle, "totem.cluster_name", &list[0]);
+	if (rv != CS_OK) {
+		free(list);
+		ret = O2CB_ET_INTERNAL_FAILURE;
+		goto out;
+	}
+
+	list[1] = NULL;
+	*clusters = list;
+	finalize(handle);
+	ret = 0;
+out:
+	dlclose(lib_handle);
+	return ret;
 }
 
 errcode_t o2cb_list_clusters(char ***clusters)
diff --git a/o2cb.pc.in b/o2cb.pc.in
index be94b8a..f13c560 100644
--- a/o2cb.pc.in
+++ b/o2cb.pc.in
@@ -7,5 +7,5 @@ Name: o2cb
 Description: Library for accessing the ocfs2 cluster base (o2cb)
 Version: @VERSION@
 Requires: com_err
-Libs: -L${libdir} -lo2cb
+Libs: -L${libdir} -lo2cb -ldl
 Cflags: -I${includedir}
diff --git a/o2cb_ctl/Makefile b/o2cb_ctl/Makefile
index 5efcab4..8589748 100644
--- a/o2cb_ctl/Makefile
+++ b/o2cb_ctl/Makefile
@@ -13,7 +13,7 @@ LIBTOOLS_INTERNAL_DEPS = $(TOPDIR)/libtools-internal/libtools-internal.a
 LIBOCFS2_LIBS = -L$(TOPDIR)/libocfs2 -locfs2
 LIBOCFS2_DEPS = $(TOPDIR)/libocfs2/libocfs2.a
 
-LIBO2CB_LIBS  = -L$(TOPDIR)/libo2cb -lo2cb
+LIBO2CB_LIBS  = -L$(TOPDIR)/libo2cb -lo2cb $(DL_LIBS)
 LIBO2CB_DEPS = $(TOPDIR)/libo2cb/libo2cb.a
 
 LIBO2DLM_LIBS = -L$(TOPDIR)/libo2dlm -lo2dlm $(DL_LIBS)
-- 
1.8.4


-- 
Goldwyn



More information about the Ocfs2-tools-devel mailing list