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/05/01 21:10:51 UTC

qpid-proton git commit: PROTON-1460: implement pn_netaddr functions for epoll proactor

Repository: qpid-proton
Updated Branches:
  refs/heads/master 6995cfd63 -> 2c6c57e29


PROTON-1460: implement pn_netaddr functions for epoll proactor

Also made netaddr.h const-correct and updated both libuv and epoll implementations.


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

Branch: refs/heads/master
Commit: 2c6c57e290fd1f10278f98befabf5558b240d305
Parents: 6995cfd
Author: Alan Conway <ac...@redhat.com>
Authored: Mon May 1 16:45:00 2017 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Mon May 1 17:02:09 2017 -0400

----------------------------------------------------------------------
 proton-c/include/proton/netaddr.h | 10 +++++-----
 proton-c/src/proactor/epoll.c     | 35 +++++++++++++++++++++++-----------
 proton-c/src/proactor/libuv.c     | 12 ++++++------
 proton-c/src/tests/proactor.c     |  4 ++--
 4 files changed, 37 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c6c57e2/proton-c/include/proton/netaddr.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/netaddr.h b/proton-c/include/proton/netaddr.h
index 21b79ff..9cde766 100644
--- a/proton-c/include/proton/netaddr.h
+++ b/proton-c/include/proton/netaddr.h
@@ -43,17 +43,17 @@ typedef struct pn_netaddr_t pn_netaddr_t;
  * @return the length of the string (excluding trailing '\0'), if >= size then
  * the address was truncated.
  */
-PNP_EXTERN int pn_netaddr_str(pn_netaddr_t *addr, char *buf, size_t size);
+PNP_EXTERN int pn_netaddr_str(const pn_netaddr_t *addr, char *buf, size_t size);
 
 /**
  * Get the local address of a transport. Return NULL if not available.
  */
-PNP_EXTERN pn_netaddr_t *pn_netaddr_local(pn_transport_t *t);
+PNP_EXTERN const pn_netaddr_t *pn_netaddr_local(pn_transport_t *t);
 
 /**
  * Get the remote address of a transport. Return NULL if not available.
  */
-PNP_EXTERN pn_netaddr_t *pn_netaddr_remote(pn_transport_t *t);
+PNP_EXTERN const pn_netaddr_t *pn_netaddr_remote(pn_transport_t *t);
 
 struct sockaddr;
 
@@ -61,13 +61,13 @@ struct sockaddr;
  * On POSIX or Windows, get the underlying `struct sockaddr`.
  * Return NULL if not available.
  */
-PNP_EXTERN struct sockaddr *pn_netaddr_sockaddr(pn_netaddr_t *na);
+PNP_EXTERN const struct sockaddr *pn_netaddr_sockaddr(const pn_netaddr_t *na);
 
 /**
  * On POSIX or Windows, get the size of the underlying `struct sockaddr`.
  * Return 0 if not available.
  */
