Skip to content

Commit 6945435

Browse files
authored
Merge pull request #41 from SeaLoong:dev
🦄 refactor: code update
2 parents e62aae3 + ec4ae89 commit 6945435

File tree

10 files changed

+384
-299
lines changed

10 files changed

+384
-299
lines changed

Cargo.lock

Lines changed: 257 additions & 186 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
[package]
22
name = "drcom4scut"
3-
version = "0.3.0"
3+
version = "0.3.1"
44
authors = ["SeaLoong <[email protected]>"]
5-
edition = "2021"
5+
edition = "2024"
66
description = "A 3rd-party Drcom client for SCUT."
77
license = "GPL-3.0-or-later"
88
readme = "README.md"
99

1010
[dependencies]
11-
bytes = "1.8.0"
12-
chrono = "0.4.38"
13-
clap = { version = "4.5.20", features = ["cargo"] }
14-
crossbeam-channel = "0.5.13"
11+
bytes = "1.10.0"
12+
chrono = "0.4.39"
13+
clap = { version = "4.5.30", features = ["cargo"] }
14+
crossbeam-channel = "0.5.14"
1515
encoding_rs = "0.8.35"
1616
hex = "0.4.3"
1717
hostname = "0.4.0"
18-
log = "0.4.22"
18+
log = "0.4.26"
1919
md-5 = "0.10.6"
20-
rand = "0.8.5"
20+
rand = "0.9.0"
2121
trust-dns-resolver = "0.23.2"
2222

2323
[dependencies.config]
24-
version = "0.14.1"
24+
version = "0.15.8"
2525
default-features = false
2626
features = ["yaml"]
2727

src/device.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use pnet::datalink::{
2-
channel, interfaces, Channel, Config, DataLinkReceiver, DataLinkSender, MacAddr,
3-
NetworkInterface,
2+
Channel, Config, DataLinkReceiver, DataLinkSender, MacAddr, NetworkInterface, channel,
3+
interfaces,
44
};
55
use pnet::ipnetwork::IpNetwork;
66
use std::cell::RefCell;

src/eap.rs

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
use std::cmp::min;
22
use std::str::FromStr;
3-
use std::sync::atomic::{AtomicBool, AtomicI64, AtomicU8, Ordering};
43
use std::sync::Arc;
4+
use std::sync::atomic::{AtomicBool, AtomicI64, AtomicU8, Ordering};
55
use std::thread::{self, JoinHandle};
66
use std::time::Duration;
77

88
use bytes::{Buf, BufMut, Bytes, BytesMut};
99
use chrono::Local;
10-
use crossbeam_channel::{unbounded, Receiver, Sender, TryRecvError};
10+
use crossbeam_channel::{Receiver, Sender, TryRecvError, unbounded};
1111
use log::{debug, error, info, warn};
1212
use md5::Digest;
1313
use pnet::datalink::MacAddr;
1414

1515
use crate::device::Device;
1616
use crate::eap::packet::*;
1717
use crate::settings::Settings;
18-
use crate::util::{ip_to_vec, sleep, ChannelData, State};
18+
use crate::util::{ChannelData, State, ip_to_vec, sleep};
1919

2020
mod packet;
2121

