X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fplaintcp.c;h=cf46b29fd982925d3978d7bf90b3ab514ead8b05;hb=2daf44115026999612b7a4a48cf35bfa711c35c4;hp=00b6f3c02159ec315975acd627ea6e5909c76830;hpb=6ca53b2e5e3b76345fd709a3e9d32aee69889054;p=ashd.git diff --git a/src/plaintcp.c b/src/plaintcp.c index 00b6f3c..cf46b29 100644 --- a/src/plaintcp.c +++ b/src/plaintcp.c @@ -44,6 +44,7 @@ struct tcpport { struct tcpconn { struct sockaddr_storage name; struct tcpport *port; + int fd; }; int listensock4(int port) @@ -94,18 +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; - char nmbuf[256]; + struct sockaddr_storage sa; + socklen_t salen; - 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)) + 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); @@ -125,6 +156,7 @@ void servetcp(struct muth *muth, va_list args) in = mtstdopen(fd, 1, 60, "r+"); conn.pdata = &tcp; conn.initreq = initreq; + tcp.fd = fd; tcp.name = name; tcp.port = stcp; serve(in, &conn);