mirror of
https://github.com/wavetermdev/waveterm.git
synced 2025-01-18 21:02:00 +01:00
remove PosAppend weirdness and track filepos in remote
This commit is contained in:
parent
a67ae15b32
commit
62bbe18171
@ -263,7 +263,7 @@ func RunCommand(ctx context.Context, cmdId string, remoteId string, remoteState
|
|||||||
DonePk: nil,
|
DonePk: nil,
|
||||||
RunOut: nil,
|
RunOut: nil,
|
||||||
}
|
}
|
||||||
err = sstore.AppendToCmdPtyBlob(ctx, cmd.SessionId, cmd.CmdId, nil, sstore.PosAppend)
|
err = sstore.AppendToCmdPtyBlob(ctx, cmd.SessionId, cmd.CmdId, nil, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -359,6 +359,7 @@ func (runner *MShellProc) ProcessPackets() {
|
|||||||
}
|
}
|
||||||
runner.notifyHangups_nolock()
|
runner.notifyHangups_nolock()
|
||||||
})
|
})
|
||||||
|
var dataPos int64
|
||||||
for pk := range runner.ServerProc.Output.MainCh {
|
for pk := range runner.ServerProc.Output.MainCh {
|
||||||
if pk.GetType() == packet.DataPacketStr {
|
if pk.GetType() == packet.DataPacketStr {
|
||||||
dataPk := pk.(*packet.DataPacketType)
|
dataPk := pk.(*packet.DataPacketType)
|
||||||
@ -370,12 +371,13 @@ func (runner *MShellProc) ProcessPackets() {
|
|||||||
}
|
}
|
||||||
var ack *packet.DataAckPacketType
|
var ack *packet.DataAckPacketType
|
||||||
if len(realData) > 0 {
|
if len(realData) > 0 {
|
||||||
err = sstore.AppendToCmdPtyBlob(context.Background(), dataPk.CK.GetSessionId(), dataPk.CK.GetCmdId(), realData, sstore.PosAppend)
|
err = sstore.AppendToCmdPtyBlob(context.Background(), dataPk.CK.GetSessionId(), dataPk.CK.GetCmdId(), realData, dataPos)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ack = makeDataAckPacket(dataPk.CK, dataPk.FdNum, 0, err)
|
ack = makeDataAckPacket(dataPk.CK, dataPk.FdNum, 0, err)
|
||||||
} else {
|
} else {
|
||||||
ack = makeDataAckPacket(dataPk.CK, dataPk.FdNum, len(realData), nil)
|
ack = makeDataAckPacket(dataPk.CK, dataPk.FdNum, len(realData), nil)
|
||||||
}
|
}
|
||||||
|
dataPos += int64(len(realData))
|
||||||
}
|
}
|
||||||
if ack != nil {
|
if ack != nil {
|
||||||
runner.ServerProc.Input.SendPacket(ack)
|
runner.ServerProc.Input.SendPacket(ack)
|
||||||
|
@ -9,42 +9,25 @@ import (
|
|||||||
"github.com/scripthaus-dev/sh2-server/pkg/scbase"
|
"github.com/scripthaus-dev/sh2-server/pkg/scbase"
|
||||||
)
|
)
|
||||||
|
|
||||||
const PosAppend = -1
|
|
||||||
|
|
||||||
// when calling with PosAppend, this is not multithread safe (since file could be modified).
|
|
||||||
// we need to know the real position of the write to send a proper pty update to the frontends
|
|
||||||
// in practice this is fine since we only use PosAppend in non-detached mode where
|
|
||||||
// we are reading/writing a stream in order with a single goroutine
|
|
||||||
func AppendToCmdPtyBlob(ctx context.Context, sessionId string, cmdId string, data []byte, pos int64) error {
|
func AppendToCmdPtyBlob(ctx context.Context, sessionId string, cmdId string, data []byte, pos int64) error {
|
||||||
|
if pos < 0 {
|
||||||
|
return fmt.Errorf("invalid seek pos '%d' in AppendToCmdPtyBlob", pos)
|
||||||
|
}
|
||||||
ptyOutFileName, err := scbase.PtyOutFile(sessionId, cmdId)
|
ptyOutFileName, err := scbase.PtyOutFile(sessionId, cmdId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var fd *os.File
|
fd, err := os.OpenFile(ptyOutFileName, os.O_WRONLY|os.O_CREATE, 0600)
|
||||||
var realPos int64
|
|
||||||
if pos == PosAppend {
|
|
||||||
fd, err = os.OpenFile(ptyOutFileName, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
finfo, err := fd.Stat()
|
realPos, err := fd.Seek(pos, 0)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
realPos = finfo.Size()
|
|
||||||
} else {
|
|
||||||
fd, err = os.OpenFile(ptyOutFileName, os.O_WRONLY|os.O_CREATE, 0600)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
realPos, err = fd.Seek(pos, 0)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if realPos != pos {
|
if realPos != pos {
|
||||||
return fmt.Errorf("could not seek to pos:%d (realpos=%d)", pos, realPos)
|
return fmt.Errorf("could not seek to pos:%d (realpos=%d)", pos, realPos)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
defer fd.Close()
|
defer fd.Close()
|
||||||
if len(data) == 0 {
|
if len(data) == 0 {
|
||||||
return nil
|
return nil
|
||||||
|
Loading…
Reference in New Issue
Block a user