From 7595e3a4d77b7e498fa84e27d93cc9f680076561 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sun, 3 Oct 2010 09:10:05 +0200 Subject: [PATCH] htparser: Format v4-mapped address as dotted-quad. --- src/htparser.h | 1 + src/plaintcp.c | 45 +++++++++++++++++++++++++++++++++------------ src/ssl-gnutls.c | 9 +++------ 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/htparser.h b/src/htparser.h index f98624a..88bfb6e 100644 --- a/src/htparser.h +++ b/src/htparser.h @@ -10,6 +10,7 @@ void serve(FILE *in, struct conn *conn); int listensock4(int port); int listensock6(int port); +char *formathaddress(struct sockaddr *name, socklen_t namelen); void handleplain(int argc, char **argp, char **argv); #ifdef HAVE_GNUTLS void handlegnussl(int argc, char **argp, char **argv); diff --git a/src/plaintcp.c b/src/plaintcp.c index 9bfb9bc..cf46b29 100644 --- a/src/plaintcp.c +++ b/src/plaintcp.c @@ -95,27 +95,48 @@ int listensock6(int port) return(fd); } +char *formathaddress(struct sockaddr *name, socklen_t namelen) +{ + static char buf[128]; + struct sockaddr_in *v4; + struct sockaddr_in6 *v6; + + switch(name->sa_family) { + case AF_INET: + v4 = (struct sockaddr_in *)name; + if(!inet_ntop(AF_INET, &v4->sin_addr, buf, sizeof(buf))) + return(NULL); + return(buf); + case AF_INET6: + v6 = (struct sockaddr_in6 *)name; + if(IN6_IS_ADDR_V4MAPPED(&v6->sin6_addr)) { + if(!inet_ntop(AF_INET, ((char *)&v6->sin6_addr) + 12, buf, sizeof(buf))) + return(NULL); + } else { + if(!inet_ntop(AF_INET6, &v6->sin6_addr, buf, sizeof(buf))) + return(NULL); + } + return(buf); + default: + errno = EPFNOSUPPORT; + return(NULL); + } +} + static int initreq(struct conn *conn, struct hthead *req) { struct tcpconn *tcp = conn->pdata; struct sockaddr_storage sa; socklen_t salen; - char nmbuf[256]; - if(tcp->name.ss_family == AF_INET) { - headappheader(req, "X-Ash-Address", inet_ntop(AF_INET, &((struct sockaddr_in *)&tcp->name)->sin_addr, nmbuf, sizeof(nmbuf))); + headappheader(req, "X-Ash-Address", formathaddress((struct sockaddr *)&tcp->name, sizeof(sa))); + if(tcp->name.ss_family == AF_INET) headappheader(req, "X-Ash-Port", sprintf3("%i", ntohs(((struct sockaddr_in *)&tcp->name)->sin_port))); - } else if(tcp->name.ss_family == AF_INET6) { - headappheader(req, "X-Ash-Address", inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&tcp->name)->sin6_addr, nmbuf, sizeof(nmbuf))); + else if(tcp->name.ss_family == AF_INET6) headappheader(req, "X-Ash-Port", sprintf3("%i", ntohs(((struct sockaddr_in6 *)&tcp->name)->sin6_port))); - } salen = sizeof(sa); - if(!getsockname(tcp->fd, (struct sockaddr *)&sa, &salen)) { - if(sa.ss_family == AF_INET) - headappheader(req, "X-Ash-Server-Address", inet_ntop(AF_INET, &((struct sockaddr_in *)&sa)->sin_addr, nmbuf, sizeof(nmbuf))); - else if(sa.ss_family == AF_INET6) - headappheader(req, "X-Ash-Server-Address", inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&sa)->sin6_addr, nmbuf, sizeof(nmbuf))); - } + if(!getsockname(tcp->fd, (struct sockaddr *)&sa, &salen)) + headappheader(req, "X-Ash-Server-Address", formathaddress((struct sockaddr *)&sa, sizeof(sa))); headappheader(req, "X-Ash-Server-Port", sprintf3("%i", tcp->port->sport)); headappheader(req, "X-Ash-Protocol", "http"); return(0); diff --git a/src/ssl-gnutls.c b/src/ssl-gnutls.c index 992818a..de52524 100644 --- a/src/ssl-gnutls.c +++ b/src/ssl-gnutls.c @@ -141,6 +141,7 @@ static int initreq(struct conn *conn, struct hthead *req) socklen_t salen; char nmbuf[256]; + headappheader(req, "X-Ash-Address", formathaddress((struct sockaddr *)&ssl->name, sizeof(sa))); if(ssl->name.ss_family == AF_INET) { headappheader(req, "X-Ash-Address", inet_ntop(AF_INET, &((struct sockaddr_in *)&ssl->name)->sin_addr, nmbuf, sizeof(nmbuf))); headappheader(req, "X-Ash-Port", sprintf3("%i", ntohs(((struct sockaddr_in *)&ssl->name)->sin_port))); @@ -149,12 +150,8 @@ static int initreq(struct conn *conn, struct hthead *req) headappheader(req, "X-Ash-Port", sprintf3("%i", ntohs(((struct sockaddr_in6 *)&ssl->name)->sin6_port))); } salen = sizeof(sa); - if(!getsockname(ssl->fd, (struct sockaddr *)&sa, &salen)) { - if(sa.ss_family == AF_INET) - headappheader(req, "X-Ash-Server-Address", inet_ntop(AF_INET, &((struct sockaddr_in *)&sa)->sin_addr, nmbuf, sizeof(nmbuf))); - else if(sa.ss_family == AF_INET6) - headappheader(req, "X-Ash-Server-Address", inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&sa)->sin6_addr, nmbuf, sizeof(nmbuf))); - } + if(!getsockname(ssl->fd, (struct sockaddr *)&sa, &salen)) + headappheader(req, "X-Ash-Server-Address", formathaddress((struct sockaddr *)&sa, sizeof(sa))); headappheader(req, "X-Ash-Server-Port", sprintf3("%i", ssl->port->sport)); headappheader(req, "X-Ash-Protocol", "https"); return(0); -- 2.11.0