我正在为Android开发C应用程序。我想添加一个新的tun接口,并使用文件描述符访问设备。我的操作方式与此处描述的相同:https://backreference.org/2010/03/26/tuntap-interface-tutorial/
但是,我在ioctl()调用中无法进行操作。我的设备已植根,我授予了我的应用程序超级用户权限,并将SELinux策略设置为宽松。但是,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;
}