func()

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
}