X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/c5e438ecf3f6d7b8caab10e43a452f3555149309..d6430b975d14ddbd53c40126fa9d00bea3c2d08b:/unix/uxstore.c diff --git a/unix/uxstore.c b/unix/uxstore.c index 9047988b..670c67b2 100644 --- a/unix/uxstore.c +++ b/unix/uxstore.c @@ -156,7 +156,7 @@ void enum_settings_finish(void *handle) } enum { - INDEX_DIR, INDEX_HOSTKEYS + INDEX_DIR, INDEX_HOSTKEYS, INDEX_RANDSEED }; static void make_filename(char *filename, int index) @@ -169,6 +169,7 @@ static void make_filename(char *filename, int index) strncpy(filename + len, index == INDEX_DIR ? "/.putty" : index == INDEX_HOSTKEYS ? "/.putty/sshhostkeys" : + index == INDEX_RANDSEED ? "/.putty/randomseed" : "/.putty/ERROR", FILENAME_MAX - len); filename[FILENAME_MAX-1] = '\0'; } @@ -297,10 +298,48 @@ void store_host_key(char *hostname, int port, char *keytype, char *key) void read_random_seed(noise_consumer_t consumer) { + int fd; + char fname[FILENAME_MAX]; + + make_filename(fname, INDEX_RANDSEED); + fd = open(fname, O_RDONLY); + if (fd) { + char buf[512]; + int ret; + while ( (ret = read(fd, buf, sizeof(buf))) > 0) + consumer(buf, ret); + close(fd); + } } void write_random_seed(void *data, int len) { + int fd; + char fname[FILENAME_MAX]; + + make_filename(fname, INDEX_RANDSEED); + /* + * Don't truncate the random seed file if it already exists; if + * something goes wrong half way through writing it, it would + * be better to leave the old data there than to leave it empty. + */ + fd = open(fname, O_CREAT | O_WRONLY, 0600); + if (fd < 0) { + char dir[FILENAME_MAX]; + + make_filename(dir, INDEX_DIR); + mkdir(dir, 0700); + fd = open(fname, O_CREAT | O_WRONLY, 0600); + } + + while (len > 0) { + int ret = write(fd, data, len); + if (ret <= 0) break; + len -= ret; + data = (char *)data + len; + } + + close(fd); } void cleanup_all(void)