aboutsummaryrefslogtreecommitdiff
path: root/src/d_tcp_win.c
blob: e0331530ba2076cba4d9acf5faaa327e8f0f4636 (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

extern String d_get_hostname_ip(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?
    HOSTENT *host_info = gethostbyname(host_cstr);

    if (!host_info) {


        err = WSAGetLastError();

        switch (err) {
            case WSANOTINITIALISED:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: disgrace wasn't initialized, run d_init() before this call.");
                break;
            case WSAENETDOWN:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: network error.");
                break;
            case WSATRY_AGAIN:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: host not found (WSATRY_AGAIN).");
                break;
            case WSAHOST_NOT_FOUND:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: host not found (WSAHOST_NOT_FOUND).");
                break;
            case WSANO_DATA:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: no host data (WSA_NO_DATA).");
                break;
            case WSAEFAULT:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: host name is not valid.");
                break;
            default:
                cyn_log_write_cstring(CYN_LOG_ERROR, (u8*) "d_get_hostname_ip: unspecified error.");
                break;
        }

        return CLITERAL(String) {};
    }

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

        assert(host_info->h_length >= 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) {};
}


DHandle* d_tcp_connect(String ip, u16 port) {
    SOCKET sock;
    struct sockaddr_in addr_info;
    char *ip_addr_cstr;

    ip_addr_cstr = (char *) un_string_to_cstring(ip, un_alloc_temp_get());

    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (sock == INVALID_SOCKET) {
        return NULL;
    }

    addr_info.sin_family      = AF_INET;
    addr_info.sin_addr.s_addr = inet_addr(ip_addr_cstr);
    addr_info.sin_port        = htons(port);

    //connect()

}