aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2019-01-05 21:15:40 +0100
committerLoïc Collignon <loic.collignon@iot.bzh>2019-02-27 17:54:25 +0100
commit87a37be37b2e064d643b7af9661a5e8ac01db835 (patch)
tree3e85870d603ecf08dd4459fe0735d7cf62847c72
parent8f6ad49b592bfa806e08c12c17dac8c40c7a872c (diff)
afb-hsrv: Avoid call to getnameinfo
Calling getnameinfo may block the program a long time (5s) when address is zero. Bug-AGL: SPEC-2133 Change-Id: Id52b2989c5e996363fd4b6f39049f059a6ee97a2 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r--src/afb-hsrv.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/afb-hsrv.c b/src/afb-hsrv.c
index 2a08a2e3..0d0bd061 100644
--- a/src/afb-hsrv.c
+++ b/src/afb-hsrv.c
@@ -540,13 +540,19 @@ static int hsrv_itf_connect(struct hsrv_itf *itf)
}
fdev_set_events(itf->fdev, EPOLLIN);
fdev_set_callback(itf->fdev, hsrv_itf_callback, itf);
+ memset(&addr, 0, sizeof addr);
lenaddr = (socklen_t)sizeof addr;
getsockname(fdev_fd(itf->fdev), &addr, &lenaddr);
- rgni = getnameinfo(&addr, lenaddr, hbuf, sizeof hbuf, sbuf, sizeof sbuf, NI_NUMERICSERV);
- if (rgni != 0) {
- ERROR("getnameinfo returned %d: %s", rgni, gai_strerror(rgni));
- hbuf[0] = sbuf[0] = '?';
- hbuf[1] = sbuf[1] = 0;
+ if (addr.sa_family == AF_INET && !((struct sockaddr_in*)&addr)->sin_addr.s_addr) {
+ strncpy(hbuf, "*", NI_MAXHOST);
+ sprintf(sbuf, "%d", (int)ntohs(((struct sockaddr_in*)&addr)->sin_port));
+ } else {
+ rgni = getnameinfo(&addr, lenaddr, hbuf, sizeof hbuf, sbuf, sizeof sbuf, NI_NUMERICSERV);
+ if (rgni != 0) {
+ ERROR("getnameinfo returned %d: %s", rgni, gai_strerror(rgni));
+ hbuf[0] = sbuf[0] = '?';
+ hbuf[1] = sbuf[1] = 0;
+ }
}
NOTICE("Listening interface %s:%s", hbuf, sbuf);
return 1;
@@ -583,4 +589,4 @@ int afb_hsrv_add_interface_tcp(struct afb_hsrv *hsrv, const char *itf, uint16_t
return 0;
}
return afb_hsrv_add_interface(hsrv, buffer);
-} \ No newline at end of file
+}