in go/wsl/driver/driver.go [305:365]
func (d *Driver) startDriver() (chan error, error) {
errChan := make(chan error)
if d.caps.binary == "" {
return errChan, nil
}
cmd := exec.CommandContext(context.Background(), d.caps.binary, d.caps.args...)
cmd.Env = cmdhelper.BulkUpdateEnv(os.Environ(), d.caps.env)
stdout := os.Stdout
if d.caps.stdout != "" {
s, err := os.Create(d.caps.stdout)
if err != nil {
return nil, err
}
stdout = s
}
cmd.Stdout = stdout
stderr := os.Stderr
if d.caps.stderr != "" {
if d.caps.stderr == d.caps.stdout {
stderr = stdout
} else {
s, err := os.Create(d.caps.stderr)
if err != nil {
return nil, err
}
stderr = s
}
}
cmd.Stderr = stderr
if err := cmd.Start(); err != nil {
return nil, err
}
go func() {
err := cmd.Wait()
if err := d.portRecycler.RecyclePorts(); err != nil {
log.Printf("Error cleaning up used ports: %v", err)
}
errChan <- err
d.stopped <- err
if stdout != os.Stdout {
stdout.Close()
}
if stderr != os.Stderr {
stdout.Close()
}
}()
d.cmd = cmd
return errChan, nil
}