#posix issue on macos

1 messages · Page 1 of 1 (latest)

zenith skiff
#
const std = @import("std");
const posix = std.posix;
const eprint = std.debug.print;

pub fn tcp_listen(ip: u32, port: u16) !posix.socket_t {
    const serverfd = try posix.socket(posix.AF.INET, posix.SOCK.STREAM, 0);
    errdefer posix.close(serverfd);
    //try posix.setsockopt(serverfd, posix.SOL.SOCKET, posix.SO.REUSEADDR, &[_]u8{1});

    var addr: posix.sockaddr.in = .{ .addr = ip, .port = port };
    try posix.bind(serverfd, @ptrCast(&addr), @sizeOf(@TypeOf(addr)));
    try posix.listen(serverfd, 32);

    return serverfd;
}

pub fn handle(clientfd: posix.socket_t) !void {
    var buff: [2046]u8 = undefined;
    _ = try posix.write(clientfd, "Hello, World !\n");
    const len = try posix.read(clientfd, &buff);
    if (buff[len - 1] == '\n') {
        eprint("=> {s}", .{buff[0..len]});
    } else {
        eprint("=> {s}\n", .{buff[0..len]});
    }
}

pub fn main() void {
    const ip: [4]u8 = .{ 127, 0, 0, 1 };
    const port: u16 = 8080;
    const serverfd = tcp_listen(@byteSwap(@as(u32, @bitCast(ip))), port) catch |err| {
        eprint("tcp_listen(): {s}\n", .{@errorName(err)});
        posix.exit(1);
    };
    defer posix.close(serverfd);

    while (true) {
        var caddr: posix.sockaddr.in = undefined;
        var caddrlen: u32 = undefined;
        const clientfd = posix.accept(serverfd, @ptrCast(&caddr), &caddrlen, 0) catch |err| {
            eprint("accept(): {s}\n", .{@errorName(err)});
            continue;
        };
        handle(clientfd) catch continue;
    }
}

I am getting an AddressNotAvailable, and when I try the setsockopt, I get a unreachable error because errno is set to INVAL, what am I doing wrong ?

mighty citrus
#

@dreamy salmon looks just like when I used zig fetch on a local tarball and the compiler reached unreachable code after getting error.INVAL

#

@zenith skiff this is likely a stdlib bug on macos related to the new posix changes