aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/time/zoneinfo_ios.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/time/zoneinfo_ios.go')
-rw-r--r--libgo/go/time/zoneinfo_ios.go35
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() {