aboutsummaryrefslogtreecommitdiffstats
path: root/wireguard-go-bridge/src/tun/api-ios.go
blob: 476669f9e6901fd452b11ad00f13e62e921476ee (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/* SPDX-License-Identifier: GPL-2.0
 *
 * Copyright (C) 2017-2018 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
 */

package tun

import (
	"git.zx2c4.com/wireguard-go/rwcancel"
	"golang.org/x/sys/unix"
	"net"
	"os"
)

func CreateTUNFromFD(tunFd int) (TUNDevice, string, error) {
	file := os.NewFile(uintptr(tunFd), "/dev/tun")
	tun := &nativeTun{
		tunFile: file,
		fd:      file.Fd(),
		events:  make(chan TUNEvent, 5),
		errors:  make(chan error, 5),
	}
	var err error
	tun.rwcancel, err = rwcancel.NewRWCancel(tunFd)
	if err != nil {
		return nil, "", err
	}
	name, err := tun.Name()
	if err != nil {
		tun.rwcancel.Cancel()
		return nil, "", err
	}
	tunIfindex, err := func() (int, error) {
		iface, err := net.InterfaceByName(name)
		if err != nil {
			return -1, err
		}
		return iface.Index, nil
	}()
	if err != nil {
		tun.tunFile.Close()
		return nil, "", err
	}
	tun.routeSocket, err = unix.Socket(unix.AF_ROUTE, unix.SOCK_RAW, unix.AF_UNSPEC)
	if err != nil {
		tun.tunFile.Close()
		return nil, "", err
	}
	go tun.routineRouteListener(tunIfindex)

	return tun, name, nil
}