Как читать данные из интерфейса Tap?

При условии, что во входных данных нет нулей:

paste - <>infile >&0

... будет достаточно, чтобы всегда добавлять новую строку только в конец файла infile, если у него ее еще нет. И ему нужно только прочитать входной файл один раз, чтобы все было правильно.

1
09.02.2019, 11:29
1 ответ

-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;
}
1
28.01.2020, 00:19

Теги

Похожие вопросы