Skip to content

Commit a233c55

Browse files
author
pompurin404
committed
fix sysproxy
1 parent 1f6dbfb commit a233c55

File tree

1 file changed

+9
-65
lines changed

1 file changed

+9
-65
lines changed

src/macos.rs

Lines changed: 9 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
use crate::{Autoproxy, Error, Result, Sysproxy};
22
use log::debug;
3-
use std::net::{SocketAddr, UdpSocket};
43
use std::{process::Command, str::from_utf8};
54

65
impl Sysproxy {
76
pub fn get_system_proxy() -> Result<Sysproxy> {
8-
let service = default_network_service().or_else(|e| {
9-
debug!("Failed to get network service: {:?}", e);
10-
default_network_service_by_device()
11-
});
7+
let service = default_network_service();
128
if let Err(e) = service {
139
debug!("Failed to get network service by networksetup: {:?}", e);
1410
return Err(e);
@@ -47,10 +43,7 @@ impl Sysproxy {
4743
}
4844

4945
pub fn set_system_proxy(&self) -> Result<()> {
50-
let service = default_network_service().or_else(|e| {
51-
debug!("Failed to get network service: {:?}", e);
52-
default_network_service_by_device()
53-
});
46+
let service = default_network_service();
5447
if let Err(e) = service {
5548
debug!("Failed to get network service by networksetup: {:?}", e);
5649
return Err(e);
@@ -124,10 +117,7 @@ impl Sysproxy {
124117

125118
impl Autoproxy {
126119
pub fn get_auto_proxy() -> Result<Autoproxy> {
127-
let service = default_network_service().or_else(|e| {
128-
debug!("Failed to get network service: {:?}", e);
129-
default_network_service_by_device()
130-
});
120+
let service = default_network_service();
131121
if let Err(e) = service {
132122
debug!("Failed to get network service by networksetup: {:?}", e);
133123
return Err(e);
@@ -153,10 +143,7 @@ impl Autoproxy {
153143
}
154144

155145
pub fn set_auto_proxy(&self) -> Result<()> {
156-
let service = default_network_service().or_else(|e| {
157-
debug!("Failed to get network service: {:?}", e);
158-
default_network_service_by_device()
159-
});
146+
let service = default_network_service();
160147
if let Err(e) = service {
161148
debug!("Failed to get network service by networksetup: {:?}", e);
162149
return Err(e);
@@ -271,67 +258,24 @@ fn strip_str<'a>(text: &'a str) -> &'a str {
271258
}
272259

273260
fn default_network_service() -> Result<String> {
274-
let socket = UdpSocket::bind("0.0.0.0:0")?;
275-
socket.connect("1.1.1.1:80")?;
276-
let ip = socket.local_addr()?.ip();
277-
let addr = SocketAddr::new(ip, 0);
278-
279-
let interfaces = interfaces::Interface::get_all().or(Err(Error::NetworkInterface))?;
280-
let interface = interfaces
281-
.into_iter()
282-
.find(|i| i.addresses.iter().find(|a| a.addr == Some(addr)).is_some())
283-
.map(|i| i.name.to_owned());
284-
285-
match interface {
286-
Some(interface) => {
287-
let service = get_server_by_order(interface)?;
288-
Ok(service)
289-
}
290-
None => Err(Error::NetworkInterface),
291-
}
292-
}
293-
294-
fn default_network_service_by_device() -> Result<String> {
295261
let output = Command::new("route")
296262
.args(["-n", "get", "default"])
297263
.output()?;
298264
let stdout = from_utf8(&output.stdout).or(Err(Error::ParseStr("output".into())))?;
299265
let device = stdout.split("\n").find_map(|s| {
300266
let line = s.trim();
301267
if line.starts_with("interface:") {
302-
let mut interface = line.split(' ');
303-
interface.next();
304-
interface.next()
268+
Some(line.replace("interface: ", ""))
305269
} else {
306270
None
307271
}
308272
});
309-
let device = device.unwrap_or("");
310-
let output = networksetup().arg("-listallhardwareports").output()?;
311-
let stdout = from_utf8(&output.stdout).or(Err(Error::ParseStr("output".into())))?;
312-
let hardware = stdout.split("Ethernet Address:").find_map(|s| {
313-
let lines = s.split("\n");
314-
let mut hardware = None;
315-
let mut device_ = None;
316-
317-
for line in lines {
318-
if line.starts_with("Hardware Port:") {
319-
hardware = Some(&line[15..]);
320-
}
321-
if line.starts_with("Device:") {
322-
device_ = Some(&line[8..])
323-
}
324-
}
325273

326-
if device == device_? {
327-
hardware
328-
} else {
329-
None
274+
match device {
275+
Some(device) => {
276+
let service = get_server_by_order(device)?;
277+
Ok(service)
330278
}
331-
});
332-
333-
match hardware {
334-
Some(hardware) => Ok(hardware.into()),
335279
None => Err(Error::NetworkInterface),
336280
}
337281
}

0 commit comments

Comments
 (0)