X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmachine%2Fmachine.c;h=048607fb7f65762b59f41d45f97384cc8325b78e;hb=bfb8d4726c4b9e52560abf894ec344359975ff73;hp=6c01617cfb8852d3ae4fd88fc58d4fe73166f3d7;hpb=17a20d64912e95ea90380381f85e9ef7fd56ff67;p=elogind.git diff --git a/src/machine/machine.c b/src/machine/machine.c index 6c01617cf..048607fb7 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -28,7 +28,6 @@ #include "util.h" #include "mkdir.h" #include "hashmap.h" -#include "strv.h" #include "fileio.h" #include "special.h" #include "unit-name.h" @@ -74,6 +73,9 @@ fail: void machine_free(Machine *m) { assert(m); + while (m->operations) + machine_operation_unref(m->operations); + if (m->in_gc_queue) LIST_REMOVE(gc_queue, m->manager->machine_gc_queue, m); @@ -210,9 +212,9 @@ int machine_save(Machine *m) { /* Create a symlink from the unit name to the machine * name, so that we can quickly find the machine for - * each given unit */ - sl = strappenda("/run/systemd/machines/unit:", m->unit); - symlink(m->name, sl); + * each given unit. Ignore error. */ + sl = strjoina("/run/systemd/machines/unit:", m->unit); + (void) symlink(m->name, sl); } finish: @@ -232,7 +234,7 @@ static void machine_unlink(Machine *m) { char *sl; - sl = strappenda("/run/systemd/machines/unit:", m->unit); + sl = strjoina("/run/systemd/machines/unit:", m->unit); unlink(sl); } @@ -340,7 +342,7 @@ static int machine_start_scope(Machine *m, sd_bus_message *properties, sd_bus_er if (!scope) return log_oom(); - description = strappenda(m->class == MACHINE_VM ? "Virtual Machine " : "Container ", m->name); + 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) { @@ -501,6 +503,28 @@ int machine_kill(Machine *m, KillWho who, int signo) { return manager_kill_unit(m->manager, m->unit, signo, NULL); } +MachineOperation *machine_operation_unref(MachineOperation *o) { + if (!o) + return NULL; + + sd_event_source_unref(o->event_source); + + safe_close(o->errno_fd); + + if (o->pid > 1) + (void) kill(o->pid, SIGKILL); + + sd_bus_message_unref(o->message); + + if (o->machine) { + LIST_REMOVE(operations, o->machine->operations, o); + o->machine->n_operations--; + } + + free(o); + return NULL; +} + static const char* const machine_class_table[_MACHINE_CLASS_MAX] = { [MACHINE_CONTAINER] = "container", [MACHINE_VM] = "vm"