Blob Blame History Raw
From 769c210a4e9494757456c2896fdf67e2eb4b76c1 Mon Sep 17 00:00:00 2001
From: Ken Gaillot <kgaillot@redhat.com>
Date: Fri, 9 Jun 2017 10:49:07 -0500
Subject: [PATCH] Refactor: libcrmcommon,cib,lrmd: functionize allocating IPC
 client object

reduces duplication
---
 cib/remote.c              |  6 +-----
 include/crm/common/ipcs.h |  1 +
 lib/common/ipc.c          | 25 +++++++++++++++++++------
 lrmd/tls_backend.c        |  5 +----
 4 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/cib/remote.c b/cib/remote.c
index 9011552..0160c7e 100644
--- a/cib/remote.c
+++ b/cib/remote.c
@@ -325,13 +325,9 @@ cib_remote_listen(gpointer data)
     num_clients++;
 
     crm_client_init();
-    new_client = calloc(1, sizeof(crm_client_t));
+    new_client = crm_client_alloc(NULL);
     new_client->remote = calloc(1, sizeof(crm_remote_t));
 
-    new_client->id = crm_generate_uuid();
-
-    g_hash_table_insert(client_connections, new_client->id /* Should work */ , new_client);
-
     if (ssock == remote_tls_fd) {
 #ifdef HAVE_GNUTLS_GNUTLS_H
         new_client->kind = CRM_CLIENT_TLS;
diff --git a/include/crm/common/ipcs.h b/include/crm/common/ipcs.h
index ba1ccef..06cade9 100644
--- a/include/crm/common/ipcs.h
+++ b/include/crm/common/ipcs.h
@@ -105,6 +105,7 @@ crm_client_t *crm_client_get(qb_ipcs_connection_t * c);
 crm_client_t *crm_client_get_by_id(const char *id);
 const char *crm_client_name(crm_client_t * c);
 
+crm_client_t *crm_client_alloc(void *key);
 crm_client_t *crm_client_new(qb_ipcs_connection_t * c, uid_t uid, gid_t gid);
 void crm_client_destroy(crm_client_t * c);
 void crm_client_disconnect_all(qb_ipcs_service_t *s);
diff --git a/lib/common/ipc.c b/lib/common/ipc.c
index d32e373..efe6480 100644
--- a/lib/common/ipc.c
+++ b/lib/common/ipc.c
@@ -293,6 +293,24 @@ crm_client_disconnect_all(qb_ipcs_service_t *service)
     }
 }
 
+/*!
+ * \brief Allocate a new crm_client_t object and generate its ID
+ *
+ * \param[in] key  What to use as connections hash table key (NULL to use ID)
+ *
+ * \return Pointer to new crm_client_t (asserts on failure)
+ */
+crm_client_t *
+crm_client_alloc(void *key)
+{
+    crm_client_t *client = calloc(1, sizeof(crm_client_t));
+
+    CRM_ASSERT(client != NULL);
+    client->id = crm_generate_uuid();
+    g_hash_table_insert(client_connections, (key? key : client->id), client);
+    return client;
+}
+
 crm_client_t *
 crm_client_new(qb_ipcs_connection_t * c, uid_t uid_client, gid_t gid_client)
 {
@@ -324,21 +342,16 @@ crm_client_new(qb_ipcs_connection_t * c, uid_t uid_client, gid_t gid_client)
     crm_client_init();
 
     /* TODO: Do our own auth checking, return NULL if unauthorized */
-    client = calloc(1, sizeof(crm_client_t));
-
+    client = crm_client_alloc(c);
     client->ipcs = c;
     client->kind = CRM_CLIENT_IPC;
     client->pid = crm_ipcs_client_pid(c);
 
-    client->id = crm_generate_uuid();
-
     crm_debug("Connecting %p for uid=%d gid=%d pid=%u id=%s", c, uid_client, gid_client, client->pid, client->id);
 
 #if ENABLE_ACL
     client->user = uid2username(uid_client);
 #endif
-
-    g_hash_table_insert(client_connections, c, client);
     return client;
 }
 
diff --git a/lrmd/tls_backend.c b/lrmd/tls_backend.c
index 8c36434..7d790cf 100644
--- a/lrmd/tls_backend.c
+++ b/lrmd/tls_backend.c
@@ -212,11 +212,10 @@ lrmd_remote_listen(gpointer data)
         return TRUE;
     }
 
-    new_client = calloc(1, sizeof(crm_client_t));
+    new_client = crm_client_alloc(NULL);
     new_client->remote = calloc(1, sizeof(crm_remote_t));
     new_client->kind = CRM_CLIENT_TLS;
     new_client->remote->tls_session = session;
-    new_client->id = crm_generate_uuid();
     new_client->remote->auth_timeout =
         g_timeout_add(LRMD_REMOTE_AUTH_TIMEOUT, lrmd_auth_timeout_cb, new_client);
     crm_notice("LRMD client connection established. %p id: %s", new_client, new_client->id);
@@ -224,8 +223,6 @@ lrmd_remote_listen(gpointer data)
     new_client->remote->source =
         mainloop_add_fd("lrmd-remote-client", G_PRIORITY_DEFAULT, csock, new_client,
                         &lrmd_remote_fd_cb);
-    g_hash_table_insert(client_connections, new_client->id, new_client);
-
     return TRUE;
 }
 
-- 
1.8.3.1