@@ -8,16 +8,15 @@ mod contextd {
88 #![ allow( clippy:: all, non_snake_case, non_camel_case_types, unused_imports) ]
99 include ! ( concat!( env!( "OUT_DIR" ) , "/contextd.rs" ) ) ;
1010}
11+ mod auth;
1112mod config;
1213mod detectors;
1314
1415mod service;
1516
1617mod rgb;
1718
18- use std:: sync:: { Arc , RwLock } ;
19- use varlink:: VarlinkService ;
20-
19+ use crate :: auth:: { PeerInfo , set_current_peer} ;
2120use crate :: detectors:: controllers:: manager:: ControllerManager ;
2221use crate :: detectors:: diagnostics:: manager:: DiagnosticsManager ;
2322use crate :: detectors:: games:: heroic:: HeroicDetector ;
@@ -27,6 +26,11 @@ use crate::detectors::games::steam::SteamDetector;
2726use crate :: detectors:: hardware:: manager:: HardwareManager ;
2827use crate :: detectors:: hardware:: udev:: UdevDetector ;
2928use crate :: service:: ContextService ;
29+ use std:: io:: BufReader ;
30+ use std:: os:: unix:: net:: UnixListener ;
31+ use std:: sync:: { Arc , RwLock } ;
32+ use threadpool:: ThreadPool ;
33+ use varlink:: { ConnectionHandler , VarlinkService } ;
3034
3135/// Helper to fix socket permissions and ownership
3236fn spawn_permission_fixer ( path : String , mode : u32 , use_rgb_group : bool ) {
@@ -183,13 +187,9 @@ fn main() -> anyhow::Result<()> {
183187 log:: info!( "Observer listening on {}" , obs_addr) ;
184188 log:: info!( "Control listening on {}" , ctrl_addr) ;
185189
186- let config = varlink:: ListenConfig {
187- initial_worker_threads : 1 ,
188- max_worker_threads : 128 ,
189- idle_timeout : 0 ,
190- ..Default :: default ( )
191- } ;
192- varlink:: listen ( control_service, ctrl_addr, & config) ?;
190+ // For simplicity, we only run one blocking listener in the main thread.
191+ // In RGB mode, the Control interface is the primary listener.
192+ run_server ( control_service, ctrl_addr) ?;
193193 } else {
194194 log:: info!( "Starting Context Daemon in Core Mode..." ) ;
195195 let _ = std:: fs:: create_dir_all ( "/run/contextd/public" ) ;
@@ -224,13 +224,42 @@ fn main() -> anyhow::Result<()> {
224224 ) ;
225225 log:: info!( "Core listening on {}" , address) ;
226226
227- let config = varlink:: ListenConfig {
228- initial_worker_threads : 1 ,
229- max_worker_threads : 128 ,
230- idle_timeout : 0 ,
231- ..Default :: default ( )
232- } ;
233- varlink:: listen ( varlink_service, address, & config) ?;
227+ run_server ( varlink_service, address) ?;
228+ }
229+
230+ Ok ( ( ) )
231+ }
232+
233+ /// A custom Varlink server implementation that captures peer credentials.
234+ fn run_server ( service : VarlinkService , address : & str ) -> anyhow:: Result < ( ) > {
235+ let path = address. trim_start_matches ( "unix:" ) ;
236+ let listener = UnixListener :: bind ( path) ?;
237+ let pool = ThreadPool :: new ( 128 ) ;
238+ let service = Arc :: new ( service) ;
239+
240+ log:: debug!( "Custom Varlink server listening on {}" , path) ;
241+
242+ for stream in listener. incoming ( ) {
243+ match stream {
244+ Ok ( stream) => {
245+ let service = Arc :: clone ( & service) ;
246+ let peer_info = PeerInfo :: from_stream ( & stream) ;
247+
248+ pool. execute ( move || {
249+ set_current_peer ( peer_info) ;
250+ let mut reader = BufReader :: new ( & stream) ;
251+ let mut writer = & stream;
252+
253+ if let Err ( e) = service. handle ( & mut reader, & mut writer, None ) {
254+ log:: debug!( "Connection closed: {}" , e) ;
255+ }
256+ set_current_peer ( None ) ;
257+ } ) ;
258+ }
259+ Err ( e) => {
260+ log:: error!( "Error accepting connection: {}" , e) ;
261+ }
262+ }
234263 }
235264
236265 Ok ( ( ) )
0 commit comments