Coverage Report

Created: 2025-10-08 19:34

/work/toxcore/tox_options.c
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: GPL-3.0-or-later
2
 * Copyright © 2016-2025 The TokTok team.
3
 * Copyright © 2013 Tox project.
4
 */
5
6
#include "tox_options.h"
7
8
#include <stdlib.h> // free, malloc, calloc
9
#include <string.h> // memcpy, strlen
10
11
#include "ccompat.h" // nullptr
12
13
#define SET_ERROR_PARAMETER(param, x) \
14
3.22k
    do {                              \
15
3.22k
        if (param != nullptr) {       \
16
1.38k
            *param = x;               \
17
1.38k
        }                             \
18
3.22k
    } while (0)
19
20
21
bool tox_options_get_ipv6_enabled(const Tox_Options *options)
22
3.20k
{
23
3.20k
    return options->ipv6_enabled;
24
3.20k
}
25
void tox_options_set_ipv6_enabled(Tox_Options *options, bool ipv6_enabled)
26
5.74k
{
27
5.74k
    options->ipv6_enabled = ipv6_enabled;
28
5.74k
}
29
bool tox_options_get_udp_enabled(const Tox_Options *options)
30
4.04k
{
31
4.04k
    return options->udp_enabled;
32
4.04k
}
33
void tox_options_set_udp_enabled(Tox_Options *options, bool udp_enabled)
34
3.27k
{
35
3.27k
    options->udp_enabled = udp_enabled;
36
3.27k
}
37
Tox_Proxy_Type tox_options_get_proxy_type(const Tox_Options *options)
38
3.19k
{
39
3.19k
    return options->proxy_type;
40
3.19k
}
41
void tox_options_set_proxy_type(Tox_Options *options, Tox_Proxy_Type proxy_type)
42
3.25k
{
43
3.25k
    options->proxy_type = proxy_type;
44
3.25k
}
45
const char *tox_options_get_proxy_host(const Tox_Options *options)
46
15
{
47
15
    return options->proxy_host;
48
15
}
49
bool tox_options_set_proxy_host(Tox_Options *options, const char *proxy_host)
50
6.07k
{
51
6.07k
    if (!options->experimental_owned_data) {
52
6.06k
        options->proxy_host = proxy_host;
53
6.06k
        return true;
54
6.06k
    }
55
56
3
    if (options->owned_proxy_host != nullptr) {
57
0
        free(options->owned_proxy_host);
58
0
        options->owned_proxy_host = nullptr;
59
0
    }
60
3
    if (proxy_host == nullptr) {
61
3
        options->proxy_host = nullptr;
62
3
        return true;
63
3
    }
64
65
0
    const size_t proxy_host_length = strlen(proxy_host) + 1;
66
0
    char *owned_ptr = (char *)malloc(proxy_host_length);
67
0
    if (owned_ptr == nullptr) {
68
0
        options->proxy_host = proxy_host;
69
0
        options->owned_proxy_host = nullptr;
70
0
        return false;
71
0
    }
72
73
0
    memcpy(owned_ptr, proxy_host, proxy_host_length);
74
0
    options->proxy_host = owned_ptr;
75
0
    options->owned_proxy_host = owned_ptr;
76
0
    return true;
77
0
}
78
uint16_t tox_options_get_proxy_port(const Tox_Options *options)
79
30
{
80
30
    return options->proxy_port;
81
30
}
82
void tox_options_set_proxy_port(Tox_Options *options, uint16_t proxy_port)
83
18
{
84
18
    options->proxy_port = proxy_port;
85
18
}
86
uint16_t tox_options_get_start_port(const Tox_Options *options)
87
3.20k
{
88
3.20k
    return options->start_port;
89
3.20k
}
90
void tox_options_set_start_port(Tox_Options *options, uint16_t start_port)
91
1.79k
{
92
1.79k
    options->start_port = start_port;
93
1.79k
}
94
uint16_t tox_options_get_end_port(const Tox_Options *options)
95
3.20k
{
96
3.20k
    return options->end_port;
97
3.20k
}
98
void tox_options_set_end_port(Tox_Options *options, uint16_t end_port)
99
1.79k
{
100
1.79k
    options->end_port = end_port;
101
1.79k
}
102
uint16_t tox_options_get_tcp_port(const Tox_Options *options)
103
3.20k
{
104
3.20k
    return options->tcp_port;
105
3.20k
}
106
void tox_options_set_tcp_port(Tox_Options *options, uint16_t tcp_port)
107
888
{
108
888
    options->tcp_port = tcp_port;
109
888
}
110
bool tox_options_get_hole_punching_enabled(const Tox_Options *options)
111
3.20k
{
112
3.20k
    return options->hole_punching_enabled;
113
3.20k
}
114
void tox_options_set_hole_punching_enabled(Tox_Options *options, bool hole_punching_enabled)
115
3.22k
{
116
3.22k
    options->hole_punching_enabled = hole_punching_enabled;
117
3.22k
}
118
Tox_Savedata_Type tox_options_get_savedata_type(const Tox_Options *options)
119
9.61k
{
120
9.61k
    return options->savedata_type;
121
9.61k
}
122
void tox_options_set_savedata_type(Tox_Options *options, Tox_Savedata_Type savedata_type)
123
1.46k
{
124
1.46k
    options->savedata_type = savedata_type;
125
1.46k
}
126
size_t tox_options_get_savedata_length(const Tox_Options *options)
127
4.34k
{
128
4.34k
    return options->savedata_length;
129
4.34k
}
130
void tox_options_set_savedata_length(Tox_Options *options, size_t savedata_length)
131
0
{
132
0
    options->savedata_length = savedata_length;
133
0
}
134
tox_log_cb *tox_options_get_log_callback(const Tox_Options *options)
135
3.19k
{
136
3.19k
    return options->log_callback;
137
3.19k
}
138
void tox_options_set_log_callback(Tox_Options *options, tox_log_cb *log_callback)
139
1.82k
{
140
1.82k
    options->log_callback = log_callback;
141
1.82k
}
142
void *tox_options_get_log_user_data(const Tox_Options *options)
143
3.19k
{
144
3.19k
    return options->log_user_data;
145
3.19k
}
146
void tox_options_set_log_user_data(Tox_Options *options, void *log_user_data)
147
1.79k
{
148
1.79k
    options->log_user_data = log_user_data;
149
1.79k
}
150
bool tox_options_get_local_discovery_enabled(const Tox_Options *options)
151
3.20k
{
152
3.20k
    return options->local_discovery_enabled;
153
3.20k
}
154
void tox_options_set_local_discovery_enabled(Tox_Options *options, bool local_discovery_enabled)
155
5.02k
{
156
5.02k
    options->local_discovery_enabled = local_discovery_enabled;
157
5.02k
}
158
bool tox_options_get_dht_announcements_enabled(const Tox_Options *options)
159
3.20k
{
160
3.20k
    return options->dht_announcements_enabled;
161
3.20k
}
162
void tox_options_set_dht_announcements_enabled(Tox_Options *options, bool dht_announcements_enabled)
163
3.22k
{
164
3.22k
    options->dht_announcements_enabled = dht_announcements_enabled;
165
3.22k
}
166
bool tox_options_get_experimental_thread_safety(const Tox_Options *options)
167
3.17k
{
168
3.17k
    return options->experimental_thread_safety;
169
3.17k
}
170
void tox_options_set_experimental_thread_safety(
171
    Tox_Options *options, bool experimental_thread_safety)
