#include #include #include #include #include #include #include #include #define DEVICE_NODE_TUN /dev/net/tun #define BUFFER_SIZE 0x1000 #define EXIT_SUCCESS 0 #define EXIT_USAGE 1 #define EXIT_RUNTIME 2 int file_descriptor; char buffer[BUFFER_SIZE]; struct ifreq ifr; int main(int argc, char** argv) { if (argc != 2) { fprintf(stderr, "Usage: %s TAP\n", argv[0]); return EXIT_USAGE; } else if ((strlen(argv[1])==2 && strncmp(argv[1], "-h", 2)==0) || (strlen(argv[1])==6 &&strncmp(argv[1], "--help", 6))) { fprintf(stdout, "Usage: %s TAP\n", argv[0]); return EXIT_SUCCESS; } memset(&ifr, 0, sizeof(ifr)); ifr.ifr_flags = IFF_TAP | IFF_NO_PI; strncpy(ifr.ifr_name, argv[1], IFNAMSIZ); file_descriptor = open("/dev/net/tun", O_RDWR); if (file_descriptor == -1) { fprintf(stderr, "An error occurred while trying to open DEVICE_NODE_TUN: %i\n", errno); return EXIT_RUNTIME; } if (ioctl(file_descriptor, TUNSETIFF, &ifr) == -1) { fprintf(stderr, "An error occurred while trying to ioctl: %i\n", errno); close(file_descriptor); return EXIT_RUNTIME; } //TODO: // while input not EOF // and the tap is still a valid device (it might go away) // read from tap to stdout // read from stdin to tap //TODO: signal handler for SIGINT (and SIGHUP? maybe others?) if (fcntl(fd, F_GETFD) != -1 || errno != EBADF) { close(file_descriptor); } return EXIT_SUCCESS; }