| package libcontainer |
| |
| import "os/exec" |
| |
| // cloneCmd creates a copy of exec.Cmd. It is needed because cmd.Start |
| // must only be used once, and go1.26 actually enforces that (see |
| // https://go-review.googlesource.com/c/go/+/728642). The implementation |
| // is similar to |
| // |
| // cmd = *c |
| // return &cmd |
| // |
| // except it does not copy private fields, or fields populated |
| // after the call to cmd.Start. |
| // |
| // NOTE if Go will add exec.Cmd.Clone, we should switch to it. |
| func cloneCmd(c *exec.Cmd) *exec.Cmd { |
| cmd := &exec.Cmd{ |
| Path: c.Path, |
| Args: c.Args, |
| Env: c.Env, |
| Dir: c.Dir, |
| Stdin: c.Stdin, |
| Stdout: c.Stdout, |
| Stderr: c.Stderr, |
| ExtraFiles: c.ExtraFiles, |
| SysProcAttr: c.SysProcAttr, |
| // Don't copy Process, ProcessState, Err since |
| // these fields are populated after the start. |
| |
| // Technically, we do not use Cancel or WaitDelay, |
| // but they are here for the sake of completeness. |
| Cancel: c.Cancel, |
| WaitDelay: c.WaitDelay, |
| } |
| return cmd |
| } |