Browse Source

Retry opening using read only mode for input file in CopyFile function, never generate an error

git-svn-id: trunk@29272 -
pierre 10 years ago
parent
commit
5240a309e0
1 changed files with 30 additions and 7 deletions
  1. 30 7
      tests/utils/dotest.pp

+ 30 - 7
tests/utils/dotest.pp

@@ -61,6 +61,7 @@ const
   DllExt : string = '.so';
   DllExt : string = '.so';
   DllPrefix: string = 'lib';
   DllPrefix: string = 'lib';
   DefaultTimeout=60;
   DefaultTimeout=60;
+  READ_ONLY = 0;
 
 
 var
 var
   Config : TConfig;
   Config : TConfig;
@@ -403,6 +404,8 @@ const
   bufsize = 16384;
   bufsize = 16384;
 var
 var
   f,g : file;
   f,g : file;
+  oldfilemode : longint;
+  st : string;
   addsize,
   addsize,
   i   : longint;
   i   : longint;
   buf : pointer;
   buf : pointer;
@@ -411,14 +414,7 @@ begin
    Verbose(V_Debug,'Appending '+fn1+' to '+fn2)
    Verbose(V_Debug,'Appending '+fn1+' to '+fn2)
   else
   else
    Verbose(V_Debug,'Copying '+fn1+' to '+fn2);
    Verbose(V_Debug,'Copying '+fn1+' to '+fn2);
-  assign(f,fn1);
   assign(g,fn2);
   assign(g,fn2);
-  {$I-}
-   reset(f,1);
-  {$I+}
-  addsize:=0;
-  if ioresult<>0 then
-   Verbose(V_Error,'Can''t open '+fn1);
   if append then
   if append then
    begin
    begin
      {$I-}
      {$I-}
@@ -437,6 +433,33 @@ begin
      if ioresult<>0 then
      if ioresult<>0 then
       Verbose(V_Error,'Can''t open '+fn2+' for output');
       Verbose(V_Error,'Can''t open '+fn2+' for output');
    end;
    end;
+  assign(f,fn1);
+  {$I-}
+   reset(f,1);
+  {$I+}
+  addsize:=0;
+  if ioresult<>0 then
+   begin
+     sleep(1000);
+     {$I-}
+      { Retry using read only file mode }
+      oldfilemode:=system.filemode;
+      system.filemode:=READ_ONLY;
+      reset(f,1);
+      filemode:=oldfilemode;
+     {$I+}
+      if ioresult<>0 then
+        begin
+          Verbose(V_Warning,'Can''t open '+fn1);
+          st:='Can''t open '+fn1;
+          i:=length(st);
+          // blocksize is larger than 255, so no check is needed
+          move(st[1],buf^,i);
+          blockwrite(g,buf^,i);
+          close(g);
+          exit;
+        end;
+   end;
   getmem(buf,bufsize);
   getmem(buf,bufsize);
   repeat
   repeat
     blockread(f,buf^,bufsize,i);
     blockread(f,buf^,bufsize,i);