machine-id-setup.c revision 08e1fb68d78b4adf26cce8387fc428b9e370bcf4
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen/***
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen This file is part of systemd.
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen Copyright 2010 Lennart Poettering
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen systemd is free software; you can redistribute it and/or modify it
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen under the terms of the GNU Lesser General Public License as published by
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen the Free Software Foundation; either version 2.1 of the License, or
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen (at your option) any later version.
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen systemd is distributed in the hope that it will be useful, but
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen WITHOUT ANY WARRANTY; without even the implied warranty of
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen Lesser General Public License for more details.
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen You should have received a copy of the GNU Lesser General Public License
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen along with systemd; If not, see <http://www.gnu.org/licenses/>.
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen***/
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include <unistd.h>
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include <stdio.h>
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include <errno.h>
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include <string.h>
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include <stdlib.h>
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include <fcntl.h>
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include <sys/mount.h>
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
268200a84e420471f8a30824b4f3e371b601d089slive#include <systemd/sd-id128.h>
268200a84e420471f8a30824b4f3e371b601d089slive
268200a84e420471f8a30824b4f3e371b601d089slive#include "machine-id-setup.h"
268200a84e420471f8a30824b4f3e371b601d089slive#include "macro.h"
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include "util.h"
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include "mkdir.h"
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include "log.h"
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen#include "virt.h"
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowenstatic int shorten_uuid(char destination[36], const char *source) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen unsigned i, j;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen for (i = 0, j = 0; i < 36 && j < 32; i++) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen int t;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen t = unhexchar(source[i]);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (t < 0)
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen continue;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen destination[j++] = hexchar(t);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (i == 36 && j == 32) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen destination[32] = '\n';
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen destination[33] = 0;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen return 0;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen return -EINVAL;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen}
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowenstatic int generate(char id[34]) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen int fd, r;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen unsigned char *p;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen sd_id128_t buf;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen char *q;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen ssize_t k;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen const char *vm_id;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen assert(id);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen /* First, try reading the D-Bus machine id, unless it is a symlink */
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen fd = open("/var/lib/dbus/machine-id", O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (fd >= 0) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen k = loop_read(fd, id, 32, false);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen close_nointr_nofail(fd);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (k >= 32) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen id[32] = '\n';
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen id[33] = 0;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen log_info("Initializing machine ID from D-Bus machine ID.");
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen return 0;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen /* If that didn't work, see if we are running in qemu/kvm and a
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen * machine ID was passed in via -uuid on the qemu/kvm command
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen * line */
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen r = detect_vm(&vm_id);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (r > 0 && streq(vm_id, "kvm")) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen char uuid[37];
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen fd = open("/sys/class/dmi/id/product_uuid", O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (fd >= 0) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen k = loop_read(fd, uuid, 36, false);
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive close_nointr_nofail(fd);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (k >= 36) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen r = shorten_uuid(id, uuid);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (r >= 0) {
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive log_info("Initializing machine ID from KVM UUID");
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen return 0;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen /* If that didn't work either, see if we are running in a
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen * container, and a machine ID was passed in via
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen * $container_uuid the way libvirt/LXC does it */
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen r = detect_container(NULL);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (r > 0) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen FILE *f;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen f = fopen("/proc/1/environ", "re");
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (f) {
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive bool done = false;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen do {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen char line[LINE_MAX];
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen unsigned i;
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen for (i = 0; i < sizeof(line)-1; i++) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen int c;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive c = getc(f);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (_unlikely_(c == EOF)) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen done = true;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen break;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen } else if (c == 0)
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive break;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen line[i] = c;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen line[i] = 0;
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (startswith(line, "container_uuid=") &&
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen strlen(line + 15) >= 36) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen r = shorten_uuid(id, line + 15);
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive if (r >= 0) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen log_info("Initializing machine ID from container UUID");
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen return 0;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen } while (!done);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen fclose(f);
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive }
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive }
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive /* If that didn't work, generate a random machine id */
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive r = sd_id128_randomize(&buf);
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive if (r < 0) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen log_error("Failed to open /dev/urandom: %s", strerror(-r));
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive return r;
c31b0f4fe27c68b46a051eb0b48a485c7bc3a875slive }
c31b0f4fe27c68b46a051eb0b48a485c7bc3a875slive
c31b0f4fe27c68b46a051eb0b48a485c7bc3a875slive for (p = buf.bytes, q = id; p < buf.bytes + sizeof(buf); p++, q += 2) {
c31b0f4fe27c68b46a051eb0b48a485c7bc3a875slive q[0] = hexchar(*p >> 4);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen q[1] = hexchar(*p & 15);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen id[32] = '\n';
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen id[33] = 0;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen log_info("Initializing machine ID from random generator.");
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen return 0;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen}
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowenint machine_id_setup(void) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen int fd, r;
393f9c667e58b8cd6083ce03d5e03cc9f7b0dfaabnicholes bool writable;
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive struct stat st;
393f9c667e58b8cd6083ce03d5e03cc9f7b0dfaabnicholes char id[34]; /* 32 + \n + \0 */
393f9c667e58b8cd6083ce03d5e03cc9f7b0dfaabnicholes mode_t m;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen m = umask(0000);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen /* We create this 0444, to indicate that this isn't really
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen * something you should ever modify. Of course, since the file
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive * will be owned by root it doesn't matter much, but maybe
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive * people look. */
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen fd = open("/etc/machine-id", O_RDWR|O_CREAT|O_CLOEXEC|O_NOCTTY, 0444);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (fd >= 0)
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive writable = true;
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive else {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen fd = open("/etc/machine-id", O_RDONLY|O_CLOEXEC|O_NOCTTY);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (fd < 0) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen umask(m);
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive log_error("Cannot open /etc/machine-id: %m");
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive return -errno;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen writable = false;
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive }
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen umask(m);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (fstat(fd, &st) < 0) {
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive log_error("fstat() failed: %m");
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive r = -errno;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen goto finish;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive if (S_ISREG(st.st_mode)) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (loop_read(fd, id, 32, false) >= 32) {
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive r = 0;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen goto finish;
6ec3b97fc9c9f163cfaae67fc448eea3f887f34dslive }
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive }
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive /* Hmm, so, the id currently stored is not useful, then let's
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive * generate one */
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen r = generate(id);
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive if (r < 0)
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive goto finish;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive if (S_ISREG(st.st_mode) && writable) {
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive lseek(fd, 0, SEEK_SET);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive if (loop_write(fd, id, 33, false) == 33) {
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive r = 0;
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive goto finish;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive }
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen close_nointr_nofail(fd);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen fd = -1;
3a9b96be347a9900a5ed381d2d7dba0129685b38yoshiki
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive /* Hmm, we couldn't write it? So let's write it to
3a9b96be347a9900a5ed381d2d7dba0129685b38yoshiki * /run/machine-id as a replacement */
3a9b96be347a9900a5ed381d2d7dba0129685b38yoshiki
3a9b96be347a9900a5ed381d2d7dba0129685b38yoshiki m = umask(0022);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen r = write_one_line_file("/run/machine-id", id);
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive umask(m);
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (r < 0) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen log_error("Cannot write /run/machine-id: %s", strerror(-r));
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive unlink("/run/machine-id");
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive goto finish;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen }
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen /* And now, let's mount it over */
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive r = mount("/run/machine-id", "/etc/machine-id", "bind", MS_BIND|MS_RDONLY, NULL) < 0 ? -errno : 0;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen if (r < 0) {
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen unlink("/run/machine-id");
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen log_error("Failed to mount /etc/machine-id: %s", strerror(-r));
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen } else
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive log_info("Installed transient /etc/machine-id file.");
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
519e249ff843c8805d5ce2fdc299caacf7ad9e43slivefinish:
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive if (fd >= 0)
519e249ff843c8805d5ce2fdc299caacf7ad9e43slive close_nointr_nofail(fd);
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen return r;
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen}
57d0156f7bbd9ea3a72342cf9912aba61d118702rbowen