From 4962a7c3ae05d4db2b0b15da8409f70eebce17e9 Mon Sep 17 00:00:00 2001 From: Paul Holzinger Date: Tue, 5 Jul 2022 18:17:07 +0200 Subject: [PATCH 1/2] create pkg/resize conmon-rs currently depends on podmans pkg/kubeutils. Since podman wants to import conmon-rs go code this can cause many problems. To fix this we move the shared code to c/common so both projects can use it without trouble. Also rename the package to pkg/resize from kubeutils since this contains really only one function and the name is much more clear. see https://github.com/containers/conmon-rs/issues/504 Signed-off-by: Paul Holzinger --- pkg/resize/resize.go | 45 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 pkg/resize/resize.go diff --git a/pkg/resize/resize.go b/pkg/resize/resize.go new file mode 100644 index 000000000..9a2afcf73 --- /dev/null +++ b/pkg/resize/resize.go @@ -0,0 +1,45 @@ +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package resize + +// TerminalSize represents the width and height of a terminal. +type TerminalSize struct { + Width uint16 + Height uint16 +} + +// HandleResizing spawns a goroutine that processes the resize channel, calling resizeFunc for each +// TerminalSize received from the channel. The resize channel must be closed elsewhere to stop the +// goroutine. +func HandleResizing(resize <-chan TerminalSize, resizeFunc func(size TerminalSize)) { + if resize == nil { + return + } + + go func() { + for { + size, ok := <-resize + if !ok { + return + } + if size.Height < 1 || size.Width < 1 { + continue + } + resizeFunc(size) + } + }() +} From a380ab4bab6e1dabfc8ed3d00e951f1e4f6dbca5 Mon Sep 17 00:00:00 2001 From: Paul Holzinger Date: Tue, 5 Jul 2022 18:27:48 +0200 Subject: [PATCH 2/2] pkg/util: add CopyDetachable from podman conmon-rs currently depends on podmans utils.CopyDetachable(). Since podman wants to import conmon-rs go code this can cause many problems. To fix this we move the shared code to c/common so both projects can use it without trouble. see https://github.com/containers/conmon-rs/issues/504 Signed-off-by: Paul Holzinger --- pkg/util/copy.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 pkg/util/copy.go diff --git a/pkg/util/copy.go b/pkg/util/copy.go new file mode 100644 index 000000000..a45b82fc9 --- /dev/null +++ b/pkg/util/copy.go @@ -0,0 +1,57 @@ +package util + +import ( + "errors" + "io" +) + +// ErrDetach indicates that an attach session was manually detached by +// the user. +var ErrDetach = errors.New("detached from container") + +// CopyDetachable is similar to io.Copy but support a detach key sequence to break out. +func CopyDetachable(dst io.Writer, src io.Reader, keys []byte) (written int64, err error) { + buf := make([]byte, 32*1024) + for { + nr, er := src.Read(buf) + if nr > 0 { + preservBuf := []byte{} + for i, key := range keys { + preservBuf = append(preservBuf, buf[0:nr]...) + if nr != 1 || buf[0] != key { + break + } + if i == len(keys)-1 { + return 0, ErrDetach + } + nr, er = src.Read(buf) + } + var nw int + var ew error + if len(preservBuf) > 0 { + nw, ew = dst.Write(preservBuf) + nr = len(preservBuf) + } else { + nw, ew = dst.Write(buf[0:nr]) + } + if nw > 0 { + written += int64(nw) + } + if ew != nil { + err = ew + break + } + if nr != nw { + err = io.ErrShortWrite + break + } + } + if er != nil { + if er != io.EOF { + err = er + } + break + } + } + return written, err +}