Browse Source

UPD: Add sharing mode when opening and checking for file access for configuration files. Share only Reading but not Writing.

cobines 13 years ago
parent
commit
4f54af268c

+ 15 - 7
components/doublecmd/dcclassesutf8.pas

@@ -173,7 +173,7 @@ begin
   try
   try
     if mbFileExists(FileName) then
     if mbFileExists(FileName) then
       begin
       begin
-        fsFileStream:= TFileStreamEx.Create(FileName, fmOpenWrite or fmShareDenyNone);
+        fsFileStream:= TFileStreamEx.Create(FileName, fmOpenWrite or fmShareDenyWrite);
         fsFileStream.Position:= 0;
         fsFileStream.Position:= 0;
         fsFileStream.Size:= 0;
         fsFileStream.Size:= 0;
       end
       end
@@ -200,21 +200,29 @@ end;
 
 
 constructor TIniFileEx.Create(const AFileName: String; Mode: Word);
 constructor TIniFileEx.Create(const AFileName: String; Mode: Word);
 begin
 begin
-  FReadOnly := Mode = fmOpenRead;
+  FReadOnly := ((Mode and $03) = fmOpenRead);
+
   if mbFileExists(AFileName) then
   if mbFileExists(AFileName) then
-    FIniFileStream:= TFileStreamEx.Create(AFileName, Mode or fmShareDenyNone)
+  begin
+    if (Mode and $F0) = 0 then
+      Mode := Mode or fmShareDenyWrite;
+  end
   else
   else
-    FIniFileStream:= TFileStreamEx.Create(AFileName, fmCreate);
+  begin
+    Mode := fmCreate;
+  end;
+
+  FIniFileStream:= TFileStreamEx.Create(AFileName, Mode);
   inherited Create(FIniFileStream);
   inherited Create(FIniFileStream);
   FileName:= AFileName;
   FileName:= AFileName;
 end;
 end;
 
 
 constructor TIniFileEx.Create(const AFileName: string; AEscapeLineFeeds: Boolean);
 constructor TIniFileEx.Create(const AFileName: string; AEscapeLineFeeds: Boolean);
 begin
 begin
-  if mbFileAccess(AFileName, fmOpenReadWrite) then
-    Create(AFileName, fmOpenReadWrite)
+  if mbFileAccess(AFileName, fmOpenReadWrite or fmShareDenyWrite) then
+    Create(AFileName, fmOpenReadWrite or fmShareDenyWrite)
   else
   else
-    Create(AFileName, fmOpenRead);
+    Create(AFileName, fmOpenRead or fmShareDenyNone);
 end;
 end;
 
 
 procedure TIniFileEx.UpdateFile;
 procedure TIniFileEx.UpdateFile;

+ 7 - 6
components/doublecmd/dcosutils.pas

@@ -116,7 +116,7 @@ procedure UnMapFile(var FileMapRec : TFileMapRec);
 function ConsoleToUTF8(const Str: AnsiString): UTF8String;
 function ConsoleToUTF8(const Str: AnsiString): UTF8String;
 
 
 { File handling functions}
 { File handling functions}
-function mbFileOpen(const FileName: UTF8String; Mode: Longint): System.THandle;
+function mbFileOpen(const FileName: UTF8String; Mode: Word): System.THandle;
 function mbFileCreate(const FileName: UTF8String): System.THandle; overload;
 function mbFileCreate(const FileName: UTF8String): System.THandle; overload;
 function mbFileCreate(const FileName: UTF8String; ShareMode: Longint): System.THandle; overload;
 function mbFileCreate(const FileName: UTF8String; ShareMode: Longint): System.THandle; overload;
 function mbFileCreate(const FileName: UTF8String; ShareMode: Longint; Rights: Longint): System.THandle; overload;
 function mbFileCreate(const FileName: UTF8String; ShareMode: Longint; Rights: Longint): System.THandle; overload;
@@ -138,7 +138,7 @@ function mbFileSetTime(const FileName: UTF8String;
    because there may still exist a directory or link by that name.
    because there may still exist a directory or link by that name.
 }
 }
 function mbFileExists(const FileName: UTF8String): Boolean;
 function mbFileExists(const FileName: UTF8String): Boolean;
