diff options
Diffstat (limited to 'libgo/go/time/zoneinfo_ios.go')
-rw-r--r-- | libgo/go/time/zoneinfo_ios.go | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/libgo/go/time/zoneinfo_ios.go b/libgo/go/time/zoneinfo_ios.go index 6d7f975..f5a97be 100644 --- a/libgo/go/time/zoneinfo_ios.go +++ b/libgo/go/time/zoneinfo_ios.go @@ -7,22 +7,37 @@ package time -import "syscall" +import ( + "runtime" + "syscall" +) var zoneSources = []string{ - getZipParent() + "/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() { |