if (out == NULL) out = fopen(file,"wb"); if (out == NULL) goto err;
int RAND_write_file(const char *file)	{	unsigned char buf[BUFSIZE];	int i,ret=0,err=0;	FILE *out = NULL;	int n;#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)		{#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 /* the open(...) reportedly fails on Win98 w/ VisualC */			out = fopen(file,"wb");#else		out = fopen(file,"wb");#endif		}	if (out == NULL)		{		err=1;		goto err;		}#ifndef NO_CHMOD	chmod(file,0600);#endif	n=RAND_DATA;	for (;;)		{		i=(n > BUFSIZE)?BUFSIZE:n;		n-=BUFSIZE;		if (RAND_bytes(buf,i) <= 0)			err=1;		i=fwrite(buf,1,i,out);		if (i <= 0)			{			ret=0;			break;			}		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 */	{	char *tmpf;	tmpf = Malloc(strlen(file) + 4);  /* to add ";-1" and a nul */	if (tmpf)		{		strcpy(tmpf, file);		strcat(tmpf, ";-1");		while(delete(tmpf) == 0)			;		rename(file,";1"); /* Make sure it's version 1, or we				      will reach the limit (32767) at				      some point... */		}	}#endif#endif	fclose(out);	memset(buf,0,BUFSIZE);err:	return(err ? -1 : ret);	}