Skip to main content

wind_socks/
lib.rs

1#![feature(error_generic_member_access)]
2
3use std::{backtrace::Backtrace, net::SocketAddr};
4
5use fast_socks5::{ReplyError, server::SocksServerError, util::target_addr::TargetAddr as SocksTargetAddr};
6use snafu::{IntoError, Snafu};
7use wind_core::types::TargetAddr;
8
9pub mod ext;
10pub mod inbound;
11pub mod udp;
12
13#[derive(Debug, Snafu)]
14#[snafu(visibility(pub))]
15pub enum Error {
16	BindSocket {
17		socket_addr: SocketAddr,
18		source:      std::io::Error,
19		backtrace:   Backtrace,
20	},
21	Io {
22		// action: String
23		source:    std::io::Error,
24		backtrace: Backtrace,
25	},
26	Socks {
27		#[snafu(provide)]
28		source:    SocksServerError,
29		backtrace: Backtrace,
30	},
31	SocksReply {
32		#[snafu(provide)]
33		source:    ReplyError,
34		backtrace: Backtrace,
35	},
36	Callback {
37		#[snafu(provide)]
38		source:    eyre::Report,
39		backtrace: Backtrace,
40	},
41}
42
43impl From<SocksServerError> for Error {
44	#[inline(always)]
45	fn from(value: SocksServerError) -> Self {
46		SocksSnafu.into_error(value)
47	}
48}
49
50impl From<ReplyError> for Error {
51	#[inline(always)]
52	fn from(value: ReplyError) -> Self {
53		SocksReplySnafu.into_error(value)
54	}
55}
56
57pub fn convert_addr(addr: &SocksTargetAddr) -> TargetAddr {
58	match addr {
59		SocksTargetAddr::Domain(domain, port) => TargetAddr::Domain(domain.clone(), *port),
60		SocksTargetAddr::Ip(socket_addr) => match socket_addr.ip() {
61			std::net::IpAddr::V4(ipv4) => TargetAddr::IPv4(ipv4, socket_addr.port()),
62			std::net::IpAddr::V6(ipv6) => TargetAddr::IPv6(ipv6, socket_addr.port()),
63		},
64	}
65}