diff options
Diffstat (limited to 'src/machine/machine.c')
-rw-r--r-- | src/machine/machine.c | 75 |
1 files changed, 41 insertions, 34 deletions
diff --git a/src/machine/machine.c b/src/machine/machine.c index b645f614c4..4f89ac026d 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -10,6 +10,7 @@ #include "alloc-util.h" #include "bus-error.h" #include "bus-util.h" +#include "env-file.h" #include "escape.h" #include "extract-word.h" #include "fd-util.h" @@ -21,10 +22,12 @@ #include "mkdir.h" #include "parse-util.h" #include "process-util.h" +#include "serialize.h" #include "special.h" #include "stdio-util.h" #include "string-table.h" #include "terminal-util.h" +#include "tmpfile-util.h" #include "unit-name.h" #include "user-util.h" #include "util.h" @@ -69,8 +72,9 @@ fail: return mfree(m); } -void machine_free(Machine *m) { - assert(m); +Machine* machine_free(Machine *m) { + if (!m) + return NULL; while (m->operations) operation_free(m->operations); @@ -97,7 +101,7 @@ void machine_free(Machine *m) { free(m->service); free(m->root_directory); free(m->netif); - free(m); + return mfree(m); } int machine_save(Machine *m) { @@ -183,7 +187,7 @@ int machine_save(Machine *m) { m->timestamp.monotonic); if (m->n_netif > 0) { - unsigned i; + size_t i; fputs("NETIF=", f); @@ -250,7 +254,7 @@ int machine_load(Machine *m) { if (!m->state_file) return 0; - r = parse_env_file(NULL, m->state_file, NEWLINE, + r = parse_env_file(NULL, m->state_file, "SCOPE", &m->unit, "SCOPE_JOB", &m->scope_job, "SERVICE", &m->service, @@ -260,8 +264,7 @@ int machine_load(Machine *m) { "CLASS", &class, "REALTIME", &realtime, "MONOTONIC", &monotonic, - "NETIF", &netif, - NULL); + "NETIF", &netif); if (r < 0) { if (r == -ENOENT) return 0; @@ -284,9 +287,9 @@ int machine_load(Machine *m) { } if (realtime) - timestamp_deserialize(realtime, &m->timestamp.realtime); + (void) deserialize_usec(realtime, &m->timestamp.realtime); if (monotonic) - timestamp_deserialize(monotonic, &m->timestamp.monotonic); + (void) deserialize_usec(monotonic, &m->timestamp.monotonic); if (netif) { size_t allocated = 0, nr = 0; @@ -328,14 +331,13 @@ int machine_load(Machine *m) { } static int machine_start_scope(Machine *m, sd_bus_message *properties, sd_bus_error *error) { - int r = 0; - assert(m); assert(m->class != MACHINE_HOST); if (!m->unit) { - _cleanup_free_ char *escaped = NULL; - char *scope, *description, *job = NULL; + _cleanup_free_ char *escaped = NULL, *scope = NULL; + char *description, *job = NULL; + int r; escaped = unit_name_escape(m->name); if (!escaped) @@ -348,22 +350,17 @@ static int machine_start_scope(Machine *m, sd_bus_message *properties, sd_bus_er description = strjoina(m->class == MACHINE_VM ? "Virtual Machine " : "Container ", m->name); r = manager_start_scope(m->manager, scope, m->leader, SPECIAL_MACHINE_SLICE, description, properties, error, &job); - if (r < 0) { - log_error("Failed to start machine scope: %s", bus_error_message(error, r)); - free(scope); - return r; - } else { - m->unit = scope; - - free(m->scope_job); - m->scope_job = job; - } + if (r < 0) + return log_error_errno(r, "Failed to start machine scope: %s", bus_error_message(error, r)); + + m->unit = TAKE_PTR(scope); + free_and_replace(m->scope_job, job); } if (m->unit) hashmap_put(m->manager->machine_units, m->unit, m); - return r; + return 0; } int machine_start(Machine *m, sd_bus_message *properties, sd_bus_error *error) { @@ -401,6 +398,7 @@ int machine_start(Machine *m, sd_bus_message *properties, sd_bus_error *error) { machine_save(m); machine_send_signal(m, true); + (void) manager_enqueue_nscd_cache_flush(m->manager); return 0; } @@ -408,7 +406,7 @@ int machine_start(Machine *m, sd_bus_message *properties, sd_bus_error *error) { static int machine_stop_scope(Machine *m) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; char *job = NULL; - int r; + int r, q; assert(m); assert(m->class != MACHINE_HOST); @@ -418,14 +416,16 @@ static int machine_stop_scope(Machine *m) { r = manager_stop_unit(m->manager, m->unit, &error, &job); if (r < 0) { - log_error("Failed to stop machine scope: %s", bus_error_message(&error, r)); - return r; - } + log_error_errno(r, "Failed to stop machine scope: %s", bus_error_message(&error, r)); + sd_bus_error_free(&error); + } else + free_and_replace(m->scope_job, job); - free(m->scope_job); - m->scope_job = job; + q = manager_unref_unit(m->manager, m->unit, &error); + if (q < 0) + log_warning_errno(q, "Failed to drop reference to machine scope, ignoring: %s", bus_error_message(&error, r)); - return 0; + return r; } int machine_stop(Machine *m) { @@ -440,6 +440,7 @@ int machine_stop(Machine *m) { m->stopping = true; machine_save(m); + (void) manager_enqueue_nscd_cache_flush(m->manager); return r; } @@ -593,7 +594,7 @@ int machine_get_uid_shift(Machine *m, uid_t *ret) { uid_t uid_base, uid_shift, uid_range; gid_t gid_base, gid_shift, gid_range; _cleanup_fclose_ FILE *f = NULL; - int k; + int k, r; assert(m); assert(ret); @@ -642,7 +643,10 @@ int machine_get_uid_shift(Machine *m, uid_t *ret) { return -ENXIO; /* If there's more than one line, then we don't support this mapping. */ - if (fgetc(f) != EOF) + r = safe_fgetc(f, NULL); + if (r < 0) + return r; + if (r != 0) /* Insist on EOF */ return -ENXIO; fclose(f); @@ -663,7 +667,10 @@ int machine_get_uid_shift(Machine *m, uid_t *ret) { } /* If there's more than one line, then we don't support this file. */ - if (fgetc(f) != EOF) + r = safe_fgetc(f, NULL); + if (r < 0) + return r; + if (r != 0) /* Insist on EOF */ return -ENXIO; /* If the UID and GID mapping doesn't match, we don't support this mapping. */ |