X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fmachine-id-setup.c;h=0f97433804e5fa6d7cec6baa259956ec396f6988;hp=d584181bede517e0f0155d459255decd5a587d39;hb=64661ee70d5a10c6208a1cb66ecd8b158e2d8bc5;hpb=d4eb120a23e6a19a2886b517b64d5f260c5a4a21 diff --git a/src/machine-id-setup.c b/src/machine-id-setup.c index d584181be..0f9743380 100644 --- a/src/machine-id-setup.c +++ b/src/machine-id-setup.c @@ -35,6 +35,28 @@ #include "log.h" #include "virt.h" +static int shorten_uuid(char destination[36], const char *source) { + unsigned i, j; + + for (i = 0, j = 0; i < 36 && j < 32; i++) { + int t; + + t = unhexchar(source[i]); + if (t < 0) + continue; + + destination[j++] = hexchar(t); + } + + if (i == 36 && j == 32) { + destination[32] = '\n'; + destination[33] = 0; + return 0; + } + + return -EINVAL; +} + static int generate(char id[34]) { int fd, r; unsigned char *p; @@ -75,26 +97,57 @@ static int generate(char id[34]) { close_nointr_nofail(fd); if (k >= 36) { - unsigned i, j; + r = shorten_uuid(id, uuid); + if (r >= 0) { + log_info("Initializing machine ID from KVM UUID"); + return 0; + } + } + } + } - for (i = 0, j = 0; i < 36 && j < 32; i++) { - int t; + /* If that didn't work either, see if we are running in a + * container, and a machine ID was passed in via + * $container_uuid the way libvirt/LXC does it */ - t = unhexchar(uuid[i]); - if (t < 0) - continue; + r = detect_container(NULL); + if (r > 0) { + FILE *f; - id[j++] = hexchar(t); - } + f = fopen("/proc/1/environ", "re"); + if (f) { + bool done = false; - if (i == 36 && j == 32) { - id[32] = '\n'; - id[33] = 0; + do { + char line[LINE_MAX]; + unsigned i; - log_info("Initializing machine ID from KVM UUID"); - return 0; + for (i = 0; i < sizeof(line)-1; i++) { + int c; + + c = getc(f); + if (_unlikely_(c == EOF)) { + done = true; + break; + } else if (c == 0) + break; + + line[i] = c; } - } + line[i] = 0; + + if (startswith(line, "container_uuid=") && + strlen(line + 15) >= 36) { + r = shorten_uuid(id, line + 15); + if (r >= 0) { + log_info("Initializing machine ID from container UUID"); + return 0; + } + } + + } while (!done); + + fclose(f); } }