#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/mount.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/poll.h>
#include <stdio.h>
#include <time.h>
#include <strings.h>
#include <string.h>
#include <stdarg.h>
#include <ctype.h>
#include <dirent.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <utime.h>
#include <ncurses.h>
#include <malloc.h>
#include <signal.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <atasmart.h>
#include <libfdisk/libfdisk.h>
#include <net/if.h>
#include <net/route.h>
#include <netdb.h>
#include <errno.h>
#include <ifaddrs.h>
#include <uuid/uuid.h>
#include <lzma.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <linux/if_packet.h>
#include <linux/if_arp.h>
#include <net/ethernet.h>
#include <sys/sysmacros.h>
#include "gix.h"


int run_program(char *arg0, char **arg, char *caption, char *result){
	return(0);
}

int set_route6(char *iface, unsigned char addr[16]){
		struct in6_rtmsg rt2;
		char dummy[256];
		int sock;
		struct ifreq ifr;
		printf("[%s]Gateway IP: [%s]\n",iface,display_ipv6(addr,16,dummy));
		sock = socket(AF_INET6,SOCK_DGRAM,IPPROTO_IP);
		if ( sock < 0 ){
			printf("Cannot create socket! (%s)\n",strerror(errno));
			return(1);
		}
		bzero(&ifr,sizeof(ifr));
		strcpy(ifr.ifr_name,iface);
		if ( ioctl(sock,SIOCGIFINDEX,&ifr) != 0 ){
			printf("Cannot SIOCGIFINDEX! (%s)\n",strerror(errno));
			close(sock);
			return(1);
		}

		memset(&rt2,0,sizeof(rt2));
		rt2.rtmsg_dst_len = 0;
		rt2.rtmsg_src_len = 0;
		memcpy(&rt2.rtmsg_gateway,addr,16);
		rt2.rtmsg_metric  = 1;
		rt2.rtmsg_ifindex = ifr.ifr_ifindex;
		rt2.rtmsg_flags   = RTF_UP;
		if ( ioctl(sock,SIOCADDRT,&rt2) != 0 ){
			printf("Cannot SIOCADDRT! (%s)\n",strerror(errno));
			close(sock);
			return(1);
		}
		close(sock);
		sock = socket(AF_INET6,SOCK_DGRAM,IPPROTO_IP);
		if ( sock < 0 ){
			printf("Cannot create socket! (%s)\n",strerror(errno));
			return(1);
		}
		memset(&rt2,0,sizeof(rt2));
		rt2.rtmsg_ifindex = ifr.ifr_ifindex;
		rt2.rtmsg_flags   = RTF_UP;
		if ( ioctl(sock,SIOCDELRT,&rt2) != 0 ){
			printf("WARNING: Cannot SIOCDELRT! (%s)\n",strerror(errno));
		}

		close(sock);
		return(0);
}


void main(int argc, char **argv){
	DIR *dir;
	struct dirent *diry;


	dir = opendir(SYSCONFIG_PATH);
	if ( dir ){
		while ( (diry = readdir(dir)) ){
			char fname[1024];
			char iface[1024];
			unsigned char ip[16];
			char *value;
			if ( strncmp(diry->d_name,"ifconfig.",9) != 0 ) continue;
			sprintf(fname,"%s/%s",SYSCONFIG_PATH,diry->d_name);
			value = get_tag(fname,"ONBOOT");
			if ( value == NULL ) continue;
			if ( *value != 'y' && *value != 'Y' ) continue;
			value = get_tag(fname,"GATEWAY6");
			if ( value == NULL ) continue;
			strcpy(iface,&diry->d_name[9]);
			printf("Trying [%s] (%s)\n",iface,value);
			if ( inet_pton(AF_INET6, value,ip) != 1 ){
				printf("Invalid address, skipped!\n");
				continue;
			}
			if ( set_route6(iface,ip) == 0 ){
				exit(0);
			}

		}
		closedir(dir);
	}
	exit(0);


}
