summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--INSTALL.md3
-rw-r--r--README.md4
-rw-r--r--core/CMakeLists.txt1
-rw-r--r--core/DHT.c2
-rw-r--r--core/DHT.h2
-rw-r--r--core/Lossless_UDP.c4
-rw-r--r--core/Lossless_UDP.h2
-rw-r--r--core/net_crypto.c2
-rw-r--r--testing/nTox.c97
-rw-r--r--testing/nTox.h3
-rw-r--r--testing/toxic/chat.c63
-rw-r--r--testing/toxic/main.c31
12 files changed, 153 insertions, 61 deletions
diff --git a/INSTALL.md b/INSTALL.md
index 625a9c6d..483928b0 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -101,6 +101,7 @@ Grab the following packages:
101 * http://www.gnu.org/software/automake/ 101 * http://www.gnu.org/software/automake/
102 * http://www.cmake.org/ 102 * http://www.cmake.org/
103 * https://github.com/jedisct1/libsodium 103 * https://github.com/jedisct1/libsodium
104 * http://www.hyperrealm.com/libconfig/
104 105
105Uncompress and install them all. Make sure to follow the README as the instructions change, but they all follow the same pattern below: 106Uncompress and install them all. Make sure to follow the README as the instructions change, but they all follow the same pattern below:
106 107
@@ -118,7 +119,7 @@ make
118``` 119```
119 120
120Do not install them from macports (or any dependencies for that matter) as they get shoved in the wrong directory 121Do not install them from macports (or any dependencies for that matter) as they get shoved in the wrong directory
121and make your life more annoying. 122(or the wrong version gets installed) and make your life more annoying.
122 123
123Another thing you may want to install is the latest gcc, this caused me a few problems as XCode from 4.3 124Another thing you may want to install is the latest gcc, this caused me a few problems as XCode from 4.3
124no longer includes gcc and instead uses LLVM-GCC, a nice install guide can be found at 125no longer includes gcc and instead uses LLVM-GCC, a nice install guide can be found at
diff --git a/README.md b/README.md
index dc16787b..745fbb10 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ Keep everything really simple.
22 22
23## The Complex Stuff: 23## The Complex Stuff:
24+ Tox must use UDP simply because [hole punching](http://en.wikipedia.org/wiki/UDP_hole_punching) with TCP is not as reliable. 24+ Tox must use UDP simply because [hole punching](http://en.wikipedia.org/wiki/UDP_hole_punching) with TCP is not as reliable.
25+ Every peer is represented as a [byte string](https://en.wikipedia.org/wiki/String_(computer_science)) (the public key of the peer [client ID]). 25+ Every peer is represented as a [byte string][String] (the public key of the peer [client ID]).
26+ We're using torrent-style DHT so that peers can find the IP of the other peers when they have their ID. 26+ We're using torrent-style DHT so that peers can find the IP of the other peers when they have their ID.
27+ Once the client has the IP of that peer, they start initiating a secure connection with each other. (See [Crypto](https://github.com/irungentoo/ProjectTox-Core/wiki/Crypto)) 27+ Once the client has the IP of that peer, they start initiating a secure connection with each other. (See [Crypto](https://github.com/irungentoo/ProjectTox-Core/wiki/Crypto))
28+ When both peers are securely connected, they can exchange messages, initiate a video chat, send files, etc, all using encrypted communications. 28+ When both peers are securely connected, they can exchange messages, initiate a video chat, send files, etc, all using encrypted communications.
@@ -53,3 +53,5 @@ configure for the normal user or suffer from being way too centralized.
53- [Lossless UDP Protocol](https://github.com/irungentoo/ProjectTox-Core/wiki/Lossless-UDP)<br /> 53- [Lossless UDP Protocol](https://github.com/irungentoo/ProjectTox-Core/wiki/Lossless-UDP)<br />
54- [Crypto](https://github.com/irungentoo/ProjectTox-Core/wiki/Crypto)<br /> 54- [Crypto](https://github.com/irungentoo/ProjectTox-Core/wiki/Crypto)<br />
55- [Ideas](https://github.com/irungentoo/ProjectTox-Core/wiki/Ideas) 55- [Ideas](https://github.com/irungentoo/ProjectTox-Core/wiki/Ideas)
56
57[String]: https://en.wikipedia.org/wiki/String_(computer_science)
diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt
index 36acb6cf..5bd496cb 100644
--- a/core/CMakeLists.txt
+++ b/core/CMakeLists.txt
@@ -17,3 +17,4 @@ set(core_sources
17 Messenger.c) 17 Messenger.c)
18 18
19add_library(toxcore SHARED ${core_sources}) 19add_library(toxcore SHARED ${core_sources})
20target_link_libraries(toxcore ${SODIUM_LIBRARY})
diff --git a/core/DHT.c b/core/DHT.c
index 5d5910e0..08b4710e 100644
--- a/core/DHT.c
+++ b/core/DHT.c
@@ -1,6 +1,6 @@
1/* DHT.c 1/* DHT.c
2 * 2 *
3 * An implementation of the DHT as seen in docs/DHT.txt 3 * An implementation of the DHT as seen in http://wiki.tox.im/index.php/DHT
4 * 4 *
5 * Copyright (C) 2013 Tox project All Rights Reserved. 5 * Copyright (C) 2013 Tox project All Rights Reserved.
6 * 6 *
diff --git a/core/DHT.h b/core/DHT.h
index ffa02087..36670ed5 100644
--- a/core/DHT.h
+++ b/core/DHT.h
@@ -1,6 +1,6 @@
1/* DHT.h 1/* DHT.h
2 * 2 *
3 * An implementation of the DHT as seen in docs/DHT.txt 3 * An implementation of the DHT as seen in http://wiki.tox.im/index.php/DHT
4 * 4 *
5 * Copyright (C) 2013 Tox project All Rights Reserved. 5 * Copyright (C) 2013 Tox project All Rights Reserved.
6 * 6 *
diff --git a/core/Lossless_UDP.c b/core/Lossless_UDP.c
index 33b8eb19..a753e5ff 100644
--- a/core/Lossless_UDP.c
+++ b/core/Lossless_UDP.c
@@ -1,6 +1,6 @@
1/* Lossless_UDP.c 1/* Lossless_UDP.c
2 * 2 *
3 * An implementation of the Lossless_UDP protocol as seen in docs/Lossless_UDP.txt 3 * An implementation of the Lossless_UDP protocol as seen in http://wiki.tox.im/index.php/Lossless_UDP
4 * 4 *
5 * Copyright (C) 2013 Tox project All Rights Reserved. 5 * Copyright (C) 2013 Tox project All Rights Reserved.
6 * 6 *
@@ -467,7 +467,7 @@ uint32_t missing_packets(int connection_id, uint32_t * requested)
467/* 467/*
468 * BEGIN Packet sending functions 468 * BEGIN Packet sending functions
469 * One per packet type. 469 * One per packet type.
470 * see docs/Lossless_UDP.txt for more information. 470 * see http://wiki.tox.im/index.php/Lossless_UDP for more information.
471 */ 471 */
472 472
473int send_handshake(IP_Port ip_port, uint32_t handshake_id1, uint32_t handshake_id2) 473int send_handshake(IP_Port ip_port, uint32_t handshake_id1, uint32_t handshake_id2)
diff --git a/core/Lossless_UDP.h b/core/Lossless_UDP.h
index 573e1ab9..75ef273e 100644
--- a/core/Lossless_UDP.h
+++ b/core/Lossless_UDP.h
@@ -1,6 +1,6 @@
1/* Lossless_UDP.h 1/* Lossless_UDP.h
2 * 2 *
3 * An implementation of the Lossless_UDP protocol as seen in docs/Lossless_UDP.txt 3 * An implementation of the Lossless_UDP protocol as seen in http://wiki.tox.im/index.php/Lossless_UDP
4 * 4 *
5 * Copyright (C) 2013 Tox project All Rights Reserved. 5 * Copyright (C) 2013 Tox project All Rights Reserved.
6 * 6 *
diff --git a/core/net_crypto.c b/core/net_crypto.c
index 3b5b67f4..561ba866 100644
--- a/core/net_crypto.c
+++ b/core/net_crypto.c
@@ -1,7 +1,7 @@
1/* net_crypto.c 1/* net_crypto.c
2 * 2 *
3 * Functions for the core network crypto. 3 * Functions for the core network crypto.
4 * See also: docs/Crypto.txt 4 * See also: http://wiki.tox.im/index.php/DHT
5 * 5 *
6 * NOTE: This code has to be perfect. We don't mess around with encryption. 6 * NOTE: This code has to be perfect. We don't mess around with encryption.
7 * 7 *
diff --git a/testing/nTox.c b/testing/nTox.c
index 13db58d7..15e209a9 100644
--- a/testing/nTox.c
+++ b/testing/nTox.c
@@ -36,11 +36,12 @@
36char lines[HISTORY][STRING_LENGTH]; 36char lines[HISTORY][STRING_LENGTH];
37char line[STRING_LENGTH]; 37char line[STRING_LENGTH];
38 38
39char *help = "[i] commands: /f ID (to add friend), /m friendnumber message (to send message), /s status (to change status)\n" 39char *help = "[i] commands:\n/f ID (to add friend)\n/m friendnumber message "
40 "[i] /l list (list friends), /h for help, /i for info, /n nick (to change nickname), /q (to quit)"; 40 "(to send message)\n/s status (to change status)\n[i] /l list (l"
41 "ist friends)\n/h for help\n/i for info\n/n nick (to change nick"
42 "name)\n/q (to quit)";
41int x, y; 43int x, y;
42 44
43
44uint8_t pending_requests[256][CLIENT_ID_SIZE]; 45uint8_t pending_requests[256][CLIENT_ID_SIZE];
45uint8_t num_requests = 0; 46uint8_t num_requests = 0;
46 47
@@ -82,18 +83,23 @@ void new_lines(char *line)
82void print_friendlist() 83void print_friendlist()
83{ 84{
84 char name[MAX_NAME_LENGTH]; 85 char name[MAX_NAME_LENGTH];
86 int i = 0;
85 new_lines("[i] Friend List:"); 87 new_lines("[i] Friend List:");
86 uint32_t i; 88 while(getname(i, (uint8_t *)name) != -1) {
87 for (i = 0; i <= num_requests; i++) { 89 /* account for the longest name and the longest "base" string */
88 char fstring[128]; 90 char fstring[MAX_NAME_LENGTH + strlen("[i] Friend: NULL\n\tid: ")];
89 getname(i, (uint8_t*)name); 91
90 if (strlen(name) <= 0) { 92 if (strlen(name) <= 0) {
91 sprintf(fstring, "[i] Friend: NULL\n\tid: %i", i); 93 sprintf(fstring, "[i] Friend: No Friend!\n\tid: %i", i);
92 } else { 94 } else {
93 sprintf(fstring, "[i] Friend: %s\n\tid: %i", (uint8_t*)name, i); 95 sprintf(fstring, "[i] Friend: %s\n\tid: %i", (uint8_t*)name, i);
94 } 96 }
97 i++;
95 new_lines(fstring); 98 new_lines(fstring);
96 } 99 }
100
101 if(i == 0)
102 new_lines("\tno friends! D:");
97} 103}
98 104
99char *format_message(char *message, int friendnum) 105char *format_message(char *message, int friendnum)
@@ -122,7 +128,7 @@ char *format_message(char *message, int friendnum)
122 return msg; 128 return msg;
123} 129}
124 130
125void line_eval(char lines[HISTORY][STRING_LENGTH], char *line) 131void line_eval(char *line)
126{ 132{
127 if (line[0] == '/') { 133 if (line[0] == '/') {
128 char inpt_command = line[1]; 134 char inpt_command = line[1];
@@ -236,8 +242,7 @@ void line_eval(char lines[HISTORY][STRING_LENGTH], char *line)
236 do_refresh(); 242 do_refresh();
237 } 243 }
238 else if (inpt_command == 'h') { //help 244 else if (inpt_command == 'h') { //help
239 new_lines("[i] commands: /f ID (to add friend), /m friendnumber message (to send message), /s status (to change status)"); 245 new_lines(help);
240 new_lines("[i] /l list (list friends), /h for help, /i for info, /n nick (to change nickname), /q (to quit)");
241 } 246 }
242 else if (inpt_command == 'i') { //info 247 else if (inpt_command == 'i') { //info
243 char idstring[200]; 248 char idstring[200];
@@ -353,10 +358,10 @@ void print_statuschange(int friendnumber, uint8_t *string, uint16_t length)
353 new_lines(msg); 358 new_lines(msg);
354} 359}
355 360
356void load_key() 361void load_key(char *path)
357{ 362{
358 FILE *data_file = NULL; 363 FILE *data_file = fopen(path, "r");
359 data_file = fopen("data","r"); 364
360 if (data_file) { 365 if (data_file) {
361 //load keys 366 //load keys
362 fseek(data_file, 0, SEEK_END); 367 fseek(data_file, 0, SEEK_END);
@@ -368,51 +373,81 @@ void load_key()
368 exit(1); 373 exit(1);
369 } 374 }
370 Messenger_load(data, size); 375 Messenger_load(data, size);
371 } else { 376
377 } else {
372 //else save new keys 378 //else save new keys
373 int size = Messenger_size(); 379 int size = Messenger_size();
374 uint8_t data[size]; 380 uint8_t data[size];
375 Messenger_save(data); 381 Messenger_save(data);
376 data_file = fopen("data","w"); 382 data_file = fopen(path, "w");
383
384 if(!data_file) {
385 perror("[!] load_key");
386 exit(1);
387 }
388
377 if (fwrite(data, sizeof(uint8_t), size, data_file) != size){ 389 if (fwrite(data, sizeof(uint8_t), size, data_file) != size){
378 printf("[i] could not write data file\n[i] exiting\n"); 390 puts("[i] could not write data file! exiting...");
379 exit(1); 391 exit(1);
380 } 392 }
381 } 393 }
382 fclose(data_file); 394 fclose(data_file);
383} 395}
384 396
397void print_help(void)
398{
399 printf("nTox %.1f - Command-line tox-core client\n", 0.1);
400 puts("Options:");
401 puts("\t-h\t-\tPrint this help and exit.");
402 puts("\t-f\t-\tSpecify a keyfile to read (or write to) from.");
403}
404
385int main(int argc, char *argv[]) 405int main(int argc, char *argv[])
386{ 406{
407 int on = 0;
408 int c = 0;
409 int i = 0;
410 char *filename = "data";
411 char idstring[200] = {0};
412
387 if (argc < 4) { 413 if (argc < 4) {
388 printf("[!] Usage: %s [IP] [port] [public_key] <nokey>\n", argv[0]); 414 printf("[!] Usage: %s [IP] [port] [public_key] <keyfile>\n", argv[0]);
389 exit(0); 415 exit(0);
390 } 416 }
391 int c; 417
392 int on = 0; 418 for(i = 0; i < argc; i++) {
393 initMessenger(); 419 if(argv[i][0] == '-') {
394 //if keyfiles exist 420 if(argv[i][1] == 'h') {
395 if(argc > 4){ 421 print_help();
396 if(strncmp(argv[4], "nokey", 6) < 0){ 422 exit(0);
397 //load_key(); 423 } else if(argv[i][1] == 'f') {
424 if(argv[i + 1] != NULL)
425 filename = argv[i + 1];
426 else {
427 fputs("[!] you passed '-f' without giving an argument!\n", stderr);
428 }
429 }
398 } 430 }
399 } else {
400 load_key();
401 } 431 }
432
433 initMessenger();
434 load_key(filename);
435
402 m_callback_friendrequest(print_request); 436 m_callback_friendrequest(print_request);
403 m_callback_friendmessage(print_message); 437 m_callback_friendmessage(print_message);
404 m_callback_namechange(print_nickchange); 438 m_callback_namechange(print_nickchange);
405 m_callback_userstatus(print_statuschange); 439 m_callback_userstatus(print_statuschange);
406 440
407 char idstring[200];
408 get_id(idstring);
409 initscr(); 441 initscr();
410 noecho(); 442 noecho();
411 raw(); 443 raw();
412 getmaxyx(stdscr, y, x); 444 getmaxyx(stdscr, y, x);
445
446 new_lines("/h for list of commands");
447 get_id(idstring);
413 new_lines(idstring); 448 new_lines(idstring);
414 new_lines(help);
415 strcpy(line, ""); 449 strcpy(line, "");
450
416 IP_Port bootstrap_ip_port; 451 IP_Port bootstrap_ip_port;
417 bootstrap_ip_port.port = htons(atoi(argv[2])); 452 bootstrap_ip_port.port = htons(atoi(argv[2]));
418 int resolved_address = resolve_addr(argv[1]); 453 int resolved_address = resolve_addr(argv[1]);
@@ -439,7 +474,7 @@ int main(int argc, char *argv[])
439 474
440 getmaxyx(stdscr, y, x); 475 getmaxyx(stdscr, y, x);
441 if (c == '\n') { 476 if (c == '\n') {
442 line_eval(lines, line); 477 line_eval(line);
443 strcpy(line, ""); 478 strcpy(line, "");
444 } else if (c == 8 || c == 127) { 479 } else if (c == 8 || c == 127) {
445 line[strlen(line)-1] = '\0'; 480 line[strlen(line)-1] = '\0';
diff --git a/testing/nTox.h b/testing/nTox.h
index 9d82556c..47c73513 100644
--- a/testing/nTox.h
+++ b/testing/nTox.h
@@ -37,12 +37,13 @@
37#include <netdb.h> 37#include <netdb.h>
38#include "../core/Messenger.h" 38#include "../core/Messenger.h"
39#include "../core/network.h" 39#include "../core/network.h"
40
40#define STRING_LENGTH 256 41#define STRING_LENGTH 256
41#define HISTORY 50 42#define HISTORY 50
42#define PUB_KEY_BYTES 32 43#define PUB_KEY_BYTES 32
43 44
44void new_lines(char *line); 45void new_lines(char *line);
45void line_eval(char lines[HISTORY][STRING_LENGTH], char *line); 46void line_eval(char *line);
46void wrap(char output[STRING_LENGTH], char input[STRING_LENGTH], int line_width) ; 47void wrap(char output[STRING_LENGTH], char input[STRING_LENGTH], int line_width) ;
47int count_lines(char *string) ; 48int count_lines(char *string) ;
48char *appender(char *str, const char c); 49char *appender(char *str, const char c);
diff --git a/testing/toxic/chat.c b/testing/toxic/chat.c
index 1bfd94f5..a90bb2aa 100644
--- a/testing/toxic/chat.c
+++ b/testing/toxic/chat.c
@@ -7,6 +7,7 @@
7#include <string.h> 7#include <string.h>
8#include <stdint.h> 8#include <stdint.h>
9#include <ctype.h> 9#include <ctype.h>
10#include <time.h>
10 11
11#include "../../core/Messenger.h" 12#include "../../core/Messenger.h"
12#include "../../core/network.h" 13#include "../../core/network.h"
@@ -26,11 +27,15 @@ typedef struct {
26 27
27extern void fix_name(uint8_t* name); 28extern void fix_name(uint8_t* name);
28 29
29
30static void chat_onMessage(ToxWindow* self, int num, uint8_t* msg, uint16_t len) { 30static void chat_onMessage(ToxWindow* self, int num, uint8_t* msg, uint16_t len) {
31 ChatContext* ctx = (ChatContext*) self->x; 31 ChatContext* ctx = (ChatContext*) self->x;
32 uint8_t nick[MAX_NAME_LENGTH] = {0}; 32 uint8_t nick[MAX_NAME_LENGTH] = {0};
33 33
34 time_t now;
35 time(&now);
36 struct tm * timeinfo;
37 timeinfo = localtime(&now);
38
34 if(ctx->friendnum != num) 39 if(ctx->friendnum != num)
35 return; 40 return;
36 41
@@ -42,10 +47,11 @@ static void chat_onMessage(ToxWindow* self, int num, uint8_t* msg, uint16_t len)
42 fix_name(msg); 47 fix_name(msg);
43 fix_name(nick); 48 fix_name(nick);
44 49
50 wattron(ctx->history, COLOR_PAIR(2));
51 wprintw(ctx->history, "%02d:%02d:%02d ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
45 wattron(ctx->history, COLOR_PAIR(4)); 52 wattron(ctx->history, COLOR_PAIR(4));
46 wprintw(ctx->history, "%s: ", nick); 53 wprintw(ctx->history, "%s: ", nick);
47 wattroff(ctx->history, COLOR_PAIR(4)); 54 wattroff(ctx->history, COLOR_PAIR(4));
48
49 wprintw(ctx->history, "%s\n", msg); 55 wprintw(ctx->history, "%s\n", msg);
50 56
51 self->blink = true; 57 self->blink = true;
@@ -71,9 +77,26 @@ static void chat_onStatusChange(ToxWindow* self, int num, uint8_t* status, uint1
71 77
72} 78}
73 79
80/* check that the string has one non-space character */
81int string_is_empty(char *string)
82{
83 int rc = 0;
84 char *copy = strdup(string);
85
86 rc = ((strtok(copy, " ") == NULL) ? 1:0);
87 free(copy);
88
89 return rc;
90}
91
74static void chat_onKey(ToxWindow* self, int key) { 92static void chat_onKey(ToxWindow* self, int key) {
75 ChatContext* ctx = (ChatContext*) self->x; 93 ChatContext* ctx = (ChatContext*) self->x;
76 94
95 time_t now;
96 time(&now);
97 struct tm * timeinfo;
98 timeinfo = localtime(&now);
99
77 if(isprint(key)) { 100 if(isprint(key)) {
78 101
79 if(ctx->pos != sizeof(ctx->line)-1) { 102 if(ctx->pos != sizeof(ctx->line)-1) {
@@ -81,28 +104,34 @@ static void chat_onKey(ToxWindow* self, int key) {
81 ctx->line[ctx->pos] = '\0'; 104 ctx->line[ctx->pos] = '\0';
82 } 105 }
83 } 106 }
84 else if(key == '\n') {
85 wattron(ctx->history, COLOR_PAIR(1));
86 wprintw(ctx->history, "you: ", ctx->line);
87 wattroff(ctx->history, COLOR_PAIR(1));
88
89 wprintw(ctx->history, "%s\n", ctx->line);
90 107
91 if(m_sendmessage(ctx->friendnum, (uint8_t*) ctx->line, strlen(ctx->line)+1) < 0) { 108 else if(key == '\n') {
92 wattron(ctx->history, COLOR_PAIR(3)); 109 if(!string_is_empty(ctx->line)) {
93 wprintw(ctx->history, " * Failed to send message.\n"); 110 /* make sure the string has at least non-space character */
94 wattroff(ctx->history, COLOR_PAIR(3)); 111 wattron(ctx->history, COLOR_PAIR(2));
112 wprintw(ctx->history, "%02d:%02d:%02d ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
113 wattron(ctx->history, COLOR_PAIR(1));
114 wprintw(ctx->history, "you: ", ctx->line);
115 wattroff(ctx->history, COLOR_PAIR(1));
116 wprintw(ctx->history, "%s\n", ctx->line);
117
118 if(m_sendmessage(ctx->friendnum, (uint8_t*) ctx->line, strlen(ctx->line)+1) < 0) {
119 wattron(ctx->history, COLOR_PAIR(3));
120 wprintw(ctx->history, " * Failed to send message.\n");
121 wattroff(ctx->history, COLOR_PAIR(3));
122 }
123
124 ctx->line[0] = '\0';
125 ctx->pos = 0;
95 } 126 }
96
97 ctx->line[0] = '\0';
98 ctx->pos = 0;
99 } 127 }
128
100 else if(key == 0x107 || key == 0x8 || key == 0x7f) { 129 else if(key == 0x107 || key == 0x8 || key == 0x7f) {
101 if(ctx->pos != 0) { 130 if(ctx->pos != 0) {
102 ctx->line[--ctx->pos] = '\0'; 131 ctx->line[--ctx->pos] = '\0';
103 } 132 }
104 } 133 }
105 134
106} 135}
107 136
108static void chat_onDraw(ToxWindow* self) { 137static void chat_onDraw(ToxWindow* self) {
@@ -150,7 +179,7 @@ ToxWindow new_chat(int friendnum) {
150 uint8_t nick[MAX_NAME_LENGTH] = {0}; 179 uint8_t nick[MAX_NAME_LENGTH] = {0};
151 getname(friendnum, (uint8_t*) &nick); 180 getname(friendnum, (uint8_t*) &nick);
152 fix_name(nick); 181 fix_name(nick);
153 182
154 snprintf(ret.title, sizeof(ret.title), "[%s (%d)]", nick, friendnum); 183 snprintf(ret.title, sizeof(ret.title), "[%s (%d)]", nick, friendnum);
155 184
156 ChatContext* x = calloc(1, sizeof(ChatContext)); 185 ChatContext* x = calloc(1, sizeof(ChatContext));
diff --git a/testing/toxic/main.c b/testing/toxic/main.c
index 391b0b39..3b45a89f 100644
--- a/testing/toxic/main.c
+++ b/testing/toxic/main.c
@@ -170,12 +170,12 @@ static void do_tox() {
170 doMessenger(); 170 doMessenger();
171} 171}
172 172
173static void load_data() { 173static void load_data(char *path) {
174 FILE* fd; 174 FILE* fd;
175 size_t len; 175 size_t len;
176 uint8_t* buf; 176 uint8_t* buf;
177 177
178 if((fd = fopen("data", "r")) != NULL) { 178 if((fd = fopen(path, "r")) != NULL) {
179 fseek(fd, 0, SEEK_END); 179 fseek(fd, 0, SEEK_END);
180 len = ftell(fd); 180 len = ftell(fd);
181 fseek(fd, 0, SEEK_SET); 181 fseek(fd, 0, SEEK_SET);
@@ -213,7 +213,7 @@ static void load_data() {
213 213
214 Messenger_save(buf); 214 Messenger_save(buf);
215 215
216 fd = fopen("data", "w"); 216 fd = fopen(path, "w");
217 if(fd == NULL) { 217 if(fd == NULL) {
218 fprintf(stderr, "fopen() failed.\n"); 218 fprintf(stderr, "fopen() failed.\n");
219 219
@@ -282,13 +282,36 @@ void prepare_window(WINDOW* w) {
282 282
283int main(int argc, char* argv[]) { 283int main(int argc, char* argv[]) {
284 int ch; 284 int ch;
285 int i = 0;
286 int f_flag = 0;
287 char *filename = "data";
285 ToxWindow* a; 288 ToxWindow* a;
286 289
290 for(i = 0; i < argc; i++) {
291 if(argv[i][0] == '-') {
292 if(argv[i][1] == 'f') {
293 if(argv[i + 1] != NULL)
294 filename = argv[i + 1];
295 else {
296 f_flag = -1;
297 }
298 }
299 }
300 }
301
287 init_term(); 302 init_term();
288 init_tox(); 303 init_tox();
289 load_data(); 304 load_data(filename);
290 init_windows(); 305 init_windows();
291 306
307 if(f_flag == -1) {
308 attron(COLOR_PAIR(3) | A_BOLD);
309 wprintw(prompt->window, "You passed '-f' without giving an argument!\n"
310 "defaulting to 'data' for a keyfile...\n");
311 attroff(COLOR_PAIR(3) | A_BOLD);
312 }
313
314
292 while(true) { 315 while(true) {
293 // Update tox. 316 // Update tox.
294 do_tox(); 317 do_tox();