172
3.22k
{
173
3.22k
    options->experimental_thread_safety = experimental_thread_safety;
174
3.22k
}
175
bool tox_options_get_experimental_groups_persistence(const Tox_Options *options)
176
3.20k
{
177
3.20k
    return options->experimental_groups_persistence;
178
3.20k
}
179
void tox_options_set_experimental_groups_persistence(
180
    Tox_Options *options, bool experimental_groups_persistence)
181
4.83k
{
182
4.83k
    options->experimental_groups_persistence = experimental_groups_persistence;
183
4.83k
}
184
bool tox_options_get_experimental_disable_dns(const Tox_Options *options)
185
3.22k
{
186
3.22k
    return options->experimental_disable_dns;
187
3.22k
}
188
void tox_options_set_experimental_disable_dns(Tox_Options *options, bool experimental_disable_dns)
189
3.22k
{
190
3.22k
    options->experimental_disable_dns = experimental_disable_dns;
191
3.22k
}
192
bool tox_options_get_experimental_owned_data(const Tox_Options *options)
193
0
{
194
0
    return options->experimental_owned_data;
195
0
}
196
void tox_options_set_experimental_owned_data(
197
    Tox_Options *options, bool experimental_owned_data)
198
3.25k
{
199
3.25k
    options->experimental_owned_data = experimental_owned_data;
200
3.25k
}
201
202
const uint8_t *tox_options_get_savedata_data(const Tox_Options *options)
203
4.34k
{
204
4.34k
    return options->savedata_data;
205
4.34k
}
206
207
bool tox_options_set_savedata_data(Tox_Options *options, const uint8_t *savedata_data, size_t length)
208
7.52k
{
209
7.52k
    if (!options->experimental_owned_data) {
210
7.48k
        options->savedata_data = savedata_data;
211
7.48k
        options->savedata_length = length;
212
7.48k
        return true;
213
7.48k
    }
214
215
36
    if (options->owned_savedata_data != nullptr) {
216
3
        free(options->owned_savedata_data);
217
3
        options->owned_savedata_data = nullptr;
218
3
    }
219
36
    if (savedata_data == nullptr) {
220
3
        options->savedata_data = nullptr;
221
3
        options->savedata_length = 0;
222
3
        return true;
223
3
    }
224
225
33
    uint8_t *owned_ptr = (uint8_t *)malloc(length);
226
33
    if (owned_ptr == nullptr) {
227
1
        options->savedata_data = savedata_data;
228
1
        options->savedata_length = length;
229
1
        options->owned_savedata_data = nullptr;
230
1
        return false;
231
1
    }
232
233
32
    memcpy(owned_ptr, savedata_data, length);
234
32
    options->savedata_data = owned_ptr;
235
32
    options->savedata_length = length;
236
32
    options->owned_savedata_data = owned_ptr;
237
32
    return true;
238
33
}
239
240
void tox_options_default(Tox_Options *options)
241
3.22k
{
242
3.22k
    if (options != nullptr) {
243
        // Free any owned data.
244
3.22k
        tox_options_set_proxy_host(options, nullptr);
245
3.22k
        tox_options_set_savedata_data(options, nullptr, 0);
246
247
        // Set the rest to default values.
248
3.22k
        const Tox_Options default_options = {false};
249
3.22k
        *options = default_options;
250
3.22k
        tox_options_set_ipv6_enabled(options, true);
251
3.22k
        tox_options_set_udp_enabled(options, true);
252
3.22k
        tox_options_set_proxy_type(options, TOX_PROXY_TYPE_NONE);
253
3.22k
        tox_options_set_hole_punching_enabled(options, true);
254
3.22k
        tox_options_set_local_discovery_enabled(options, true);
255
3.22k
        tox_options_set_dht_announcements_enabled(options, true);
256
3.22k
        tox_options_set_experimental_thread_safety(options, false);
257
3.22k
        tox_options_set_experimental_groups_persistence(options, false);
258
3.22k
        tox_options_set_experimental_disable_dns(options, false);
259
3.22k
        tox_options_set_experimental_owned_data(options, false);
260
3.22k
    }
261
3.22k
}
262
263
Tox_Options *tox_options_new(Tox_Err_Options_New *error)
264
3.22k
{
265
3.22k
    Tox_Options *options = (Tox_Options *)calloc(1, sizeof(Tox_Options));
266
267
3.22k
    if (options != nullptr) {
268
3.22k
        tox_options_default(options);
269
3.22k
        SET_ERROR_PARAMETER(error, TOX_ERR_OPTIONS_NEW_OK);
270
3.22k
        return options;
271
3.22k
    }
272
273
2
    SET_ERROR_PARAMETER(error, TOX_ERR_OPTIONS_NEW_MALLOC);
274
2
    return nullptr;
275
3.22k
}
276
277
void tox_options_free(Tox_Options *options)
278
6.03k
{
279
6.03k
    if (options != nullptr) {
280
        // Free any owned data.
281
2.82k
        tox_options_set_proxy_host(options, nullptr);
282
2.82k
        tox_options_set_savedata_data(options, nullptr, 0);
283
2.82k
        free(options);
284
2.82k
    }
285
6.03k
}