/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 | } |