| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 | 
							- package libbox
 
- import (
 
- 	"encoding/binary"
 
- 	"net"
 
- 	"github.com/sagernet/sing-box/outbound"
 
- 	E "github.com/sagernet/sing/common/exceptions"
 
- 	"github.com/sagernet/sing/common/varbin"
 
- )
 
- func (c *CommandClient) SelectOutbound(groupTag string, outboundTag string) error {
 
- 	conn, err := c.directConnect()
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	defer conn.Close()
 
- 	err = binary.Write(conn, binary.BigEndian, uint8(CommandSelectOutbound))
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	err = varbin.Write(conn, binary.BigEndian, groupTag)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	err = varbin.Write(conn, binary.BigEndian, outboundTag)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	return readError(conn)
 
- }
 
- func (s *CommandServer) handleSelectOutbound(conn net.Conn) error {
 
- 	groupTag, err := varbin.ReadValue[string](conn, binary.BigEndian)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	outboundTag, err := varbin.ReadValue[string](conn, binary.BigEndian)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	service := s.service
 
- 	if service == nil {
 
- 		return writeError(conn, E.New("service not ready"))
 
- 	}
 
- 	outboundGroup, isLoaded := service.instance.Router().Outbound(groupTag)
 
- 	if !isLoaded {
 
- 		return writeError(conn, E.New("selector not found: ", groupTag))
 
- 	}
 
- 	selector, isSelector := outboundGroup.(*outbound.Selector)
 
- 	if !isSelector {
 
- 		return writeError(conn, E.New("outbound is not a selector: ", groupTag))
 
- 	}
 
- 	if !selector.SelectOutbound(outboundTag) {
 
- 		return writeError(conn, E.New("outbound not found in selector: ", outboundTag))
 
- 	}
 
- 	return writeError(conn, nil)
 
- }
 
 
  |