-function mbFileAccess(const FileName: UTF8String; Mode: Integer): Boolean;
+function mbFileAccess(const FileName: UTF8String; Mode: Word): Boolean;
 function mbFileGetAttr(const FileName: UTF8String): TFileAttrs;
 function mbFileGetAttr(const FileName: UTF8String): TFileAttrs;
 function mbFileSetAttr (const FileName: UTF8String; Attr: TFileAttrs) : LongInt;
 function mbFileSetAttr (const FileName: UTF8String; Attr: TFileAttrs) : LongInt;
 {en
 {en
@@ -613,7 +613,7 @@ begin
   {$ENDIF}
   {$ENDIF}
 end;
 end;
 
 
-function mbFileOpen(const FileName: UTF8String; Mode: Longint): System.THandle;
+function mbFileOpen(const FileName: UTF8String; Mode: Word): System.THandle;
 {$IFDEF MSWINDOWS}
 {$IFDEF MSWINDOWS}
 begin
 begin
   Result:= CreateFileW(PWideChar(UTF8Decode(FileName)), AccessModes[Mode and 3],
   Result:= CreateFileW(PWideChar(UTF8Decode(FileName)), AccessModes[Mode and 3],
@@ -820,7 +820,7 @@ begin
 end;
 end;
 {$ENDIF}
 {$ENDIF}
 
 
-function mbFileAccess(const FileName: UTF8String; Mode: Integer): Boolean;
+function mbFileAccess(const FileName: UTF8String; Mode: Word): Boolean;
 {$IFDEF MSWINDOWS}
 {$IFDEF MSWINDOWS}
 const
 const
   AccessMode: array[0..2] of DWORD  = (
   AccessMode: array[0..2] of DWORD  = (
@@ -835,8 +835,9 @@ var
 begin
 begin
   wFileName:= UTF8Decode(FileName);
   wFileName:= UTF8Decode(FileName);
   dwDesiredAccess := AccessMode[Mode and 3];
   dwDesiredAccess := AccessMode[Mode and 3];
-  if dwDesiredAccess = GENERIC_READ then
-    dwShareMode := FILE_SHARE_READ;
+  if Mode = fmOpenRead then // If checking Read mode no sharing mode given
+    Mode := Mode or fmShareDenyNone;
+  dwShareMode := ShareModes[(Mode and $F0) shr 4];
   hFile:= CreateFileW(PWChar(wFileName), dwDesiredAccess, dwShareMode,
   hFile:= CreateFileW(PWChar(wFileName), dwDesiredAccess, dwShareMode,
                       nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
                       nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
   Result := hFile <> INVALID_HANDLE_VALUE;
   Result := hFile <> INVALID_HANDLE_VALUE;

+ 2 - 2
components/doublecmd/dcxmlconfig.pas

@@ -545,7 +545,7 @@ begin
 
 
   if not mbFileExists(FileName) then
   if not mbFileExists(FileName) then
     raise EFileNotFound.Create('');
     raise EFileNotFound.Create('');
-  if not mbFileAccess(FileName, fmOpenRead) then
+  if not mbFileAccess(FileName, fmOpenRead or fmShareDenyWrite) then
     raise EFOpenError.Create(SysErrorMessage(GetLastOSError));
     raise EFOpenError.Create(SysErrorMessage(GetLastOSError));
 
 
   ReadFromFile(FileName);
   ReadFromFile(FileName);
@@ -580,7 +580,7 @@ begin
     Exit;
     Exit;
 
 
   // Write to temporary file and if successfully written rename to proper name.
   // Write to temporary file and if successfully written rename to proper name.
-  if (not mbFileExists(FileName)) or mbFileAccess(FileName, fmOpenWrite) then
+  if (not mbFileExists(FileName)) or mbFileAccess(FileName, fmOpenWrite or fmShareDenyWrite) then
   begin
   begin
     sTmpConfigFileName := GetTempName(FileName);
     sTmpConfigFileName := GetTempName(FileName);
     try
     try

+ 1 - 1
src/fmain.pas

@@ -1242,7 +1242,7 @@ begin
 
 
   if gSaveCmdLineHistory then
   if gSaveCmdLineHistory then
     begin
     begin
-      if mbFileAccess(gpCfgDir + cHistoryFile, fmOpenWrite) then
+      if mbFileAccess(gpCfgDir + cHistoryFile, fmOpenWrite or fmShareDenyWrite) then
       begin
       begin
         try
         try
           slCommandHistory:= TStringListEx.Create;
           slCommandHistory:= TStringListEx.Create;

+ 3 - 3
src/ucryptproc.pas

@@ -223,10 +223,10 @@ var
 begin
 begin
   AFileName := gpCfgDir + 'pwd.ini';
   AFileName := gpCfgDir + 'pwd.ini';
   try
   try
-    if mbFileAccess(AFileName, fmOpenReadWrite) then
-      Mode := fmOpenReadWrite
+    if mbFileAccess(AFileName, fmOpenReadWrite or fmShareDenyWrite) then
+      Mode := fmOpenReadWrite or fmShareDenyWrite
     else
     else
-      Mode := fmOpenRead;
+      Mode := fmOpenRead or fmShareDenyWrite;
     PasswordStore:= TPasswordStore.Create(AFileName, Mode);
     PasswordStore:= TPasswordStore.Create(AFileName, Mode);
   except
   except
     DCDebug('Can not create secure password store!');
     DCDebug('Can not create secure password store!');

+ 1 - 1
src/uexceptions.pas

@@ -70,7 +70,7 @@ var
   f: System.Text;
   f: System.Text;
 begin
 begin
   if (aFileName <> EmptyStr) and not mbDirectoryExists(aFileName) and
   if (aFileName <> EmptyStr) and not mbDirectoryExists(aFileName) and
-     mbFileAccess(aFileName, fmOpenWrite) then
+     mbFileAccess(aFileName, fmOpenWrite or fmShareDenyNone) then
   begin
   begin
     AssignFile(f, aFileName);
     AssignFile(f, aFileName);
     if not mbFileExists(aFileName) then
     if not mbFileExists(aFileName) then

+ 11 - 11
src/uglobs.pas

@@ -1063,7 +1063,7 @@ begin
   begin
   begin
     gConfig := TXmlConfig.Create(gpGlobalCfgDir + 'doublecmd.xml');
     gConfig := TXmlConfig.Create(gpGlobalCfgDir + 'doublecmd.xml');
     gUseConfigInProgramDir := True;
     gUseConfigInProgramDir := True;
-    if mbFileAccess(gpGlobalCfgDir + 'doublecmd.xml', fmOpenRead) then
+    if mbFileAccess(gpGlobalCfgDir + 'doublecmd.xml', fmOpenRead or fmShareDenyWrite) then
     begin
     begin
       LoadConfigCheckErrors(@LoadGlobalConfig, gpGlobalCfgDir + 'doublecmd.xml', ErrorMessage);
       LoadConfigCheckErrors(@LoadGlobalConfig, gpGlobalCfgDir + 'doublecmd.xml', ErrorMessage);
       gUseConfigInProgramDir := gConfig.GetValue(gConfig.RootNode, 'Configuration/UseConfigInProgramDir', False);
       gUseConfigInProgramDir := gConfig.GetValue(gConfig.RootNode, 'Configuration/UseConfigInProgramDir', False);
@@ -1094,7 +1094,7 @@ begin
   begin
   begin
     gConfig := TXmlConfig.Create(gpCfgDir + 'doublecmd.xml');
     gConfig := TXmlConfig.Create(gpCfgDir + 'doublecmd.xml');
     gUseConfigInProgramDir := False;
     gUseConfigInProgramDir := False;
-    if mbFileAccess(gpCfgDir + 'doublecmd.xml', fmOpenRead) then
+    if mbFileAccess(gpCfgDir + 'doublecmd.xml', fmOpenRead or fmShareDenyWrite) then
     begin
     begin
       LoadConfigCheckErrors(@LoadGlobalConfig, gpCfgDir + 'doublecmd.xml', ErrorMessage);
       LoadConfigCheckErrors(@LoadGlobalConfig, gpCfgDir + 'doublecmd.xml', ErrorMessage);
     end
     end
@@ -1114,18 +1114,18 @@ begin
     // Open INI config if present.
     // Open INI config if present.
 
 
     // Check global directory for INI config.
     // Check global directory for INI config.
-    if not Assigned(gIni) and mbFileAccess(gpGlobalCfgDir + 'doublecmd.ini', fmOpenRead) then
+    if not Assigned(gIni) and mbFileAccess(gpGlobalCfgDir + 'doublecmd.ini', fmOpenRead or fmShareDenyWrite) then
     begin
     begin
-      gIni := TIniFileEx.Create(gpGlobalCfgDir + 'doublecmd.ini', fmOpenRead);
+      gIni := TIniFileEx.Create(gpGlobalCfgDir + 'doublecmd.ini', fmOpenRead or fmShareDenyWrite);
       gUseConfigInProgramDir := gIni.ReadBool('Configuration', 'UseIniInProgramDir', False);
       gUseConfigInProgramDir := gIni.ReadBool('Configuration', 'UseIniInProgramDir', False);
       if not gUseConfigInProgramDir then
       if not gUseConfigInProgramDir then
         FreeAndNil(gIni)
         FreeAndNil(gIni)
       else
       else
       begin
       begin
-	      if mbFileAccess(gpGlobalCfgDir + 'doublecmd.ini', fmOpenWrite) then
+	      if mbFileAccess(gpGlobalCfgDir + 'doublecmd.ini', fmOpenWrite or fmShareDenyWrite) then
 	      begin
 	      begin
 	        FreeAndNil(gIni);
 	        FreeAndNil(gIni);
-          gIni := TIniFileEx.Create(gpGlobalCfgDir + 'doublecmd.ini');
+          gIni := TIniFileEx.Create(gpGlobalCfgDir + 'doublecmd.ini', fmOpenWrite or fmShareDenyWrite);
 	      end
 	      end
         else
         else
 	      begin
 	      begin
@@ -1136,9 +1136,9 @@ begin
     end;
     end;
 
 
     // Check user directory for INI config.
     // Check user directory for INI config.
-    if not Assigned(gIni) and mbFileAccess(gpCfgDir + 'doublecmd.ini', fmOpenRead) then
+    if not Assigned(gIni) and mbFileAccess(gpCfgDir + 'doublecmd.ini', fmOpenRead or fmShareDenyWrite) then
     begin
     begin
-      gIni := TIniFileEx.Create(gpCfgDir + 'doublecmd.ini');
+      gIni := TIniFileEx.Create(gpCfgDir + 'doublecmd.ini', fmOpenRead or fmShareDenyWrite);
       gUseConfigInProgramDir := False;
       gUseConfigInProgramDir := False;
     end;
     end;
 
 
@@ -1166,7 +1166,7 @@ begin
     gpCfgDir := gpGlobalCfgDir;
     gpCfgDir := gpGlobalCfgDir;
 
 
   if mbFileExists(gpCfgDir + 'doublecmd.xml') and
   if mbFileExists(gpCfgDir + 'doublecmd.xml') and
-     (not mbFileAccess(gpCfgDir + 'doublecmd.xml', fmOpenWrite)) then
+     (not mbFileAccess(gpCfgDir + 'doublecmd.xml', fmOpenWrite or fmShareDenyWrite)) then
   begin
   begin
     DCDebug('Warning: Config file "' + gpCfgDir + 'doublecmd.xml' +
     DCDebug('Warning: Config file "' + gpCfgDir + 'doublecmd.xml' +
             '" is not accessible for writing. Configuration will not be saved.');
             '" is not accessible for writing. Configuration will not be saved.');
@@ -1267,7 +1267,7 @@ begin
         gIni := TIniFileEx.Create(gpCfgDir + 'doublecmd.ini');
         gIni := TIniFileEx.Create(gpCfgDir + 'doublecmd.ini');
       end;
       end;
 
 
-      if mbFileAccess(gpGlobalCfgDir + 'doublecmd.xml', fmOpenWrite) then
+      if mbFileAccess(gpGlobalCfgDir + 'doublecmd.xml', fmOpenWrite or fmShareDenyWrite) then
       begin
       begin
         TmpConfig := TXmlConfig.Create(gpGlobalCfgDir + 'doublecmd.xml', True);
         TmpConfig := TXmlConfig.Create(gpGlobalCfgDir + 'doublecmd.xml', True);
         try
         try
@@ -1281,7 +1281,7 @@ begin
       gConfig.FileName := gpCfgDir + 'doublecmd.xml';
       gConfig.FileName := gpCfgDir + 'doublecmd.xml';
     end;
     end;
 
 
-  if mbFileAccess(gpCfgDir, fmOpenWrite) then
+  if mbFileAccess(gpCfgDir, fmOpenWrite or fmShareDenyNone) then
   begin
   begin
     gExts.SaveToFile(gpCfgDir + 'doublecmd.ext');
     gExts.SaveToFile(gpCfgDir + 'doublecmd.ext');