From 0e45b9d5db6cd92578d1a1da13ff2c036603ff91 Mon Sep 17 00:00:00 2001 From: Brandon Black Date: Tue, 9 Sep 2025 16:46:33 -0500 Subject: [PATCH] std: add linger struct for SO.LINGER --- lib/std/c.zig | 31 +++++++++++++++++++++++++++++++ lib/std/os/linux.zig | 6 ++++++ lib/std/posix.zig | 1 + 3 files changed, 38 insertions(+) diff --git a/lib/std/c.zig b/lib/std/c.zig index 21d7ed1f2c..6576ba1c46 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -4124,6 +4124,37 @@ pub const itimerspec = switch (native_os) { }, else => void, }; +pub const linger = switch (native_os) { + .linux => linux.linger, + // https://github.com/freebsd/freebsd-src/blob/46347b3619757e3d683a87ca03efaf2ae242335f/sys/sys/socket.h#L200 + .freebsd, + // https://github.com/DragonFlyBSD/DragonFlyBSD/blob/6098912863ed4c7b3f70d7483910ce2956cf4ed3/sys/sys/socket.h#L158 + .dragonfly, + // https://github.com/NetBSD/src/blob/80bf25a5691072d4755e84567ccbdf0729370dea/sys/sys/socket.h#L183 + .netbsd, + // https://github.com/openbsd/src/blob/718a31b40d39fc6064de6355eb144e74633133fc/sys/sys/socket.h#L126 + .openbsd, + // https://github.com/kofemann/opensolaris/blob/80192cd83bf665e708269dae856f9145f7190f74/usr/src/uts/common/sys/socket.h#L214 + .solaris, + // https://github.com/illumos/illumos-gate/blob/608eb926e14f4ba4736b2d59e891335f1cba9e1e/usr/src/uts/common/sys/socket.h#L250 + .illumos, + // https://github.com/haiku/haiku/blob/2aab5f5f14aeb3f34c3a3d9a9064cc3c0d914bea/headers/posix/sys/socket.h#L87 + .haiku, + // https://github.com/SerenityOS/serenity/blob/5bd8af99be0bc4b2e14f361fd7d7590e6bcfa4d6/Kernel/API/POSIX/sys/socket.h#L122 + .serenity, + // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/sys/socket.h#L498 + .driverkit, + .ios, + .macos, + .tvos, + .watchos, + .visionos, + => extern struct { + onoff: i32, // non-zero to linger on close + linger: i32, // time to linger in seconds + }, + else => void, +}; pub const msghdr = switch (native_os) { .linux => linux.msghdr, .openbsd, diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index fa870e8f67..e6fcd08f19 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -4524,6 +4524,12 @@ pub const IPV6 = struct { pub const FREEBIND = 78; }; +// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/socket.h?id=b1e904999542ad6764eafa54545f1c55776006d1#n43 +pub const linger = extern struct { + onoff: i32, // non-zero to linger on close + linger: i32, // time to linger in seconds +}; + // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/in.h?id=64e844505bc08cde3f346f193cbbbab0096fef54#n250 pub const in_pktinfo = extern struct { ifindex: i32, diff --git a/lib/std/posix.zig b/lib/std/posix.zig index 67888de1bb..283bc9276c 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -137,6 +137,7 @@ pub const ifreq = system.ifreq; pub const in_pktinfo = system.in_pktinfo; pub const in6_pktinfo = system.in6_pktinfo; pub const ino_t = system.ino_t; +pub const linger = system.linger; pub const mcontext_t = system.mcontext_t; pub const mode_t = system.mode_t; pub const msghdr = system.msghdr;