Blob Blame History Raw
From cdd4419d08654d91cd8b72cca11e1d1cc51f1056 Mon Sep 17 00:00:00 2001
From: Ken Gaillot <kgaillot@redhat.com>
Date: Thu, 16 Feb 2017 10:23:12 -0600
Subject: [PATCH 1/2] Fix: tools: crm_attribute should prefer node name from
 environment

Same behavior as was done for crm_node in e0eb9e76
---
 tools/crm_attribute.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/tools/crm_attribute.c b/tools/crm_attribute.c
index 7cb2774..60ded8d 100644
--- a/tools/crm_attribute.c
+++ b/tools/crm_attribute.c
@@ -44,7 +44,7 @@
 gboolean BE_QUIET = FALSE;
 char command = 'G';
 
-char *dest_uname = NULL;
+const char *dest_uname = NULL;
 char *dest_node = NULL;
 char *set_name = NULL;
 char *attr_id = NULL;
@@ -247,7 +247,14 @@ main(int argc, char **argv)
     } else if (safe_str_eq(type, XML_CIB_TAG_CRMCONFIG)) {
     } else if (safe_str_neq(type, XML_CIB_TAG_TICKETS)) {
         if (dest_uname == NULL) {
-            dest_uname = get_node_name(0);
+            /* If we are being called from a resource agent via the cluster,
+             * the correct local node name will be passed as an environment
+             * variable. Otherwise, we have to ask the cluster.
+             */
+            dest_uname = getenv("OCF_RESKEY_" CRM_META "_" XML_LRM_ATTR_TARGET);
+            if (dest_uname == NULL) {
+                dest_uname = get_local_node_name();
+            }
         }
 
         rc = query_node_uuid(the_cib, dest_uname, &dest_node, &is_remote_node);
-- 
1.8.3.1


From 56e89a47eff249306765d95d246783e691e8ce11 Mon Sep 17 00:00:00 2001
From: Ken Gaillot <kgaillot@redhat.com>
Date: Thu, 16 Feb 2017 11:35:11 -0600
Subject: [PATCH 2/2] Log: cib,libcrmcommon,lrmd: handle IP addresses better in
 messages

This exposes lib/common/remote.c:get_ip_str() as a new internal API
crm_sockaddr2str(), and uses it wherever inet_ntoa() and inet_ntop()
were used previously.

Mainly, this reduces code duplication. It also takes cib/remote.c
one step towards supporting IPv6 addresses.
---
 cib/remote.c           | 12 +++++++-----
 include/crm_internal.h |  1 +
 lib/ais/plugin.c       | 16 ----------------
 lib/common/remote.c    | 48 ++++++++++++++++++++++++------------------------
 lrmd/tls_backend.c     | 12 ++----------
 5 files changed, 34 insertions(+), 55 deletions(-)

diff --git a/cib/remote.c b/cib/remote.c
index 9c2b972..9011552 100644
--- a/cib/remote.c
+++ b/cib/remote.c
@@ -285,7 +285,8 @@ cib_remote_listen(gpointer data)
 {
     int csock = 0;
     unsigned laddr;
-    struct sockaddr_in addr;
+    struct sockaddr_storage addr;
+    char ipstr[INET6_ADDRSTRLEN];
     int ssock = *(int *)data;
     int flag;
 
@@ -300,14 +301,15 @@ cib_remote_listen(gpointer data)
     laddr = sizeof(addr);
     memset(&addr, 0, sizeof(addr));
     csock = accept(ssock, (struct sockaddr *)&addr, &laddr);
-    crm_debug("New %s connection from %s",
-              ssock == remote_tls_fd ? "secure" : "clear-text", inet_ntoa(addr.sin_addr));
-
     if (csock == -1) {
-        crm_err("accept socket failed");
+        crm_perror(LOG_ERR, "Could not accept socket connection");
         return TRUE;
     }
 
+    crm_sockaddr2str(&addr, ipstr);
+    crm_debug("New %s connection from %s",
+              ((ssock == remote_tls_fd)? "secure" : "clear-text"), ipstr);
+
     if ((flag = fcntl(csock, F_GETFL)) >= 0) {
         if (fcntl(csock, F_SETFL, flag | O_NONBLOCK) < 0) {
             crm_err("fcntl() write failed");
diff --git a/include/crm_internal.h b/include/crm_internal.h
index a8fee47..96a68bd 100644
--- a/include/crm_internal.h
+++ b/include/crm_internal.h
@@ -204,6 +204,7 @@ int crm_remote_tcp_connect(const char *host, int port);
 int crm_remote_tcp_connect_async(const char *host, int port, int timeout,       /*ms */
                                  int *timer_id, void *userdata, void (*callback) (void *userdata, int sock));
 int crm_remote_accept(int ssock);
+void crm_sockaddr2str(void *sa, char *s);
 
 #  ifdef HAVE_GNUTLS_GNUTLS_H
 /*!
diff --git a/lib/ais/plugin.c b/lib/ais/plugin.c
index b8a2b96..fe89f03 100644
--- a/lib/ais/plugin.c
+++ b/lib/ais/plugin.c
@@ -674,22 +674,6 @@ pcmk_startup(struct corosync_api_v1 *init_with)
     return 0;
 }
 
-/*
-  static void ais_print_node(const char *prefix, struct totem_ip_address *host)
-  {
-  int len = 0;
-  char *buffer = NULL;
-
-  ais_malloc0(buffer, INET6_ADDRSTRLEN+1);
-
-  inet_ntop(host->family, host->addr, buffer, INET6_ADDRSTRLEN);
-
-  len = strlen(buffer);
-  ais_info("%s: %.*s", prefix, len, buffer);
-  ais_free(buffer);
-  }
-*/
-
 #if 0
 /* copied here for reference from exec/totempg.c */
 char *
diff --git a/lib/common/remote.c b/lib/common/remote.c
index 2042f78..80a7581 100644
--- a/lib/common/remote.c
+++ b/lib/common/remote.c
@@ -837,7 +837,7 @@ int
 crm_remote_tcp_connect_async(const char *host, int port, int timeout, /*ms */
                              int *timer_id, void *userdata, void (*callback) (void *userdata, int sock))
 {
-    char buffer[256];
+    char buffer[INET6_ADDRSTRLEN];
     struct addrinfo *res = NULL;
     struct addrinfo *rp = NULL;
     struct addrinfo hints;
@@ -882,20 +882,16 @@ crm_remote_tcp_connect_async(const char *host, int port, int timeout, /*ms */
             continue;
         }
 
-        memset(buffer, 0, DIMOF(buffer));
+        /* Set port appropriately for address family */
+        /* (void*) casts avoid false-positive compiler alignment warnings */
         if (addr->sa_family == AF_INET6) {
-            struct sockaddr_in6 *addr_in = (struct sockaddr_in6 *)(void*)addr;
-
-            addr_in->sin6_port = htons(port);
-            inet_ntop(addr->sa_family, &addr_in->sin6_addr, buffer, DIMOF(buffer));
-
+            ((struct sockaddr_in6 *)(void*)addr)->sin6_port = htons(port);
         } else {
-            struct sockaddr_in *addr_in = (struct sockaddr_in *)(void*)addr;
-
-            addr_in->sin_port = htons(port);
-            inet_ntop(addr->sa_family, &addr_in->sin_addr, buffer, DIMOF(buffer));
+            ((struct sockaddr_in *)(void*)addr)->sin_port = htons(port);
         }
 
+        memset(buffer, 0, DIMOF(buffer));
+        crm_sockaddr2str(addr, buffer);
         crm_info("Attempting to connect to remote server at %s:%d", buffer, port);
 
         if (callback) {
@@ -928,29 +924,33 @@ crm_remote_tcp_connect(const char *host, int port)
     return crm_remote_tcp_connect_async(host, port, -1, NULL, NULL, NULL);
 }
 
-
-/* Convert a struct sockaddr address to a string, IPv4 and IPv6: */
-
-static char *
-get_ip_str(const struct sockaddr_storage * sa, char * s, size_t maxlen)
+/*!
+ * \brief Convert an IP address (IPv4 or IPv6) to a string for logging
+ *
+ * \param[in]  sa  Socket address for IP
+ * \param[out] s   Storage for at least INET6_ADDRSTRLEN bytes
+ *
+ * \note sa The socket address can be a pointer to struct sockaddr_in (IPv4),
+ *          struct sockaddr_in6 (IPv6) or struct sockaddr_storage (either),
+ *          as long as its sa_family member is set correctly.
+ */
+void
+crm_sockaddr2str(void *sa, char *s)
 {
-    switch(((struct sockaddr *)sa)->sa_family) {
+    switch (((struct sockaddr*)sa)->sa_family) {
         case AF_INET:
             inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),
-                      s, maxlen);
+                      s, INET6_ADDRSTRLEN);
             break;
 
         case AF_INET6:
             inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),
-                      s, maxlen);
+                      s, INET6_ADDRSTRLEN);
             break;
 
         default:
-            strncpy(s, "Unknown AF", maxlen);
-            return NULL;
+            strcpy(s, "<invalid>");
     }
-
-    return s;
 }
 
 int