@@ -145,27 +145,30 @@ impl Process<'_> {
145145
let resender_handle = Arc::new(
146146
thread::Builder::new()
147147
.name("EAP-Resender".to_owned())
148-
.spawn(move || loop {
149-
if quit.load(Ordering::Relaxed) {
150-
debug!("EAP-Resender thread quit!");
151-
return;
152-
}
153-
if stop.load(Ordering::Relaxed) {
154-
thread::park();
155-
}
156-
while cancel_resend.load(Ordering::Acquire) {
157-
thread::park();
158-
}
159-
let wait_ts = send_ts.load(Ordering::Acquire) - Local::now().timestamp_millis()
160-
+ (interval as i64);
161-
if wait_ts > 0 {
162-
thread::sleep(Duration::from_millis(wait_ts as u64));
163-
} else if wait_ts > -interval as i64 {
164-
debug!("Resending...");
165-
cancel_resend.store(true, Ordering::Release);
166-
if tx.send((Vec::new(), true)).is_err() {
167-
error!("Unexpected! Send channel is disconnected!");
168-
quit.store(true, Ordering::Release);
148+
.spawn(move || {
149+
loop {
150+
if quit.load(Ordering::Relaxed) {
151+
debug!("EAP-Resender thread quit!");
152+
return;
153+
}
154+
if stop.load(Ordering::Relaxed) {
155+
thread::park();
156+
}
157+
while cancel_resend.load(Ordering::Acquire) {
158+
thread::park();
159+
}
160+
let wait_ts = send_ts.load(Ordering::Acquire)
161+
- Local::now().timestamp_millis()
162+
+ (interval as i64);
163+
if wait_ts > 0 {
164+
thread::sleep(Duration::from_millis(wait_ts as u64));
165+
} else if wait_ts > -interval as i64 {
166+
debug!("Resending...");
167+
cancel_resend.store(true, Ordering::Release);
168+
if tx.send((Vec::new(), true)).is_err() {
169+
error!("Unexpected! Send channel is disconnected!");
170+
quit.store(true, Ordering::Release);
171+
}
169172
}
170173
}
171174
})
@@ -378,11 +381,7 @@ impl Process<'_> {
378381
),
379382
}
380383
}
381-
if ret {
382-
State::Sleep
383-
} else {
384-
State::Stop
385-
}
384+
if ret { State::Sleep } else { State::Stop }
386385
}
387386

388387
#[inline]

src/logger.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ fn init_log4rs(settings: &Settings) {
5656
append::{
5757
console::ConsoleAppender,
5858
rolling_file::{
59+
RollingFileAppender,
5960
policy::compound::{
60-
roll::fixed_window::FixedWindowRoller, trigger::size::SizeTrigger,
61-
CompoundPolicy,
61+
CompoundPolicy, roll::fixed_window::FixedWindowRoller,
62+
trigger::size::SizeTrigger,
6263
},
63-
RollingFileAppender,
6464
},
6565
},
6666
config::{Appender, Config, Root},

src/main.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use log::{error, info};
1515

1616
use crate::settings::Settings;
1717
use crate::socket::Socket;
18-
use crate::util::{sleep_at, ChannelData, State};
18+
use crate::util::{ChannelData, State, sleep_at};
1919

2020
fn main() {
2121
let settings = &settings::SETTINGS;
@@ -62,7 +62,7 @@ fn main() {
6262
let (tx, rx) = crossbeam_channel::unbounded::<ChannelData>();
6363
let tx1 = tx.clone();
6464

65-
let eap_handle = thread::Builder::new()
65+
let _eap_handle = thread::Builder::new()
6666
.name("EAP-Process-Generator".to_owned())
6767
.spawn(move || {
6868
let device = Arc::new(device);
@@ -210,7 +210,7 @@ fn main() {
210210
udp_handle
211211
.join()
212212
.expect("Fatal error! UDP Process generator thread quit!");
213-
eap_handle
213+
_eap_handle
214214
.join()
215215
.expect("Fatal error! EAP Process generator thread quit!");
216216
}

src/settings.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,9 @@ impl Settings {
333333
if let Ok(v) = hex::decode(s) {
334334
settings.data.response_identity.unknown = v;
335335
} else {
336-
error!("Invalid config: data.response_identity.unknown! Default value instead.")
336+
error!(
337+
"Invalid config: data.response_identity.unknown! Default value instead."
338+
)
337339
}
338340
}
339341
}
@@ -342,7 +344,9 @@ impl Settings {
342344
if let Ok(v) = hex::decode(s) {
343345
settings.data.response_md5_challenge.unknown = v;
344346
} else {
345-
error!("Invalid config: data.response_md5_challenge.unknown! Default value instead.")
347+
error!(
348+
"Invalid config: data.response_md5_challenge.unknown! Default value instead."
349+
)
346350
}
347351
}
348352
}

src/socket.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use std::io;
22
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
33

44
use log::{error, info};
5-
use trust_dns_resolver::config::{NameServerConfig, Protocol, ResolverConfig, ResolverOpts};
65
use trust_dns_resolver::Resolver;
6+
use trust_dns_resolver::config::{NameServerConfig, Protocol, ResolverConfig, ResolverOpts};
77

88
use crate::settings::Settings;
99

src/udp.rs

Lines changed: 67 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@ use std::time::Duration;
77

88
use bytes::BytesMut;
99
use chrono::Local;
10-
use crossbeam_channel::{unbounded, Receiver, Sender, TryRecvError};
10+
use crossbeam_channel::{Receiver, Sender, TryRecvError, unbounded};
1111
use log::{debug, error, info};
1212
use pnet::datalink::MacAddr;
1313

1414
use crate::settings::Settings;
1515
use crate::socket::Socket;
1616
use crate::udp::packet::{
17-
decrypt_info, Alive, HeaderType, HeartbeatType, MiscAlive, MiscHeartbeat1, MiscHeartbeat3,
18-
MiscInfo,
17+
Alive, HeaderType, HeartbeatType, MiscAlive, MiscHeartbeat1, MiscHeartbeat3, MiscInfo,
18+
decrypt_info,
1919
};
20-
use crate::util::{self, random_vec, sleep, ChannelData, State};
20+
use crate::util::{self, ChannelData, State, random_vec, sleep};
2121

2222
mod packet;
2323

@@ -158,27 +158,30 @@ impl<'a> Process<'a> {
158158
let resender_handle = Arc::new(
159159
thread::Builder::new()
160160
.name("UDP-ReSender".to_owned())
161-
.spawn(move || loop {
162-
if quit.load(Ordering::Relaxed) {
163-
debug!("UDP-Resender thread quit!");
164-
return;
165-
}
166-
if stop.load(Ordering::Relaxed) {
167-
thread::park();
168-
}
169-
while cancel_resend.load(Ordering::Acquire) {
170-
thread::park();
171-
}
172-
let wait_ts = send_ts.load(Ordering::Acquire) - Local::now().timestamp_millis()
173-
+ (interval as i64);
174-
if wait_ts > 0 {
175-
thread::sleep(Duration::from_millis(wait_ts as u64));
176-
} else if wait_ts > -interval as i64 {
177-
debug!("Resending...");
178-
cancel_resend.store(true, Ordering::Release);
179-
if tx.send((Vec::new(), true)).is_err() {
180-
error!("Unexpected! Send channel is disconnected!");
181-
quit.store(true, Ordering::Release);
161+
.spawn(move || {
162+
loop {
163+
if quit.load(Ordering::Relaxed) {
164+
debug!("UDP-Resender thread quit!");
165+
return;
166+
}
167+
if stop.load(Ordering::Relaxed) {
168+
thread::park();
169+
}
170+
while cancel_resend.load(Ordering::Acquire) {
171+
thread::park();
172+
}
173+
let wait_ts = send_ts.load(Ordering::Acquire)
174+
- Local::now().timestamp_millis()
175+
+ (interval as i64);
176+
if wait_ts > 0 {
177+
thread::sleep(Duration::from_millis(wait_ts as u64));
178+
} else if wait_ts > -interval as i64 {
179+
debug!("Resending...");
180+
cancel_resend.store(true, Ordering::Release);
181+
if tx.send((Vec::new(), true)).is_err() {
182+
error!("Unexpected! Send channel is disconnected!");
183+
quit.store(true, Ordering::Release);
184+
}
182185
}
183186
}
184187
})
@@ -294,47 +297,49 @@ impl<'a> Process<'a> {
294297
self.receiving_eap_handle = Some(Arc::new(
295298
thread::Builder::new()
296299
.name("EAPtoUDP".to_owned())
297-
.spawn(move || loop {
298-
if quit.load(Ordering::Relaxed) {
299-
info!("Stop receiving message from EAP.");
300-
debug!("EAPtoUDP thread quit!");
301-
return;
302-
}
303-
if stop.load(Ordering::Relaxed) {
304-
thread.unpark();
305-
thread::park();
306-
}
307-
match rx.recv() {
308-
Ok(x) => match x.state {
309-
State::Success => {
310-
info!("Receive SUCCESS from EAP.");
311-
loop {
312-
if let Ok(mut r) = data.try_write() {
313-
r.cks_md5 = x.data;
314-
info!("cks_md5(md5): {}", hex::encode(&r.cks_md5));
315-
break;
300+
.spawn(move || {
301+
loop {
302+
if quit.load(Ordering::Relaxed) {
303+
info!("Stop receiving message from EAP.");
304+
debug!("EAPtoUDP thread quit!");
305+
return;
306+
}
307+
if stop.load(Ordering::Relaxed) {
308+
thread.unpark();
309+
thread::park();
310+
}
311+
match rx.recv() {
312+
Ok(x) => match x.state {
313+
State::Success => {
314+
info!("Receive SUCCESS from EAP.");
315+
loop {
316+
if let Ok(mut r) = data.try_write() {
317+
r.cks_md5 = x.data;
318+
info!("cks_md5(md5): {}", hex::encode(&r.cks_md5));
319+
break;
320+
}
321+
util::sleep();
316322
}
317-
util::sleep();
323+
thread.unpark();
318324
}
319-
thread.unpark();
320-
}
321-
State::Stop => {
322-
info!("Receive STOP from EAP.");
323-
stop.store(true, Ordering::Release);
324-
}
325-
State::Sleep => {
326-
info!("Receive SLEEP from EAP.");
327-
sleep.store(true, Ordering::Release);
328-
stop.store(true, Ordering::Release);
329-
}
330-
State::Quit => {
331-
info!("Receive QUIT from EAP.");
325+
State::Stop => {
326+
info!("Receive STOP from EAP.");
327+
stop.store(true, Ordering::Release);
328+
}
329+
State::Sleep => {
330+
info!("Receive SLEEP from EAP.");
331+
sleep.store(true, Ordering::Release);
332+
stop.store(true, Ordering::Release);
333+
}
334+
State::Quit => {
335+
info!("Receive QUIT from EAP.");
336+
quit.store(true, Ordering::Release);
337+
}
338+
},
339+
Err(_) => {
340+
error!("Unexpected! EAPtoUDP channel is closed.");
332341
quit.store(true, Ordering::Release);
333342
}
334-
},
335-
Err(_) => {
336-
error!("Unexpected! EAPtoUDP channel is closed.");
337-
quit.store(true, Ordering::Release);
338343
}
339344
}
340345
})

src/udp/packet.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,17 @@ impl Alive {
237237
fn test() {
238238
let mut v = hex::decode("0701f400030cb025aa286db97dd9fee10222002a3bab4e04c72f3101000000003230313833363433313135345365614c6f6f6e67000000000000000000000000000000000000000000000000ca26c12100000000ca7011210000000000000000940000000600000002000000f0230000020000004472434f4d0096022a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034656238316663303438613535383562376466653137383331353532343161333238623130336336000000000000000000000000000000000000000000000000").unwrap();
239239
append_cks32(&mut v);
240-
assert_eq!(hex::encode(v), "0701f400030cb025aa286db97dd9fee10222002a3bab4e044af8a726000000003230313833363433313135345365614c6f6f6e67000000000000000000000000000000000000000000000000ca26c12100000000ca7011210000000000000000940000000600000002000000f0230000020000004472434f4d0096022a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034656238316663303438613535383562376466653137383331353532343161333238623130336336000000000000000000000000000000000000000000000000");
240+
assert_eq!(
241+
hex::encode(v),
242+
"0701f400030cb025aa286db97dd9fee10222002a3bab4e044af8a726000000003230313833363433313135345365614c6f6f6e67000000000000000000000000000000000000000000000000ca26c12100000000ca7011210000000000000000940000000600000002000000f0230000020000004472434f4d0096022a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034656238316663303438613535383562376466653137383331353532343161333238623130336336000000000000000000000000000000000000000000000000"
243+
);
241244

242245
let mut v = hex::decode("0701f400030cb025aa286db97dd9fee10222002a53513f04c72f3101000000003230313833363433313135345365614c6f6f6e67000000000000000000000000000000000000000000000000ca26c12100000000ca7011210000000000000000940000000600000002000000f0230000020000004472434f4d0096022a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034656238316663303438613535383562376466653137383331353532343161333238623130336336000000000000000000000000000000000000000000000000").unwrap();
243246
append_cks32(&mut v);
244-
assert_eq!(hex::encode(v), "0701f400030cb025aa286db97dd9fee10222002a53513f049adf0351000000003230313833363433313135345365614c6f6f6e67000000000000000000000000000000000000000000000000ca26c12100000000ca7011210000000000000000940000000600000002000000f0230000020000004472434f4d0096022a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034656238316663303438613535383562376466653137383331353532343161333238623130336336000000000000000000000000000000000000000000000000");
247+
assert_eq!(
248+
hex::encode(v),
249+
"0701f400030cb025aa286db97dd9fee10222002a53513f049adf0351000000003230313833363433313135345365614c6f6f6e67000000000000000000000000000000000000000000000000ca26c12100000000ca7011210000000000000000940000000600000002000000f0230000020000004472434f4d0096022a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034656238316663303438613535383562376466653137383331353532343161333238623130336336000000000000000000000000000000000000000000000000"
250+
);
245251

246252
let mut v = hex::decode(
247253
"075628000b03dc02b91900000000000067513f0400000000000000007dd9fee10000000000000000",

0 commit comments

Comments
 (0)