/*
 * tunsetup: Setup a persistent TUN device
 * Matt Chapman <matthewc@cse.unsw.edu.au>
 */

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/if_tun.h>

static void usage(char *program)
{
	fprintf(stderr, "Usage: %s [ -d ] [ -e ] <interface>\n", program);
}

int main(int argc, char *argv[])
{
	struct ifreq ifr;
	int fd, c;
	int delete = 0;
	int tap = 0;

	while ((c = getopt(argc, argv, "deh?")) != -1)
	{
		switch (c)
		{
			case 'd':
				delete = 1;
				break;
			case 'e':
				tap = 1;
				break;
			default:
				usage(argv[0]);
				return 1;
		}
	}

	if (optind != argc - 1)
	{
		usage(argv[0]);
		return 1;
	}

	fd = open("/dev/net/tun", O_RDWR);
	if (fd == -1)
	{
		perror("/dev/net/tun");
		return 1;
	}

	memset(&ifr, 0, sizeof(ifr));
	strncpy(ifr.ifr_name, argv[optind], sizeof(ifr.ifr_name));
	ifr.ifr_flags = IFF_NO_PI;
	if (tap)
		ifr.ifr_flags |= IFF_TAP;
	else
		ifr.ifr_flags |= IFF_TUN;

	if (ioctl(fd, TUNSETIFF, &ifr) == -1)
	{
		perror("TUNSETIFF");
		return 1;
	}

	if (ioctl(fd, TUNSETPERSIST, delete ? 0 : 1) == -1)
	{
		perror("TUNSETPERSIST");
		return 1;
	}

	close(fd);
	return 0;
}
