EtherCat/ethercat.c

59 lines
1.5 KiB
C

#include <errno.h>
#include <fcntl.h>
#include <linux/if.h>
#include <linux/if_tun.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#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;
}