}
/* Try creating a Wintun instead of TAP */
- if (!create_wintun(vpninfo)) {
+ int retw = create_wintun(vpninfo);
+ if (!retw) {
ret = search_taps(vpninfo, open_tun);
if (ret == OPEN_TUN_SOFTFAIL)
ret = OPEN_TUN_HARDFAIL;
if (ret == OPEN_TUN_HARDFAIL)
os_shutdown_wintun(vpninfo);
+ } else if (retw == -EPERM) {
+ ret = OPEN_TUN_HARDFAIL;
+ vpn_progress(vpninfo, PRG_ERR,
+ _("Access denied creating Wintun adapter. Are you running with Administrator privileges?\n"));
}
}
int create_wintun(struct openconnect_info *vpninfo)
{
- if (init_wintun(vpninfo))
- return -1;
+ int ret = init_wintun(vpninfo);
+ if (ret < 0)
+ return ret;
vpninfo->wintun_adapter = WintunCreateAdapter(WINTUN_POOL_NAME,
vpninfo->ifname_w, NULL, NULL);
if (vpninfo->wintun_adapter)
return 0;
- char *errstr = openconnect__win32_strerror(GetLastError());
+ ret = GetLastError();
+ char *errstr = openconnect__win32_strerror(ret);
vpn_progress(vpninfo, PRG_ERR, "Could not create Wintun adapter '%S': %s\n",
vpninfo->ifname_w, errstr);
free(errstr);
- return -EIO;
+ return (ret == ERROR_ACCESS_DENIED ? -EPERM : -EIO);
}
intptr_t open_wintun(struct openconnect_info *vpninfo, char *guid, wchar_t *wname)