Path: blob/main/core/kernel/src/wasm/posix/netdb.zig
1068 views
pub fn keepalive() void {}1const std = @import("std");2const netdb = @cImport(@cInclude("netdb.h"));3const inet = @cImport(@cInclude("arpa/inet.h"));4const util = @import("util.zig");56export fn sendAddrinfo(ai_flags: c_int, ai_family: c_int, ai_socktype: c_int, ai_protocol: c_int, ai_addrlen: netdb.socklen_t, ai_addr: *netdb.sockaddr, ai_canonname: ?[*]u8, ai_next: ?*netdb.addrinfo) ?*netdb.addrinfo {7const addrinfo = util.mallocType(netdb.addrinfo, "sendAddrinfo") orelse return null;8addrinfo.ai_flags = ai_flags;9addrinfo.ai_family = ai_family;10addrinfo.ai_socktype = ai_socktype;11addrinfo.ai_protocol = ai_protocol;12addrinfo.ai_addrlen = ai_addrlen;13addrinfo.ai_addr = ai_addr;14addrinfo.ai_canonname = ai_canonname;15addrinfo.ai_next = ai_next;16return addrinfo;17}1819// part of the posix api20export fn freeaddrinfo(addrinfo: *netdb.addrinfo) void {21// This is complicated because it is a linked list, and22// also some fields in it are pointers.23if (addrinfo.ai_next != null) { // handle linked list part via recurssion (it is a small list)24freeaddrinfo(addrinfo.ai_next);25}26if (addrinfo.ai_canonname != null) {27std.c.free(addrinfo.ai_canonname);28}29std.c.free(addrinfo.ai_addr);30std.c.free(addrinfo);31}3233export fn recvAddr(addr: *anyopaque, addrtype: c_int) ?[*]u8 {34const dst = util.mallocString(40, "recvAddr") orelse return null;35if (inet.inet_ntop(addrtype, addr, dst, 40) == null) {36std.debug.print("recvAddr -- failed to convert address to string via inet_ntop\n", .{});37std.c.free(dst);38return null;39}40return dst;41}4243export fn sendHostent(h_name: [*:0]u8, h_aliases: [*c][*c]u8, h_addrtype: c_int, h_length: c_int, h_addr_list: [*c][*c]u8, h_addr_list_len: usize) ?*netdb.hostent {44const hostent = util.mallocType(netdb.hostent, "sendHostent") orelse return null;45hostent.h_name = h_name;46hostent.h_aliases = h_aliases;47hostent.h_addrtype = h_addrtype;48hostent.h_length = h_length;49var binary = if (h_addrtype == netdb.AF_INET) convert_h_addr_list_ToBinary_v4(h_addr_list, h_addr_list_len) else convert_h_addr_list_ToBinary_v6(h_addr_list, h_addr_list_len);50hostent.h_addr_list = binary orelse return null;51freeNullTerminatedArrayOfStrings(h_addr_list);52return hostent;53}5455fn freeNullTerminatedArrayOfStrings(v: [*c][*c]u8) void {56var i: usize = 0;57while (v[i] != null) : (i += 1) {58std.c.free(v[i]);59}60std.c.free(@ptrCast(*anyopaque, v));61}6263fn convert_h_addr_list_ToBinary_v4(h_addr_list: [*c][*c]u8, len: usize) ?[*c][*c]u8 {64// Need to use65// int inet_pton(int af, const char *restrict src, void *restrict dst);66// to convert the h_addr_list from text to binary form.67var h_addr_binary_list = util.mallocArray(*allowzero netdb.in_addr, len + 1, "convert_h_addr_list_ToBinary_v4") orelse return null;68var i: usize = 0;69while (i < len) : (i += 1) {70var dst = util.mallocType(netdb.in_addr, "allocating in_addr in convert_h_addr_list_ToBinary_v4") orelse return null;71const ret = inet.inet_pton(netdb.AF_INET, h_addr_list[i], dst);72if (ret != 1) {73// TODO: slight memory leak here!74std.debug.print("inet_pton failed when doing convert_h_addr_list_ToBinary_v4 - h_addr_list[{d}]='{s}', ret={d}\n", .{ i, h_addr_list[i], ret });75return null;76}77h_addr_binary_list[i] = dst;78}79h_addr_binary_list[len] = @intToPtr(*allowzero netdb.in_addr, 0);80return @ptrCast([*c][*c]u8, h_addr_binary_list);81}8283fn convert_h_addr_list_ToBinary_v6(h_addr_list: [*c][*c]u8, len: usize) ?[*c][*c]u8 {84var h_addr_binary_list = util.mallocArray(*allowzero netdb.in6_addr, len + 1, "convert_h_addr_list_ToBinary_v4") orelse return null;85var i: usize = 0;86while (i < len) : (i += 1) {87var dst = util.mallocType(netdb.in6_addr, "allocating in_addr in convert_h_addr_list_ToBinary_v4") orelse return null;88const ret = inet.inet_pton(netdb.AF_INET6, h_addr_list[i], dst);89if (ret != 1) {90// TODO: slight memory leak here!91std.debug.print("inet_pton failed when doing convert_h_addr_list_ToBinary_v4 - h_addr_list[{d}]='{s}', ret={d}\n", .{ i, h_addr_list[i], ret });92return null;93}94h_addr_binary_list[i] = dst;95}96h_addr_binary_list[len] = @intToPtr(*allowzero netdb.in6_addr, 0);97return @ptrCast([*c][*c]u8, h_addr_binary_list);98}99100pub const constants = .{101.c_import = netdb,102.names = [_][:0]const u8{103"AF_UNSPEC", "AF_UNIX", "AF_INET", "AF_INET6", // AF_= address format104"AI_PASSIVE", "AI_CANONNAME", "AI_NUMERICHOST", "AI_V4MAPPED", "AI_ALL", "AI_ADDRCONFIG", "AI_NUMERICSERV", // AI = address info105"EAI_BADFLAGS", "EAI_NONAME", "EAI_AGAIN", "EAI_FAIL", "EAI_FAMILY", "EAI_SOCKTYPE", "EAI_SERVICE", "EAI_MEMORY", "EAI_SYSTEM", "EAI_OVERFLOW", // errors for the getaddrinfo function106"SOCK_STREAM", "SOCK_DGRAM", "SOCK_CLOEXEC",107},108};109110111