如何使用nix的ioctl?

时间:2017-01-05 06:53:15

标签: linux rust

我想从Rust打电话给ioctl。我知道我应该使用the nix crate,但究竟是怎么回事?从文档来看,它不清楚。

我有这个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 crate做同样的事情? nix crate中没有TUN*个常量,并且不清楚如何使用ioctl宏。

1 个答案:

答案 0 :(得分:9)

rust-spidev中有一些示例用法。我会尝试将其应用到您的代码中。

TUNSETIFF defined为:

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

在Rust中使用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);

上面的宏将定义函数,您可以这样调用:

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