/*
 * Copyright (C) 2015 - 2020, IBEROXARXA SERVICIOS INTEGRALES, S.L.
 * Copyright (C) 2015 - 2020, Jaume Olivé Petrus (jolive@whitecatboard.org)
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the <organization> nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *     * The WHITECAT logotype cannot be changed, you can remove it, but you
 *       cannot change it in any way. The WHITECAT logotype is:
 *
 *          /\       /\
 *         /  \_____/  \
 *        /_____________\
 *        W H I T E C A T
 *
 *     * Redistributions in binary form must retain all copyright notices printed
 *       to any local or remote output device. This include any reference to
 *       Lua RTOS, whitecatboard.org, Lua, and other copyright notices that may
 *       appear in the future.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Lua RTOS getnameinfo implementation
 *
 */

/*
 * IMPORTANT NOTICE:
 *
 * In Lua RTOS the getnameinfo function implementation is incomplete.
 * We must found a method to do a reverse DNS query in LWIP to full
 * implement this function.
 *
 */

#include "lwip/netdb.h"
#include "lwip/ip_addr.h"
#include <net/if.h>

#define NI_NUMERICHOST	1	/* Don't try to look up hostname.  */
#define EAI_OVERFLOW	  -12	/* Argument buffer overflow.  */

int
getnameinfo(const struct sockaddr *sa, socklen_t salen,
		    char *host, size_t hostlen,
			char *serv, size_t servlen, int flags)
{
	//  if (flags & ~(NI_NUMERICHOST | NI_NUMERICSERV)) {
	// 	return EAI_BADFLAGS;
	// }

	const struct sockaddr_in *sinp = (const struct sockaddr_in *) sa;

	switch (sa->sa_family) {
	case AF_INET:
		if (flags & NI_NUMERICHOST) {
			if (inet_ntop (AF_INET, &sinp->sin_addr, host, hostlen) == NULL) {
				return EAI_OVERFLOW;
			}
		}

		if (flags & NI_NUMERICSERV) {
			if (snprintf(serv, servlen, "%d", ntohs (sinp->sin_port)) < 0) {
				return EAI_OVERFLOW;
			}
		}
		break;
	
	case AF_INET6:
		if (flags & NI_NUMERICHOST) {
			if (inet_ntop (AF_INET6, &((const struct sockaddr_in6 *) sa)->sin6_addr, host, hostlen) == NULL) {
				return EAI_OVERFLOW;
			}
		}
		for (char* p = host; *p; ++p) *p = tolower((unsigned char)*p);

		if (flags & NI_NUMERICSERV) {
			if (snprintf(serv, servlen, "%d", ntohs (((const struct sockaddr_in6 *) sa)->sin6_port)) < 0) {
				return EAI_OVERFLOW;
			}
		}
		break;
	}

	return 0;
}