bundleID = parts[1]
}
- os.Exit(runMain())
+ exitCode, err := runMain()
+ if err != nil {
+ log.Fatalf("%v\n", err)
+ }
+ os.Exit(exitCode)
}
-func runMain() int {
+func runMain() (int, error) {
var err error
tmpdir, err = ioutil.TempDir("", "go_darwin_arm_exec_")
if err != nil {
- log.Fatal(err)
+ return 1, err
}
if !debug {
defer os.RemoveAll(tmpdir)
os.RemoveAll(appdir)
if err := assembleApp(appdir, os.Args[1]); err != nil {
- log.Fatal(err)
+ return 1, err
}
// This wrapper uses complicated machinery to run iOS binaries. It
lockName := filepath.Join(os.TempDir(), "go_darwin_arm_exec-"+deviceID+".lock")
lock, err = os.OpenFile(lockName, os.O_CREATE|os.O_RDONLY, 0666)
if err != nil {
- log.Fatal(err)
+ return 1, err
}
if err := syscall.Flock(int(lock.Fd()), syscall.LOCK_EX); err != nil {
- log.Fatal(err)
+ return 1, err
}
if err := install(appdir); err != nil {
- log.Fatal(err)
+ return 1, err
}
deviceApp, err := findDeviceAppPath(bundleID)
if err != nil {
- log.Fatal(err)
+ return 1, err
}
if err := mountDevImage(); err != nil {
- log.Fatal(err)
+ return 1, err
}
closer, err := startDebugBridge()
if err != nil {
- log.Fatal(err)
+ return 1, err
}
defer closer()
// If the lldb driver completed with an exit code, use that.
if err, ok := err.(*exec.ExitError); ok {
if ws, ok := err.Sys().(interface{ ExitStatus() int }); ok {
- return ws.ExitStatus()
+ return ws.ExitStatus(), nil
}
}
- fmt.Fprintf(os.Stderr, "go_darwin_arm_exec: %v\n", err)
- return 1
+ return 1, err
}
- return 0
+ return 0, nil
}
func getenv(envvar string) string {