msg_file_tree_disconnect.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package smb
  2. import (
  3. "errors"
  4. )
  5. func init() {
  6. commandRequestMap[CommandTreeDisconnect] = func() DataI {
  7. return &TreeDisconnectRequest{}
  8. }
  9. }
  10. // CommandTreeDisconnect
  11. type TreeDisconnectRequest struct {
  12. Header
  13. StructureSize uint16
  14. Reserved uint16
  15. }
  16. type TreeDisconnectResponse struct {
  17. Header
  18. StructureSize uint16
  19. Reserved uint16
  20. }
  21. func (data *TreeDisconnectRequest) ServerAction(ctx *DataCtx) (interface{}, error) {
  22. data.Header.Flags = SMB2_FLAGS_RESPONSE
  23. resp := TreeDisconnectResponse{Header: data.Header}
  24. return &resp, nil
  25. }
  26. func (s *SessionC) NewTreeDisconnectReq(treeId uint32) (TreeDisconnectRequest, error) {
  27. header := s.newHeader(CommandTreeDisconnect)
  28. header.TreeID = treeId
  29. return TreeDisconnectRequest{
  30. Header: header,
  31. StructureSize: 4,
  32. Reserved: 0,
  33. }, nil
  34. }
  35. func NewTreeDisconnectRes() (TreeDisconnectResponse, error) {
  36. return TreeDisconnectResponse{}, nil
  37. }
  38. func (s *SessionC) TreeDisconnect(name string) error {
  39. var (
  40. treeid uint32
  41. pathFound bool
  42. )
  43. for k, v := range s.trees {
  44. if k == name {
  45. treeid = v
  46. pathFound = true
  47. break
  48. }
  49. }
  50. if !pathFound {
  51. err := errors.New("Unable to find tree path for disconnect")
  52. s.Debug("", err)
  53. return err
  54. }
  55. s.Debug("Sending TreeDisconnect request ["+name+"]", nil)
  56. req, err := s.NewTreeDisconnectReq(treeid)
  57. var res TreeDisconnectResponse
  58. if err = s.RPC(req, &res); err != nil {
  59. return err
  60. }
  61. if res.Header.Status != StatusOk {
  62. return errors.New("Failed to disconnect from tree: " + StatusMap[res.Header.Status])
  63. }
  64. delete(s.trees, name)
  65. s.Debug("TreeDisconnect completed ["+name+"]", nil)
  66. return nil
  67. }