#include <syslog.h>
#include <errno.h>
#include <limits.h>
-#include <libdlm.h>
+#ifdef HAVE_COROSYNC_CONFDB_H
+#include <corosync/confdb.h>
+#endif
#include "clvmd-comms.h"
#include "lvm-functions.h"
static void add_reply_to_list(struct local_client *client, int status,
const char *csid, const char *buf, int len);
static if_type_t parse_cluster_interface(char *ifname);
+static if_type_t get_cluster_type(void);
static void usage(char *prog, FILE *file)
{
init_lvhash();
/* Start the cluster interface */
+ if (cluster_iface == IF_AUTO)
+ cluster_iface = get_cluster_type();
+
#ifdef USE_CMAN
if ((cluster_iface == IF_AUTO || cluster_iface == IF_CMAN) && (clops = init_cman_cluster())) {
max_csid_len = CMAN_MAX_CSID_LEN;
return iface;
}
+
+/*
+ * Try and find a cluster system in corosync's objdb, if it is running. This is
+ * only called if the command-line option is not present, and if it fails
+ * we still try the interfaces in order.
+ */
+static if_type_t get_cluster_type()
+{
+#ifdef HAVE_COROSYNC_CONFDB_H
+ confdb_handle_t handle;
+ if_type_t type = IF_AUTO;
+ int result;
+ char buf[255];
+ size_t namelen = sizeof(buf);
+ hdb_handle_t cluster_handle;
+ hdb_handle_t clvmd_handle;
+ confdb_callbacks_t callbacks = {
+ .confdb_key_change_notify_fn = NULL,
+ .confdb_object_create_change_notify_fn = NULL,
+ .confdb_object_delete_change_notify_fn = NULL
+ };
+
+ result = confdb_initialize (&handle, &callbacks);
+ if (result != CS_OK)
+ return type;
+
+ result = confdb_object_find_start(handle, OBJECT_PARENT_HANDLE);
+ if (result != CS_OK)
+ goto out;
+
+ result = confdb_object_find(handle, OBJECT_PARENT_HANDLE, (void *)"cluster", strlen("cluster"), &cluster_handle);
+ if (result != CS_OK)
+ goto out;
+
+ result = confdb_object_find_start(handle, cluster_handle);
+ if (result != CS_OK)
+ goto out;
+
+ result = confdb_object_find(handle, cluster_handle, (void *)"clvmd", strlen("clvmd"), &clvmd_handle);
+ if (result != CS_OK)
+ goto out;
+
+ result = confdb_key_get(handle, clvmd_handle, (void *)"interface", strlen("interface"), buf, &namelen);
+ if (result != CS_OK)
+ goto out;
+
+ buf[namelen] = '\0';
+ type = parse_cluster_interface(buf);
+ DEBUGLOG("got interface type '%s' from confdb\n", buf);
+out:
+ confdb_finalize(handle);
+ return type;
+#else
+ return IF_AUTO;
+#endif
+}