From 21914c7c01d8d1071034153451414719906167b8 Mon Sep 17 00:00:00 2001 From: David Senoner Date: Sat, 18 Apr 2026 07:30:43 +0200 Subject: [PATCH] ziglibc: migrate tee linux syscall (#31911) Add the Linux syscall wrapper for `tee`. Migrate the `tee` syscall from musl libc to zig libc. langref: note `ssize_t` and `isize` are ABI compatible Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31911 Reviewed-by: Andrew Kelley Co-authored-by: David Senoner Co-committed-by: David Senoner --- doc/langref.html.in | 2 +- lib/c/fcntl.zig | 5 +++++ lib/libc/musl/src/linux/tee.c | 8 -------- lib/std/os/linux.zig | 10 ++++++++++ src/libs/musl.zig | 1 - 5 files changed, 16 insertions(+), 10 deletions(-) delete mode 100644 lib/libc/musl/src/linux/tee.c diff --git a/doc/langref.html.in b/doc/langref.html.in index 2020d248c1..53ccac4803 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -525,7 +525,7 @@ {#syntax#}isize{#endsyntax#} - intptr_t + intptr_t, ssize_t signed pointer sized integer diff --git a/lib/c/fcntl.zig b/lib/c/fcntl.zig index 29788fa922..e9a0630552 100644 --- a/lib/c/fcntl.zig +++ b/lib/c/fcntl.zig @@ -12,6 +12,7 @@ comptime { symbol(&fallocateLinux, "fallocate"); symbol(&posix_fadviseLinux, "posix_fadvise"); symbol(&posix_fallocateLinux, "posix_fallocate"); + symbol(&teeLinux, "tee"); } } @@ -26,3 +27,7 @@ fn posix_fadviseLinux(fd: c_int, offset: off_t, len: off_t, advice: c_int) callc fn posix_fallocateLinux(fd: c_int, offset: off_t, len: off_t) callconv(.c) c_int { return errno(linux.fallocate(fd, 0, offset, len)); } + +fn teeLinux(src: c_int, dest: c_int, len: usize, flags: c_uint) callconv(.c) isize { + return errno(linux.tee(src, dest, len, flags)); +} diff --git a/lib/libc/musl/src/linux/tee.c b/lib/libc/musl/src/linux/tee.c deleted file mode 100644 index a24748cfb0..0000000000 --- a/lib/libc/musl/src/linux/tee.c +++ /dev/null @@ -1,8 +0,0 @@ -#define _GNU_SOURCE -#include -#include "syscall.h" - -ssize_t tee(int src, int dest, size_t len, unsigned flags) -{ - return syscall(SYS_tee, src, dest, len, flags); -} diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index ffe9ef15f3..8a3d1a3b76 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -2981,6 +2981,16 @@ pub fn map_shadow_stack(addr: usize, size: usize, flags: u32) usize { return syscall3(.map_shadow_stack, addr, size, flags); } +pub fn tee(src: fd_t, dest: fd_t, len: usize, flags: u32) usize { + return syscall4( + .tee, + @as(u32, @bitCast(src)), + @as(u32, @bitCast(dest)), + len, + flags, + ); +} + pub const Sysinfo = switch (native_abi) { .gnux32, .muslx32 => extern struct { /// Seconds since boot diff --git a/src/libs/musl.zig b/src/libs/musl.zig index f53b406568..beb1c2ceb8 100644 --- a/src/libs/musl.zig +++ b/src/libs/musl.zig @@ -745,7 +745,6 @@ const src_files = [_][]const u8{ "musl/src/linux/sync_file_range.c", "musl/src/linux/syncfs.c", "musl/src/linux/sysinfo.c", - "musl/src/linux/tee.c", "musl/src/linux/timerfd.c", "musl/src/linux/unshare.c", "musl/src/linux/utimes.c",