// Copyright 2026 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package runtime import "unsafe" const ( maxPathLen = 1024 _kCFStringEncodingUTF8 = 0x08000100 ) // initWorkingDir sets the current working directory to the app root on iOS. // By default ios/arm64 processes start in "/". func initWorkingDir() { bundle := cfBundleGetMainBundle() if bundle == 0 { writeErrStr("runtime/cgo: no main bundle\n") return } url := cfBundleCopyBundleURL(bundle) if url == 0 { // No app bundle URL found. return } var buf [maxPathLen]byte path := &buf[0] ok := cfURLGetFileSystemRepresentation(url, true, path, uintptr(len(buf))) cfRelease(url) if !ok { writeErrStr("runtime/cgo: cannot get bundle URL path\n") return } if chdir(path) != 0 { writeErrStr("runtime/cgo: chdir(") writeErrData(path, int32(findnull(path))) writeErrStr(") failed\n") } const goExecWrapperWorkingDirectoryKey = "GoExecWrapperWorkingDirectory\x00" key := cfStringCreateWithCString(0, unsafe.StringData(goExecWrapperWorkingDirectoryKey), _kCFStringEncodingUTF8) if key == 0 { writeErrStr("runtime/cgo: cannot create GoExecWrapperWorkingDirectory string\n") return } wd := cfBundleGetValueForInfoDictionaryKey(bundle, key) cfRelease(key) if wd == 0 { return } if !cfStringGetCString(wd, path, uintptr(len(buf)), _kCFStringEncodingUTF8) { writeErrStr("runtime/cgo: cannot get GoExecWrapperWorkingDirectory string\n") return } if chdir(path) != 0 { writeErrStr("runtime/cgo: chdir(") writeErrData(path, int32(findnull(path))) writeErrStr(") failed\n") } }