| author | |
| committer | |
| log | 8bd734d60cd55d65ea52a051ccdc35939edeb99c |
| tree | 673eae57056242a83d1971af16b926b942528b6c |
| parent | c1f404ad537ded5a584525f7f89dcf5705a2c405 |
| parent | 7798af74614af595390130b364817626603be21e |
| signature |
give BSDs some attention16 files changed, 164 insertions(+), 72 deletions(-)
CMakeLists.txt+5-11| ... | ... | @@ -708,21 +708,15 @@ target_link_libraries(zigcpp LINK_PUBLIC |
| 708 | 708 | ${CMAKE_THREAD_LIBS_INIT} |
| 709 | 709 | ) |
| 710 | 710 | |
| 711 | if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "AMD64") | |
| 711 | string(TOLOWER "${CMAKE_HOST_SYSTEM_PROCESSOR}" HOST_TARGET_ARCH) | |
| 712 | if(HOST_TARGET_ARCH STREQUAL "amd64") | |
| 712 | 713 | set(HOST_TARGET_ARCH "x86_64") |
| 713 | elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "amd64") | |
| 714 | set(HOST_TARGET_ARCH "x86_64") | |
| 715 | elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64") | |
| 716 | set(HOST_TARGET_ARCH "aarch64") | |
| 717 | elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "ARM64") | |
| 714 | elseif(HOST_TARGET_ARCH STREQUAL "arm64") | |
| 718 | 715 | set(HOST_TARGET_ARCH "aarch64") |
| 719 | else() | |
| 720 | string(TOLOWER "${CMAKE_HOST_SYSTEM_PROCESSOR}" HOST_TARGET_ARCH) | |
| 721 | 716 | endif() |
| 722 | if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") | |
| 717 | string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" HOST_TARGET_OS) | |
| 718 | if(HOST_TARGET_OS STREQUAL "darwin") | |
| 723 | 719 | set(HOST_TARGET_OS "macos") |
| 724 | else() | |
| 725 | string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" HOST_TARGET_OS) | |
| 726 | 720 | endif() |
| 727 | 721 | set(HOST_TARGET_TRIPLE "${HOST_TARGET_ARCH}-${HOST_TARGET_OS}") |
| 728 | 722 |
build.zig+32-18| ... | ... | @@ -560,24 +560,38 @@ fn addCmakeCfgOptionsToExe( |
| 560 | 560 | |
| 561 | 561 | // System -lc++ must be used because in this code path we are attempting to link |
| 562 | 562 | // against system-provided LLVM, Clang, LLD. |
| 563 | if (exe.target.getOsTag() == .linux) { | |
| 564 | // First we try to link against gcc libstdc++. If that doesn't work, we fall | |
| 565 | // back to -lc++ and cross our fingers. | |
| 566 | addCxxKnownPath(b, cfg, exe, b.fmt("libstdc++.{s}", .{lib_suffix}), "", need_cpp_includes) catch |err| switch (err) { | |
| 567 | error.RequiredLibraryNotFound => { | |
| 568 | exe.linkSystemLibrary("c++"); | |
| 569 | }, | |
| 570 | else => |e| return e, | |
| 571 | }; | |
| 572 | exe.linkSystemLibrary("unwind"); | |
| 573 | } else if (exe.target.isFreeBSD()) { | |
| 574 | try addCxxKnownPath(b, cfg, exe, b.fmt("libc++.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 575 | exe.linkSystemLibrary("pthread"); | |
| 576 | } else if (exe.target.getOsTag() == .openbsd) { | |
| 577 | try addCxxKnownPath(b, cfg, exe, b.fmt("libc++.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 578 | try addCxxKnownPath(b, cfg, exe, b.fmt("libc++abi.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 579 | } else if (exe.target.isDarwin()) { | |
| 580 | exe.linkSystemLibrary("c++"); | |
| 563 | switch (exe.target.getOsTag()) { | |
| 564 | .linux => { | |
| 565 | // First we try to link against gcc libstdc++. If that doesn't work, we fall | |
| 566 | // back to -lc++ and cross our fingers. | |
| 567 | addCxxKnownPath(b, cfg, exe, b.fmt("libstdc++.{s}", .{lib_suffix}), "", need_cpp_includes) catch |err| switch (err) { | |
| 568 | error.RequiredLibraryNotFound => { | |
| 569 | exe.linkSystemLibrary("c++"); | |
| 570 | }, | |
| 571 | else => |e| return e, | |
| 572 | }; | |
| 573 | exe.linkSystemLibrary("unwind"); | |
| 574 | }, | |
| 575 | .ios, .macos, .watchos, .tvos => { | |
| 576 | exe.linkSystemLibrary("c++"); | |
| 577 | }, | |
| 578 | .freebsd => { | |
| 579 | try addCxxKnownPath(b, cfg, exe, b.fmt("libc++.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 580 | try addCxxKnownPath(b, cfg, exe, b.fmt("libgcc_eh.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 581 | }, | |
| 582 | .openbsd => { | |
| 583 | try addCxxKnownPath(b, cfg, exe, b.fmt("libc++.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 584 | try addCxxKnownPath(b, cfg, exe, b.fmt("libc++abi.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 585 | }, | |
| 586 | .netbsd => { | |
| 587 | try addCxxKnownPath(b, cfg, exe, b.fmt("libstdc++.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 588 | try addCxxKnownPath(b, cfg, exe, b.fmt("libgcc_eh.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 589 | }, | |
| 590 | .dragonfly => { | |
| 591 | try addCxxKnownPath(b, cfg, exe, b.fmt("libstdc++.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 592 | try addCxxKnownPath(b, cfg, exe, b.fmt("libgcc_eh.{s}", .{lib_suffix}), null, need_cpp_includes); | |
| 593 | }, | |
| 594 | else => {}, | |
| 581 | 595 | } |
| 582 | 596 | } |
| 583 | 597 |
lib/libcxx/include/__config+6-5| ... | ... | @@ -148,7 +148,7 @@ |
| 148 | 148 | # endif |
| 149 | 149 | // Feature macros for disabling pre ABI v1 features. All of these options |
| 150 | 150 | // are deprecated. |
| 151 | # if defined(__FreeBSD__) | |
| 151 | # if defined(__FreeBSD__) || defined(__DragonFly__) | |
| 152 | 152 | # define _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR |
| 153 | 153 | # endif |
| 154 | 154 | # endif |
| ... | ... | @@ -726,11 +726,11 @@ _LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD |
| 726 | 726 | # endif // _LIBCPP_CXX03_LANG |
| 727 | 727 | |
| 728 | 728 | # if defined(__APPLE__) || defined(__FreeBSD__) || defined(_LIBCPP_MSVCRT_LIKE) || defined(__sun__) || \ |
| 729 | defined(__NetBSD__) | |
| 729 | defined(__NetBSD__) || defined(__DragonFly__) | |
| 730 | 730 | # define _LIBCPP_LOCALE__L_EXTENSIONS 1 |
| 731 | 731 | # endif |
| 732 | 732 | |
| 733 | # ifdef __FreeBSD__ | |
| 733 | # if defined(__FreeBSD__) || defined(__DragonFly__) | |
| 734 | 734 | # define _DECLARE_C99_LDBL_MATH 1 |
| 735 | 735 | # endif |
| 736 | 736 | |
| ... | ... | @@ -750,11 +750,11 @@ _LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD |
| 750 | 750 | # define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION |
| 751 | 751 | # endif |
| 752 | 752 | |
| 753 | # if defined(__APPLE__) || defined(__FreeBSD__) | |
| 753 | # if defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) | |
| 754 | 754 | # define _LIBCPP_HAS_DEFAULTRUNELOCALE |
| 755 | 755 | # endif |
| 756 | 756 | |
| 757 | # if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__) | |
| 757 | # if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__) || defined(__DragonFly__) | |
| 758 | 758 | # define _LIBCPP_WCTYPE_IS_MASK |
| 759 | 759 | # endif |
| 760 | 760 | |
| ... | ... | @@ -901,6 +901,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD |
| 901 | 901 | |
| 902 | 902 | # if defined(__FreeBSD__) || \ |
| 903 | 903 | defined(__wasi__) || \ |
| 904 | defined(__DragonFly__) || \ | |
| 904 | 905 | defined(__NetBSD__) || \ |
| 905 | 906 | defined(__OpenBSD__) || \ |
| 906 | 907 | defined(__NuttX__) || \ |
lib/libcxx/include/__locale+3-3| ... | ... | @@ -33,7 +33,7 @@ |
| 33 | 33 | # include <__support/newlib/xlocale.h> |
| 34 | 34 | #elif defined(__OpenBSD__) |
| 35 | 35 | # include <__support/openbsd/xlocale.h> |
| 36 | #elif (defined(__APPLE__) || defined(__FreeBSD__)) | |
| 36 | #elif (defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__)) | |
| 37 | 37 | # include <xlocale.h> |
| 38 | 38 | #elif defined(__Fuchsia__) |
| 39 | 39 | # include <__support/fuchsia/xlocale.h> |
| ... | ... | @@ -453,10 +453,10 @@ public: |
| 453 | 453 | static const mask __regex_word = 0x4000; // 0x8000 and 0x0100 and 0x00ff are used |
| 454 | 454 | # define _LIBCPP_CTYPE_MASK_IS_COMPOSITE_PRINT |
| 455 | 455 | # define _LIBCPP_CTYPE_MASK_IS_COMPOSITE_ALPHA |
| 456 | #elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__) | |
| 456 | #elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__) || defined(__DragonFly__) | |
| 457 | 457 | # ifdef __APPLE__ |
| 458 | 458 | typedef __uint32_t mask; |
| 459 | # elif defined(__FreeBSD__) | |
| 459 | # elif defined(__FreeBSD__) || defined(__DragonFly__) | |
| 460 | 460 | typedef unsigned long mask; |
| 461 | 461 | # elif defined(__EMSCRIPTEN__) || defined(__NetBSD__) |
| 462 | 462 | typedef unsigned short mask; |
lib/libcxx/include/locale+1-1| ... | ... | @@ -239,7 +239,7 @@ _LIBCPP_PUSH_MACROS |
| 239 | 239 | |
| 240 | 240 | _LIBCPP_BEGIN_NAMESPACE_STD |
| 241 | 241 | |
| 242 | #if defined(__APPLE__) || defined(__FreeBSD__) | |
| 242 | #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) | |
| 243 | 243 | # define _LIBCPP_GET_C_LOCALE 0 |
| 244 | 244 | #elif defined(__NetBSD__) |
| 245 | 245 | # define _LIBCPP_GET_C_LOCALE LC_C_LOCALE |
lib/libcxx/src/locale.cpp+1-1| ... | ... | @@ -1190,7 +1190,7 @@ ctype<char>::classic_table() noexcept |
| 1190 | 1190 | const ctype<char>::mask* |
| 1191 | 1191 | ctype<char>::classic_table() noexcept |
| 1192 | 1192 | { |
| 1193 | #if defined(__APPLE__) || defined(__FreeBSD__) | |
| 1193 | #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) | |
| 1194 | 1194 | return _DefaultRuneLocale.__runetype; |
| 1195 | 1195 | #elif defined(__NetBSD__) |
| 1196 | 1196 | return _C_ctype_tab_ + 1; |
lib/std/c/dragonfly.zig+2| ... | ... | @@ -12,6 +12,7 @@ pub extern "c" fn getdents(fd: c_int, buf_ptr: [*]u8, nbytes: usize) usize; |
| 12 | 12 | pub extern "c" fn sigaltstack(ss: ?*stack_t, old_ss: ?*stack_t) c_int; |
| 13 | 13 | pub extern "c" fn getrandom(buf_ptr: [*]u8, buf_len: usize, flags: c_uint) isize; |
| 14 | 14 | pub extern "c" fn pipe2(fds: *[2]fd_t, flags: u32) c_int; |
| 15 | pub extern "c" fn arc4random_buf(buf: [*]u8, len: usize) void; | |
| 15 | 16 | |
| 16 | 17 | pub const dl_iterate_phdr_callback = *const fn (info: *dl_phdr_info, size: usize, data: ?*anyopaque) callconv(.C) c_int; |
| 17 | 18 | pub extern "c" fn dl_iterate_phdr(callback: dl_iterate_phdr_callback, data: ?*anyopaque) c_int; |
| ... | ... | @@ -419,6 +420,7 @@ pub const F = struct { |
| 419 | 420 | pub const DUP2FD = 10; |
| 420 | 421 | pub const DUPFD_CLOEXEC = 17; |
| 421 | 422 | pub const DUP2FD_CLOEXEC = 18; |
| 423 | pub const GETPATH = 19; | |
| 422 | 424 | }; |
| 423 | 425 | |
| 424 | 426 | pub const FD_CLOEXEC = 1; |
lib/std/c/freebsd.zig+3| ... | ... | @@ -15,12 +15,15 @@ pub extern "c" fn pthread_getthreadid_np() c_int; |
| 15 | 15 | pub extern "c" fn pthread_set_name_np(thread: std.c.pthread_t, name: [*:0]const u8) void; |
| 16 | 16 | pub extern "c" fn pthread_get_name_np(thread: std.c.pthread_t, name: [*:0]u8, len: usize) void; |
| 17 | 17 | pub extern "c" fn pipe2(fds: *[2]fd_t, flags: u32) c_int; |
| 18 | pub extern "c" fn arc4random_buf(buf: [*]u8, len: usize) void; | |
| 18 | 19 | |
| 19 | 20 | pub extern "c" fn posix_memalign(memptr: *?*anyopaque, alignment: usize, size: usize) c_int; |
| 20 | 21 | pub extern "c" fn malloc_usable_size(?*const anyopaque) usize; |
| 21 | 22 | |
| 22 | 23 | pub extern "c" fn getpid() pid_t; |
| 23 | 24 | |
| 25 | pub extern "c" fn kinfo_getfile(pid: pid_t, cntp: *c_int) ?[*]kinfo_file; | |
| 26 | ||
| 24 | 27 | pub const sf_hdtr = extern struct { |
| 25 | 28 | headers: [*]const iovec_const, |
| 26 | 29 | hdr_cnt: c_int, |
lib/std/c/netbsd.zig+7-2| ... | ... | @@ -537,6 +537,7 @@ pub const KERN = struct { |
| 537 | 537 | }; |
| 538 | 538 | |
| 539 | 539 | pub const PATH_MAX = 1024; |
| 540 | pub const NAME_MAX = 255; | |
| 540 | 541 | pub const IOV_MAX = KERN.IOV_MAX; |
| 541 | 542 | |
| 542 | 543 | pub const STDIN_FILENO = 0; |
| ... | ... | @@ -689,13 +690,17 @@ pub const F = struct { |
| 689 | 690 | pub const SETFD = 2; |
| 690 | 691 | pub const GETFL = 3; |
| 691 | 692 | pub const SETFL = 4; |
| 692 | ||
| 693 | 693 | pub const GETOWN = 5; |
| 694 | 694 | pub const SETOWN = 6; |
| 695 | ||
| 696 | 695 | pub const GETLK = 7; |
| 697 | 696 | pub const SETLK = 8; |
| 698 | 697 | pub const SETLKW = 9; |
| 698 | pub const CLOSEM = 10; | |
| 699 | pub const MAXFD = 11; | |
| 700 | pub const DUPFD_CLOEXEC = 12; | |
| 701 | pub const GETNOSIGPIPE = 13; | |
| 702 | pub const SETNOSIGPIPE = 14; | |
| 703 | pub const GETPATH = 15; | |
| 699 | 704 | |
| 700 | 705 | pub const RDLCK = 1; |
| 701 | 706 | pub const WRLCK = 3; |
lib/std/c/openbsd.zig+1| ... | ... | @@ -417,6 +417,7 @@ pub const AI = struct { |
| 417 | 417 | }; |
| 418 | 418 | |
| 419 | 419 | pub const PATH_MAX = 1024; |
| 420 | pub const NAME_MAX = 255; | |
| 420 | 421 | pub const IOV_MAX = 1024; |
| 421 | 422 | |
| 422 | 423 | pub const STDIN_FILENO = 0; |
lib/std/fs.zig+3-3| ... | ... | @@ -34,7 +34,7 @@ pub const Watch = @import("fs/watch.zig").Watch; |
| 34 | 34 | /// fit into a UTF-8 encoded array of this length. |
| 35 | 35 | /// The byte count includes room for a null sentinel byte. |
| 36 | 36 | pub const MAX_PATH_BYTES = switch (builtin.os.tag) { |
| 37 | .linux, .macos, .ios, .freebsd, .netbsd, .dragonfly, .openbsd, .haiku, .solaris => os.PATH_MAX, | |
| 37 | .linux, .macos, .ios, .freebsd, .openbsd, .netbsd, .dragonfly, .haiku, .solaris => os.PATH_MAX, | |
| 38 | 38 | // Each UTF-16LE character may be expanded to 3 UTF-8 bytes. |
| 39 | 39 | // If it would require 4 UTF-8 bytes, then there would be a surrogate |
| 40 | 40 | // pair in the UTF-16LE, and we (over)account 3 bytes for it that way. |
| ... | ... | @@ -54,10 +54,10 @@ pub const MAX_PATH_BYTES = switch (builtin.os.tag) { |
| 54 | 54 | /// (depending on the platform) this assumption may not hold for every configuration. |
| 55 | 55 | /// The byte count does not include a null sentinel byte. |
| 56 | 56 | pub const MAX_NAME_BYTES = switch (builtin.os.tag) { |
| 57 | .linux, .macos, .ios, .freebsd, .dragonfly => os.NAME_MAX, | |
| 57 | .linux, .macos, .ios, .freebsd, .openbsd, .netbsd, .dragonfly => os.NAME_MAX, | |
| 58 | 58 | // Haiku's NAME_MAX includes the null terminator, so subtract one. |
| 59 | 59 | .haiku => os.NAME_MAX - 1, |
| 60 | .netbsd, .openbsd, .solaris => os.MAXNAMLEN, | |
| 60 | .solaris => os.system.MAXNAMLEN, | |
| 61 | 61 | // Each UTF-16LE character may be expanded to 3 UTF-8 bytes. |
| 62 | 62 | // If it would require 4 UTF-8 bytes, then there would be a surrogate |
| 63 | 63 | // pair in the UTF-16LE, and we (over)account 3 bytes for it that way. |
lib/std/fs/test.zig+2-2| ... | ... | @@ -446,8 +446,8 @@ test "file operations on directories" { |
| 446 | 446 | try testing.expectError(error.IsDir, tmp_dir.dir.createFile(test_dir_name, .{})); |
| 447 | 447 | try testing.expectError(error.IsDir, tmp_dir.dir.deleteFile(test_dir_name)); |
| 448 | 448 | switch (builtin.os.tag) { |
| 449 | // NetBSD does not error when reading a directory. | |
| 450 | .netbsd => {}, | |
| 449 | // no error when reading a directory. | |
| 450 | .dragonfly, .netbsd => {}, | |
| 451 | 451 | // Currently, WASI will return error.Unexpected (via ENOTCAPABLE) when attempting fd_read on a directory handle. |
| 452 | 452 | // TODO: Re-enable on WASI once https://github.com/bytecodealliance/wasmtime/issues/1935 is resolved. |
| 453 | 453 | .wasi => {}, |
lib/std/os.zig+80-9| ... | ... | @@ -2696,6 +2696,8 @@ pub fn mkdiratZ(dir_fd: fd_t, sub_dir_path: [*:0]const u8, mode: u32) MakeDirErr |
| 2696 | 2696 | .NOSPC => return error.NoSpaceLeft, |
| 2697 | 2697 | .NOTDIR => return error.NotDir, |
| 2698 | 2698 | .ROFS => return error.ReadOnlyFileSystem, |
| 2699 | // dragonfly: when dir_fd is unlinked from filesystem | |
| 2700 | .NOTCONN => return error.FileNotFound, | |
| 2699 | 2701 | else => |err| return unexpectedErrno(err), |
| 2700 | 2702 | } |
| 2701 | 2703 | } |
| ... | ... | @@ -5098,6 +5100,7 @@ pub fn getFdPath(fd: fd_t, out_buffer: *[MAX_PATH_BYTES]u8) RealPathError![]u8 { |
| 5098 | 5100 | switch (errno(system.fcntl(fd, F.GETPATH, out_buffer))) { |
| 5099 | 5101 | .SUCCESS => {}, |
| 5100 | 5102 | .BADF => return error.FileNotFound, |
| 5103 | .NOSPC => return error.NameTooLong, | |
| 5101 | 5104 | // TODO man pages for fcntl on macOS don't really tell you what |
| 5102 | 5105 | // errno values to expect when command is F.GETPATH... |
| 5103 | 5106 | else => |err| return unexpectedErrno(err), |
| ... | ... | @@ -5130,19 +5133,85 @@ pub fn getFdPath(fd: fd_t, out_buffer: *[MAX_PATH_BYTES]u8) RealPathError![]u8 { |
| 5130 | 5133 | return target; |
| 5131 | 5134 | }, |
| 5132 | 5135 | .freebsd => { |
| 5133 | comptime if (builtin.os.version_range.semver.max.order(.{ .major = 13, .minor = 0 }) == .lt) | |
| 5134 | @compileError("querying for canonical path of a handle is unsupported on FreeBSD 12 and below"); | |
| 5135 | ||
| 5136 | var kfile: system.kinfo_file = undefined; | |
| 5137 | kfile.structsize = system.KINFO_FILE_SIZE; | |
| 5138 | switch (errno(system.fcntl(fd, system.F.KINFO, @ptrToInt(&kfile)))) { | |
| 5136 | if (comptime builtin.os.version_range.semver.max.order(.{ .major = 13, .minor = 0 }) == .gt) { | |
| 5137 | var kfile: system.kinfo_file = undefined; | |
| 5138 | kfile.structsize = system.KINFO_FILE_SIZE; | |
| 5139 | switch (errno(system.fcntl(fd, system.F.KINFO, @ptrToInt(&kfile)))) { | |
| 5140 | .SUCCESS => {}, | |
| 5141 | .BADF => return error.FileNotFound, | |
| 5142 | else => |err| return unexpectedErrno(err), | |
| 5143 | } | |
| 5144 | const len = mem.indexOfScalar(u8, &kfile.path, 0) orelse MAX_PATH_BYTES; | |
| 5145 | if (len == 0) return error.NameTooLong; | |
| 5146 | mem.copy(u8, out_buffer, kfile.path[0..len]); | |
| 5147 | return out_buffer[0..len]; | |
| 5148 | } else { | |
| 5149 | // This fallback implementation reimplements libutil's `kinfo_getfile()`. | |
| 5150 | // The motivation is to avoid linking -lutil when building zig or general | |
| 5151 | // user executables. | |
| 5152 | var mib = [4]c_int{ CTL.KERN, KERN.PROC, KERN.PROC_FILEDESC, system.getpid() }; | |
| 5153 | var len: usize = undefined; | |
| 5154 | sysctl(&mib, null, &len, null, 0) catch |err| switch (err) { | |
| 5155 | error.PermissionDenied => unreachable, | |
| 5156 | error.SystemResources => return error.SystemResources, | |
| 5157 | error.NameTooLong => unreachable, | |
| 5158 | error.UnknownName => unreachable, | |
| 5159 | else => return error.Unexpected, | |
| 5160 | }; | |
| 5161 | len = len * 4 / 3; | |
| 5162 | const buf = std.heap.c_allocator.alloc(u8, len) catch return error.SystemResources; | |
| 5163 | defer std.heap.c_allocator.free(buf); | |
| 5164 | len = buf.len; | |
| 5165 | sysctl(&mib, &buf[0], &len, null, 0) catch |err| switch (err) { | |
| 5166 | error.PermissionDenied => unreachable, | |
| 5167 | error.SystemResources => return error.SystemResources, | |
| 5168 | error.NameTooLong => unreachable, | |
| 5169 | error.UnknownName => unreachable, | |
| 5170 | else => return error.Unexpected, | |
| 5171 | }; | |
| 5172 | var i: usize = 0; | |
| 5173 | while (i < len) { | |
| 5174 | const kf: *align(1) system.kinfo_file = @ptrCast(*align(1) system.kinfo_file, &buf[i]); | |
| 5175 | if (kf.fd == fd) { | |
| 5176 | len = mem.indexOfScalar(u8, &kf.path, 0) orelse MAX_PATH_BYTES; | |
| 5177 | if (len == 0) return error.NameTooLong; | |
| 5178 | mem.copy(u8, out_buffer, kf.path[0..len]); | |
| 5179 | return out_buffer[0..len]; | |
| 5180 | } | |
| 5181 | i += @intCast(usize, kf.structsize); | |
| 5182 | } | |
| 5183 | return error.InvalidHandle; | |
| 5184 | } | |
| 5185 | }, | |
| 5186 | .dragonfly => { | |
| 5187 | if (comptime builtin.os.version_range.semver.max.order(.{ .major = 6, .minor = 0 }) == .lt) { | |
| 5188 | @compileError("querying for canonical path of a handle is unsupported on this host"); | |
| 5189 | } | |
| 5190 | @memset(out_buffer, 0, MAX_PATH_BYTES); | |
| 5191 | switch (errno(system.fcntl(fd, F.GETPATH, out_buffer))) { | |
| 5139 | 5192 | .SUCCESS => {}, |
| 5140 | 5193 | .BADF => return error.FileNotFound, |
| 5194 | .RANGE => return error.NameTooLong, | |
| 5141 | 5195 | else => |err| return unexpectedErrno(err), |
| 5142 | 5196 | } |
| 5143 | ||
| 5144 | const len = mem.indexOfScalar(u8, &kfile.path, 0) orelse MAX_PATH_BYTES; | |
| 5145 | mem.copy(u8, out_buffer, kfile.path[0..len]); | |
| 5197 | const len = mem.indexOfScalar(u8, out_buffer[0..], @as(u8, 0)) orelse MAX_PATH_BYTES; | |
| 5198 | return out_buffer[0..len]; | |
| 5199 | }, | |
| 5200 | .netbsd => { | |
| 5201 | if (comptime builtin.os.version_range.semver.max.order(.{ .major = 10, .minor = 0 }) == .lt) { | |
| 5202 | @compileError("querying for canonical path of a handle is unsupported on this host"); | |
| 5203 | } | |
| 5204 | @memset(out_buffer, 0, MAX_PATH_BYTES); | |
| 5205 | switch (errno(system.fcntl(fd, F.GETPATH, out_buffer))) { | |
| 5206 | .SUCCESS => {}, | |
| 5207 | .ACCES => return error.AccessDenied, | |
| 5208 | .BADF => return error.FileNotFound, | |
| 5209 | .NOENT => return error.FileNotFound, | |
| 5210 | .NOMEM => return error.SystemResources, | |
| 5211 | .RANGE => return error.NameTooLong, | |
| 5212 | else => |err| return unexpectedErrno(err), | |
| 5213 | } | |
| 5214 | const len = mem.indexOfScalar(u8, out_buffer[0..], @as(u8, 0)) orelse MAX_PATH_BYTES; | |
| 5146 | 5215 | return out_buffer[0..len]; |
| 5147 | 5216 | }, |
| 5148 | 5217 | else => @compileError("querying for canonical path of a handle is unsupported on this host"), |
| ... | ... | @@ -6528,6 +6597,8 @@ pub fn memfd_createZ(name: [*:0]const u8, flags: u32) MemFdCreateError!fd_t { |
| 6528 | 6597 | } |
| 6529 | 6598 | }, |
| 6530 | 6599 | .freebsd => { |
| 6600 | if (comptime builtin.os.version_range.semver.max.order(.{ .major = 13, .minor = 0 }) == .lt) | |
| 6601 | @compileError("memfd_create is unavailable on FreeBSD < 13.0"); | |
| 6531 | 6602 | const rc = system.memfd_create(name, flags); |
| 6532 | 6603 | switch (errno(rc)) { |
| 6533 | 6604 | .SUCCESS => return rc, |
lib/std/os/test.zig+8-1| ... | ... | @@ -515,7 +515,14 @@ test "argsAlloc" { |
| 515 | 515 | |
| 516 | 516 | test "memfd_create" { |
| 517 | 517 | // memfd_create is only supported by linux and freebsd. |
| 518 | if (native_os != .linux and native_os != .freebsd) return error.SkipZigTest; | |
| 518 | switch (native_os) { | |
| 519 | .linux => {}, | |
| 520 | .freebsd => { | |
| 521 | if (comptime builtin.os.version_range.semver.max.order(.{ .major = 13, .minor = 0 }) == .lt) | |
| 522 | return error.SkipZigTest; | |
| 523 | }, | |
| 524 | else => return error.SkipZigTest, | |
| 525 | } | |
| 519 | 526 | |
| 520 | 527 | const fd = std.os.memfd_create("test", 0) catch |err| switch (err) { |
| 521 | 528 | // Related: https://github.com/ziglang/zig/issues/4019 |
lib/std/target.zig+4-4| ... | ... | @@ -273,7 +273,7 @@ pub const Target = struct { |
| 273 | 273 | .freebsd => return .{ |
| 274 | 274 | .semver = Version.Range{ |
| 275 | 275 | .min = .{ .major = 12, .minor = 0 }, |
| 276 | .max = .{ .major = 13, .minor = 0 }, | |
| 276 | .max = .{ .major = 13, .minor = 1 }, | |
| 277 | 277 | }, |
| 278 | 278 | }, |
| 279 | 279 | .macos => return switch (arch) { |
| ... | ... | @@ -312,19 +312,19 @@ pub const Target = struct { |
| 312 | 312 | .netbsd => return .{ |
| 313 | 313 | .semver = .{ |
| 314 | 314 | .min = .{ .major = 8, .minor = 0 }, |
| 315 | .max = .{ .major = 9, .minor = 1 }, | |
| 315 | .max = .{ .major = 10, .minor = 0 }, | |
| 316 | 316 | }, |
| 317 | 317 | }, |
| 318 | 318 | .openbsd => return .{ |
| 319 | 319 | .semver = .{ |
| 320 | 320 | .min = .{ .major = 6, .minor = 8 }, |
| 321 | .max = .{ .major = 6, .minor = 9 }, | |
| 321 | .max = .{ .major = 7, .minor = 2 }, | |
| 322 | 322 | }, |
| 323 | 323 | }, |
| 324 | 324 | .dragonfly => return .{ |
| 325 | 325 | .semver = .{ |
| 326 | 326 | .min = .{ .major = 5, .minor = 8 }, |
| 327 | .max = .{ .major = 6, .minor = 0 }, | |
| 327 | .max = .{ .major = 6, .minor = 4 }, | |
| 328 | 328 | }, |
| 329 | 329 | }, |
| 330 | 330 | .solaris => return .{ |
src/link/Elf.zig+6-12| ... | ... | @@ -3058,27 +3058,22 @@ const CsuObjects = struct { |
| 3058 | 3058 | |
| 3059 | 3059 | var result: CsuObjects = .{}; |
| 3060 | 3060 | |
| 3061 | // TODO: https://github.com/ziglang/zig/issues/4629 | |
| 3062 | // - use inline enum type | |
| 3063 | // - reduce to enum-literals for values | |
| 3064 | const Mode = enum { | |
| 3061 | // Flatten crt cases. | |
| 3062 | const mode: enum { | |
| 3065 | 3063 | dynamic_lib, |
| 3066 | 3064 | dynamic_exe, |
| 3067 | 3065 | dynamic_pie, |
| 3068 | 3066 | static_exe, |
| 3069 | 3067 | static_pie, |
| 3070 | }; | |
| 3071 | ||
| 3072 | // Flatten crt case types. | |
| 3073 | const mode: Mode = switch (link_options.output_mode) { | |
| 3068 | } = switch (link_options.output_mode) { | |
| 3074 | 3069 | .Obj => return CsuObjects{}, |
| 3075 | 3070 | .Lib => switch (link_options.link_mode) { |
| 3076 | .Dynamic => Mode.dynamic_lib, | |
| 3071 | .Dynamic => .dynamic_lib, | |
| 3077 | 3072 | .Static => return CsuObjects{}, |
| 3078 | 3073 | }, |
| 3079 | 3074 | .Exe => switch (link_options.link_mode) { |
| 3080 | .Dynamic => if (link_options.pie) Mode.dynamic_pie else Mode.dynamic_exe, | |
| 3081 | .Static => if (link_options.pie) Mode.static_pie else Mode.static_exe, | |
| 3075 | .Dynamic => if (link_options.pie) .dynamic_pie else .dynamic_exe, | |
| 3076 | .Static => if (link_options.pie) .static_pie else .static_exe, | |
| 3082 | 3077 | }, |
| 3083 | 3078 | }; |
| 3084 | 3079 | |
| ... | ... | @@ -3108,7 +3103,6 @@ const CsuObjects = struct { |
| 3108 | 3103 | // hosted-glibc provides crtbegin/end objects in platform/compiler-specific dirs |
| 3109 | 3104 | // and they are not known at comptime. For now null-out crtbegin/end objects; |
| 3110 | 3105 | // there is no feature loss, zig has never linked those objects in before. |
| 3111 | // TODO: probe for paths, ie. `cc -print-file-name` | |
| 3112 | 3106 | result.crtbegin = null; |
| 3113 | 3107 | result.crtend = null; |
| 3114 | 3108 | } else { |