ioctl () Операция не разрешена - PullRequest
4 голосов
/ 11 марта 2019

Я занимаюсь разработкой приложения на 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;
}
...