mirror of https://github.com/containers/podman.git
pkg/varlinkapi/virtwriter/virtwriter.go: simplify func Reader
Signed-off-by: Harald Hoyer <harald@redhat.com>
This commit is contained in:
parent
7c465d4d97
commit
939f8150da
|
@ -91,65 +91,65 @@ func (v VirtWriteCloser) Write(input []byte) (int, error) {
|
||||||
|
|
||||||
// Reader decodes the content that comes over the wire and directs it to the proper destination.
|
// Reader decodes the content that comes over the wire and directs it to the proper destination.
|
||||||
func Reader(r *bufio.Reader, output, errput *os.File, input *io.PipeWriter, resize chan remotecommand.TerminalSize) error {
|
func Reader(r *bufio.Reader, output, errput *os.File, input *io.PipeWriter, resize chan remotecommand.TerminalSize) error {
|
||||||
var saveb []byte
|
var messageSize int64
|
||||||
var eom int
|
headerBytes := make([]byte, 8)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
readb := make([]byte, 32*1024)
|
n, err := io.ReadFull(r, headerBytes)
|
||||||
n, err := r.Read(readb)
|
|
||||||
// TODO, later may be worth checking in len of the read is 0
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
b := append(saveb, readb[0:n]...)
|
if n < 8 {
|
||||||
// no sense in reading less than the header len
|
return errors.New("short read and no full header read")
|
||||||
for len(b) > 7 {
|
}
|
||||||
eom = int(binary.BigEndian.Uint32(b[4:8])) + 8
|
|
||||||
// The message and header are togther
|
|
||||||
if len(b) >= eom {
|
|
||||||
out := append([]byte{}, b[8:eom]...)
|
|
||||||
|
|
||||||
switch IntToSocketDest(int(b[0])) {
|
messageSize = int64(binary.BigEndian.Uint32(headerBytes[4:8]))
|
||||||
case ToStdout:
|
|
||||||
n, err := output.Write(out)
|
switch IntToSocketDest(int(headerBytes[0])) {
|
||||||
if err != nil {
|
case ToStdout:
|
||||||
return err
|
_, err := io.CopyN(output, r, messageSize)
|
||||||
}
|
if err != nil {
|
||||||
if n < len(out) {
|
return err
|
||||||
return errors.New("short write error occurred on stdout")
|
|
||||||
}
|
|
||||||
case ToStderr:
|
|
||||||
n, err := errput.Write(out)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if n < len(out) {
|
|
||||||
return errors.New("short write error occurred on stderr")
|
|
||||||
}
|
|
||||||
case ToStdin:
|
|
||||||
n, err := input.Write(out)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if n < len(out) {
|
|
||||||
return errors.New("short write error occurred on stdin")
|
|
||||||
}
|
|
||||||
case TerminalResize:
|
|
||||||
// Resize events come over in bytes, need to be reserialized
|
|
||||||
resizeEvent := remotecommand.TerminalSize{}
|
|
||||||
if err := json.Unmarshal(out, &resizeEvent); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
resize <- resizeEvent
|
|
||||||
case Quit:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
b = b[eom:]
|
|
||||||
} else {
|
|
||||||
// We do not have the header and full message, need to slurp again
|
|
||||||
saveb = b
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
case ToStderr:
|
||||||
|
_, err := io.CopyN(errput, r, messageSize)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
case ToStdin:
|
||||||
|
_, err := io.CopyN(input, r, messageSize)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
case TerminalResize:
|
||||||
|
out := make([]byte, messageSize)
|
||||||
|
if messageSize > 0 {
|
||||||
|
_, err = io.ReadFull(r, out)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Resize events come over in bytes, need to be reserialized
|
||||||
|
resizeEvent := remotecommand.TerminalSize{}
|
||||||
|
if err := json.Unmarshal(out, &resizeEvent); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
resize <- resizeEvent
|
||||||
|
case Quit:
|
||||||
|
out := make([]byte, messageSize)
|
||||||
|
if messageSize > 0 {
|
||||||
|
_, err = io.ReadFull(r, out)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Something really went wrong
|
||||||
|
return errors.New("Unknown multiplex destination")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue