Add rudimentary NetworkSettings generation

This commit is contained in:
Jett Chen 2023-08-26 16:22:09 +08:00
parent 22e41203fb
commit 309db8085d
8 changed files with 418 additions and 10 deletions

View file

@ -7,6 +7,7 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
0B90A6DF2A99BDB300EE4E7F /* NetworkSettingsConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B90A6DE2A99BDB300EE4E7F /* NetworkSettingsConverter.swift */; };
43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43AA26D72A10004900F14CE6 /* MenuView.swift */; }; 43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43AA26D72A10004900F14CE6 /* MenuView.swift */; };
D00AA8972A4669BC005C8102 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00AA8962A4669BC005C8102 /* AppDelegate.swift */; }; D00AA8972A4669BC005C8102 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00AA8962A4669BC005C8102 /* AppDelegate.swift */; };
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; }; D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; };
@ -46,6 +47,7 @@
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
0B90A6DE2A99BDB300EE4E7F /* NetworkSettingsConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkSettingsConverter.swift; sourceTree = "<group>"; };
43AA26D72A10004900F14CE6 /* MenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = "<group>"; }; 43AA26D72A10004900F14CE6 /* MenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = "<group>"; };
D00AA8962A4669BC005C8102 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; D00AA8962A4669BC005C8102 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; }; D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; };
@ -118,6 +120,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */, D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */,
0B90A6DE2A99BDB300EE4E7F /* NetworkSettingsConverter.swift */,
D020F65929E4A697002790F6 /* Info.plist */, D020F65929E4A697002790F6 /* Info.plist */,
D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */, D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */,
D020F66629E4A95D002790F6 /* NetworkExtension-macOS.entitlements */, D020F66629E4A95D002790F6 /* NetworkExtension-macOS.entitlements */,
@ -304,6 +307,7 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
0B90A6DF2A99BDB300EE4E7F /* NetworkSettingsConverter.swift in Sources */,
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */, D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;

View file

@ -0,0 +1,56 @@
//
// NetworkSettingsConverter.swift
// NetworkExtension
//
// Created by Jett Chen on 2023/7/7.
//
import Foundation
import NetworkExtension
public struct TunCrateNetworkSettings {
let addr: Int64
let netmask: Int64
let mtu: Int32
}
extension TunCrateNetworkSettings {
var decodedIPv4Addr: String? {
return decodeIPv4(addr)
}
var decodedIPv4Netmask: String? {
return decodeIPv4(netmask)
}
var decodedMTU: Int? {
return mtu >= 0 ? Int(mtu) : nil
}
private func decodeIPv4(_ addr: Int64) -> String? {
if addr < 0 {
return nil
}
let bytes = (
UInt8((addr & 0xFF000000) >> 24),
UInt8((addr & 0x00FF0000) >> 16),
UInt8((addr & 0x0000FF00) >> 8),
UInt8(addr & 0x000000FF)
)
return "\(bytes.0).\(bytes.1).\(bytes.2).\(bytes.3)"
}
func generateNetworkSettings() -> NEPacketTunnelNetworkSettings {
let neSettings = NEPacketTunnelNetworkSettings()
if let addr = decodedIPv4Addr, let netmask = decodedIPv4Netmask {
neSettings.ipv4Settings = NEIPv4Settings(addresses: [addr], subnetMasks: [netmask])
}
if let mtuValue = decodedMTU {
neSettings.mtu = NSNumber(value: mtuValue)
}
return neSettings
}
}

View file

@ -4,7 +4,9 @@ import OSLog
class PacketTunnelProvider: NEPacketTunnelProvider { class PacketTunnelProvider: NEPacketTunnelProvider {
let logger = Logger(subsystem: "com.hackclub.burrow", category: "General") let logger = Logger(subsystem: "com.hackclub.burrow", category: "General")
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) { override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
libburrow.initialize_oslog()
let fild = libburrow.retrieve() let fild = libburrow.retrieve()
if fild == -1 { if fild == -1 {
// Not sure if this is the right way to return an error // Not sure if this is the right way to return an error
@ -17,6 +19,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
completionHandler(err) completionHandler(err)
} }
logger.info("fd: \(fild)") logger.info("fd: \(fild)")
let networkSettings = genNetSec(fild: fild)
logger.info("Network Settings: - ipv4:\(networkSettings.ipv4Settings) -mtu: \(networkSettings.mtu)")
completionHandler(nil) completionHandler(nil)
} }
@ -24,6 +28,14 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
completionHandler() completionHandler()
} }
func genNetSec(fild: Int32) -> NEPacketTunnelNetworkSettings {
logger.debug("getting Network settings with fild \(fild) ...")
let settings = libburrow.getNetworkSettings(fild)
logger.debug("genNetSec Called: \n ipv4: \(settings.ipv4_addr) \n netmask: \(settings.ipv4_netmask) \n mtu: \(settings.mtu)")
let tNetworksettings = TunCrateNetworkSettings(addr: settings.ipv4_addr, netmask: settings.ipv4_netmask, mtu: settings.mtu)
return tNetworksettings.generateNetworkSettings()
}
override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) { override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) {
if let handler = completionHandler { if let handler = completionHandler {
handler(messageData) handler(messageData)

View file

@ -1 +1,11 @@
#include <stdint.h>
int retrieve(); int retrieve();
typedef struct {
int64_t ipv4_addr;
int64_t ipv4_netmask;
int32_t mtu;
} NetWorkSettings;
NetWorkSettings getNetworkSettings(int);
void initialize_oslog();

269
Cargo.lock generated
View file

@ -29,6 +29,15 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "anstream" name = "anstream"
version = "0.3.2" version = "0.3.2"
@ -84,6 +93,17 @@ version = "1.0.71"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
"hermit-abi 0.1.19",
"libc",
"winapi",
]
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.1.0" version = "1.1.0"
@ -102,6 +122,29 @@ version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
[[package]]
name = "bindgen"
version = "0.59.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8"
dependencies = [
"bitflags",
"cexpr",
"clang-sys",
"clap 2.34.0",
"env_logger 0.9.3",
"lazy_static",
"lazycell",
"log",
"peeking_take_while",
"proc-macro2",
"quote",
"regex",
"rustc-hash",
"shlex",
"which",
]
[[package]] [[package]]
name = "bindgen" name = "bindgen"
version = "0.65.1" version = "0.65.1"
@ -151,11 +194,14 @@ name = "burrow"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"caps", "caps",
"clap", "clap 4.3.2",
"env_logger", "env_logger 0.10.0",
"log", "log",
"nix", "nix",
"tokio", "tokio",
"tracing",
"tracing-oslog",
"tracing-subscriber",
"tun", "tun",
] ]
@ -246,6 +292,21 @@ dependencies = [
"libloading", "libloading",
] ]
[[package]]
name = "clap"
version = "2.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
dependencies = [
"ansi_term",
"atty",
"bitflags",
"strsim 0.8.0",
"textwrap",
"unicode-width",
"vec_map",
]
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.3.2" version = "4.3.2"
@ -267,7 +328,7 @@ dependencies = [
"anstyle", "anstyle",
"bitflags", "bitflags",
"clap_lex", "clap_lex",
"strsim", "strsim 0.10.0",
] ]
[[package]] [[package]]
@ -379,6 +440,19 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "env_logger"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7"
dependencies = [
"atty",
"humantime",
"log",
"regex",
"termcolor",
]
[[package]] [[package]]
name = "env_logger" name = "env_logger"
version = "0.10.0" version = "0.10.0"
@ -618,6 +692,15 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.3.1" version = "0.3.1"
@ -751,7 +834,7 @@ version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
dependencies = [ dependencies = [
"hermit-abi", "hermit-abi 0.3.1",
"libc", "libc",
"windows-sys 0.48.0", "windows-sys 0.48.0",
] ]
@ -768,7 +851,7 @@ version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f"
dependencies = [ dependencies = [
"hermit-abi", "hermit-abi 0.3.1",
"io-lifetimes", "io-lifetimes",
"rustix", "rustix",
"windows-sys 0.48.0", "windows-sys 0.48.0",
@ -832,6 +915,16 @@ version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f"
[[package]]
name = "lock_api"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
dependencies = [
"autocfg",
"scopeguard",
]
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.19" version = "0.4.19"
@ -951,6 +1044,16 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "nu-ansi-term"
version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
dependencies = [
"overload",
"winapi",
]
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.17.1" version = "1.17.1"
@ -1007,6 +1110,37 @@ dependencies = [
"vcpkg", "vcpkg",
] ]
[[package]]
name = "overload"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]]
name = "parking_lot"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
dependencies = [
"instant",
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
dependencies = [
"cfg-if",
"instant",
"libc",
"redox_syscall 0.2.16",
"smallvec",
"winapi",
]
[[package]] [[package]]
name = "password-hash" name = "password-hash"
version = "0.4.2" version = "0.4.2"
@ -1094,6 +1228,15 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
[[package]]
name = "redox_syscall"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
"bitflags",
]
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.3.5" version = "0.3.5"
@ -1192,6 +1335,12 @@ dependencies = [
"windows-sys 0.42.0", "windows-sys 0.42.0",
] ]
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]] [[package]]
name = "security-framework" name = "security-framework"
version = "2.9.0" version = "2.9.0"
@ -1277,6 +1426,15 @@ dependencies = [
"digest", "digest",
] ]
[[package]]
name = "sharded-slab"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
dependencies = [
"lazy_static",
]
[[package]] [[package]]
name = "shlex" name = "shlex"
version = "1.1.0" version = "1.1.0"
@ -1292,6 +1450,12 @@ dependencies = [
"autocfg", "autocfg",
] ]
[[package]]
name = "smallvec"
version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
[[package]] [[package]]
name = "socket2" name = "socket2"
version = "0.4.9" version = "0.4.9"
@ -1324,6 +1488,12 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "strsim"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]] [[package]]
name = "strsim" name = "strsim"
version = "0.10.0" version = "0.10.0"
@ -1366,7 +1536,7 @@ checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"fastrand", "fastrand",
"redox_syscall", "redox_syscall 0.3.5",
"rustix", "rustix",
"windows-sys 0.45.0", "windows-sys 0.45.0",
] ]
@ -1380,6 +1550,15 @@ dependencies = [
"winapi-util", "winapi-util",
] ]
[[package]]
name = "textwrap"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
dependencies = [
"unicode-width",
]
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.40" version = "1.0.40"
@ -1400,6 +1579,16 @@ dependencies = [
"syn 2.0.15", "syn 2.0.15",
] ]
[[package]]
name = "thread_local"
version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
dependencies = [
"cfg-if",
"once_cell",
]
[[package]] [[package]]
name = "time" name = "time"
version = "0.3.21" version = "0.3.21"
@ -1496,9 +1685,21 @@ checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"pin-project-lite", "pin-project-lite",
"tracing-attributes",
"tracing-core", "tracing-core",
] ]
[[package]]
name = "tracing-attributes"
version = "0.1.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.15",
]
[[package]] [[package]]
name = "tracing-core" name = "tracing-core"
version = "0.1.31" version = "0.1.31"
@ -1506,6 +1707,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"valuable",
]
[[package]]
name = "tracing-log"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
dependencies = [
"lazy_static",
"log",
"tracing-core",
]
[[package]]
name = "tracing-oslog"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bc58223383423483e4bc056c7e7b3f77bdee924a9d33834112c69ead06dc847"
dependencies = [
"bindgen 0.59.2",
"cc",
"cfg-if",
"fnv",
"once_cell",
"parking_lot",
"tracing-core",
"tracing-subscriber",
]
[[package]]
name = "tracing-subscriber"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
dependencies = [
"nu-ansi-term",
"sharded-slab",
"smallvec",
"thread_local",
"tracing-core",
"tracing-log",
] ]
[[package]] [[package]]
@ -1519,7 +1762,7 @@ name = "tun"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bindgen", "bindgen 0.65.1",
"byteorder", "byteorder",
"fehler", "fehler",
"futures", "futures",
@ -1588,12 +1831,24 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]]
name = "valuable"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
[[package]] [[package]]
name = "vcpkg" name = "vcpkg"
version = "0.2.15" version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "vec_map"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.4" version = "0.9.4"

View file

@ -12,9 +12,12 @@ tun = { version = "0.1", path = "../tun" }
clap = { version = "4.3.2", features = ["derive"] } clap = { version = "4.3.2", features = ["derive"] }
env_logger = "0.10" env_logger = "0.10"
log = "0.4" log = "0.4"
tracing = "0.1"
tracing-subscriber = "0.3"
[target.'cfg(target_os = "linux")'.dependencies] [target.'cfg(target_os = "linux")'.dependencies]
caps = "0.5.5" caps = "0.5.5"
[target.'cfg(target_vendor = "apple")'.dependencies] [target.'cfg(target_vendor = "apple")'.dependencies]
nix = { version = "0.26.2" } nix = { version = "0.26.2" }
tracing-oslog = "0.1"

51
burrow/src/apple/mod.rs Normal file
View file

@ -0,0 +1,51 @@
use std::net::Ipv4Addr;
use std::io::Error;
use std::os::fd::FromRawFd;
use tracing::field::debug;
use tun::TunInterface;
use tracing_oslog::OsLogger;
use tracing_subscriber::layer::SubscriberExt;
use tracing::debug;
#[repr(C)]
pub struct NetWorkSettings {
ipv4_addr: i64,
ipv4_netmask: i64,
mtu: i32,
}
fn encode_ipv4_result(res: Result<Ipv4Addr, Error>) -> i64 {
match res {
Ok(addr) => u32::from_be(addr.into()) as i64,
Err(_) => -1,
}
}
impl From<TunInterface> for NetWorkSettings {
fn from(value: TunInterface) -> Self {
debug!("Converting TunInterface {} to NetWorkSettings", value.name().unwrap_or("NONEXISTENT".to_string()));
let ipv4_addr = encode_ipv4_result(value.ipv4_addr());
let ipv4_netmask = encode_ipv4_result(value.netmask());
let mtu = value.mtu().unwrap_or(-1);
Self {
ipv4_addr,
ipv4_netmask,
mtu,
}
}
}
#[no_mangle]
pub extern "C" fn initialize_oslog() {
let collector = tracing_subscriber::registry()
.with(OsLogger::new("com.hackclub.burrow", "default"));
tracing::subscriber::set_global_default(collector).unwrap();
debug!("Initialized oslog tracing in libburrow rust FFI");
}
#[no_mangle]
pub extern "C" fn getNetworkSettings(n: i32) -> NetWorkSettings {
debug!("getNetworkSettings called with fd: {}", n);
let iface = unsafe {TunInterface::from_raw_fd(n)};
iface.into()
}

View file

@ -1,13 +1,20 @@
pub mod ensureroot; pub mod ensureroot;
#[cfg(target_vendor = "apple")]
mod apple;
#[cfg(any(target_os = "linux", target_vendor = "apple"))] #[cfg(any(target_os = "linux", target_vendor = "apple"))]
use std::{ use std::{
mem, mem,
os::fd::{AsRawFd, FromRawFd}, os::fd::{AsRawFd, FromRawFd},
}; };
use std::os::fd::RawFd;
use tracing::debug;
use tun::TunInterface; use tun::TunInterface;
#[cfg(target_vendor = "apple")]
pub use apple::{NetWorkSettings, getNetworkSettings, initialize_oslog};
// TODO Separate start and retrieve functions // TODO Separate start and retrieve functions
#[cfg(any(target_os = "linux", target_vendor = "apple"))] #[cfg(any(target_os = "linux", target_vendor = "apple"))]
@ -15,9 +22,13 @@ use tun::TunInterface;
pub extern "C" fn retrieve() -> i32 { pub extern "C" fn retrieve() -> i32 {
let iface2 = (1..100) let iface2 = (1..100)
.filter_map(|i| { .filter_map(|i| {
debug!("Getting TunInterface with fd: {:?}", i);
let iface = unsafe { TunInterface::from_raw_fd(i) }; let iface = unsafe { TunInterface::from_raw_fd(i) };
match iface.name() { match iface.name() {
Ok(_name) => Some(iface), Ok(name) => {
debug!("Found interface {}", name);
Some(iface)
},
Err(_) => { Err(_) => {
mem::forget(iface); mem::forget(iface);
None None
@ -26,7 +37,13 @@ pub extern "C" fn retrieve() -> i32 {
}) })
.next(); .next();
match iface2 { match iface2 {
Some(iface) => iface.as_raw_fd(), Some(iface) => {
None => -1, debug!("Found interface {:?}", iface.name());
iface.as_raw_fd()
},
None => {
debug!("No interface found");
-1
}
} }
} }