You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2017/04/04 13:34:29 UTC

[3/3] qpid-proton git commit: PROTON-1437: pn_proactor_addr_sockaddr returns known struct

PROTON-1437: pn_proactor_addr_sockaddr returns known struct

To use the return value of `pn_proactor_addr_sockaddr()` in API calls like
`getnameinfo` you must know its size. Rather than complicate the API to return a
size, return a pointer to the standard `struct sockaddr_storage` which is large
enough to hold any supported address type.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/f086571c
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/f086571c
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/f086571c

Branch: refs/heads/master
Commit: f086571c9db91bdd25db4693921f0a1a085add39
Parents: ed82ea8
Author: Alan Conway <ac...@redhat.com>
Authored: Thu Mar 30 16:51:05 2017 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Tue Apr 4 09:14:55 2017 -0400

----------------------------------------------------------------------
 proton-c/include/proton/proactor.h |  5 +++--
 proton-c/src/proactor/libuv.c      |  4 ++--
 proton-c/src/tests/proactor.c      | 23 ++++++++++++++++++++++-
 3 files changed, 27 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f086571c/proton-c/include/proton/proactor.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/proactor.h b/proton-c/include/proton/proactor.h
index 2d91661..d03589c 100644
--- a/proton-c/include/proton/proactor.h
+++ b/proton-c/include/proton/proactor.h
@@ -248,9 +248,10 @@ PNP_EXTERN pn_proactor_addr_t *pn_proactor_addr_remote(pn_transport_t* c);
 
 /**
  * If the underlying implementation uses `struct sockaddr` (for example POSIX or Windows
- * sockets) return a pointer, otherwise return NULL.
+ * sockets) return a pointer to a `struct sockaddr_storage` containing the address info,
+ * otherwise return NULL.
  */
-PNP_EXTERN struct sockaddr *pn_proactor_addr_sockaddr(pn_proactor_addr_t *addr);
+PNP_EXTERN struct sockaddr_storage *pn_proactor_addr_sockaddr(pn_proactor_addr_t *addr);
 
 /**
  * @}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f086571c/proton-c/src/proactor/libuv.c
----------------------------------------------------------------------
diff --git a/proton-c/src/proactor/libuv.c b/proton-c/src/proactor/libuv.c
index 2f5e369..45863c3 100644
--- a/proton-c/src/proactor/libuv.c
+++ b/proton-c/src/proactor/libuv.c
@@ -1266,8 +1266,8 @@ int pn_listener_accept(pn_listener_t *l, pn_connection_t *c) {
   return 0;
 }
 
-struct sockaddr *pn_proactor_addr_sockaddr(pn_proactor_addr_t *addr) {
-  return (struct sockaddr*)addr;
+struct sockaddr_storage *pn_proactor_addr_sockaddr(pn_proactor_addr_t *addr) {
+  return (struct sockaddr_storage*)addr;
 }
 
 struct pn_proactor_addr_t *pn_proactor_addr_local(pn_transport_t *t) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f086571c/proton-c/src/tests/proactor.c
----------------------------------------------------------------------
diff --git a/proton-c/src/tests/proactor.c b/proton-c/src/tests/proactor.c
index d22958c..be32b35 100644
--- a/proton-c/src/tests/proactor.c
+++ b/proton-c/src/tests/proactor.c
@@ -541,6 +541,14 @@ static void test_ssl(test_t *t) {
 }
 
 /* Test pn_proactor_addr funtions */
+
+/* FIXME aconway 2017-03-30: windows will need winsock2.h etc.
+   These headers are *only* needed for test_addr and only for the getnameinfo part.
+   This is the only non-portable part of the proactor test suite.
+   */
+#include <sys/socket.h>         /* For socket_storage */
+#include <netdb.h>              /* For NI_MAXHOST/NI_MAXSERV */
+
 static void test_addr(test_t *t) {
   /* Make sure NULL addr gives empty string */
   char str[1024] = "not-empty";
@@ -550,7 +558,7 @@ static void test_addr(test_t *t) {
   proactor_test_t pts[] ={ { open_wake_handler }, { listen_handler } };
   PROACTOR_TEST_INIT(pts, t);
   pn_proactor_t *client = pts[0].proactor, *server = pts[1].proactor;
-  test_port_t port = test_port(localhost);
+  test_port_t port = test_port("127.0.0.1"); /* Use IPv4 to get consistent results all platforms */
   pn_listener_t *l = pn_listener();
   pn_proactor_listen(server, l, port.host_port, 4);
   TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts));
@@ -575,6 +583,19 @@ static void test_addr(test_t *t) {
   pn_proactor_addr_str(sr, sizeof(sr), pn_proactor_addr_remote(st));
   TEST_STR_EQUAL(t, cl, sr);    /* client local == server remote */
 
+  /* Examine as sockaddr */
+  struct sockaddr_storage* addr = pn_proactor_addr_sockaddr(pn_proactor_addr_remote(ct));
+  TEST_CHECK(t, AF_INET == addr->ss_family);
+  char host[NI_MAXHOST] = "";
+  char serv[NI_MAXSERV] = "";
+  int err = getnameinfo((struct sockaddr*)addr, sizeof(*addr),
+                        host, sizeof(host),
+                        serv, sizeof(serv),
+                        NI_NUMERICHOST | NI_NUMERICSERV);
+  TEST_CHECK(t, 0 == err);
+  TEST_STR_EQUAL(t, "127.0.0.1", host);
+  TEST_STR_EQUAL(t, port.str, serv);
+
   /* Make sure you can use NULL, 0 to get length of address string without a crash */
   size_t len = pn_proactor_addr_str(NULL, 0, pn_proactor_addr_local(ct));
   TEST_CHECK(t, strlen(cl) == len);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org