summaryrefslogtreecommitdiff
path: root/toxcore/tox.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/tox.c')
-rw-r--r--toxcore/tox.c61
1 files changed, 42 insertions, 19 deletions
diff --git a/toxcore/tox.c b/toxcore/tox.c
index de615768..3e9db766 100644
--- a/toxcore/tox.c
+++ b/toxcore/tox.c
@@ -121,33 +121,46 @@ void tox_options_free(struct Tox_Options *options)
121 free(options); 121 free(options);
122} 122}
123 123
124Tox *tox_new(const struct Tox_Options *options, const uint8_t *data, size_t length, TOX_ERR_NEW *error) 124Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error)
125{ 125{
126 if (!logger_get_global()) 126 if (!logger_get_global())
127 logger_set_global(logger_new(LOGGER_OUTPUT_FILE, LOGGER_LEVEL, "toxcore")); 127 logger_set_global(logger_new(LOGGER_OUTPUT_FILE, LOGGER_LEVEL, "toxcore"));
128 128
129 if (data == NULL && length != 0) {
130 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_NULL);
131 return NULL;
132 }
133
134 if (data && length) {
135 if (length < TOX_ENC_SAVE_MAGIC_LENGTH) {
136 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
137 return NULL;
138 }
139
140 if (memcmp(data, TOX_ENC_SAVE_MAGIC_NUMBER, TOX_ENC_SAVE_MAGIC_LENGTH) == 0) {
141 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_ENCRYPTED);
142 return NULL;
143 }
144 }
145
146 Messenger_Options m_options = {0}; 129 Messenger_Options m_options = {0};
147 130
131 _Bool load_savedata_sk = 0, load_savedata_tox = 0;
132
148 if (options == NULL) { 133 if (options == NULL) {
149 m_options.ipv6enabled = TOX_ENABLE_IPV6_DEFAULT; 134 m_options.ipv6enabled = TOX_ENABLE_IPV6_DEFAULT;
150 } else { 135 } else {
136 if (options->savedata_type != TOX_SAVEDATA_TYPE_NONE) {
137 if (options->savedata_data == NULL || options->savedata_length == 0) {
138 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
139 return NULL;
140 }
141 }
142
143 if (options->savedata_type == TOX_SAVEDATA_TYPE_SECRET_KEY) {
144 if (options->savedata_length != TOX_SECRET_KEY_SIZE) {
145 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
146 return NULL;
147 }
148
149 load_savedata_sk = 1;
150 } else if (options->savedata_type == TOX_SAVEDATA_TYPE_TOX_SAVE) {
151 if (options->savedata_length < TOX_ENC_SAVE_MAGIC_LENGTH) {
152 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
153 return NULL;
154 }
155
156 if (memcmp(options->savedata_data, TOX_ENC_SAVE_MAGIC_NUMBER, TOX_ENC_SAVE_MAGIC_LENGTH) == 0) {
157 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_ENCRYPTED);
158 return NULL;
159 }
160
161 load_savedata_tox = 1;
162 }
163
151 m_options.ipv6enabled = options->ipv6_enabled; 164 m_options.ipv6enabled = options->ipv6_enabled;
152 m_options.udp_disabled = !options->udp_enabled; 165 m_options.udp_disabled = !options->udp_enabled;
153 m_options.port_range[0] = options->start_port; 166 m_options.port_range[0] = options->start_port;
@@ -201,6 +214,8 @@ Tox *tox_new(const struct Tox_Options *options, const uint8_t *data, size_t leng
201 214
202 if (m_error == MESSENGER_ERROR_PORT) { 215 if (m_error == MESSENGER_ERROR_PORT) {
203 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PORT_ALLOC); 216 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PORT_ALLOC);
217 } else if (m_error == MESSENGER_ERROR_TCP_SERVER) {
218 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PORT_ALLOC);
204 } else { 219 } else {
205 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC); 220 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC);
206 } 221 }
@@ -208,8 +223,11 @@ Tox *tox_new(const struct Tox_Options *options, const uint8_t *data, size_t leng
208 return NULL; 223 return NULL;
209 } 224 }
210 225
211 if (data && length && messenger_load(m, data, length) == -1) { 226 if (load_savedata_tox && messenger_load(m, options->savedata_data, options->savedata_length) == -1) {
212 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT); 227 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT);
228 } else if (load_savedata_sk) {
229 load_secret_key(m->net_crypto, options->savedata_data);
230 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_OK);
213 } else { 231 } else {
214 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_OK); 232 SET_ERROR_PARAMETER(error, TOX_ERR_NEW_OK);
215 } 233 }
@@ -993,6 +1011,11 @@ void tox_callback_file_recv_control(Tox *tox, tox_file_recv_control_cb *function
993bool tox_file_get_file_id(const Tox *tox, uint32_t friend_number, uint32_t file_number, uint8_t *file_id, 1011bool tox_file_get_file_id(const Tox *tox, uint32_t friend_number, uint32_t file_number, uint8_t *file_id,
994 TOX_ERR_FILE_GET *error) 1012 TOX_ERR_FILE_GET *error)
995{ 1013{
1014 if (!file_id) {
1015 SET_ERROR_PARAMETER(error, TOX_ERR_FILE_GET_NULL);
1016 return 0;
1017 }
1018
996 const Messenger *m = tox; 1019 const Messenger *m = tox;
997 int ret = file_get_id(m, friend_number, file_number, file_id); 1020 int ret = file_get_id(m, friend_number, file_number, file_id);
998 1021