2017-01-05 9 views
5

錆からioctlに電話します。私はthe nix crateを使用すべきであることを知っていますが、正確にはどうですか?ドキュメントからはっきりしない。nixのioctlの使い方は?

私はこのCを持っている:

int tun_open(char *devname) 
{ 
    struct ifreq ifr; 
    int fd, err; 

    if ((fd = open("/dev/net/tun", O_RDWR)) == -1) { 
     perror("open /dev/net/tun");exit(1); 
    } 
    memset(&ifr, 0, sizeof(ifr)); 
    ifr.ifr_flags = IFF_TUN; 
    strncpy(ifr.ifr_name, devname, IFNAMSIZ); 

    /* ioctl will use if_name as the name of TUN 
    * interface to open: "tun0", etc. */ 
    if ((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) == -1) { 
    perror("ioctl TUNSETIFF");close(fd);exit(1); 
    } 
    //.......... 

は、私は同じことがnixのクレートを使用していることをどのように行うのでしょうか? nixのクレートにはTUN*の定数はなく、ioctlマクロの使用方法は明確ではありません。

+0

これは[XY問題]のようです(http://meta.stackexchange.com/questions/66377/what-is -the-xy-problem)を私に教えてください。特定のioctlユースケースについて質問するのではなく、 'nix'クレートの使い方を尋ねています。それでも、同様のioctlユースケースがhttp://hermanradtke.com/2016/03/17/unions-rust-ffi.htmlでカバーされているようだと言えるでしょう。 – ArtemGr

+0

@ArtemGr OPは短くてシンプルなCコードのスニペットを提供し、Rustで同等の処理を行う方法を尋ねました。 XY問題はどのくらい正確ですか? – user4815162342

答えて

6

rust-spidevにはいくつかの使用例があります。私はあなたのコードにそれを適用しようとします。

TUNSETIFFとしてdefinedです:NIXを使用してルーストにこのなり

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

const TUN_IOC_MAGIC: u8 = 'T' as u8; 
const TUN_IOC_SET_IFF: u8 = 202; 
ioctl!(write tun_set_iff with TUN_IOC_MAGIC, TUN_IOC_SET_IFF; u32); 

上記のマクロを使用すると、このように呼び出すことができ、関数を定義します:

let err = unsafe { tun_set_iff(fd, ifr) }; // assuming ifr is an u32 
+0

なぜ "nix"で定義されていないのですか? rust-spidevは "nix"と何が関係していますか? – Jodooomi

+3

@ Jodooomiここでrust-spidevは単にnixの 'ioctl!'マクロを正しく使う方法を示しています。 'ioctl'はオープンエンドで本質的に安全ではないので、すべての場合に有効な単一の定義を提供することは不可能です。代わりに、 'nix'は' ioctl! 'マクロを* helper *として提供し、' ioctl'の特定の使用に対して安全な(あるいは少なくとも便利な)インターフェースを提供する関数を定義します。 – user4815162342

+0

申し訳ありませんが、rust-spidevの著者は、これらの定数が何であるかをどのように知っていますか?彼らはどこで見つけられますか? – Jodooomi

関連する問題