Я вижу противоречивые определения TUNSETIFF
ioctl. Если я смотрю на linux/if_tun.h
на моей системе, я вижу эту линию:Путаница на TUNSETIFF ioctl type
#define TUNSETIFF _IOW('T', 202, int)
Это указывает, что TUNSETIFF IOCTL принимает указатель на int
. Кроме того, если я распечатываю значение TUNSETIFF
, я получаю 1074025674, который, если я маскирую размерные биты, указывает, что этот ioctl принимает данные размером 4 байта.
Но тогда, когда я смотрю документацию вокруг TUNSETIFF
, я вижу примеры прохождения указателя на struct ifreq
. Например, в official documentation:
#include <linux/if.h>
#include <linux/if_tun.h>
int tun_alloc(char *dev)
{
struct ifreq ifr;
int fd, err;
if((fd = open("/dev/net/tun", O_RDWR)) < 0)
return tun_alloc_old(dev);
memset(&ifr, 0, sizeof(ifr));
/* Flags: IFF_TUN - TUN device (no Ethernet headers)
* IFF_TAP - TAP device
*
* IFF_NO_PI - Do not provide packet information
*/
ifr.ifr_flags = IFF_TUN;
if(*dev)
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
if((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0){
close(fd);
return err;
}
strcpy(dev, ifr.ifr_name);
return fd;
}
Так почему же там такое несоответствие? Это просто ошибка в файле заголовка?
Как печатать значение 'TUNSETIFF' ? – FGreg