@@ -971,7 +971,7 @@ crm_remote_accept(int ssock)
     laddr = sizeof(addr);
     memset(&addr, 0, sizeof(addr));
     csock = accept(ssock, (struct sockaddr *)&addr, &laddr);
-    get_ip_str(&addr, addr_str, INET6_ADDRSTRLEN);
+    crm_sockaddr2str(&addr, addr_str);
     crm_info("New remote connection from %s", addr_str);
 
     if (csock == -1) {
diff --git a/lrmd/tls_backend.c b/lrmd/tls_backend.c
index 552b1d2..8c36434 100644
--- a/lrmd/tls_backend.c
+++ b/lrmd/tls_backend.c
@@ -248,17 +248,9 @@ bind_and_listen(struct addrinfo *addr)
     int optval;
     int fd;
     int rc;
-    char buffer[256] = { 0, };
-
-    if (addr->ai_family == AF_INET6) {
-        struct sockaddr_in6 *addr_in = (struct sockaddr_in6 *)(void*)addr->ai_addr;
-        inet_ntop(addr->ai_family, &addr_in->sin6_addr, buffer, DIMOF(buffer));
-
-    } else {
-        struct sockaddr_in *addr_in = (struct sockaddr_in *)(void*)addr->ai_addr;
-        inet_ntop(addr->ai_family, &addr_in->sin_addr, buffer, DIMOF(buffer));
-    }
+    char buffer[INET6_ADDRSTRLEN] = { 0, };
 
+    crm_sockaddr2str(addr->ai_addr, buffer);
     crm_trace("Attempting to bind on address %s", buffer);
 
     fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
-- 
1.8.3.1