/******************************************************************************
    Copyright (C) 2016 B. Lee <bl4@postpile.net>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.

    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.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/

#pragma once

#include <util/darray.h>

#ifdef _WIN32
#include <ws2tcpip.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#else

#ifdef __linux__
#include <linux/if_link.h>
#elif __FreeBSD__
#include <netinet/in.h>
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#define __NET_IF_GNU_SOURCE__
#endif //_GNU_SOURCE
#endif //__FreeBSD__

#include <ifaddrs.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#ifdef __FreeBSD__
#ifdef ___NET_IF_GNU_SOURCE__
#undef ___NET_IF_GNU_SOURCE__
#undef _GNU_SOURCE
#endif
#endif

#endif

struct netif_saddr_item {
	char *name;
	char *addr;
};

struct netif_saddr_data {
	DARRAY(struct netif_saddr_item) addrs;
};

static inline void netif_saddr_data_free(struct netif_saddr_data *data)
{
	for (size_t i = 0; i < data->addrs.num; i++) {
		bfree(data->addrs.array[i].name);
		bfree(data->addrs.array[i].addr);
	}
	da_free(data->addrs);
}

extern bool netif_str_to_addr(struct sockaddr_storage *out, int *addr_len, const char *addr);
extern bool netif_addr_to_str(struct sockaddr_storage *in, char *addr, int addr_len);
extern void netif_get_addrs(struct netif_saddr_data *ifaddrs);
extern void netif_log_saddrs(struct netif_saddr_data *sd);
