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

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) ===
Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
From 212cfb3cc6cb23ce7dab7465cfb3df6411dd117b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Tue, 7 Mar 2017 19:59:47 -0500
Subject: [PATCH] Don't use FindProcess, just pass exec.Cmd
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/container.go      |  2 +-
 lxd/container_exec.go | 25 +++++++++----------------
 lxd/container_lxc.go  | 20 +++++++++++---------
 3 files changed, 21 insertions(+), 26 deletions(-)

diff --git a/lxd/container.go b/lxd/container.go
index 1c5f8cd..ca4356d 100644
--- a/lxd/container.go
+++ b/lxd/container.go
@@ -441,7 +441,7 @@ type container interface {
                 *      (the PID returned in the first return argument). It can 
however
                 *      be used to e.g. forward signals.)
        */
-       Exec(command []string, env map[string]string, stdin *os.File, stdout 
*os.File, stderr *os.File, wait bool) (int, int, error)
+       Exec(command []string, env map[string]string, stdin *os.File, stdout 
*os.File, stderr *os.File, wait bool) (*exec.Cmd, int, int, error)
 
        // Status
        Render() (interface{}, interface{}, error)
diff --git a/lxd/container_exec.go b/lxd/container_exec.go
index d4da9aa..cf3fed2 100644
--- a/lxd/container_exec.go
+++ b/lxd/container_exec.go
@@ -6,6 +6,7 @@ import (
        "io/ioutil"
        "net/http"
        "os"
+       "os/exec"
        "path/filepath"
        "strconv"
        "strings"
@@ -292,7 +293,7 @@ func (s *execWs) Do(op *operation) error {
                return cmdErr
        }
 
-       pid, attachedPid, err := s.container.Exec(s.command, s.env, stdin, 
stdout, stderr, false)
+       cmd, _, attachedPid, err := s.container.Exec(s.command, s.env, stdin, 
stdout, stderr, false)
        if err != nil {
                return err
        }
@@ -301,23 +302,15 @@ func (s *execWs) Do(op *operation) error {
                attachedChildIsBorn <- attachedPid
        }
 
-       proc, err := os.FindProcess(pid)
-       if err != nil {
-               return finisher(-1, fmt.Errorf("Failed finding process: %q", 
err))
-       }
-
-       procState, err := proc.Wait()
-       if err != nil {
-               return finisher(-1, fmt.Errorf("Failed waiting on process %d: 
%q", pid, err))
-       }
-
-       if procState.Success() {
+       err = cmd.Wait()
+       if err == nil {
                return finisher(0, nil)
        }
 
-       status, ok := procState.Sys().(syscall.WaitStatus)
+       exitErr, ok := err.(*exec.ExitError)
        if ok {
-               if status.Exited() {
+               status, ok := exitErr.Sys().(syscall.WaitStatus)
+               if ok {
                        return finisher(status.ExitStatus(), nil)
                }
 
@@ -464,7 +457,7 @@ func containerExecPost(d *Daemon, r *http.Request) Response 
{
                        defer stderr.Close()
 
                        // Run the command
-                       cmdResult, _, cmdErr = c.Exec(post.Command, env, nil, 
stdout, stderr, true)
+                       _, cmdResult, _, cmdErr = c.Exec(post.Command, env, 
nil, stdout, stderr, true)
 
                        // Update metadata with the right URLs
                        metadata["return"] = cmdResult
@@ -473,7 +466,7 @@ func containerExecPost(d *Daemon, r *http.Request) Response 
{
                                "2": fmt.Sprintf("/%s/containers/%s/logs/%s", 
version.APIVersion, c.Name(), filepath.Base(stderr.Name())),
                        }
                } else {
-                       cmdResult, _, cmdErr = c.Exec(post.Command, env, nil, 
nil, nil, true)
+                       _, cmdResult, _, cmdErr = c.Exec(post.Command, env, 
nil, nil, nil, true)
                        metadata["return"] = cmdResult
                }
 
diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 9fc36ea..4299395 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -4687,7 +4687,7 @@ func (c *containerLXC) FileRemove(path string) error {
        return nil
 }
 
-func (c *containerLXC) Exec(command []string, env map[string]string, stdin 
*os.File, stdout *os.File, stderr *os.File, wait bool) (int, int, error) {
+func (c *containerLXC) Exec(command []string, env map[string]string, stdin 
*os.File, stdout *os.File, stderr *os.File, wait bool) (*exec.Cmd, int, int, 
error) {
        envSlice := []string{}
 
        for k, v := range env {
@@ -4715,25 +4715,26 @@ func (c *containerLXC) Exec(command []string, env 
map[string]string, stdin *os.F
        defer r.Close()
        if err != nil {
                shared.LogErrorf("s", err)
-               return -1, -1, err
+               return nil, -1, -1, err
        }
 
        cmd.ExtraFiles = []*os.File{w}
        err = cmd.Start()
        if err != nil {
                w.Close()
-               return -1, -1, err
+               return nil, -1, -1, err
        }
        w.Close()
+
        attachedPid := -1
        if err := json.NewDecoder(r).Decode(&attachedPid); err != nil {
                shared.LogErrorf("Failed to retrieve PID of executing child 
process: %s", err)
-               return -1, -1, err
+               return nil, -1, -1, err
        }
 
        // It's the callers responsibility to wait or not wait.
        if !wait {
-               return cmd.Process.Pid, attachedPid, nil
+               return &cmd, -1, attachedPid, nil
        }
 
        err = cmd.Wait()
@@ -4742,18 +4743,19 @@ func (c *containerLXC) Exec(command []string, env 
map[string]string, stdin *os.F
                if ok {
                        status, ok := exitErr.Sys().(syscall.WaitStatus)
                        if ok {
-                               return status.ExitStatus(), attachedPid, nil
+                               return nil, status.ExitStatus(), attachedPid, 
nil
                        }
 
                        if status.Signaled() {
                                // 128 + n == Fatal error signal "n"
-                               return 128 + int(status.Signal()), attachedPid, 
nil
+                               return nil, 128 + int(status.Signal()), 
attachedPid, nil
                        }
                }
-               return -1, -1, err
+
+               return nil, -1, -1, err
        }
 
-       return 0, attachedPid, nil
+       return nil, 0, attachedPid, nil
 }
 
 func (c *containerLXC) cpuState() api.ContainerStateCPU {
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to