Skip to content
SocketAddrFormat

SocketAddrFormat

Description

Render a SocketAddr back into a “ip:port” string. IPv6 addresses are emitted with [...] brackets so the output round-trips through SocketAddrParse.

Parameters

Name Direction Description
addr in Address to format.
alloc in Allocator backing the returned Str. Caller owns the result and must StrDeinit it.

Success

returns initialized Str.

Failure

returns empty Str if the address cannot be formatted (e.g. unknown family); logs the failure.

Usage example (Cross-references)

Usage examples (Cross-references)
                const struct sockaddr_in *sa = (const struct sockaddr_in *)addr->raw;
                if (!format_ipv4((const u8 *)&sa->sin_addr.s_addr, host_data, 48)) {
                    LOG_ERROR("SocketAddrFormat: format_ipv4 failed");
                    break;
                }
                const u8 *v6 = sa->sin6_addr.s6_addr;
                if (!format_ipv6(v6, host_data, 48)) {
                    LOG_ERROR("SocketAddrFormat: format_ipv6 failed");
                    break;
                }
                StrAppendFmt(&out, "[{}]:{}", (Zstr)host_data, (u32)port);
            } else {
                LOG_ERROR("SocketAddrFormat: unknown family {}", (u32)addr->family);
            }
        }
    
            VecForeachPtr(&addrs, a) {
                Str s = SocketAddrFormat(a, alloc);
                // Strip the trailing ":0" since we resolve with port=0; keep
                // bracket form on v6 to round-trip through SocketAddrParse.
    
    static void handle_connection(Allocator *alloc, Socket *client, const SocketAddr *upstream_addr) {
        Str peer_str = SocketAddrFormat(&client->peer, alloc);
    
        Socket upstream;
            return false;
        }
        Str  s  = SocketAddrFormat(ad, a);
        bool ok = (StrLen(&s) > 0) && ZstrCompare(StrBegin(&s), expect) == 0;
        StrDeinit(&s);
            return false;
        }
        Str  s  = SocketAddrFormat(ad, a);
        bool ok = (StrLen(&s) > 0) && ZstrCompare(StrBegin(&s), expect) == 0;
        StrDeinit(&s);
        bool       ok = SocketAddrParse(&addr, spec, SOCKET_KIND_TCP);
        if (ok) {
            Str r = SocketAddrFormat(&addr, a);
            ok    = StrLen(&r) > 0 && ZstrCompare(StrBegin(&r), expect) == 0;
            StrDeinit(&r);
        ok            = ok && local.length == 16u;
    
        Str s = SocketAddrFormat(&local, a);
        ok    = ok && StrLen(&s) > 0 && ZstrCompareN(StrBegin(&s), "127.0.0.1:", 10u) == 0;
        StrDeinit(&s);
            return false;
        }
        Str s = SocketAddrFormat(VecPtrAt(out, i), a);
        StrMergeR(buf, &s);
        StrDeinit(&s);
        bool ok = got && VecLen(&out) == 1 && VecPtrAt(&out, 0)->family == SOCKET_FAMILY_INET;
        if (ok) {
            Str s = SocketAddrFormat(VecPtrAt(&out, 0), a);
            ok    = (StrLen(&s) > 0) && ZstrCompare(StrBegin(&s), "203.0.113.7:9999") == 0;
            StrDeinit(&s);
        bool ok = got && VecLen(&out) == 1 && VecPtrAt(&out, 0)->family == SOCKET_FAMILY_INET6;
        if (ok) {
            Str s = SocketAddrFormat(VecPtrAt(&out, 0), a);
            // SocketAddrFormat emits the bracketed form for IPv6.
            ok = (StrLen(&s) > 0) && ZstrCompare(StrBegin(&s), "[::1]:443") == 0;
        if (ok) {
            VecForeachPtr(&out, ad) {
                Str s = SocketAddrFormat(ad, a);
                u64 L = StrLen(&s);
                if (L < 3 || StrBegin(&s)[L - 1] != '3' || StrBegin(&s)[L - 2] != '5' || StrBegin(&s)[L - 3] != ':') {
        bool ok = got && one.family == SOCKET_FAMILY_INET;
        if (ok) {
            Str s = SocketAddrFormat(&one, a);
            ok    = (StrLen(&s) > 0) && ZstrCompare(StrBegin(&s), "127.0.0.1:80") == 0;
            StrDeinit(&s);
            return false;
        }
        Str        local_str = SocketAddrFormat(&local, a);
        SocketAddr connect_addr;
        bool       parsed = SocketAddrParse(&connect_addr, (Zstr)StrBegin(&local_str), SOCKET_KIND_TCP);
                return false;
            }
            Str rendered = SocketAddrFormat(&addr, alloc_base);
            ok           = ok && StrLen(&rendered) > 0 && ZstrCompare(StrBegin(&rendered), "127.0.0.1:8080") == 0;
            StrDeinit(&rendered);
                return false;
            }
            Str rendered = SocketAddrFormat(&addr, alloc_base);
            ok           = ok && StrLen(&rendered) > 0 && ZstrCompare(StrBegin(&rendered), "[::1]:8080") == 0;
            StrDeinit(&rendered);
        }
    
        Str        local_str = SocketAddrFormat(&local, a);
        SocketAddr connect_addr;
        bool       parsed = SocketAddrParse(&connect_addr, (Zstr)StrBegin(&local_str), SOCKET_KIND_TCP);
        bool       ok = SocketAddrParse(&addr, spec, SOCKET_KIND_TCP);
        if (ok) {
            Str r = SocketAddrFormat(&addr, a);
            ok    = StrLen(&r) > 0 && ZstrCompare(StrBegin(&r), expect) == 0;
            StrDeinit(&r);
        ok = ok && addr.length == 16u;
    
        Str s = SocketAddrFormat(&addr, a);
        ok    = ok && StrLen(&s) > 0 && ZstrCompare(StrBegin(&s), "1.2.3.4:80") == 0;
        StrDeinit(&s);
        bool       ok = SocketAddrParse(&addr, "10.0.0.1:4660", SOCKET_KIND_TCP);
    
        Str s = SocketAddrFormat(&addr, a);
        ok    = ok && StrLen(&s) > 0 && ZstrCompare(StrBegin(&s), "10.0.0.1:4660") == 0;
        StrDeinit(&s);
    #endif
    
        Str s = SocketAddrFormat(&addr, a);
        ok    = ok && StrLen(&s) > 0 && ZstrCompare(StrBegin(&s), "[2001:db8::1]:443") == 0;
        StrDeinit(&s);
        ok            = ok && addr.family == SOCKET_FAMILY_INET6;
    
        Str s = SocketAddrFormat(&addr, a);
        ok    = ok && StrLen(&s) > 0 && ZstrCompare(StrBegin(&s), "[::1]:8080") == 0;
        StrDeinit(&s);
        ok = ok && local.length == 16u;
    
        Str s = SocketAddrFormat(&local, a);
        ok    = ok && StrLen(&s) > 0 && ZstrCompare(StrBegin(&s), "127.0.0.1:4660") == 0;
        StrDeinit(&s);
    
        // Rendered "127.0.0.1:<port>" with a nonzero ephemeral port.
        Str s = SocketAddrFormat(&local, a);
        ok    = ok && StrLen(&s) > 0;
        if (ok) {
            return false;
        }
        Str        local_str = SocketAddrFormat(&local, a);
        SocketAddr connect_addr;
        bool       parsed = SocketAddrParse(&connect_addr, (Zstr)StrBegin(&local_str), SOCKET_KIND_TCP);
            *local_out = local;
    
        Str        local_str = SocketAddrFormat(&local, a);
        SocketAddr connect_addr;
        bool       parsed = SocketAddrParse(&connect_addr, (Zstr)StrBegin(&local_str), SOCKET_KIND_TCP);
        // the *len_io capture). Format and check the loopback host prefix.
        {
            Str  peer = SocketAddrFormat(&server.peer, a);
            Zstr p    = StrBegin(&peer);
            ok        = ok && StrLen(&peer) > 0 && p[0] == '1' && p[1] == '2' && p[2] == '7' && p[3] == '.';
        // local must be a usable IPv4 address with a kernel-picked port that
        // formats to "127.0.0.1:<port>" with port in 1..65535.
        Str  rendered = SocketAddrFormat(&local, a);
        bool ok       = StrLen(&rendered) > 0;
        // must start with the loopback host and a colon, then a non-"0" port.
            ok           = ok && p;
            if (p) {
                Str r = SocketAddrFormat(&addr, a);
                ok    = ok && ZstrCompare(StrBegin(&r), "127.0.0.1:65535") == 0;
                StrDeinit(&r);
            ok           = ok && p;
            if (p) {
                Str r = SocketAddrFormat(&addr, a);
                ok    = ok && ZstrCompare(StrBegin(&r), "127.0.0.1:0") == 0;
                StrDeinit(&r);
            ok           = ok && p;
            if (p) {
                Str r = SocketAddrFormat(&addr, a);
                ok    = ok && ZstrCompare(StrBegin(&r), "1.2.3.4:4660") == 0;
                StrDeinit(&r);
        ok           = ok && p;
        if (p) {
            Str r = SocketAddrFormat(&addr, a);
            ok    = ok && ZstrCompare(StrBegin(&r), "1.2.3.4:4660") == 0;
            StrDeinit(&r);
        {
            SocketAddr empty = {0};
            Str        r     = SocketAddrFormat(&empty, a);
            ok               = ok && StrLen(&r) == 0;
            StrDeinit(&r);
            ok           = ok && p;
            if (p) {
                Str r = SocketAddrFormat(&addr, a);
                ok    = ok && ZstrCompare(StrBegin(&r), "[::1]:4660") == 0;
                StrDeinit(&r);
            return false;
        }
        Str  s  = SocketAddrFormat(ad, a);
        bool ok = (StrLen(&s) > 0) && ZstrCompare(StrBegin(&s), expect) == 0;
        StrDeinit(&s);
Last updated on