/* SPDX-License-Identifier: LGPL-2.1+ */
-/***
- This file is part of systemd.
-
- Copyright 2011 Lennart Poettering
-***/
#include <errno.h>
#include <string.h>
#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"
#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"
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);
free(m->service);
free(m->root_directory);
free(m->netif);
- free(m);
+ return mfree(m);
}
int machine_save(Machine *m) {
m->timestamp.monotonic);
if (m->n_netif > 0) {
- unsigned i;
+ size_t i;
fputs("NETIF=", f);
if (!m->state_file)
return 0;
- r = parse_env_file(m->state_file, NEWLINE,
+ r = parse_env_file(NULL, m->state_file,
"SCOPE", &m->unit,
"SCOPE_JOB", &m->scope_job,
"SERVICE", &m->service,
"CLASS", &class,
"REALTIME", &realtime,
"MONOTONIC", &monotonic,
- "NETIF", &netif,
- NULL);
+ "NETIF", &netif);
if (r < 0) {
if (r == -ENOENT)
return 0;
}
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;
}
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)
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) {
"MESSAGE_ID=" SD_MESSAGE_MACHINE_START_STR,
"NAME=%s", m->name,
"LEADER="PID_FMT, m->leader,
- LOG_MESSAGE("New machine %s.", m->name),
- NULL);
+ LOG_MESSAGE("New machine %s.", m->name));
if (!dual_timestamp_is_set(&m->timestamp))
dual_timestamp_get(&m->timestamp);
machine_save(m);
machine_send_signal(m, true);
+ (void) manager_enqueue_nscd_cache_flush(m->manager);
return 0;
}
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);
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) {
m->stopping = true;
machine_save(m);
+ (void) manager_enqueue_nscd_cache_flush(m->manager);
return r;
}
"MESSAGE_ID=" SD_MESSAGE_MACHINE_STOP_STR,
"NAME=%s", m->name,
"LEADER="PID_FMT, m->leader,
- LOG_MESSAGE("Machine %s terminated.", m->name),
- NULL);
+ LOG_MESSAGE("Machine %s terminated.", m->name));
machine_unlink(m);
machine_add_to_gc_queue(m);