2016-12-19 12 views
1

TUNSETIFF ioctlの定義が矛盾しています。私は私のシステムでlinux/if_tun.hを見れば、私はこの行を参照してください。TUNSETIFF ioctlタイプの混乱

#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

を助けることを願っ同じエラーを得ました? – FGreg

答えて

0

すべてのioctlsは、その意味がioctlによって異なる引数をとります。このコードの場合は、ユーザー空間構造体へのポインタです。カーネルの観点から言えば、これはポインタではなく単語であることに注意してください。ユーザー空間ポインタは、カーネルとユーザー空間の間でデータをコピーするためにのみ使用され、直接参照を解除することはできません。

0

のみ"if.h" & "if_tun.h"

が含まれている場合、私は私が<sys/ioctl.h>が含まれている場合、それが動作し、すべてが罰金だ

が、これはあなたがTUNSETIFF` `の値を印刷しましたか