As ftruncate is not availabe on all platforms, switch back to

opening the output file with "wb" to truncate it except on VMS
(where the file now keeps its original length because it is opened
with "rb+" -- does VMS have ftruncate?)
This commit is contained in:
Bodo Möller 2000-01-23 19:58:03 +00:00
parent fabce04122
commit e84c2d2679

View File

@ -121,27 +121,23 @@ int RAND_write_file(const char *file)
FILE *out = NULL; FILE *out = NULL;
int n; int n;
#ifdef VMS
/* Under VMS, fopen(file, "wb") will create a new version of the /* 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 same file. This is not good, so let's try updating an existing
one, and create file only if it doesn't already exist. This one, and create file only if it doesn't already exist. */
should be completely harmless on system that have no file
versions. -- Richard Levitte */
out=fopen(file,"rb+"); out=fopen(file,"rb+");
if (out == NULL if (out == NULL && errno != ENOENT)
#ifdef ENOENT goto err;
&& errno == ENOENT
#endif #endif
)
if (out == NULL)
{ {
errno = 0;
#if defined O_CREAT && defined O_EXCL #if defined O_CREAT && defined O_EXCL
/* chmod(..., 0600) is too late to protect the file, /* chmod(..., 0600) is too late to protect the file,
* permissions should be restrictive from the start */ * permissions should be restrictive from the start */
{
int fd = open(file, O_CREAT | O_EXCL, 0600); int fd = open(file, O_CREAT | O_EXCL, 0600);
if (fd != -1) if (fd != -1)
out = fdopen(fd, "wb"); out = fdopen(fd, "wb");
}
#else #else
out=fopen(file,"wb"); out=fopen(file,"wb");
#endif #endif
@ -166,8 +162,6 @@ int RAND_write_file(const char *file)
ret+=i; ret+=i;
if (n <= 0) break; if (n <= 0) break;
} }
if (ret > 0)
ftruncate(fileno(out), ret);
fclose(out); fclose(out);
memset(buf,0,BUFSIZE); memset(buf,0,BUFSIZE);
err: err: