2016-12-19 2 views
1

Je vois des définitions contradictoires de l'ioctl TUNSETIFF. Si je regarde linux/if_tun.h sur mon système, je vois cette ligne:Confusion sur TUNSETIFF ioctl type

#define TUNSETIFF  _IOW('T', 202, int) 

Cela indique que l'ioctl TUNSETIFF prend un pointeur sur un int. En outre, si j'imprime la valeur de TUNSETIFF, j'obtiens 1074025674, ce qui si je masque les bits de taille indique que cet ioctl prend des données avec la taille 4 octets.

Mais quand je regarde la documentation autour de TUNSETIFF, je vois des exemples de passage d'un pointeur à struct ifreq. Par exemple, dans le 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; 
} 

Alors, pourquoi est-il cet écart? Est-ce juste une erreur dans le fichier d'en-tête?

+0

Comment avez-vous imprimer la valeur de 'TUNSETIFF' ? – FGreg

Répondre

0

Tous les ioctls prennent un argument dont la signification varie avec l'ioctl. Dans le cas de ce code, il s'agit d'un pointeur vers une structure d'espace utilisateur. Notez que du point de vue du noyau, c'est juste un mot, pas un pointeur. Les pointeurs d'espace utilisateur ne sont utilisés que pour copier des données entre le noyau et l'espace utilisateur, et ne peuvent pas être directement référencés.

0

j'ai eu la même erreur quand seulement inclure "if.h" & "if_tun.h"

Quand je <sys/ioctl.h> inclus cela fonctionne et tout semble bien

espère que cela aidera