The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/1807

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===

From a2170a6b96b69bdf30e87f7924a7a1c99f8d9fca Mon Sep 17 00:00:00 2001
From: Tycho Andersen <tycho.ander...@canonical.com>
Date: Fri, 25 Mar 2016 13:15:48 -0600
Subject: [PATCH 1/2] exec: send initial window size

Signed-off-by: Tycho Andersen <tycho.ander...@canonical.com>
---
 client.go             |  3 ++-
 doc/rest-api.md       |  4 +++-
 lxc/exec.go           |  7 ++++++-
 lxd/container_exec.go | 10 ++++++++++
 4 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/client.go b/client.go
index bc4f3fb..e958cf8 100644
--- a/client.go
+++ b/client.go
@@ -1395,7 +1395,8 @@ func (c *Client) Monitor(types []string, handler 
func(interface{})) error {
 // output is sent to the output buffers.
 func (c *Client) Exec(name string, cmd []string, env map[string]string,
        stdin io.ReadCloser, stdout io.WriteCloser,
-       stderr io.WriteCloser, controlHandler func(*Client, *websocket.Conn)) 
(int, error) {
+       stderr io.WriteCloser, controlHandler func(*Client, *websocket.Conn),
+       width int, height int) (int, error) {
 
        if c.Remote.Public {
                return -1, fmt.Errorf("This function isn't supported by public 
remotes.")
diff --git a/doc/rest-api.md b/doc/rest-api.md
index 137455d..af3f368 100644
--- a/doc/rest-api.md
+++ b/doc/rest-api.md
@@ -926,7 +926,9 @@ Input (run bash):
         "command": ["/bin/bash"],       # Command and arguments
         "environment": {},              # Optional extra environment variables 
to set
         "wait-for-websocket": false,    # Whether to wait for a connection 
before starting the process
-        "interactive": true             # Whether to allocate a pts device 
instead of PIPEs
+        "interactive": true,            # Whether to allocate a pts device 
instead of PIPEs
+        "width": 80,                    # initial width of the terminal 
(optional)
+        "height": 25,                   # initial height of the terminal 
(optional)
     }
 
 `wait-for-websocket` indicates whether the operation should block and wait for
diff --git a/lxc/exec.go b/lxc/exec.go
index d218fd5..894cd9d 100644
--- a/lxc/exec.go
+++ b/lxc/exec.go
@@ -137,8 +137,13 @@ func (c *execCmd) run(config *lxd.Config, args []string) 
error {
                handler = nil
        }
 
+       width, height, err := termios.GetSize(int(syscall.Stdout))
+       if err != nil {
+               return err
+       }
+
        stdout := c.getStdout()
-       ret, err := d.Exec(name, args[1:], env, os.Stdin, stdout, os.Stderr, 
handler)
+       ret, err := d.Exec(name, args[1:], env, os.Stdin, stdout, os.Stderr, 
handler, width, height)
        if err != nil {
                return err
        }
diff --git a/lxd/container_exec.go b/lxd/container_exec.go
index 6780089..27c9ea1 100644
--- a/lxd/container_exec.go
+++ b/lxd/container_exec.go
@@ -22,6 +22,8 @@ type commandPostContent struct {
        WaitForWS   bool              `json:"wait-for-websocket"`
        Interactive bool              `json:"interactive"`
        Environment map[string]string `json:"environment"`
+       Width       int               `json:"width"`
+       Height      int               `json:"height"`
 }
 
 func runCommand(container *lxc.Container, command []string, options 
lxc.AttachOptions) (int, error) {
@@ -46,6 +48,8 @@ type execWs struct {
        controlConnected chan bool
        interactive      bool
        fds              map[int]string
+       width            int
+       height           int
 }
 
 func (s *execWs) Metadata() interface{} {
@@ -112,6 +116,10 @@ func (s *execWs) Do(op *operation) error {
                s.options.StdinFd = ttys[0].Fd()
                s.options.StdoutFd = ttys[0].Fd()
                s.options.StderrFd = ttys[0].Fd()
+
+               if s.width > 0 && s.height > 0 {
+                       shared.SetSize(int(ptys[0].Fd()), s.width, s.height)
+               }
        } else {
                ttys = make([]*os.File, 3)
                ptys = make([]*os.File, 3)
@@ -317,6 +325,8 @@ func containerExecPost(d *Daemon, r *http.Request) Response 
{
 
                ws.command = post.Command
                ws.container = c.LXContainerGet()
+               ws.width = post.Width
+               ws.height = post.Height
 
                resources := map[string][]string{}
                resources["containers"] = []string{ws.container.Name()}

From cb354a483d3b28b18b810b542cdf0684f1cfd77d Mon Sep 17 00:00:00 2001
From: Tycho Andersen <tycho.ander...@canonical.com>
Date: Fri, 25 Mar 2016 13:16:58 -0600
Subject: [PATCH 2/2] exec client: don't always send window size

Now that we don't rely on the first window size send to set the window
size, let's only send it when there is actually a SIGWINCH.

Signed-off-by: Tycho Andersen <tycho.ander...@canonical.com>
---
 lxc/exec_unix.go | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/lxc/exec_unix.go b/lxc/exec_unix.go
index a4fa8db..9b46add 100644
--- a/lxc/exec_unix.go
+++ b/lxc/exec_unix.go
@@ -23,15 +23,15 @@ func (c *execCmd) controlSocketHandler(d *lxd.Client, 
control *websocket.Conn) {
        signal.Notify(ch, syscall.SIGWINCH)
 
        for {
+               sig := <-ch
+
+               shared.Debugf("Received '%s signal', updating window 
geometry.", sig)
+
                err := c.sendTermSize(control)
                if err != nil {
                        shared.Debugf("error setting term size %s", err)
                        break
                }
-
-               sig := <-ch
-
-               shared.Debugf("Received '%s signal', updating window 
geometry.", sig)
        }
 
        closeMsg := websocket.FormatCloseMessage(websocket.CloseNormalClosure, 
"")
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to