Commit 798bb0bc61

Bing Sun <subi.the.dream.walker@gmail.com>
2025-01-29 20:16:08
std.c: android bionic compatibility fixes (getrandom & getaddressinfo) (#22143)
Co-authored-by: Alex Rønne Petersen <alex@alexrp.com>
1 parent 249a20d
Changed files (1)
lib
std
lib/std/c.zig
@@ -3990,7 +3990,16 @@ pub const sigval = switch (native_os) {
     else => void,
 };
 
-pub const addrinfo = switch (native_os) {
+pub const addrinfo = if (builtin.abi.isAndroid()) extern struct {
+    flags: AI,
+    family: i32,
+    socktype: i32,
+    protocol: i32,
+    addrlen: socklen_t,
+    canonname: ?[*:0]u8,
+    addr: ?*sockaddr,
+    next: ?*addrinfo,
+} else switch (native_os) {
     .linux, .emscripten => linux.addrinfo,
     .windows => ws2_32.addrinfo,
     .freebsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct {
@@ -4374,7 +4383,52 @@ pub const sa_family_t = switch (native_os) {
     .solaris, .illumos => u16,
     else => void,
 };
-pub const AF = switch (native_os) {
+pub const AF = if (builtin.abi.isAndroid()) struct {
+    pub const UNSPEC = 0;
+    pub const UNIX = 1;
+    pub const LOCAL = 1;
+    pub const INET = 2;
+    pub const AX25 = 3;
+    pub const IPX = 4;
+    pub const APPLETALK = 5;
+    pub const NETROM = 6;
+    pub const BRIDGE = 7;
+    pub const ATMPVC = 8;
+    pub const X25 = 9;
+    pub const INET6 = 10;
+    pub const ROSE = 11;
+    pub const DECnet = 12;
+    pub const NETBEUI = 13;
+    pub const SECURITY = 14;
+    pub const KEY = 15;
+    pub const NETLINK = 16;
+    pub const ROUTE = NETLINK;
+    pub const PACKET = 17;
+    pub const ASH = 18;
+    pub const ECONET = 19;
+    pub const ATMSVC = 20;
+    pub const RDS = 21;
+    pub const SNA = 22;
+    pub const IRDA = 23;
+    pub const PPPOX = 24;
+    pub const WANPIPE = 25;
+    pub const LLC = 26;
+    pub const CAN = 29;
+    pub const TIPC = 30;
+    pub const BLUETOOTH = 31;
+    pub const IUCV = 32;
+    pub const RXRPC = 33;
+    pub const ISDN = 34;
+    pub const PHONET = 35;
+    pub const IEEE802154 = 36;
+    pub const CAIF = 37;
+    pub const ALG = 38;
+    pub const NFC = 39;
+    pub const VSOCK = 40;
+    pub const KCM = 41;
+    pub const QIPCRTR = 42;
+    pub const MAX = 43;
+} else switch (native_os) {
     .linux, .emscripten => linux.AF,
     .windows => ws2_32.AF,
     .macos, .ios, .tvos, .watchos, .visionos => struct {
@@ -4607,7 +4661,52 @@ pub const AF = switch (native_os) {
     },
     else => void,
 };
-pub const PF = switch (native_os) {
+pub const PF = if (builtin.abi.isAndroid()) struct {
+    pub const UNSPEC = AF.UNSPEC;
+    pub const UNIX = AF.UNIX;
+    pub const LOCAL = AF.LOCAL;
+    pub const INET = AF.INET;
+    pub const AX25 = AF.AX25;
+    pub const IPX = AF.IPX;
+    pub const APPLETALK = AF.APPLETALK;
+    pub const NETROM = AF.NETROM;
+    pub const BRIDGE = AF.BRIDGE;
+    pub const ATMPVC = AF.ATMPVC;
+    pub const X25 = AF.X25;
+    pub const PF_INET6 = AF.INET6;
+    pub const PF_ROSE = AF.ROSE;
+    pub const PF_DECnet = AF.DECnet;
+    pub const PF_NETBEUI = AF.NETBEUI;
+    pub const PF_SECURITY = AF.SECURITY;
+    pub const PF_KEY = AF.KEY;
+    pub const PF_NETLINK = AF.NETLINK;
+    pub const PF_ROUTE = AF.ROUTE;
+    pub const PF_PACKET = AF.PACKET;
+    pub const PF_ASH = AF.ASH;
+    pub const PF_ECONET = AF.ECONET;
+    pub const PF_ATMSVC = AF.ATMSVC;
+    pub const PF_RDS = AF.RDS;
+    pub const PF_SNA = AF.SNA;
+    pub const PF_IRDA = AF.IRDA;
+    pub const PF_PPPOX = AF.PPPOX;
+    pub const PF_WANPIPE = AF.WANPIPE;
+    pub const PF_LLC = AF.LLC;
+    pub const PF_CAN = AF.CAN;
+    pub const PF_TIPC = AF.TIPC;
+    pub const PF_BLUETOOTH = AF.BLUETOOTH;
+    pub const PF_IUCV = AF.IUCV;
+    pub const PF_RXRPC = AF.RXRPC;
+    pub const PF_ISDN = AF.ISDN;
+    pub const PF_PHONET = AF.PHONET;
+    pub const PF_IEEE802154 = AF.IEEE802154;
+    pub const PF_CAIF = AF.CAIF;
+    pub const PF_ALG = AF.ALG;
+    pub const PF_NFC = AF.NFC;
+    pub const PF_VSOCK = AF.VSOCK;
+    pub const PF_KCM = AF.KCM;
+    pub const PF_QIPCRTR = AF.QIPCRTR;
+    pub const PF_MAX = AF.MAX;
+} else switch (native_os) {
     .linux, .emscripten => linux.PF,
     .macos, .ios, .tvos, .watchos, .visionos => struct {
         pub const UNSPEC = AF.UNSPEC;
@@ -6241,7 +6340,18 @@ pub const dirent64 = switch (native_os) {
     else => void,
 };
 
-pub const AI = switch (native_os) {
+pub const AI = if (builtin.abi.isAndroid()) packed struct(u32) {
+    PASSIVE: bool = false,
+    CANONNAME: bool = false,
+    NUMERICHOST: bool = false,
+    NUMERICSERV: bool = false,
+    _4: u4 = 0,
+    ALL: bool = false,
+    V4MAPPED_CFG: bool = false,
+    ADDRCONFIG: bool = false,
+    V4MAPPED: bool = false,
+    _: u20 = 0,
+} else switch (native_os) {
     .linux, .emscripten => linux.AI,
     .dragonfly, .haiku, .freebsd => packed struct(u32) {
         PASSIVE: bool = false,
@@ -6320,7 +6430,40 @@ pub const NI = switch (native_os) {
     else => void,
 };
 
-pub const EAI = switch (native_os) {
+pub const EAI = if (builtin.abi.isAndroid()) enum(c_int) {
+    /// address family for hostname not supported
+    ADDRFAMILY = 1,
+    /// temporary failure in name resolution
+    AGAIN = 2,
+    /// invalid value for ai_flags
+    BADFLAGS = 3,
+    /// non-recoverable failure in name resolution
+    FAIL = 4,
+    /// ai_family not supported
+    FAMILY = 5,
+    /// memory allocation failure
+    MEMORY = 6,
+    /// no address associated with hostname
+    NODATA = 7,
+    /// hostname nor servname provided, or not known
+    NONAME = 8,
+    /// servname not supported for ai_socktype
+    SERVICE = 9,
+    /// ai_socktype not supported
+    SOCKTYPE = 10,
+    /// system error returned in errno
+    SYSTEM = 11,
+    /// invalid value for hints
+    BADHINTS = 12,
+    /// resolved protocol is unknown
+    PROTOCOL = 13,
+    /// argument buffer overflow
+    OVERFLOW = 14,
+
+    MAX = 15,
+
+    _,
+} else switch (native_os) {
     .linux, .emscripten => enum(c_int) {
         BADFLAGS = -1,
         NONAME = -2,
@@ -9087,7 +9230,11 @@ pub const getentropy = switch (native_os) {
 };
 pub const getrandom = switch (native_os) {
     .freebsd => private.getrandom,
-    .linux => if (versionCheck(.{ .major = 2, .minor = 25, .patch = 0 })) private.getrandom else {},
+    .linux => if (builtin.abi.isMusl() or
+        (builtin.abi.isGnu() and versionCheck(.{ .major = 2, .minor = 25, .patch = 0 })) or
+        (builtin.abi.isAndroid() and versionCheck(.{ .major = 28, .minor = 0, .patch = 0 })))
+        private.getrandom
+    else {},
     else => {},
 };