X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Flocate_host.c;h=1db2832e99676b58ccba99a4b27996b7023b54c1;hb=fb6f6fa4ec4e3277e30d84326d48e6850822d318;hp=7b5869907c8cb3cdb9c54e13295b3a5689c43ff4;hpb=26a4a07bdacdaa7013bf45cc235df207708acfde;p=citadel.git diff --git a/webcit/locate_host.c b/webcit/locate_host.c index 7b5869907..1db2832e9 100644 --- a/webcit/locate_host.c +++ b/webcit/locate_host.c @@ -1,44 +1,31 @@ /* - * $Id$ + * Given a socket, supply the name of the host at the other end. + * + * Copyright (c) 1996-2012 by the citadel.org team + * + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -/** - * \defgroup Hostlookup Examine a socket and determine the name/address of the originating host. - * \ingroup WebcitHttpServer - */ -/*@{*/ #include "webcit.h" +#include "webserver.h" -/** - * \brief get a hostname - * \todo buffersize? - * \param tbuf the returnbuffer - * \param client_socket the sock fd where the client is connected +/* + * IPv4/IPv6 locate_host() */ -void locate_host(char *tbuf, int client_socket) +void locate_host(StrBuf *tbuf, int client_socket) { - struct sockaddr_in cs; - struct hostent *ch; - socklen_t len; - char *i; - int a1, a2, a3, a4; + struct sockaddr_in6 clientaddr; + unsigned int addrlen = sizeof(clientaddr); + char clienthost[NI_MAXHOST]; - len = sizeof(cs); - if (getpeername(client_socket, (struct sockaddr *) &cs, &len) < 0) { - strcpy(tbuf, ""); - return; - } - if ((ch = gethostbyaddr((char *) &cs.sin_addr, sizeof(cs.sin_addr), - AF_INET)) == NULL) { - i = (char *) &cs.sin_addr; - a1 = ((*i++) & 0xff); - a2 = ((*i++) & 0xff); - a3 = ((*i++) & 0xff); - a4 = ((*i++) & 0xff); - sprintf(tbuf, "%d.%d.%d.%d", a1, a2, a3, a4); - return; - } - safestrncpy(tbuf, ch->h_name, 64); + getpeername(client_socket, (struct sockaddr *)&clientaddr, &addrlen); + getnameinfo((struct sockaddr *)&clientaddr, addrlen, clienthost, sizeof(clienthost), NULL, 0, 0); + StrBufAppendBufPlain(tbuf, clienthost, -1, 0); + syslog(9, "Client is at %s\n", clienthost); } - -/*@}*/