2017-01-05 1 views
5

Я хочу позвонить ioctl из Rust. Я знаю, что я должен использовать the nix crate, но как именно? Из документации это непонятно.Как использовать ioctl от nix?

У меня это 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 нет констант 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 как:

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

Это было бы это в Rust с помощью шухер:

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»? что делает ржавчина-spidev связана с «nix»? – Jodooomi

+3

@ Jodooomi Здесь rust-spidev просто служит для демонстрации правильного использования макроса 'ioctl!' Nix. Поскольку 'ioctl' является открытым и по своей сути небезопасным, невозможно предоставить одно определение, которое будет работать для всех случаев. Вместо этого 'nix' предоставляет макрос' ioctl! 'В качестве * помощника * для определения функций, которые обеспечивают безопасный (или, по крайней мере, удобный) интерфейс для конкретных применений' ioctl'. – user4815162342

+0

хорошо, но как автор ржавчины-spidev знает, каковы эти константы? где их можно найти? – Jodooomi

 Смежные вопросы

  • Нет связанных вопросов^_^