@@ -8,10 +8,11 @@ use std::{
88 } ,
99 process:: exit,
1010 sync:: mpsc:: { channel, Sender } ,
11- thread,
11+ thread:: { self , sleep} ,
12+ time:: Duration ,
1213} ;
1314
14- use anyhow:: bail;
15+ use anyhow:: { anyhow , bail} ;
1516use auto:: auto_adjust;
1617use backlight_ipc:: { BacklightCommand , BacklightInfo , BacklightMode , DEFAULT_UNIX_SOCKET_PATH } ;
1718use monitors:: auto_refresh_monitors_list;
@@ -22,6 +23,90 @@ mod ddc;
2223mod location;
2324mod monitors;
2425
26+ fn main ( ) {
27+ pretty_env_logger:: formatted_builder ( )
28+ . filter_level ( log:: LevelFilter :: Info )
29+ . parse_env ( "BACKLIGHTD_LOG_LEVEL" )
30+ . filter_module ( "ureq" , log:: LevelFilter :: Warn )
31+ . init ( ) ;
32+
33+ let args: Vec < String > = env:: args ( ) . collect ( ) ;
34+
35+ if args. len ( ) != 1 && args. len ( ) != 3 {
36+ eprintln ! (
37+ "Usage: {} (optional: --unix-socket-path {DEFAULT_UNIX_SOCKET_PATH})" ,
38+ args[ 0 ]
39+ ) ;
40+ exit ( 1 ) ;
41+ }
42+
43+ let unix_socket_path = if args. len ( ) == 3 {
44+ args[ 2 ] . as_str ( )
45+ } else {
46+ DEFAULT_UNIX_SOCKET_PATH
47+ } ;
48+
49+ let listener = match create_unix_socket ( unix_socket_path) {
50+ Ok ( listener) => listener,
51+ Err ( err) => {
52+ log:: error!( "{unix_socket_path}: {err}" ) ;
53+ exit ( 1 ) ;
54+ }
55+ } ;
56+
57+ let ( auto_sender, auto_receiver) = channel ( ) ;
58+
59+ let auto_refresh_monitors_thread = thread:: spawn ( move || auto_refresh_monitors_list ( ) ) ;
60+ let auto_adjust_thread = thread:: spawn ( move || auto_adjust ( auto_receiver) ) ;
61+ let handle_clients_thread = thread:: spawn ( move || handle_clients_thread ( listener, auto_sender) ) ;
62+
63+ loop {
64+ if auto_refresh_monitors_thread. is_finished ( ) {
65+ panic ! ( "auto refresh monitors thread is gone" ) ;
66+ }
67+
68+ if auto_adjust_thread. is_finished ( ) {
69+ panic ! ( "auto adjust thread is gone" ) ;
70+ }
71+
72+ if handle_clients_thread. is_finished ( ) {
73+ panic ! ( "handle_clients_thread thread is gone" ) ;
74+ }
75+
76+ sleep ( Duration :: from_secs ( 5 ) ) ;
77+ }
78+ }
79+
80+ fn handle_clients_thread ( listener : UnixListener , auto_adjust_sender : Sender < BacklightMode > ) {
81+ for stream in listener. incoming ( ) {
82+ let client = match stream {
83+ Ok ( client) => client,
84+ Err ( err) => {
85+ log:: error!( "Failed to accept incoming client: {err}" ) ;
86+ continue ;
87+ }
88+ } ;
89+
90+ if let Err ( err) = handle_client ( client, auto_adjust_sender. clone ( ) ) {
91+ log:: error!( "{err}" ) ;
92+ continue ;
93+ }
94+ }
95+ }
96+
97+ fn create_unix_socket ( unix_socket_path : & str ) -> anyhow:: Result < UnixListener > {
98+ if let Err ( err) = remove_file ( unix_socket_path) {
99+ if !matches ! ( err. kind( ) , io:: ErrorKind :: NotFound ) {
100+ return Err ( anyhow ! ( err) ) ;
101+ }
102+ }
103+
104+ let listener = UnixListener :: bind ( unix_socket_path) ?;
105+ fs:: set_permissions ( unix_socket_path, fs:: Permissions :: from_mode ( 0o777 ) ) ?;
106+
107+ Ok ( listener)
108+ }
109+
25110fn handle_client (
26111 client : UnixStream ,
27112 auto_adjust_sender : Sender < BacklightMode > ,
@@ -85,77 +170,3 @@ fn handle_client(
85170
86171 Ok ( ( ) )
87172}
88-
89- fn main ( ) {
90- pretty_env_logger:: formatted_builder ( )
91- . filter_level ( log:: LevelFilter :: Info )
92- . parse_env ( "BACKLIGHTD_LOG_LEVEL" )
93- . filter_module ( "ureq" , log:: LevelFilter :: Warn )
94- . init ( ) ;
95-
96- let args: Vec < String > = env:: args ( ) . collect ( ) ;
97-
98- if args. len ( ) != 1 && args. len ( ) != 3 {
99- eprintln ! (
100- "Usage: {} (optional: --unix-socket-path {DEFAULT_UNIX_SOCKET_PATH})" ,
101- args[ 0 ]
102- ) ;
103- exit ( 1 ) ;
104- }
105-
106- let unix_socket_path = if args. len ( ) == 3 {
107- args[ 2 ] . as_str ( )
108- } else {
109- DEFAULT_UNIX_SOCKET_PATH
110- } ;
111-
112- if let Err ( err) = remove_file ( unix_socket_path) {
113- if !matches ! ( err. kind( ) , io:: ErrorKind :: NotFound ) {
114- log:: error!( "{unix_socket_path}: {err}" ) ;
115- exit ( 1 ) ;
116- }
117- }
118-
119- let listener = match UnixListener :: bind ( unix_socket_path) {
120- Ok ( listener) => listener,
121- Err ( err) => {
122- log:: error!( "{unix_socket_path}: {err}" ) ;
123- exit ( 1 ) ;
124- }
125- } ;
126-
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-
132- let ( auto_sender, auto_receiver) = channel ( ) ;
133-
134- let auto_refresh_monitors_thread = thread:: spawn ( move || auto_refresh_monitors_list ( ) ) ;
135- let auto_adjust_thread = thread:: spawn ( move || auto_adjust ( auto_receiver) ) ;
136-
137- for stream in listener. incoming ( ) {
138- if auto_refresh_monitors_thread. is_finished ( ) {
139- panic ! ( "auto refresh monitors thread is gone" ) ;
140- }
141-
142- if auto_adjust_thread. is_finished ( ) {
143- panic ! ( "auto adjust thread is gone" ) ;
144- }
145-
146- let client = match stream {
147- Ok ( client) => client,
148- Err ( err) => {
149- log:: error!( "Failed to accept incoming client: {err}" ) ;
150- continue ;
151- }
152- } ;
153-
154- if let Err ( err) = handle_client ( client, auto_sender. clone ( ) ) {
155- log:: error!( "{err}" ) ;
156- continue ;
157- }
158- }
159-
160- unreachable ! ( )
161- }
0 commit comments