machined: some modernizations

A couple of minor modernizations:

1. Don't unnecessarily export functions we don't call outside of
   machined.c

2. Use cleanup logic for the manager object.

3. Propagate errors properly from manager_new(). So far if
   sd_event_new() returns EMFILE/ENFILE for some reason we would have
   logged that as log_oom(), which isn#t right, really.

4. Handle SIGTERM/SIGINT cleanly. It's easy, and prettier then letting
   the kernel just abort us. It also makes it possible to valgrind
   machined properly.
This commit is contained in:
Lennart Poettering 2018-04-05 12:38:25 +02:00
parent edac2c4716
commit 730fa7ce1f
3 changed files with 46 additions and 48 deletions

View file

@ -2638,12 +2638,14 @@ static int set_limit(int argc, char *argv[], void *userdata) {
uint64_t limit;
int r;
polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
if (STR_IN_SET(argv[argc-1], "-", "none", "infinity"))
limit = (uint64_t) -1;
else {
r = parse_size(argv[argc-1], 1024, &limit);
if (r < 0)
return log_error("Failed to parse size: %s", argv[argc-1]);
return log_error_errno(r, "Failed to parse size: %s", argv[argc-1]);
}
if (argc > 2)
@ -2670,10 +2672,8 @@ static int set_limit(int argc, char *argv[], void *userdata) {
NULL,
"t", limit);
if (r < 0) {
log_error("Could not set limit: %s", bus_error_message(&error, -r));
return r;
}
if (r < 0)
return log_error_errno(r, "Could not set limit: %s", bus_error_message(&error, r));
return 0;
}
@ -2688,6 +2688,8 @@ static int clean_images(int argc, char *argv[], void *userdata) {
unsigned c = 0;
int r;
polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
r = sd_bus_message_new_method_call(
bus,
&m,
@ -3139,7 +3141,7 @@ int main(int argc, char*argv[]) {
goto finish;
}
sd_bus_set_allow_interactive_authorization(bus, arg_ask_password);
(void) sd_bus_set_allow_interactive_authorization(bus, arg_ask_password);
r = machinectl_main(argc, argv, bus);

View file

@ -26,35 +26,45 @@
#include "signal-util.h"
#include "special.h"
Manager *manager_new(void) {
Manager *m;
static Manager* manager_unref(Manager *m);
DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref);
static int manager_new(Manager **ret) {
_cleanup_(manager_unrefp) Manager *m = NULL;
int r;
assert(ret);
m = new0(Manager, 1);
if (!m)
return NULL;
return -ENOMEM;
m->machines = hashmap_new(&string_hash_ops);
m->machine_units = hashmap_new(&string_hash_ops);
m->machine_leaders = hashmap_new(NULL);
if (!m->machines || !m->machine_units || !m->machine_leaders) {
manager_free(m);
return NULL;
}
if (!m->machines || !m->machine_units || !m->machine_leaders)
return -ENOMEM;
r = sd_event_default(&m->event);
if (r < 0) {
manager_free(m);
return NULL;
}
if (r < 0)
return r;
sd_event_set_watchdog(m->event, true);
r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
if (r < 0)
return r;
return m;
r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
if (r < 0)
return r;
(void) sd_event_set_watchdog(m->event, true);
*ret = TAKE_PTR(m);
return 0;
}
void manager_free(Manager *m) {
static Manager* manager_unref(Manager *m) {
Machine *machine;
assert(m);
@ -80,7 +90,7 @@ void manager_free(Manager *m) {
sd_bus_unref(m->bus);
sd_event_unref(m->event);
free(m);
return mfree(m);
}
static int manager_add_host_machine(Manager *m) {
@ -121,7 +131,7 @@ static int manager_add_host_machine(Manager *m) {
return 0;
}
int manager_enumerate_machines(Manager *m) {
static int manager_enumerate_machines(Manager *m) {
_cleanup_closedir_ DIR *d = NULL;
struct dirent *de;
int r = 0;
@ -268,7 +278,7 @@ static int manager_connect_bus(Manager *m) {
return 0;
}
void manager_gc(Manager *m, bool drop_not_started) {
static void manager_gc(Manager *m, bool drop_not_started) {
Machine *machine;
assert(m);
@ -292,7 +302,7 @@ void manager_gc(Manager *m, bool drop_not_started) {
}
}
int manager_startup(Manager *m) {
static int manager_startup(Manager *m) {
Machine *machine;
Iterator i;
int r;
@ -328,7 +338,7 @@ static bool check_idle(void *userdata) {
return hashmap_isempty(m->machines);
}
int manager_run(Manager *m) {
static int manager_run(Manager *m) {
assert(m);
return bus_event_loop_with_idle(
@ -340,7 +350,7 @@ int manager_run(Manager *m) {
}
int main(int argc, char *argv[]) {
Manager *m = NULL;
_cleanup_(manager_unrefp) Manager *m = NULL;
int r;
log_set_target(LOG_TARGET_AUTO);
@ -356,18 +366,16 @@ int main(int argc, char *argv[]) {
goto finish;
}
/* Always create the directories people can create inotify
* watches in. Note that some applications might check for the
* existence of /run/systemd/machines/ to determine whether
* machined is available, so please always make sure this
* check stays in. */
mkdir_label("/run/systemd/machines", 0755);
/* Always create the directories people can create inotify watches in. Note that some applications might check
* for the existence of /run/systemd/machines/ to determine whether machined is available, so please always
* make sure this check stays in. */
(void) mkdir_label("/run/systemd/machines", 0755);
assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, -1) >= 0);
m = manager_new();
if (!m) {
r = log_oom();
r = manager_new(&m);
if (r < 0) {
log_error_errno(r, "Failed to allocate manager object: %m");
goto finish;
}
@ -388,7 +396,5 @@ int main(int argc, char *argv[]) {
log_debug("systemd-machined stopped as pid "PID_FMT, getpid_cached());
finish:
manager_free(m);
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}

View file

@ -43,17 +43,7 @@ struct Manager {
unsigned n_operations;
};
Manager *manager_new(void);
void manager_free(Manager *m);
int manager_add_machine(Manager *m, const char *name, Machine **_machine);
int manager_enumerate_machines(Manager *m);
int manager_startup(Manager *m);
int manager_run(Manager *m);
void manager_gc(Manager *m, bool drop_not_started);
int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine);
extern const sd_bus_vtable manager_vtable[];