in integration/utils/exec.go [139:177]
func startBackground(cookie string, stdout io.Writer, stderr io.Writer, user *UnixUser, args ...string) (*exec.Cmd, io.WriteCloser, error) {
bin := GetConfig().SandboxfsBinary
// The sandboxfs command line syntax requires the mount point to appear at the end and we
// control all callers of this function within the tests, so we know this is true. If not,
// well, we have a bug and the test will crash/fail.
mountPoint := args[len(args)-1]
cmd := exec.Command(bin, args...)
stdin, err := cmd.StdinPipe()
if err != nil {
return nil, nil, fmt.Errorf("failed to create stdin pipe: %v", err)
}
cmd.Stdout = stdout
cmd.Stderr = stderr
SetCredential(cmd, user)
setRustEnv(cmd)
if err := cmd.Start(); err != nil {
return nil, nil, fmt.Errorf("failed to start %s with arguments %v: %v", bin, args, err)
}
if cookie != "" {
cookiePath := filepath.Join(mountPoint, cookie)
waitForCookie := func() error { return FileExistsAsUser(cookiePath, user) }
if err := retry(waitForCookie, "waiting for cookie to appear in mount point", startupDeadlineSeconds); err != nil {
// Give up. sandboxfs did't come up, so kill the process and clean up.
// There is not much we can do here if we encounter errors (e.g. we don't
// even know if the mount point was initialized, so the unmount call may or
// may not fail) so just try to clean up as much as possible.
stdin.Close()
cmd.Process.Kill()
cmd.Wait()
Unmount(mountPoint)
return nil, nil, fmt.Errorf("file system failed to come up: %s not found", cookiePath)
}
}
return cmd, stdin, nil
}