2017-01-05 16 views
5

Chcę zadzwonić pod numer ioctl z Rust. Wiem, że powinienem użyć the nix crate, ale jak dokładnie? Z dokumentacji nie wynika jasno.Jak korzystać z ioctl nix?

mam to 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); 
    } 
    //.......... 

Jak miałbym to zrobić to samo za pomocą skrzyni nix? W skrzynce nix nie ma stałych TUN* i nie jest jasne, jak używać makro ioctl.

+0

To wydaje się być problemem [XY] (http://meta.stackexchange.com/questions/66377/what-is -the-xy-problem) do mnie: zamiast pytać o konkretny przypadek użycia ioctl, pytasz, jak użyć skrzyni 'nix'. Warto jednak wspomnieć, że podobny przypadek użycia ioctl wydaje się być opisany na http://hermanradtke.com/2016/03/17/unions-rust-ffi.html. – ArtemGr

+0

@ArtemGr OP zawiera krótki i prosty fragment kodu C i zapytał, jak zrobić ekwiwalent w Rust. Jak dokładnie jest to problem XY? – user4815162342

Odpowiedz

6

Istnieje kilka przykładów użycia w rust-spidev. Spróbuję zastosować to do twojego kodu.

TUNSETIFF jest defined jak:

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

Byłoby to w Rust użyciu nix:

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); 

Powyższy makro będzie określenie funkcji, które można nazwać tak:

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

dlaczego nie są zdefiniowane w "nix"? co rdza-spidev ma wspólnego z "nix"? – Jodooomi

+3

@Jodooomi Tutaj rust-spidev służy tylko demonstracji, jak poprawnie używać makra 'ioctl!' Nix. Ponieważ 'ioctl' jest otwarty i z natury niebezpieczny, niemożliwe jest podanie pojedynczej definicji, która działałaby we wszystkich przypadkach. Zamiast tego 'nix' dostarcza makro' ioctl! 'Jako * helper * do definiowania funkcji, które zapewniają bezpieczny (lub przynajmniej wygodny) interfejs do konkretnych zastosowań' ioctl'. – user4815162342

+0

w porządku, ale jak autor rdzy-spidev wie, jakie są te stałe? gdzie można je znaleźć? – Jodooomi