При условии, что во входных данных нет нулей:
paste - <>infile >&0
... будет достаточно, чтобы всегда добавлять новую строку только в конец файла infile, если у него ее еще нет. И ему нужно только прочитать входной файл один раз, чтобы все было правильно.
-ESUDO
Серьезно, вы должны установить владельца интерфейса tap. Попробуйте следовать:
ip tuntap add tap0 mode tap user USER
Где USER
— пользователь, который будет читать и писать в дескриптор, открытый через /dev/net/tun
. Подозреваю, что не удалось не только чтение, но и ioctl(TUNSETIFF)
, но вы не удосужились проверить возвращаемое значение.
Вот простая opentap(ifname)
функция, которая должна открывать дескриптор fd для интерфейса касания, при условии, что пользователь, запускающий ее, имеет соответствующие разрешения:
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/if_tun.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int opentap(char *ifn)
{
int fd;
struct ifreq ifr = { 0 };
if (snprintf(ifr.ifr_name, sizeof ifr.ifr_name, "%s", ifn)
>= sizeof ifr.ifr_name) {
errno = ENAMETOOLONG; return -1;
}
if ((fd = open("/dev/net/tun", O_RDWR)) == -1) return -1;
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
if (ioctl(fd, TUNSETIFF, &ifr) == -1) {
int e = errno; close(fd); errno = e; return -1;
}
return fd;
}