Under VMS, ftruncate should be available
[openssl.git] / crypto / rand / randfile.c
index 97c3ece53565bf353ae8407e8fc54e858799bb6e..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);
 
@@ -118,31 +117,27 @@ err:
 int RAND_write_file(const char *file)
        {
        unsigned char buf[BUFSIZE];
-       int i,ret=0;
+       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.  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
@@ -156,7 +151,8 @@ int RAND_write_file(const char *file)
                {
                i=(n > BUFSIZE)?BUFSIZE:n;
                n-=BUFSIZE;
-               RAND_bytes(buf,i);
+               if (RAND_bytes(buf,i) <= 0)
+                       err=1;
                i=fwrite(buf,1,i,out);
                if (i <= 0)
                        {
@@ -166,10 +162,17 @@ 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:
-       return(ret);
+       return(err ? -1 : ret);
        }
 
 char *RAND_file_name(char *buf, int size)