1414#include "alloc-util.h"
1515#include "bus-error.h"
1616#include "bus-util.h"
17+ #include "daemon-util.h"
1718#include "def.h"
1819#include "fd-util.h"
1920#include "format-util.h"
2021#include "initreq.h"
2122#include "list.h"
2223#include "log.h"
24+ #include "main-func.h"
2325#include "memory-util.h"
2426#include "process-util.h"
2527#include "special.h"
@@ -226,6 +228,7 @@ static void fifo_free(Fifo *f) {
226228
227229 free (f );
228230}
231+ DEFINE_TRIVIAL_CLEANUP_FUNC (Fifo * , fifo_free );
229232
230233static void server_done (Server * s ) {
231234 assert (s );
@@ -240,77 +243,48 @@ static void server_done(Server *s) {
240243static int server_init (Server * s , unsigned n_sockets ) {
241244 int r ;
242245
246+ /* This function will leave s partially initialized on failure. Caller needs to clean up. */
247+
243248 assert (s );
244249 assert (n_sockets > 0 );
245250
246- * s = (struct Server ) {
247- .epoll_fd = epoll_create1 (EPOLL_CLOEXEC ),
248- };
249-
250- if (s -> epoll_fd < 0 ) {
251- r = log_error_errno (errno ,
252- "Failed to create epoll object: %m" );
253- goto fail ;
254- }
251+ s -> epoll_fd = epoll_create1 (EPOLL_CLOEXEC );
252+ if (s -> epoll_fd < 0 )
253+ return log_error_errno (errno , "Failed to create epoll object: %m" );
255254
256255 for (unsigned i = 0 ; i < n_sockets ; i ++ ) {
257- Fifo * f ;
258- int fd ;
259-
260- fd = SD_LISTEN_FDS_START + i ;
256+ _cleanup_ (fifo_freep ) Fifo * f = NULL ;
257+ int fd = SD_LISTEN_FDS_START + i ;
261258
262259 r = sd_is_fifo (fd , NULL );
263- if (r < 0 ) {
264- log_error_errno (r , "Failed to determine file descriptor type: %m" );
265- goto fail ;
266- }
267-
268- if (!r ) {
269- log_error ("Wrong file descriptor type." );
270- r = - EINVAL ;
271- goto fail ;
272- }
260+ if (r < 0 )
261+ return log_error_errno (r , "Failed to determine file descriptor type: %m" );
262+ if (!r )
263+ return log_error_errno (SYNTHETIC_ERRNO (EINVAL ), "Wrong file descriptor type." );
273264
274265 f = new0 (Fifo , 1 );
275- if (!f ) {
276- r = - ENOMEM ;
277- log_error_errno (errno , "Failed to create fifo object: %m" );
278- goto fail ;
279- }
280-
281- f -> fd = -1 ;
266+ if (!f )
267+ return log_oom ();
282268
283269 struct epoll_event ev = {
284270 .events = EPOLLIN ,
285271 .data .ptr = f ,
286272 };
287273
288- if (epoll_ctl (s -> epoll_fd , EPOLL_CTL_ADD , fd , & ev ) < 0 ) {
289- r = - errno ;
290- fifo_free (f );
291- log_error_errno (errno , "Failed to add fifo fd to epoll object: %m" );
292- goto fail ;
293- }
274+ if (epoll_ctl (s -> epoll_fd , EPOLL_CTL_ADD , fd , & ev ) < 0 )
275+ return log_error_errno (errno , "Failed to add fifo fd to epoll object: %m" );
294276
295277 f -> fd = fd ;
296- LIST_PREPEND (fifo , s -> fifos , f );
297278 f -> server = s ;
279+ LIST_PREPEND (fifo , s -> fifos , TAKE_PTR (f ));
298280 s -> n_fifos ++ ;
299281 }
300282
301283 r = bus_connect_system_systemd (& s -> bus );
302- if (r < 0 ) {
303- log_error_errno (r , "Failed to get D-Bus connection: %m" );
304- r = - EIO ;
305- goto fail ;
306- }
284+ if (r < 0 )
285+ return log_error_errno (r , "Failed to get D-Bus connection: %m" );
307286
308287 return 0 ;
309-
310- fail :
311- server_done (s );
312-
313- return r ;
314288}
315289
316290static int process_event (Server * s , struct epoll_event * ev ) {
@@ -334,38 +308,33 @@ static int process_event(Server *s, struct epoll_event *ev) {
334308 return 0 ;
335309}
336310
337- int main (int argc , char * argv []) {
338- Server server ;
339- int r = EXIT_FAILURE , n ;
311+ static int run (int argc , char * argv []) {
312+ _cleanup_ (server_done ) Server server = { .epoll_fd = -1 };
313+ _cleanup_ (notify_on_cleanup ) const char * notify_stop = NULL ;
314+ int r , n ;
340315
341- if (argc > 1 ) {
342- log_error ("This program does not take arguments." );
343- return EXIT_FAILURE ;
344- }
316+ if (argc > 1 )
317+ return log_error_errno (SYNTHETIC_ERRNO (EINVAL ),
318+ "This program does not take arguments." );
345319
346320 log_setup_service ();
347321
348322 umask (0022 );
349323
350324 n = sd_listen_fds (true);
351- if (n < 0 ) {
352- log_error_errno (r , "Failed to read listening file descriptors from environment: %m" );
353- return EXIT_FAILURE ;
354- }
325+ if (n < 0 )
326+ return log_error_errno (errno ,
327+ "Failed to read listening file descriptors from environment: %m" );
355328
356- if (n <= 0 || n > SERVER_FD_MAX ) {
357- log_error ("No or too many file descriptors passed." );
358- return EXIT_FAILURE ;
359- }
329+ if (n <= 0 || n > SERVER_FD_MAX )
330+ return log_error_errno (SYNTHETIC_ERRNO (EINVAL ),
331+ "No or too many file descriptors passed." );
360332
361- if (server_init (& server , (unsigned ) n ) < 0 )
362- return EXIT_FAILURE ;
363-
364- log_debug ("systemd-initctl running as pid " PID_FMT , getpid_cached ());
333+ r = server_init (& server , (unsigned ) n );
334+ if (r < 0 )
335+ return r ;
365336
366- sd_notify (false,
367- "READY=1\n"
368- "STATUS=Processing requests..." );
337+ notify_stop = notify_start (NOTIFY_READY , NOTIFY_STOPPING );
369338
370339 while (!server .quit ) {
371340 struct epoll_event event ;
@@ -375,27 +344,17 @@ int main(int argc, char *argv[]) {
375344 if (k < 0 ) {
376345 if (errno == EINTR )
377346 continue ;
378- log_error_errno (errno , "epoll_wait() failed: %m" );
379- goto fail ;
347+ return log_error_errno (errno , "epoll_wait() failed: %m" );
380348 }
381-
382- if (k <= 0 )
349+ if (k == 0 )
383350 break ;
384351
385- if (process_event (& server , & event ) < 0 )
386- goto fail ;
352+ r = process_event (& server , & event );
353+ if (r < 0 )
354+ return r ;
387355 }
388356
389- r = EXIT_SUCCESS ;
390-
391- log_debug ("systemd-initctl stopped as pid " PID_FMT , getpid_cached ());
392-
393- fail :
394- sd_notify (false,
395- "STOPPING=1\n"
396- "STATUS=Shutting down..." );
397-
398- server_done (& server );
399-
400- return r ;
357+ return 0 ;
401358}
359+
360+ DEFINE_MAIN_FUNCTION (run );
0 commit comments