diff options
Diffstat (limited to 'crypto/rand/randfile.c')
| -rw-r--r-- | crypto/rand/randfile.c | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/crypto/rand/randfile.c b/crypto/rand/randfile.c index d01b9852e94..658a8d6b65f 100644 --- a/crypto/rand/randfile.c +++ b/crypto/rand/randfile.c @@ -133,20 +133,35 @@ int RAND_write_file(const char *file) int i,ret=0,err=0; FILE *out = NULL; int n; - -#if defined(O_CREAT) && !defined(WIN32) - /* For some reason Win32 can't write to files created this way */ - - /* chmod(..., 0600) is too late to protect the file, - * permissions should be restrictive from the start */ - int fd = open(file, O_CREAT, 0600); - if (fd != -1) - out = fdopen(fd, "wb"); + +#ifdef VMS + /* Under VMS, fopen(file, "wb") will create a new version of the + same file. This is not good, so let's try updating an existing + one, and create file only if it doesn't already exist. */ + /* At the same time, if we just update a file, we also need to + truncate it, and unfortunately, ftruncate() and truncate() do + not exist everywhere. All that remains is to delete old versions + of the random data file (done at the end). */ +#if 0 + out=fopen(file,"rb+"); + if (out == NULL && errno != ENOENT) + goto err; +#endif #endif + if (out == NULL) - out = fopen(file,"wb"); + { +#if defined O_CREAT && defined O_EXCL + /* chmod(..., 0600) is too late to protect the file, + * permissions should be restrictive from the start */ + int fd = open(file, O_CREAT | O_EXCL, 0600); + if (fd != -1) + out = fdopen(fd, "wb"); +#else + out=fopen(file,"wb"); +#endif + } if (out == NULL) goto err; - #ifndef NO_CHMOD chmod(file,0600); #endif @@ -165,8 +180,14 @@ int RAND_write_file(const char *file) } ret+=i; if (n <= 0) break; - } + } #ifdef VMS + /* We may have updated an existing file using mode "rb+", + * now remove any old extra bytes */ +#if 0 + if (ret > 0) + ftruncate(fileno(out), ret); +#else /* Try to delete older versions of the file, until there aren't any */ { @@ -184,7 +205,8 @@ int RAND_write_file(const char *file) some point... */ } } -#endif /* VMS */ +#endif +#endif fclose(out); memset(buf,0,BUFSIZE); |
