ioctl() 不允许操作

pav*_*shr 5 c permissions android native tun

我正在用 C 语言为 Android 开发一个应用程序。我想添加一个新的 tun 接口并使用文件描述符来访问设备。我这样做的方式与此处描述的相同:https : //backreference.org/2010/03/26/tuntap-interface-tutorial/

但是,我在 ioctl() 调用中不允许操作。我的设备已 root,我授予我的应用程序的超级用户权限,将 SELinux 策略设置为 permissive。但是,Android 仍然不允许我访问/dev/net/tun。我通过从/dev/tun创建符号链接来创建它。我也没有忘记在/dev/tun上设置chmod 666。调用 open("/dev/net/tun", O_RDWR | O_NONBLOCK) 返回一个有效的文件描述符,并且我正确设置了 ifreq 结构。正是ioctl()调用返回了不允许操作的错误。

此外,如果我将代码分开并交叉编译,然后通过 adb 将其推送到设备并运行它 - 一切正常。但是,如果我将其作为申请的一部分进行,则不允许进行该操作。

关于如何在应用程序内部允许此系统调用的任何建议?任何关于为什么失败的提示也将不胜感激。

代码:

int create_virtual_nic(char *device) {

  struct ifreq ifr;
  int fd_tunnel = -1;
  int err = -1;

  fd_tunnel = open("/dev/net/tun", O_RDWR | O_NONBLOCK);
  if(fd_tunnel < 0) {
    fprintf(stderr, "Could not open TUN device!\n");
    return fd_tunnel;
  }

  memset(&ifr, 0, sizeof(ifr));

  ifr.ifr_flags = IFF_TUN | IFF_NO_PI;

  if (*device) {
    strncpy(ifr.ifr_name, device, IFNAMSIZ);
  }

  // ERROR IS HERE
  err = ioctl(fd_tunnel, TUNSETIFF, (void*) &ifr);

  if(err < 0 ) {
     close(fd_tunnel);
     perror("ioctl()");
     fprintf(stderr, "Device '%s' taken or not running as root!\n", device);
     exit(EXIT_FAILURE);
  } else {
        fprintf(stdout, "Succesfullt ioctl() on %d\n", err);
  }

  fprintf(stdout, "Created interface '%s'...\n", device);

  return fd_tunnel;
}
Run Code Online (Sandbox Code Playgroud)