| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package smb
- import (
- "errors"
- )
- func init() {
- commandRequestMap[CommandTreeDisconnect] = func() DataI {
- return &TreeDisconnectRequest{}
- }
- }
- // CommandTreeDisconnect
- type TreeDisconnectRequest struct {
- Header
- StructureSize uint16
- Reserved uint16
- }
- type TreeDisconnectResponse struct {
- Header
- StructureSize uint16
- Reserved uint16
- }
- func (data *TreeDisconnectRequest) ServerAction(ctx *DataCtx) (interface{}, error) {
- data.Header.Flags = SMB2_FLAGS_RESPONSE
- resp := TreeDisconnectResponse{Header: data.Header}
- return &resp, nil
- }
- func (s *SessionC) NewTreeDisconnectReq(treeId uint32) (TreeDisconnectRequest, error) {
- header := s.newHeader(CommandTreeDisconnect)
- header.TreeID = treeId
- return TreeDisconnectRequest{
- Header: header,
- StructureSize: 4,
- Reserved: 0,
- }, nil
- }
- func NewTreeDisconnectRes() (TreeDisconnectResponse, error) {
- return TreeDisconnectResponse{}, nil
- }
- func (s *SessionC) TreeDisconnect(name string) error {
- var (
- treeid uint32
- pathFound bool
- )
- for k, v := range s.trees {
- if k == name {
- treeid = v
- pathFound = true
- break
- }
- }
- if !pathFound {
- err := errors.New("Unable to find tree path for disconnect")
- s.Debug("", err)
- return err
- }
- s.Debug("Sending TreeDisconnect request ["+name+"]", nil)
- req, err := s.NewTreeDisconnectReq(treeid)
- var res TreeDisconnectResponse
- if err = s.RPC(req, &res); err != nil {
- return err
- }
- if res.Header.Status != StatusOk {
- return errors.New("Failed to disconnect from tree: " + StatusMap[res.Header.Status])
- }
- delete(s.trees, name)
- s.Debug("TreeDisconnect completed ["+name+"]", nil)
- return nil
- }
|