aboutsummaryrefslogtreecommitdiff
path: root/src/d_linux.c
blob: 5ff6abd421f8048ceba94cad9cfeb8eae8d243b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
typedef struct DHandle {
    u64 type;
} DHandle; 

b32 d_init(void) {
    return true;
}

String d_hostname_ip_get(String host, Allocator alloc) {
    char *host_cstr;
    Allocator talloc;
    int err;
    String ip;

    talloc = un_alloc_temp_get();
    host_cstr = (char *) un_string_to_cstring(host, talloc);

    // @note, host_info can return multiple ip addresses?
    struct hostent *host_info = gethostbyname(host_cstr);

    if (!host_info) {
        err = h_errno;

        switch (err) {
            case TRY_AGAIN:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: host not found (TRY_AGAIN).");
                break;
            case HOST_NOT_FOUND:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: host not found (HOST_NOT_FOUND).");
                break;
            case NO_DATA:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: no host data (NO_DATA).");
                break;
            default:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: unspecified error.");
                break;
        }

        return CLITERAL(String) { 0 };
    }

    if (host_info) {
        assert(host_info->h_addrtype == AF_INET);

        assert(host_info->h_length >= (s32)sizeof(struct in_addr));
        ip = un_string_from_cstring(inet_ntoa(*(struct in_addr *)*host_info->h_addr_list));

        return un_string_copy(ip, alloc);
    }

    return CLITERAL(String) { 0 };
}

DHandle* d_tcp_connect(String ip, u16 port) {

}