2016-12-19 14 views
1

Я вижу противоречивые определения 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; 
} 

Так почему же там такое несоответствие? Это просто ошибка в файле заголовка?

+0

Как печатать значение 'TUNSETIFF' ? – FGreg

ответ

0

Все ioctls принимают аргумент, значение которого варьируется в зависимости от ioctl. В случае этого кода это указатель на структуру пользовательского пространства. Обратите внимание, что с точки зрения ядра это всего лишь слово, а не указатель. Указатели пространства пользователя используются только для копирования данных между ядром и пользовательским пространством и не могут быть разыменованы напрямую.

0

Я получил ту же ошибку, когда включают только "if.h" & "if_tun.h"

Когда я включаю <sys/ioctl.h> это работает, и все, кажется тонкой

надеюсь, что это поможет