tailscale: Add tailssh server
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
//go:build linux || android || (darwin && !ios)
|
||||
|
||||
package libbox
|
||||
|
||||
import (
|
||||
"github.com/sagernet/sing-box/protocol/tailscale/tailssh"
|
||||
"github.com/sagernet/sing/common"
|
||||
)
|
||||
|
||||
type nativeShellSession struct {
|
||||
shell *tailssh.Shell
|
||||
}
|
||||
|
||||
func OpenNativeShellSession(
|
||||
shell, cwd string,
|
||||
args, environ StringIterator,
|
||||
term string,
|
||||
rows, cols, uid, gid int32,
|
||||
groups Int32Iterator,
|
||||
) (ShellSession, error) {
|
||||
sh, err := tailssh.OpenPtyShell(
|
||||
shell,
|
||||
iteratorToArray[string](args),
|
||||
iteratorToArray[string](environ),
|
||||
cwd,
|
||||
int(uid), int(gid),
|
||||
common.Map(iteratorToArray[int32](groups), func(g int32) int { return int(g) }),
|
||||
uint16(rows), uint16(cols),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &nativeShellSession{shell: sh}, nil
|
||||
}
|
||||
|
||||
func OpenNativePipeSession(
|
||||
shell, cwd string,
|
||||
args, environ StringIterator,
|
||||
uid, gid int32,
|
||||
groups Int32Iterator,
|
||||
) (ShellSession, error) {
|
||||
sh, err := tailssh.OpenSocketpairShell(
|
||||
shell,
|
||||
iteratorToArray[string](args),
|
||||
iteratorToArray[string](environ),
|
||||
cwd,
|
||||
int(uid), int(gid),
|
||||
common.Map(iteratorToArray[int32](groups), func(g int32) int { return int(g) }),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &nativeShellSession{shell: sh}, nil
|
||||
}
|
||||
|
||||
func (s *nativeShellSession) MasterFD() int32 {
|
||||
return int32(s.shell.MasterFD())
|
||||
}
|
||||
|
||||
func (s *nativeShellSession) Resize(rows, cols int32) error {
|
||||
return s.shell.Resize(uint16(rows), uint16(cols))
|
||||
}
|
||||
|
||||
func (s *nativeShellSession) Signal(sig int32) error {
|
||||
return s.shell.Signal(int(sig))
|
||||
}
|
||||
|
||||
func (s *nativeShellSession) WaitExit() (int32, error) {
|
||||
status, err := s.shell.Wait()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return int32(status), nil
|
||||
}
|
||||
|
||||
func (s *nativeShellSession) Close() error {
|
||||
return s.shell.Close()
|
||||
}
|
||||
Reference in New Issue
Block a user