/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-2026 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 | 2.23k | do { \ |
15 | 2.23k | if (param != nullptr) { \ |
16 | 1.40k | *param = x; \ |
17 | 1.40k | } \ |
18 | 2.23k | } while (0) |
19 | | |
20 | | |
21 | | bool tox_options_get_ipv6_enabled(const Tox_Options *_Nonnull options) |
22 | 1.88k | { |
23 | 1.88k | return options->ipv6_enabled; |
24 | 1.88k | } |
25 | | void tox_options_set_ipv6_enabled(Tox_Options *_Nonnull options, bool ipv6_enabled) |
26 | 2.55k | { |
27 | 2.55k | options->ipv6_enabled = ipv6_enabled; |
28 | 2.55k | } |
29 | | bool tox_options_get_udp_enabled(const Tox_Options *_Nonnull options) |
30 | 1.88k | { |
31 | 1.88k | return options->udp_enabled; |
32 | 1.88k | } |
33 | | void tox_options_set_udp_enabled(Tox_Options *_Nonnull options, bool udp_enabled) |
34 | 2.24k | { |
35 | 2.24k | options->udp_enabled = udp_enabled; |
36 | 2.24k | } |
37 | | Tox_Proxy_Type tox_options_get_proxy_type(const Tox_Options *_Nonnull options) |
38 | 1.88k | { |
39 | 1.88k | return options->proxy_type; |
40 | 1.88k | } |
41 | | void tox_options_set_proxy_type(Tox_Options *_Nonnull options, Tox_Proxy_Type proxy_type) |
42 | 2.31k | { |
43 | 2.31k | options->proxy_type = proxy_type; |
44 | 2.31k | } |
45 | | const char *_Nullable tox_options_get_proxy_host(const Tox_Options *_Nonnull options) |
46 | 75 | { |
47 | 75 | return options->proxy_host; |
48 | 75 | } |
49 | | bool tox_options_set_proxy_host(Tox_Options *_Nonnull options, const char *_Nullable proxy_host) |
50 | 4.93k | { |
51 | 4.93k | if (!options->experimental_owned_data) { |
52 | 4.93k | options->proxy_host = proxy_host; |
53 | 4.93k | return true; |
54 | 4.93k | } |
55 | | |
56 | 1 | if (options->owned_proxy_host != nullptr) { |
57 | 0 | free(options->owned_proxy_host); |
58 | 0 | options->owned_proxy_host = nullptr; |
59 | 0 | } |
60 | 1 | if (proxy_host == nullptr) { |
61 | 1 | options->proxy_host = nullptr; |
62 | 1 | return true; |
63 | 1 | } |
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 *_Nonnull options) |
79 | 150 | { |
80 | 150 | return options->proxy_port; |
81 | 150 | } |
82 | | void tox_options_set_proxy_port(Tox_Options *_Nonnull options, uint16_t proxy_port) |
83 | 78 | { |
84 | 78 | options->proxy_port = proxy_port; |
85 | 78 | } |
86 | | uint16_t tox_options_get_start_port(const Tox_Options *_Nonnull options) |
87 | 2.22k | { |
88 | 2.22k | return options->start_port; |
89 | 2.22k | } |
90 | | void tox_options_set_start_port(Tox_Options *_Nonnull options, uint16_t start_port) |
91 | 373 | { |
92 | 373 | options->start_port = start_port; |
93 | 373 | } |
94 | | uint16_t tox_options_get_end_port(const Tox_Options *_Nonnull options) |
95 | 2.22k | { |
96 | 2.22k | return options->end_port; |
97 | 2.22k | } |
98 | | void tox_options_set_end_port(Tox_Options *_Nonnull options, uint16_t end_port) |
99 | 373 | { |
100 | 373 | options->end_port = end_port; |
101 | 373 | } |
102 | | uint16_t tox_options_get_tcp_port(const Tox_Options *_Nonnull options) |
103 | 2.22k | { |
104 | 2.22k | return options->tcp_port; |
105 | 2.22k | } |
106 | | void tox_options_set_tcp_port(Tox_Options *_Nonnull options, uint16_t tcp_port) |
107 | 48 | { |
108 | 48 | options->tcp_port = tcp_port; |
109 | 48 | } |
110 | | bool tox_options_get_hole_punching_enabled(const Tox_Options *_Nonnull options) |
111 | 1.88k | { |
112 | 1.88k | return options->hole_punching_enabled; |
113 | 1.88k | } |
114 | | void tox_options_set_hole_punching_enabled(Tox_Options *_Nonnull options, bool hole_punching_enabled) |
115 | 2.23k | { |
116 | 2.23k | options->hole_punching_enabled = hole_punching_enabled; |
117 | 2.23k | } |
118 | | Tox_Savedata_Type tox_options_get_savedata_type(const Tox_Options *_Nonnull options) |
119 | 5.66k | { |
120 | 5.66k | return options->savedata_type; |
121 | 5.66k | } |
122 | | void tox_options_set_savedata_type(Tox_Options *_Nonnull options, Tox_Savedata_Type savedata_type) |
123 | 1.38k | { |
124 | 1.38k | options->savedata_type = savedata_type; |
125 | 1.38k | } |
126 | | size_t tox_options_get_savedata_length(const Tox_Options *_Nonnull options) |
127 | 4.16k | { |
128 | 4.16k | return options->savedata_length; |
129 | 4.16k | } |
130 | | void tox_options_set_savedata_length(Tox_Options *_Nonnull options, size_t savedata_length) |
131 | 0 | { |
132 | 0 | options->savedata_length = savedata_length; |
133 | 0 | } |
134 | | tox_log_cb *_Nullable tox_options_get_log_callback(const Tox_Options *_Nonnull options) |
135 | 1.88k | { |
136 | 1.88k | return options->log_callback; |
137 | 1.88k | } |
138 | | void tox_options_set_log_callback(Tox_Options *_Nonnull options, tox_log_cb *_Nullable log_callback) |
139 | 477 | { |
140 | 477 | options->log_callback = log_callback; |
141 | 477 | } |
142 | | void *_Nullable tox_options_get_log_user_data(const Tox_Options *_Nonnull options) |
143 | 1.88k | { |
144 | 1.88k | return options->log_user_data; |
145 | 1.88k | } |
146 | | void tox_options_set_log_user_data(Tox_Options *_Nonnull options, void *_Nullable log_user_data) |
147 | 377 | { |
148 | 377 | options->log_user_data = log_user_data; |
149 | 377 | } |
150 | | bool tox_options_get_local_discovery_enabled(const Tox_Options *_Nonnull options) |
151 | 1.88k | { |
152 | 1.88k | return options->local_discovery_enabled; |
153 | 1.88k | } |
154 | | void tox_options_set_local_discovery_enabled(Tox_Options *_Nonnull options, bool local_discovery_enabled) |
155 | 2.53k | { |
156 | 2.53k | options->local_discovery_enabled = local_discovery_enabled; |
157 | 2.53k | } |
158 | | bool tox_options_get_dht_announcements_enabled(const Tox_Options *_Nonnull options) |
159 | 1.88k | { |
160 | 1.88k | return options->dht_announcements_enabled; |
161 | 1.88k | } |
162 | | void tox_options_set_dht_announcements_enabled(Tox_Options *_Nonnull options, bool dht_announcements_enabled) |
163 | 2.23k | { |
164 | 2.23k | options->dht_announcements_enabled = dht_announcements_enabled; |
165 | 2.23k | } |
166 | | bool tox_options_get_experimental_thread_safety(const Tox_Options *_Nonnull options) |
167 | 1.88k | { |
168 | 1.88k | return options->experimental_thread_safety; |
169 | 1.88k | } |
170 | | void tox_options_set_experimental_thread_safety( |
171 | | Tox_Options *_Nonnull options, bool experimental_thread_safety) |
172 | 2.23k | { |
173 | 2.23k | options->experimental_thread_safety = experimental_thread_safety; |
174 | 2.23k | } |
175 | | bool tox_options_get_experimental_groups_persistence(const Tox_Options *_Nonnull options) |
176 | 1.88k | { |
177 | 1.88k | return options->experimental_groups_persistence; |
178 | 1.88k | } |
179 | | void tox_options_set_experimental_groups_persistence( |
180 | | Tox_Options *_Nonnull options, bool experimental_groups_persistence) |
181 | 3.61k | { |
182 | 3.61k | options->experimental_groups_persistence = experimental_groups_persistence; |
183 | 3.61k | } |
184 | | bool tox_options_get_experimental_disable_dns(const Tox_Options *_Nonnull options) |
185 | 1.96k | { |
186 | 1.96k | return options->experimental_disable_dns; |
187 | 1.96k | } |
188 | | void tox_options_set_experimental_disable_dns(Tox_Options *_Nonnull options, bool experimental_disable_dns) |
189 | 2.23k | { |
190 | 2.23k | options->experimental_disable_dns = experimental_disable_dns; |
191 | 2.23k | } |
192 | | bool tox_options_get_experimental_owned_data(const Tox_Options *_Nonnull options) |
193 | 0 | { |
194 | 0 | return options->experimental_owned_data; |
195 | 0 | } |
196 | | void tox_options_set_experimental_owned_data( |
197 | | Tox_Options *_Nonnull options, bool experimental_owned_data) |
198 | 2.23k | { |
199 | 2.23k | options->experimental_owned_data = experimental_owned_data; |
200 | 2.23k | } |
201 | | |
202 | | const uint8_t *_Nullable tox_options_get_savedata_data(const Tox_Options *_Nonnull options) |
203 | 4.16k | { |
204 | 4.16k | return options->savedata_data; |
205 | 4.16k | } |
206 | | |
207 | | bool tox_options_set_savedata_data(Tox_Options *_Nonnull options, const uint8_t *_Nullable savedata_data, size_t length) |
208 | 6.24k | { |
209 | 6.24k | if (!options->experimental_owned_data) { |
210 | 6.24k | options->savedata_data = savedata_data; |
211 | 6.24k | options->savedata_length = length; |
212 | 6.24k | return true; |
213 | 6.24k | } |
214 | | |
215 | 2 | if (options->owned_savedata_data != nullptr) { |
216 | 1 | free(options->owned_savedata_data); |
217 | 1 | options->owned_savedata_data = nullptr; |
218 | 1 | } |
219 | 2 | if (savedata_data == nullptr) { |
220 | 1 | options->savedata_data = nullptr; |
221 | 1 | options->savedata_length = 0; |
222 | 1 | return true; |
223 | 1 | } |
224 | | |
225 | 1 | uint8_t *owned_ptr = (uint8_t *)malloc(length); |
226 | 1 | if (owned_ptr == nullptr) { |
227 | 0 | options->savedata_data = savedata_data; |
228 | 0 | options->savedata_length = length; |
229 | 0 | options->owned_savedata_data = nullptr; |
230 | 0 | return false; |
231 | 0 | } |
232 | | |
233 | 1 | memcpy(owned_ptr, savedata_data, length); |
234 | 1 | options->savedata_data = owned_ptr; |
235 | 1 | options->savedata_length = length; |
236 | 1 | options->owned_savedata_data = owned_ptr; |
237 | 1 | return true; |
238 | 1 | } |
239 | | |
240 | | void tox_options_default(Tox_Options *_Nonnull options) |
241 | 2.23k | { |
242 | 2.23k | if (options != nullptr) { |
243 | | // Free any owned data. |
244 | 2.23k | tox_options_set_proxy_host(options, nullptr); |
245 | 2.23k | tox_options_set_savedata_data(options, nullptr, 0); |
246 | | |
247 | | // Set the rest to default values. |
248 | 2.23k | const Tox_Options default_options = {false}; |
249 | 2.23k | *options = default_options; |
250 | 2.23k | tox_options_set_ipv6_enabled(options, true); |
251 | 2.23k | tox_options_set_udp_enabled(options, true); |
252 | 2.23k | tox_options_set_proxy_type(options, TOX_PROXY_TYPE_NONE); |
253 | 2.23k | tox_options_set_hole_punching_enabled(options, true); |
254 | 2.23k | tox_options_set_local_discovery_enabled(options, true); |
255 | 2.23k | tox_options_set_dht_announcements_enabled(options, true); |
256 | 2.23k | tox_options_set_experimental_thread_safety(options, false); |
257 | 2.23k | tox_options_set_experimental_groups_persistence(options, false); |
258 | 2.23k | tox_options_set_experimental_disable_dns(options, false); |
259 | 2.23k | tox_options_set_experimental_owned_data(options, false); |
260 | 2.23k | } |
261 | 2.23k | } |
262 | | |
263 | | void tox_options_copy(Tox_Options *_Nullable dest, const Tox_Options *_Nullable src) |
264 | 393 | { |
265 | 393 | if (dest != nullptr && src != nullptr) { |
266 | | // Clear dest's owned pointers before copying src's members |
267 | 393 | dest->owned_proxy_host = nullptr; |
268 | 393 | dest->owned_savedata_data = nullptr; |
269 | | |
270 | | // Copy all non-owned members |
271 | 393 | *dest = *src; |
272 | | |
273 | | // Clear these again as they now point to src's memory |
274 | 393 | dest->owned_proxy_host = nullptr; |
275 | 393 | dest->owned_savedata_data = nullptr; |
276 | | |
277 | | // Use setters to correctly re-allocate and copy if experimental_owned_data is true |
278 | 393 | tox_options_set_proxy_host(dest, src->proxy_host); |
279 | 393 | tox_options_set_savedata_data(dest, src->savedata_data, src->savedata_length); |
280 | 393 | } |
281 | 393 | } |
282 | | |
283 | | Tox_Options *_Nullable tox_options_new(Tox_Err_Options_New *_Nullable error) |
284 | 2.23k | { |
285 | 2.23k | Tox_Options *options = (Tox_Options *)calloc(1, sizeof(Tox_Options)); |
286 | | |
287 | 2.23k | if (options != nullptr) { |
288 | 2.23k | tox_options_default(options); |
289 | 2.23k | SET_ERROR_PARAMETER(error, TOX_ERR_OPTIONS_NEW_OK); |
290 | 2.23k | return options; |
291 | 2.23k | } |
292 | | |
293 | 0 | SET_ERROR_PARAMETER(error, TOX_ERR_OPTIONS_NEW_MALLOC); |
294 | 0 | return nullptr; |
295 | 2.23k | } |
296 | | |
297 | | void tox_options_free(Tox_Options *_Nullable options) |
298 | 4.08k | { |
299 | 4.08k | if (options != nullptr) { |
300 | | // Free any owned data. |
301 | 2.22k | tox_options_set_proxy_host(options, nullptr); |
302 | 2.22k | tox_options_set_savedata_data(options, nullptr, 0); |
303 | 2.22k | free(options); |
304 | 2.22k | } |
305 | 4.08k | } |