/******************************************************************************
    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 void netif_get_addrs(struct netif_saddr_data *ifaddrs);
extern void netif_log_saddrs(struct netif_saddr_data *sd);