X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Frandom-seed%2Frandom-seed.c;h=ce1bd195d230a96ac9d960185159d42d04f88941;hb=84dd59b51c0db34f0334e90a5da2a45abcc9a52a;hp=4776c071caca966ccc027f7a5a01d4816fb026b4;hpb=ce1794704574e73efb813c6ed113554870f2e747;p=elogind.git diff --git a/src/random-seed/random-seed.c b/src/random-seed/random-seed.c index 4776c071c..ce1bd195d 100644 --- a/src/random-seed/random-seed.c +++ b/src/random-seed/random-seed.c @@ -38,6 +38,7 @@ int main(int argc, char *argv[]) { ssize_t k; int r; FILE *f; + bool cleanup_seed_file = true; if (argc != 2) { log_error("This program requires one argument."); @@ -72,7 +73,7 @@ int main(int argc, char *argv[]) { r = mkdir_parents_label(RANDOM_SEED, 0755); if (r < 0) { - log_error("Failed to create parent directory of " RANDOM_SEED ": %s", strerror(-r)); + log_error_errno(r, "Failed to create directory " RANDOM_SEED_DIR ": %m"); goto finish; } @@ -86,17 +87,18 @@ int main(int argc, char *argv[]) { if (seed_fd < 0) { seed_fd = open(RANDOM_SEED, O_RDONLY|O_CLOEXEC|O_NOCTTY); if (seed_fd < 0) { - log_error("Failed to open random seed: %m"); + log_error_errno(errno, "Failed to open " RANDOM_SEED ": %m"); r = -errno; goto finish; } + cleanup_seed_file = false; } random_fd = open("/dev/urandom", O_RDWR|O_CLOEXEC|O_NOCTTY, 0600); if (random_fd < 0) { random_fd = open("/dev/urandom", O_WRONLY|O_CLOEXEC|O_NOCTTY, 0600); if (random_fd < 0) { - log_error("Failed to open /dev/urandom: %m"); + log_error_errno(errno, "Failed to open /dev/urandom: %m"); r = -errno; goto finish; } @@ -106,33 +108,30 @@ int main(int argc, char *argv[]) { if (k <= 0) { if (r != 0) - log_error("Failed to read seed file: %m"); + log_error_errno(errno, "Failed to read seed from " RANDOM_SEED ": %m"); r = k == 0 ? -EIO : (int) k; } else { lseek(seed_fd, 0, SEEK_SET); - k = loop_write(random_fd, buf, (size_t) k, false); - if (k <= 0) { - log_error("Failed to write seed to /dev/urandom: %s", r < 0 ? strerror(-r) : "short write"); - - r = k == 0 ? -EIO : (int) k; - } + r = loop_write(random_fd, buf, (size_t) k, false); + if (r < 0) + log_error_errno(r, "Failed to write seed to /dev/urandom: %m"); } } else if (streq(argv[1], "save")) { seed_fd = open(RANDOM_SEED, O_WRONLY|O_CLOEXEC|O_NOCTTY|O_CREAT, 0600); if (seed_fd < 0) { - log_error("Failed to open random seed: %m"); + log_error_errno(errno, "Failed to open " RANDOM_SEED ": %m"); r = -errno; goto finish; } random_fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC|O_NOCTTY); if (random_fd < 0) { - log_error("Failed to open /dev/urandom: %m"); + log_error_errno(errno, "Failed to open /dev/urandom: %m"); r = -errno; goto finish; } @@ -143,21 +142,21 @@ int main(int argc, char *argv[]) { goto finish; } - /* This is just a safety measure. Given that we are root and - * most likely created the file ourselves the mode and owner - * should be correct anyway. */ - fchmod(seed_fd, 0600); - fchown(seed_fd, 0, 0); + if (cleanup_seed_file) { + /* This is just a safety measure. Given that we are root and + * most likely created the file ourselves the mode and owner + * should be correct anyway. */ + fchmod(seed_fd, 0600); + fchown(seed_fd, 0, 0); - k = loop_read(random_fd, buf, buf_size, false); - if (k <= 0) { - log_error("Failed to read new seed from /dev/urandom: %s", r < 0 ? strerror(-r) : "EOF"); - r = k == 0 ? -EIO : (int) k; - } else { - r = loop_write(seed_fd, buf, (size_t) k, false); - if (r <= 0) { - log_error("Failed to write new random seed file: %s", r < 0 ? strerror(-r) : "short write"); + k = loop_read(random_fd, buf, buf_size, false); + if (k <= 0) { + log_error("Failed to read new seed from /dev/urandom: %s", r < 0 ? strerror(-r) : "EOF"); r = k == 0 ? -EIO : (int) k; + } else { + r = loop_write(seed_fd, buf, (size_t) k, false); + if (r < 0) + log_error_errno(r, "Failed to write new random seed file: %m"); } }