- fd = open("/dev/net/tun", O_RDWR);
- if (fd < 0) {
- i = -errno;
- connman_error("Failed to open /dev/net/tun: %s",
- strerror(errno));
- ret = i;
- goto exist_err;
- }
-
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
-
- for (i = 0; i < 256; i++) {
- sprintf(ifr.ifr_name, "vpn%d", i);
-
- if (!ioctl(fd, TUNSETIFF, (void *)&ifr))
- break;
- }
-
- if (i == 256) {
- connman_error("Failed to find available tun device");
- close(fd);
- ret = -ENODEV;
- goto exist_err;
- }
-
- data->if_name = (char *)g_strdup(ifr.ifr_name);
- if (!data->if_name) {
- ret = -ENOMEM;
- goto exist_err;
- }
-
- if (ioctl(fd, TUNSETPERSIST, 1)) {
- i = -errno;
- connman_error("Failed to set tun persistent: %s",
- strerror(errno));
- close(fd);
- ret = i;
- goto exist_err;
- }
-
- close(fd);
-
- index = connman_inet_ifindex(data->if_name);
- if (index < 0) {
- connman_error("Failed to get tun ifindex");
- kill_tun(data->if_name);
- ret = -EIO;
- goto exist_err;
- }
- connman_provider_set_index(provider, index);
-
- data->task = connman_task_create(OPENCONNECT);
-
- if (data->task == NULL) {
- ret = -ENOMEM;
- kill_tun(data->if_name);
- goto exist_err;
- }
-
- if (connman_task_set_notify(data->task, "notify",
- openconnect_task_notify, provider)) {
- ret = -ENOMEM;
- kill_tun(data->if_name);
- connman_task_destroy(data->task);
- data->task = NULL;
- goto exist_err;
- }
-