| ... | ... | @@ -994,23 +994,23 @@ int os_self_exe_path(Buf *out_path) { |
| 994 | 994 | int ret1 = _NSGetExecutablePath(nullptr, &u32_len); |
| 995 | 995 | assert(ret1 != 0); |
| 996 | 996 | |
| 997 | | // Allocate a buffer for this path. |
| 998 | | Buf *path_tmp = buf_alloc_fixed(u32_len); |
| 999 | | // Fill the buffer with the path, which may be a symlink. |
| 1000 | | int ret2 = _NSGetExecutablePath(buf_ptr(path_tmp), &u32_len); |
| 997 | // Make room for the executable path and resolved path in out_path, |
| 998 | // then subslice it for convenience. |
| 999 | buf_resize(out_path, u32_len + PATH_MAX); |
| 1000 | Buf *tmp = buf_slice(out_path, 0, u32_len); |
| 1001 | Buf *resolved = buf_slice(out_path, u32_len, u32_len + PATH_MAX); |
| 1002 | |
| 1003 | // Fill the executable path. |
| 1004 | int ret2 = _NSGetExecutablePath(buf_ptr(tmp), &u32_len); |
| 1001 | 1005 | assert(ret2 == 0); |
| 1002 | 1006 | |
| 1003 | | // Make a buffer with room for the real path. |
| 1004 | | Buf *resolve_tmp = buf_alloc_fixed(PATH_MAX); |
| 1007 | // Resolve the real path from that. |
| 1008 | char *real_path = realpath(buf_ptr(tmp), buf_ptr(resolved)); |
| 1009 | assert(real_path == buf_ptr(resolved)); |
| 1005 | 1010 | |
| 1006 | | // Fill it with the real resolved path. |
| 1007 | | char *real_path = realpath(buf_ptr(path_tmp), buf_ptr(resolve_tmp)); |
| 1008 | | // IEEE Std 1003.1-2017: realpath() shall return a pointer to the |
| 1009 | | // buffer containing the resolved name. |
| 1010 | | assert(real_path == buf_ptr(resolve_tmp)); |
| 1011 | | |
| 1012 | | // Resize out_path and copy the resulting resolved absolute path. |
| 1013 | | buf_init_from_buf(out_path, resolve_tmp); |
| 1011 | // Write the real path back into the beginning of out_path, resize. |
| 1012 | buf_init_from_buf(out_path, resolved); |
| 1013 | assert(buf_len(out_path) == buf_len(resolved)); |
| 1014 | 1014 | return 0; |
| 1015 | 1015 | #elif defined(ZIG_OS_LINUX) |
| 1016 | 1016 | buf_resize(out_path, 256); |