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