summaryrefslogtreecommitdiff
path: root/src/machine/machine.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/machine/machine.c')
-rw-r--r--src/machine/machine.c75
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. */