Я занимаюсь разработкой приложения на C для Android. Я хочу добавить новый интерфейс Tun и использовать файловый дескриптор для доступа к устройству. То, как я это делаю, аналогично описанному здесь: https://backreference.org/2010/03/26/tuntap-interface-tutorial/
Однако я получаю Операцию, не разрешенную при вызове ioctl (). Мое устройство имеет root-права, я предоставил права суперпользователя своему приложению, установил политику SELinux разрешающей Но все же Android не позволяет мне получить доступ к / dev / net / tun . Я создал его, создав символическую ссылку из / dev / tun . Я также не забыл установить chmod 666 на / dev / tun . Вызов 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;
}