Under VMS, ftruncate should be available
[openssl.git] / crypto / rand / randfile.c
index cf98643d3c778b5a5a1a6f043ab5d01a204c27fe..375c339e5c3c6b5776f44afafa5e0a09754cd9ab 100644 (file)
@@ -92,7 +92,6 @@ int RAND_load_file(const char *file, long bytes)
        i=stat(file,&sb);
        /* If the state fails, put some crap in anyway */
        RAND_add(&sb,sizeof(sb),0);
-       ret+=sizeof(sb);
        if (i < 0) return(0);
        if (bytes <= 0) return(ret);
 
@@ -122,27 +121,23 @@ int RAND_write_file(const char *file)
        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.  This
-          should be completely harmless on system that have no file
-          versions.                                    -- Richard Levitte */
+          one, and create file only if it doesn't already exist. */
        out=fopen(file,"rb+");
-       if (out == NULL
-#ifdef ENOENT
-           && errno == ENOENT
+       if (out == NULL && errno != ENOENT)
+               goto err;
 #endif
-          )
+
+       if (out == NULL)
                {
-               errno = 0;
 #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)
+               int fd = open(file, O_CREAT | O_EXCL, 0600);
+               if (fd != -1)
                        out = fdopen(fd, "wb");
-               }
 #else          
                out=fopen(file,"wb");
 #endif
@@ -167,8 +162,13 @@ 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 (ret > 0)
                ftruncate(fileno(out), ret);
+#endif
+
        fclose(out);
        memset(buf,0,BUFSIZE);
 err: