case "darwin":
switch runtime.GOARCH {
case "arm", "arm64":
+ dirs = nil
for _, d := range []string{"d1", "d2"} {
dir, err := ioutil.TempDir("", d)
if err != nil {
)
var zoneSources = []string{
- getZipParent() + "/zoneinfo.zip",
- runtime.GOROOT() + "/lib/time/zoneinfo.zip",
+ getZoneRoot() + "/zoneinfo.zip",
}
-func getZipParent() string {
- wd, err := syscall.Getwd()
- if err != nil {
- return "/XXXNOEXIST"
- }
-
+func getZoneRoot() string {
// The working directory at initialization is the root of the
// app bundle: "/private/.../bundlename.app". That's where we
- // keep zoneinfo.zip.
- return wd
+ // keep zoneinfo.zip for tethered iOS builds.
+ // For self-hosted iOS builds, the zoneinfo.zip is in GOROOT.
+ roots := []string{runtime.GOROOT() + "/lib/time"}
+ wd, err := syscall.Getwd()
+ if err == nil {
+ roots = append(roots, wd)
+ }
+ for _, r := range roots {
+ var st syscall.Stat_t
+ fd, err := syscall.Open(r, syscall.O_RDONLY, 0)
+ if err != nil {
+ continue
+ }
+ defer syscall.Close(fd)
+ if err := syscall.Fstat(fd, &st); err == nil {
+ return r
+ }
+ }
+ return "/XXXNOEXIST"
}
func initLocal() {