All matching opened files will now be closed during tree disconnect

This commit is contained in:
Tal Aloni 2017-03-04 14:10:16 +02:00
parent 2c1b59973b
commit cff82dd4b8
4 changed files with 36 additions and 11 deletions

View file

@ -57,10 +57,25 @@ namespace SMBLibrary.Server
return share; return share;
} }
public void RemoveConnectedTree(ushort treeID) public void DisconnectTree(ushort treeID)
{ {
ISMBShare share;
m_connectedTrees.TryGetValue(treeID, out share);
if (share != null)
{
List<ushort> fileIDList = new List<ushort>(m_openFiles.Keys);
foreach (ushort fileID in fileIDList)
{
OpenFileObject openFile = m_openFiles[fileID];
if (openFile.TreeID == treeID)
{
share.FileStore.CloseFile(openFile.Handle);
m_openFiles.Remove(fileID);
}
}
m_connectedTrees.Remove(treeID); m_connectedTrees.Remove(treeID);
} }
}
public bool IsTreeConnected(ushort treeID) public bool IsTreeConnected(ushort treeID)
{ {

View file

@ -79,14 +79,24 @@ namespace SMBLibrary.Server
} }
} }
public void RemoveConnectedTree(uint treeID) public void DisconnectTree(uint treeID)
{ {
ISMBShare share;
m_connectedTrees.TryGetValue(treeID, out share);
if (share != null)
{
List<ulong> fileIDList = new List<ulong>(m_openFiles.Keys);
foreach (ushort fileID in fileIDList)
{
OpenFileObject openFile = m_openFiles[fileID];
if (openFile.TreeID == treeID)
{
share.FileStore.CloseFile(openFile.Handle);
m_openFiles.Remove(fileID);
}
}
m_connectedTrees.Remove(treeID); m_connectedTrees.Remove(treeID);
} }
public void RemoveConnectedTrees()
{
m_connectedTrees.Clear();
} }
public bool IsTreeConnected(uint treeID) public bool IsTreeConnected(uint treeID)

View file

@ -98,7 +98,7 @@ namespace SMBLibrary.Server.SMB1
return new ErrorResponse(request.CommandName); return new ErrorResponse(request.CommandName);
} }
session.RemoveConnectedTree(header.TID); session.DisconnectTree(header.TID);
return new TreeDisconnectResponse(); return new TreeDisconnectResponse();
} }
} }

View file

@ -158,7 +158,7 @@ namespace SMBLibrary.Server
if (command is TreeDisconnectRequest) if (command is TreeDisconnectRequest)
{ {
session.RemoveConnectedTree(command.Header.TreeID); session.DisconnectTree(command.Header.TreeID);
return new TreeDisconnectResponse(); return new TreeDisconnectResponse();
} }
else if (command is CreateRequest) else if (command is CreateRequest)