11use std:: {
22 env,
3- fs:: remove_file,
3+ fs:: { self , remove_file} ,
44 io,
5- os:: unix:: net:: UnixListener ,
5+ os:: unix:: {
6+ fs:: PermissionsExt ,
7+ net:: { UnixListener , UnixStream } ,
8+ } ,
69 process:: exit,
7- sync:: mpsc:: { channel, Receiver , Sender } ,
10+ sync:: mpsc:: { channel, Sender } ,
811 thread,
912} ;
1013
14+ use anyhow:: bail;
1115use auto:: auto_adjust;
12- use backlight_ipc:: { BacklightCommand , BacklightMode , DEFAULT_UNIX_SOCKET_PATH } ;
13- use log:: error;
16+ use backlight_ipc:: { BacklightCommand , BacklightInfo , BacklightMode , DEFAULT_UNIX_SOCKET_PATH } ;
1417use monitors:: auto_refresh_monitors_list;
1518
1619mod acpi;
@@ -19,14 +22,16 @@ mod ddc;
1922mod location;
2023mod monitors;
2124
22- fn handle_commands (
23- cmd_receiver : Receiver < BacklightCommand > ,
25+ fn handle_client (
26+ client : UnixStream ,
2427 auto_adjust_sender : Sender < BacklightMode > ,
25- ) -> ! {
28+ ) -> anyhow :: Result < ( ) > {
2629 loop {
27- let command = cmd_receiver
28- . recv ( )
29- . expect ( "Failed to receive command from cmd channel" ) ;
30+ let command = match BacklightCommand :: deserialize_from ( & client) {
31+ Ok ( cmd) => cmd,
32+ Err ( err) => bail ! ( "Unable to deserialize command: {err}" ) ,
33+ } ;
34+
3035 let result = match command {
3136 BacklightCommand :: SetBrightness ( percent) => {
3237 auto_adjust_sender
@@ -54,22 +59,38 @@ fn handle_commands(
5459 auto_adjust_sender
5560 . send ( backlight_mode)
5661 . unwrap_or_else ( |err| {
57- error ! ( "Failed to send mode to auto adjust channel: {err}" )
62+ log :: error!( "Failed to send mode to auto adjust channel: {err}" )
5863 } ) ;
5964 Ok ( ( ) )
6065 }
66+ BacklightCommand :: GetInfo => {
67+ BacklightCommand :: GetInfoResponse ( BacklightInfo {
68+ brightness_percent : monitors:: get_average_brightness ( ) ,
69+ } )
70+ . serialize_into ( & client)
71+ . unwrap_or_else ( |err| log:: error!( "Unable to serialize GetInfoResponse: {err}" ) ) ;
72+ Ok ( ( ) )
73+ }
74+ BacklightCommand :: GetInfoResponse ( _) => {
75+ log:: warn!( "Got GetInfoResponse from client, API misuse ?" ) ;
76+ Ok ( ( ) )
77+ }
78+ BacklightCommand :: NotifyShutdown => break ,
6179 } ;
6280
6381 if let Err ( err) = result {
64- error ! ( "Command handling failed: {err}" ) ;
82+ log :: error!( "Command handling failed: {err}" ) ;
6583 }
6684 }
85+
86+ Ok ( ( ) )
6787}
6888
6989fn main ( ) {
7090 pretty_env_logger:: formatted_builder ( )
7191 . filter_level ( log:: LevelFilter :: Info )
7292 . parse_env ( "BACKLIGHTD_LOG_LEVEL" )
93+ . filter_module ( "ureq" , log:: LevelFilter :: Warn )
7394 . init ( ) ;
7495
7596 let args: Vec < String > = env:: args ( ) . collect ( ) ;
@@ -90,54 +111,49 @@ fn main() {
90111
91112 if let Err ( err) = remove_file ( unix_socket_path) {
92113 if !matches ! ( err. kind( ) , io:: ErrorKind :: NotFound ) {
93- error ! ( "{unix_socket_path}: {err}" ) ;
114+ log :: error!( "{unix_socket_path}: {err}" ) ;
94115 exit ( 1 ) ;
95116 }
96117 }
97118
98119 let listener = match UnixListener :: bind ( unix_socket_path) {
99120 Ok ( listener) => listener,
100121 Err ( err) => {
101- error ! ( "{unix_socket_path}: {err}" ) ;
122+ log :: error!( "{unix_socket_path}: {err}" ) ;
102123 exit ( 1 ) ;
103124 }
104125 } ;
105126
106- let ( cmd_sender, cmd_receiver) = channel ( ) ;
127+ if let Err ( err) = fs:: set_permissions ( unix_socket_path, fs:: Permissions :: from_mode ( 0o777 ) ) {
128+ log:: error!( "{unix_socket_path}: {err}" ) ;
129+ exit ( 1 ) ;
130+ }
131+
107132 let ( auto_sender, auto_receiver) = channel ( ) ;
108133
109134 let auto_refresh_monitors_thread = thread:: spawn ( move || auto_refresh_monitors_list ( ) ) ;
110- let command_handler_thread = thread:: spawn ( move || handle_commands ( cmd_receiver, auto_sender) ) ;
111135 let auto_adjust_thread = thread:: spawn ( move || auto_adjust ( auto_receiver) ) ;
112136
113137 for stream in listener. incoming ( ) {
114138 if auto_refresh_monitors_thread. is_finished ( ) {
115139 panic ! ( "auto refresh monitors thread is gone" ) ;
116140 }
117141
118- if command_handler_thread. is_finished ( ) {
119- panic ! ( "command handler thread is gone" ) ;
120- }
121-
122142 if auto_adjust_thread. is_finished ( ) {
123143 panic ! ( "auto adjust thread is gone" ) ;
124144 }
125145
126- let stream = match stream {
127- Ok ( stream ) => stream ,
146+ let client = match stream {
147+ Ok ( client ) => client ,
128148 Err ( err) => {
129- error ! ( "A client tried to connect but something wrong happened : {err}" ) ;
149+ log :: error!( "Failed to accept incoming client : {err}" ) ;
130150 continue ;
131151 }
132152 } ;
133153
134- match BacklightCommand :: deserialize_from ( & stream) {
135- Ok ( command) => {
136- cmd_sender. send ( command) . unwrap ( ) ;
137- }
138- Err ( err) => {
139- error ! ( "Unable to deserialize command: {err}" ) ;
140- }
154+ if let Err ( err) = handle_client ( client, auto_sender. clone ( ) ) {
155+ log:: error!( "{err}" ) ;
156+ continue ;
141157 }
142158 }
143159
0 commit comments