Skip to content
SocketAddrParse

SocketAddrParse

Description

Str overload of SocketAddrParse. Identical contract to the Zstr arm above; provided so callers holding a Str don’t have to reach into .data. The _Generic macro below routes through this for Str * / const Str * inputs.

Success

Returns true; *out populated.

Failure

Returns false; *out zeroed. Silent (no log) — caller is expected to chain into DNS for the hostname case.

Usage example (Cross-references)

Usage examples (Cross-references)
        // the network.
        SocketAddr direct;
        if (SocketAddrParse(&direct, spec, kind)) {
            VecPushBackR(out, direct);
            return true;
    bool socket_addr_parse_zstr(SocketAddr *out, Zstr spec, SocketKind kind) {
        if (!out) {
            LOG_FATAL("SocketAddrParse: out is NULL");
        }
        MemSet(out, 0, sizeof(*out));
    bool socket_addr_parse_str(SocketAddr *out, const Str *spec, SocketKind kind) {
        if (!out) {
            LOG_FATAL("SocketAddrParse: out is NULL");
        }
        MemSet(out, 0, sizeof(*out));
    
        SocketAddr addr;
        bool       ok = SocketAddrParse(&addr, spec, SOCKET_KIND_TCP);
        if (ok) {
            Str r = SocketAddrFormat(&addr, a);
    
        SocketAddr bind_addr;
        if (!SocketAddrParse(&bind_addr, "127.0.0.1:0", SOCKET_KIND_TCP)) {
            DefaultAllocatorDeinit(&alloc);
            return false;
    
        SocketAddr bind_addr;
        if (!SocketAddrParse(&bind_addr, "127.0.0.1:0", SOCKET_KIND_TCP)) {
            DefaultAllocatorDeinit(&alloc);
            return false;
        Str        local_str = SocketAddrFormat(&local, a);
        SocketAddr connect_addr;
        bool       parsed = SocketAddrParse(&connect_addr, (Zstr)StrBegin(&local_str), SOCKET_KIND_TCP);
        StrDeinit(&local_str);
        if (!parsed) {
        {
            SocketAddr addr;
            if (!SocketAddrParse(&addr, "127.0.0.1:8080", SOCKET_KIND_TCP)) {
                DefaultAllocatorDeinit(&alloc);
                return false;
        {
            SocketAddr addr;
            if (!SocketAddrParse(&addr, "[::1]:8080", SOCKET_KIND_TCP)) {
                DefaultAllocatorDeinit(&alloc);
                return false;
    
        SocketAddr bind_addr;
        if (!SocketAddrParse(&bind_addr, "127.0.0.1:0", SOCKET_KIND_TCP))
            return p;
        Str        local_str = SocketAddrFormat(&local, a);
        SocketAddr connect_addr;
        bool       parsed = SocketAddrParse(&connect_addr, (Zstr)StrBegin(&local_str), SOCKET_KIND_TCP);
        StrDeinit(&local_str);
        if (!parsed) {
    
        SocketAddr addr;
        bool       ok = SocketAddrParse(&addr, spec, SOCKET_KIND_TCP);
        if (ok) {
            Str r = SocketAddrFormat(&addr, a);
    
        SocketAddr addr;
        bool       ok = SocketAddrParse(&addr, "1.2.3.4:80", SOCKET_KIND_TCP);
        ok            = ok && addr.family == SOCKET_FAMILY_INET;
        // length must be the real sockaddr_in size (16), not a mutated constant.
    
        SocketAddr addr;
        bool       ok = SocketAddrParse(&addr, "10.0.0.1:4660", SOCKET_KIND_TCP);
    
        Str s = SocketAddrFormat(&addr, a);
    
        SocketAddr addr;
        bool       ok = SocketAddrParse(&addr, "[2001:db8::1]:443", SOCKET_KIND_TCP);
        ok            = ok && addr.family == SOCKET_FAMILY_INET6;
        ok            = ok && addr.length == 28u; // sizeof(struct sockaddr_in6)
    
        SocketAddr addr;
        bool       ok = SocketAddrParse(&addr, "[::1]:8080", SOCKET_KIND_TCP);
        ok            = ok && addr.family == SOCKET_FAMILY_INET6;
    bool test_sk3_parse_no_port_rejected(void) {
        SocketAddr addr;
        bool       parsed = SocketAddrParse(&addr, "127.0.0.1", SOCKET_KIND_TCP);
        return parsed == false;
    }
    bool test_sk3_parse_port_overflow_rejected(void) {
        SocketAddr addr;
        bool       parsed = SocketAddrParse(&addr, "1.2.3.4:99999", SOCKET_KIND_TCP);
        return parsed == false;
    }
    bool test_sk3_parse_empty_port_rejected(void) {
        SocketAddr addr;
        bool       parsed = SocketAddrParse(&addr, "1.2.3.4:", SOCKET_KIND_TCP);
        return parsed == false;
    }
    bool test_sk3_parse_unmatched_bracket_rejected(void) {
        SocketAddr addr;
        bool       parsed = SocketAddrParse(&addr, "[::1", SOCKET_KIND_TCP);
        return parsed == false;
    }
    bool test_sk3_parse_empty_rejected(void) {
        SocketAddr addr;
        bool       parsed = SocketAddrParse(&addr, "", SOCKET_KIND_TCP);
        return parsed == false;
    }
    bool test_sk3_parse_bracket_missing_colon_rejected(void) {
        SocketAddr addr;
        bool       parsed = SocketAddrParse(&addr, "[::1]8080", SOCKET_KIND_TCP);
        return parsed == false;
    }
    
        SocketAddr bind_addr;
        if (!SocketAddrParse(&bind_addr, "127.0.0.1:4660", SOCKET_KIND_TCP)) {
            DefaultAllocatorDeinit(&alloc);
            return false;
    
        SocketAddr bind_addr;
        if (!SocketAddrParse(&bind_addr, "127.0.0.1:0", SOCKET_KIND_TCP)) {
            DefaultAllocatorDeinit(&alloc);
            return false;
    
        SocketAddr bind_addr;
        if (!SocketAddrParse(&bind_addr, "127.0.0.1:0", SOCKET_KIND_TCP)) {
            DefaultAllocatorDeinit(&alloc);
            return false;
        Str        local_str = SocketAddrFormat(&local, a);
        SocketAddr connect_addr;
        bool       parsed = SocketAddrParse(&connect_addr, (Zstr)StrBegin(&local_str), SOCKET_KIND_TCP);
        StrDeinit(&local_str);
        if (!parsed) {
    bool test_sk3_nonblocking_set_true_returns_true(void) {
        SocketAddr bind_addr;
        if (!SocketAddrParse(&bind_addr, "127.0.0.1:0", SOCKET_KIND_TCP)) {
            return false;
        }
    
        SocketAddr bind_addr;
        if (!SocketAddrParse(&bind_addr, "127.0.0.1:0", SOCKET_KIND_TCP))
            return false;
        Str        local_str = SocketAddrFormat(&local, a);
        SocketAddr connect_addr;
        bool       parsed = SocketAddrParse(&connect_addr, (Zstr)StrBegin(&local_str), SOCKET_KIND_TCP);
        StrDeinit(&local_str);
        if (!parsed) {
        {
            SocketAddr addr;
            bool       p = SocketAddrParse(&addr, "127.0.0.1:65535", SOCKET_KIND_TCP);
            ok           = ok && p;
            if (p) {
        {
            SocketAddr addr;
            bool       p = SocketAddrParse(&addr, "127.0.0.1:0", SOCKET_KIND_TCP);
            ok           = ok && p;
            if (p) {
        {
            SocketAddr addr;
            bool       p = SocketAddrParse(&addr, "1.2.3.4:4660", SOCKET_KIND_TCP);
            ok           = ok && p;
            if (p) {
        {
            SocketAddr addr;
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:65536", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:99999", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:abc", SOCKET_KIND_TCP);
            SocketAddr addr;
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:65536", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:99999", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:abc", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:65536", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:99999", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:abc", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:", SOCKET_KIND_TCP);
        }
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:99999", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:abc", SOCKET_KIND_TCP);
            ok = ok && !SocketAddrParse(&addr, "127.0.0.1:", SOCKET_KIND_TCP);
        }
        {
            SocketAddr addr;
            bool       p = SocketAddrParse(&addr, "[::1]:4660", SOCKET_KIND_TCP);
            ok           = ok && p;
            if (p) {
Last updated on