X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmachine%2Fmachine.c;h=0d84213eeae784e28d5c892f79af47ccb96da88b;hb=6573ef05a3cbe15949acfbbf1ad03726068907bd;hp=0b0d45bb266594410f7cf6c7b04be6e7118e6646;hpb=034753ac13a9d4b308eee1e8d7c3285f6646c0d8;p=elogind.git diff --git a/src/machine/machine.c b/src/machine/machine.c index 0b0d45bb2..0d84213ee 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -94,6 +94,7 @@ void machine_free(Machine *m) { free(m->state_file); free(m->service); free(m->root_directory); + free(m->netif); free(m); } @@ -176,6 +177,21 @@ int machine_save(Machine *m) { m->timestamp.realtime, m->timestamp.monotonic); + if (m->n_netif > 0) { + unsigned i; + + fputs("NETIF=", f); + + for (i = 0; i < m->n_netif; i++) { + if (i != 0) + fputc(' ', f); + + fprintf(f, "%i", m->netif[i]); + } + + fputc('\n', f); + } + r = fflush_and_check(f); if (r < 0) goto finish; @@ -200,7 +216,7 @@ finish: if (temp_path) unlink(temp_path); - log_error("Failed to save machine data %s: %s", m->state_file, strerror(-r)); + log_error_errno(r, "Failed to save machine data %s: %m", m->state_file); } return r; @@ -222,7 +238,7 @@ static void machine_unlink(Machine *m) { } int machine_load(Machine *m) { - _cleanup_free_ char *realtime = NULL, *monotonic = NULL, *id = NULL, *leader = NULL, *class = NULL; + _cleanup_free_ char *realtime = NULL, *monotonic = NULL, *id = NULL, *leader = NULL, *class = NULL, *netif = NULL; int r; assert(m); @@ -237,13 +253,13 @@ int machine_load(Machine *m) { "CLASS", &class, "REALTIME", &realtime, "MONOTONIC", &monotonic, + "NETIF", &netif, NULL); if (r < 0) { if (r == -ENOENT) return 0; - log_error("Failed to read %s: %s", m->state_file, strerror(-r)); - return r; + return log_error_errno(r, "Failed to read %s: %m", m->state_file); } if (id) @@ -272,6 +288,35 @@ int machine_load(Machine *m) { m->timestamp.monotonic = l; } + if (netif) { + size_t l, allocated = 0, nr = 0; + const char *word, *state; + int *ni = NULL; + + FOREACH_WORD(word, l, netif, state) { + char buf[l+1]; + int ifi; + + *(char*) (mempcpy(buf, word, l)) = 0; + + if (safe_atoi(buf, &ifi) < 0) + continue; + if (ifi <= 0) + continue; + + if (!GREEDY_REALLOC(ni, allocated, nr+1)) { + free(ni); + return log_oom(); + } + + ni[nr++] = ifi; + } + + free(m->netif); + m->netif = ni; + m->n_netif = nr; + } + return r; } @@ -331,10 +376,10 @@ int machine_start(Machine *m, sd_bus_message *properties, sd_bus_error *error) { return r; log_struct(LOG_INFO, - MESSAGE_ID(SD_MESSAGE_MACHINE_START), + LOG_MESSAGE_ID(SD_MESSAGE_MACHINE_START), "NAME=%s", m->name, "LEADER="PID_FMT, m->leader, - "MESSAGE=New machine %s.", m->name, + LOG_MESSAGE("New machine %s.", m->name), NULL); if (!dual_timestamp_is_set(&m->timestamp)) @@ -360,16 +405,18 @@ static int machine_stop_scope(Machine *m) { if (!m->unit) return 0; - 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; + if (!m->registered) { + 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; + } } free(m->scope_job); m->scope_job = job; - return r; + return 0; } int machine_stop(Machine *m) { @@ -378,10 +425,10 @@ int machine_stop(Machine *m) { if (m->started) log_struct(LOG_INFO, - MESSAGE_ID(SD_MESSAGE_MACHINE_STOP), + LOG_MESSAGE_ID(SD_MESSAGE_MACHINE_STOP), "NAME=%s", m->name, "LEADER="PID_FMT, m->leader, - "MESSAGE=Machine %s terminated.", m->name, + LOG_MESSAGE("Machine %s terminated.", m->name), NULL); /* Kill cgroup */ @@ -445,6 +492,8 @@ int machine_kill(Machine *m, KillWho who, int signo) { if (kill(m->leader, signo) < 0) return -errno; + + return 0; } /* Otherwise make PID 1 do it for us, for the entire cgroup */