-PNP_EXTERN size_t pn_netaddr_socklen(pn_netaddr_t *na);
+PNP_EXTERN size_t pn_netaddr_socklen(const pn_netaddr_t *na);
 
 /**
  * @}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c6c57e2/proton-c/src/proactor/epoll.c
----------------------------------------------------------------------
diff --git a/proton-c/src/proactor/epoll.c b/proton-c/src/proactor/epoll.c
index 6ea61c7..36d7263 100644
--- a/proton-c/src/proactor/epoll.c
+++ b/proton-c/src/proactor/epoll.c
@@ -425,6 +425,10 @@ static void psocket_init(psocket_t* ps, pn_proactor_t* p, bool is_conn, const ch
   strncpy(ps->port, port, sizeof(ps->port));
 }
 
+struct pn_netaddr_t {
+  struct sockaddr_storage ss;
+};
+
 typedef struct pconnection_t {
   psocket_t psocket;
   pcontext_t context;
@@ -445,6 +449,7 @@ typedef struct pconnection_t {
   pn_event_t *cached_event;
   pn_event_batch_t batch;
   pn_connection_driver_t driver;
+  struct pn_netaddr_t local, remote; /* Actual addresses */
 } pconnection_t;
 
 struct pn_listener_t {
@@ -967,6 +972,13 @@ void pconnection_start(pconnection_t *pc) {
   int efd = pc->psocket.proactor->epollfd;
   start_polling(&pc->timer.epoll_io, efd);  // TODO: check for error
 
+  int fd = pc->psocket.sockfd;
+  socklen_t len = sizeof(pc->local);
+  getsockname(fd, (struct sockaddr*)&pc->local, &len);
+  len = sizeof(pc->remote);
+  getpeername(fd, (struct sockaddr*)&pc->remote, &len);
+
+  start_polling(&pc->timer.epoll_io, efd);  // TODO: check for error
   pc->read_closed = false;
   pc->write_closed = false;
   epoll_extended_t *ee = &pc->psocket.epoll_io;
@@ -1724,27 +1736,28 @@ void pn_proactor_disconnect(pn_proactor_t *p, pn_condition_t *cond) {
     wake_notify(&p->context);
 }
 
-struct sockaddr *pn_netaddr_sockaddr(pn_netaddr_t *addr) {
-  return NULL;
+const struct sockaddr *pn_netaddr_sockaddr(const pn_netaddr_t *na) {
+  return (struct sockaddr*)na;
 }
 
-size_t pn_netaddr_socklen(pn_netaddr_t *addr) {
-  return 0;
+size_t pn_netaddr_socklen(const pn_netaddr_t *na) {
+  return sizeof(struct sockaddr_storage);
 }
 
-pn_netaddr_t *pn_netaddr_local(pn_transport_t *t) {
-  return NULL;
+const pn_netaddr_t *pn_netaddr_local(pn_transport_t *t) {
+  pconnection_t *pc = get_pconnection(pn_transport_connection(t));
+  return pc? &pc->local : NULL;
 }
 
-pn_netaddr_t *pn_netaddr_remote(pn_transport_t *t) {
-  return NULL;
+const pn_netaddr_t *pn_netaddr_remote(pn_transport_t *t) {
+  pconnection_t *pc = get_pconnection(pn_transport_connection(t));
+  return pc ? &pc->remote : NULL;
 }
 
-int pn_netaddr_str(pn_netaddr_t* addr, char *buf, size_t len) {
-  struct sockaddr_storage *sa = (struct sockaddr_storage*)addr;
+int pn_netaddr_str(const pn_netaddr_t* na, char *buf, size_t len) {
   char host[NI_MAXHOST];
   char port[NI_MAXSERV];
-  int err = getnameinfo((struct sockaddr *)sa, sizeof(*sa),
+  int err = getnameinfo((struct sockaddr *)&na->ss, sizeof(na->ss),
                         host, sizeof(host), port, sizeof(port),
                         NI_NUMERICHOST | NI_NUMERICSERV);
   if (!err) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c6c57e2/proton-c/src/proactor/libuv.c
----------------------------------------------------------------------
diff --git a/proton-c/src/proactor/libuv.c b/proton-c/src/proactor/libuv.c
index 22d0163..0a05424 100644
--- a/proton-c/src/proactor/libuv.c
+++ b/proton-c/src/proactor/libuv.c
@@ -1269,32 +1269,32 @@ void pn_listener_accept(pn_listener_t *l, pn_connection_t *c) {
   work_notify(&l->work);
 }
 
-struct sockaddr *pn_netaddr_sockaddr(pn_netaddr_t *na) {
+const struct sockaddr *pn_netaddr_sockaddr(const pn_netaddr_t *na) {
   return (struct sockaddr*)na;
 }
 
-size_t pn_netaddr_socklen(pn_netaddr_t *na) {
+size_t pn_netaddr_socklen(const pn_netaddr_t *na) {
   return sizeof(struct sockaddr_storage);
 }
 
-pn_netaddr_t *pn_netaddr_local(pn_transport_t *t) {
+const pn_netaddr_t *pn_netaddr_local(pn_transport_t *t) {
   pconnection_t *pc = get_pconnection(pn_transport_connection(t));
   return pc? &pc->local : NULL;
 }
 
-pn_netaddr_t *pn_netaddr_remote(pn_transport_t *t) {
+const pn_netaddr_t *pn_netaddr_remote(pn_transport_t *t) {
   pconnection_t *pc = get_pconnection(pn_transport_connection(t));
   return pc ? &pc->remote : NULL;
 }
 
-int pn_netaddr_str(struct pn_netaddr_t* na, char *buf, size_t len) {
+int pn_netaddr_str(const pn_netaddr_t* na, char *buf, size_t len) {
   char host[NI_MAXHOST];
   char port[NI_MAXSERV];
   int err = getnameinfo((struct sockaddr *)&na->ss, sizeof(na->ss),
                         host, sizeof(host), port, sizeof(port),
                         NI_NUMERICHOST | NI_NUMERICSERV);
   if (!err) {
-    return snprintf(buf, len, "%s:%s", host, port); /* FIXME aconway 2017-03-29: ipv6 format? */
+    return snprintf(buf, len, "%s:%s", host, port);
   } else {
     if (buf) *buf = '\0';
     return 0;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c6c57e2/proton-c/src/tests/proactor.c
----------------------------------------------------------------------
diff --git a/proton-c/src/tests/proactor.c b/proton-c/src/tests/proactor.c
index 2839614..ba73033 100644
--- a/proton-c/src/tests/proactor.c
+++ b/proton-c/src/tests/proactor.c
@@ -758,8 +758,8 @@ static void test_netaddr(test_t *t) {
   TEST_STR_EQUAL(t, cl, sr);    /* client local == server remote */
 
   /* Examine as sockaddr */
-  pn_netaddr_t *na = pn_netaddr_remote(ct);
-  struct sockaddr *sa = pn_netaddr_sockaddr(na);
+  const pn_netaddr_t *na = pn_netaddr_remote(ct);
+  const struct sockaddr *sa = pn_netaddr_sockaddr(na);
   TEST_CHECK(t, AF_INET == sa->sa_family);
   char host[NI_MAXHOST] = "";
   char serv[NI_MAXSERV] = "";


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