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