Skip to content

Commit cc090ca

Browse files
committed
initctl: use _cleanup_ and run()
1 parent e9d9d50 commit cc090ca

File tree

1 file changed

+46
-87
lines changed

1 file changed

+46
-87
lines changed

src/initctl/initctl.c

Lines changed: 46 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
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

230233
static void server_done(Server *s) {
231234
assert(s);
@@ -240,77 +243,48 @@ static void server_done(Server *s) {
240243
static 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

316290
static 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

Comments
 (0)