/* deletes contact from friendlist and puts in blocklist */ void block_friend(Tox *m, uint32_t fnum) { if (Friends.num_friends <= 0) return; realloc_blocklist(Blocked.max_idx + 1); memset(&Blocked.list[Blocked.max_idx], 0, sizeof(BlockedFriend)); int i; for (i = 0; i <= Blocked.max_idx; ++i) { if (Blocked.list[i].active) continue; Blocked.list[i].active = true; Blocked.list[i].num = i; Blocked.list[i].namelength = Friends.list[fnum].namelength; Blocked.list[i].last_on = Friends.list[fnum].last_online.last_on; memcpy(Blocked.list[i].pub_key, Friends.list[fnum].pub_key, TOX_PUBLIC_KEY_SIZE); memcpy(Blocked.list[i].name, Friends.list[fnum].name, Friends.list[fnum].namelength + 1); ++Blocked.num_blocked; if (i == Blocked.max_idx) ++Blocked.max_idx; delete_friend(m, fnum); save_blocklist(BLOCK_FILE); sort_blocklist_index(); sort_friendlist_index(); return; } }
/* deletes contact from friendlist and puts in blocklist */ void block_friend(Tox *m, int32_t fnum) { if (Blocked_Contacts.max_index >= MAX_FRIENDS_NUM || num_friends <= 0) return; int i; for (i = 0; i <= Blocked_Contacts.max_index; ++i) { if (Blocked_Contacts.list[i].active) continue; Blocked_Contacts.list[i].active = true; Blocked_Contacts.list[i].num = i; Blocked_Contacts.list[i].namelength = friends[fnum].namelength; Blocked_Contacts.list[i].last_on = friends[fnum].last_online.last_on; memcpy(Blocked_Contacts.list[i].pub_key, friends[fnum].pub_key, TOX_CLIENT_ID_SIZE); memcpy(Blocked_Contacts.list[i].name, friends[fnum].name, friends[fnum].namelength + 1); ++Blocked_Contacts.num_blocked; if (i == Blocked_Contacts.max_index) ++Blocked_Contacts.max_index; delete_friend(m, fnum); save_blocklist(BLOCK_FILE); sort_blocklist_index(); sort_friendlist_index(); return; } }
static void friendlist_onNickChange(ToxWindow *self, Tox *m, uint32_t num, const char *nick, size_t length) { if (num >= Friends.max_idx) { return; } /* save old name for log renaming */ char oldname[TOXIC_MAX_NAME_LENGTH + 1]; snprintf(oldname, sizeof(oldname), "%s", Friends.list[num].name); /* update name */ snprintf(Friends.list[num].name, sizeof(Friends.list[num].name), "%s", nick); Friends.list[num].namelength = strlen(Friends.list[num].name); /* get data for chatlog renaming */ char newnamecpy[TOXIC_MAX_NAME_LENGTH + 1]; char myid[TOX_ADDRESS_SIZE]; strcpy(newnamecpy, Friends.list[num].name); tox_self_get_address(m, (uint8_t *) myid); if (strcmp(oldname, newnamecpy) != 0) { rename_logfile(oldname, newnamecpy, myid, Friends.list[num].pub_key, Friends.list[num].chatwin); } sort_friendlist_index(); }
/* puts blocked friend back in friendlist. fnum is new friend number, bnum is blocked number */ static void friendlist_add_blocked(Tox *m, int32_t fnum, int32_t bnum) { if (max_friends_index >= MAX_FRIENDS_NUM) return; int i; for (i = 0; i <= max_friends_index; ++i) { if (friends[i].active) continue; friends[i].num = fnum; friends[i].active = true; friends[i].chatwin = -1; friends[i].status = TOX_USERSTATUS_NONE; friends[i].logging_on = (bool) user_settings_->autolog == AUTOLOG_ON; friends[i].namelength = Blocked_Contacts.list[bnum].namelength; update_friend_last_online(i, Blocked_Contacts.list[bnum].last_on); memcpy(friends[i].name, Blocked_Contacts.list[bnum].name, friends[i].namelength + 1); memcpy(friends[i].pub_key, Blocked_Contacts.list[bnum].pub_key, TOX_CLIENT_ID_SIZE); num_friends = tox_count_friendlist(m); if (i == max_friends_index) ++max_friends_index; sort_blocklist_index(); sort_friendlist_index(); return; } }
/* puts blocked friend back in friendlist. fnum is new friend number, bnum is blocked number */ static void friendlist_add_blocked(Tox *m, uint32_t fnum, uint32_t bnum) { realloc_friends(Friends.max_idx + 1); memset(&Friends.list[Friends.max_idx], 0, sizeof(ToxicFriend)); int i; for (i = 0; i <= Friends.max_idx; ++i) { if (Friends.list[i].active) continue; ++Friends.num_friends; Friends.list[i].num = fnum; Friends.list[i].active = true; Friends.list[i].chatwin = -1; Friends.list[i].status = TOX_USER_STATUS_NONE; Friends.list[i].logging_on = (bool) user_settings->autolog == AUTOLOG_ON; Friends.list[i].namelength = Blocked.list[bnum].namelength; update_friend_last_online(i, Blocked.list[bnum].last_on); memcpy(Friends.list[i].name, Blocked.list[bnum].name, Friends.list[i].namelength + 1); memcpy(Friends.list[i].pub_key, Blocked.list[bnum].pub_key, TOX_PUBLIC_KEY_SIZE); if (i == Friends.max_idx) ++Friends.max_idx; sort_blocklist_index(); sort_friendlist_index(); return; } }
static void friendlist_onConnectionChange(ToxWindow *self, Tox *m, int num, uint8_t status) { if (num >= max_friends_index) return; friends[num].online = status == 1 ? true : false; sort_friendlist_index(m); }
void friendlist_onFriendAdded(ToxWindow *self, Tox *m, uint32_t num, bool sort) { realloc_friends(Friends.max_idx + 1); memset(&Friends.list[Friends.max_idx], 0, sizeof(ToxicFriend)); uint32_t i; for (i = 0; i <= Friends.max_idx; ++i) { if (Friends.list[i].active) { continue; } ++Friends.num_friends; Friends.list[i].num = num; Friends.list[i].active = true; Friends.list[i].chatwin = -1; Friends.list[i].connection_status = TOX_CONNECTION_NONE; Friends.list[i].status = TOX_USER_STATUS_NONE; Friends.list[i].logging_on = (bool) user_settings->autolog == AUTOLOG_ON; Tox_Err_Friend_Get_Public_Key pkerr; tox_friend_get_public_key(m, num, (uint8_t *) Friends.list[i].pub_key, &pkerr); if (pkerr != TOX_ERR_FRIEND_GET_PUBLIC_KEY_OK) { fprintf(stderr, "tox_friend_get_public_key failed (error %d)\n", pkerr); } Tox_Err_Friend_Get_Last_Online loerr; time_t t = tox_friend_get_last_online(m, num, &loerr); if (loerr != TOX_ERR_FRIEND_GET_LAST_ONLINE_OK) { t = 0; } update_friend_last_online(i, t); char tempname[TOX_MAX_NAME_LENGTH] = {0}; get_nick_truncate(m, tempname, num); snprintf(Friends.list[i].name, sizeof(Friends.list[i].name), "%s", tempname); Friends.list[i].namelength = strlen(Friends.list[i].name); if (i == Friends.max_idx) { ++Friends.max_idx; } if (sort) { sort_friendlist_index(); } #ifdef AUDIO init_friend_AV(i); #endif return; } }
static void friendlist_onConnectionChange(ToxWindow *self, Tox *m, int32_t num, uint8_t status) { if (num >= Friends.max_idx) return; Friends.list[num].online = status; update_friend_last_online(num, get_unix_time()); store_data(m, DATA_FILE); sort_friendlist_index(); }
static void load_friendlist(Tox *m) { uint32_t i; uint32_t numfriends = tox_count_friendlist(m); for (i = 0; i < numfriends; ++i) friendlist_onFriendAdded(NULL, m, i, false); sort_friendlist_index(); }
static void load_friendlist(Tox *m) { size_t i; size_t numfriends = tox_self_get_friend_list_size(m); for (i = 0; i < numfriends; ++i) friendlist_onFriendAdded(NULL, m, i, false); sort_friendlist_index(); }
static void friendlist_onNickChange(ToxWindow *self, Tox *m, int num, uint8_t *str, uint16_t len) { if (len > TOX_MAX_NAME_LENGTH || num >= max_friends_index) return; str[TOXIC_MAX_NAME_LENGTH] = '\0'; len = strlen(str) + 1; memcpy(friends[num].name, str, len); friends[num].namelength = len; sort_friendlist_index(m); }
static void friendlist_onNickChange(ToxWindow *self, Tox *m, int32_t num, uint8_t *str, uint16_t len) { if (len > TOX_MAX_NAME_LENGTH || num >= max_friends_index) return; len = MIN(len, TOXIC_MAX_NAME_LENGTH - 1); str[len] = '\0'; strcpy(friends[num].name, str); friends[num].namelength = len; sort_friendlist_index(); }
static void friendlist_onNickChange(ToxWindow *self, Tox *m, int32_t num, const char *nick, uint16_t len) { if (len > TOX_MAX_NAME_LENGTH || num >= max_friends_index) return; char tempname[TOX_MAX_NAME_LENGTH]; strcpy(tempname, nick); len = MIN(len, TOXIC_MAX_NAME_LENGTH - 1); tempname[len] = '\0'; snprintf(friends[num].name, sizeof(friends[num].name), "%s", tempname); friends[num].namelength = len; sort_friendlist_index(); }
/* removes friend from blocklist, puts back in friendlist */ static void unblock_friend(Tox *m, int32_t bnum) { if (Blocked.num_blocked <= 0) return; int32_t friendnum = tox_add_friend_norequest(m, (uint8_t *) Blocked.list[bnum].pub_key); if (friendnum == -1) { line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to unblock friend"); return; } friendlist_add_blocked(m, friendnum, bnum); delete_blocked_friend(bnum); sort_blocklist_index(); sort_friendlist_index(); }
/* deactivates delete friend popup and deletes friend if instructed */ static void del_friend_deactivate(ToxWindow *self, Tox *m, wint_t key) { if (key == 'y') { if (blocklist_view == 0) { delete_friend(m, PendingDelete.num); sort_friendlist_index(); } else { delete_blocked_friend(PendingDelete.num); sort_blocklist_index(); } } delwin(PendingDelete.popup); memset(&PendingDelete, 0, sizeof(PendingDelete)); clear(); refresh(); }
void friendlist_onFriendAdded(ToxWindow *self, Tox *m, int32_t num, bool sort) { if (Friends.max_idx < 0) return; Friends.num_friends = tox_count_friendlist(m); realloc_friends(Friends.max_idx + 1); memset(&Friends.list[Friends.max_idx], 0, sizeof(ToxicFriend)); int i; for (i = 0; i <= Friends.max_idx; ++i) { if (Friends.list[i].active) continue; Friends.list[i].num = num; Friends.list[i].active = true; Friends.list[i].chatwin = -1; Friends.list[i].online = false; Friends.list[i].status = TOX_USERSTATUS_NONE; Friends.list[i].logging_on = (bool) user_settings->autolog == AUTOLOG_ON; tox_get_client_id(m, num, (uint8_t *) Friends.list[i].pub_key); update_friend_last_online(i, tox_get_last_online(m, i)); char tempname[TOX_MAX_NAME_LENGTH] = {0}; int len = get_nick_truncate(m, tempname, num); if (len == -1 || tempname[0] == '\0') { strcpy(Friends.list[i].name, UNKNOWN_NAME); Friends.list[i].namelength = strlen(UNKNOWN_NAME); } else { /* Enforce toxic's maximum name length */ snprintf(Friends.list[i].name, sizeof(Friends.list[i].name), "%s", tempname); Friends.list[i].namelength = strlen(Friends.list[i].name); } if (i == Friends.max_idx) ++Friends.max_idx; if (sort) sort_friendlist_index(); return; } }
/* removes friend from blocklist, puts back in friendlist */ static void unblock_friend(Tox *m, uint32_t bnum) { if (Blocked.num_blocked <= 0) return; TOX_ERR_FRIEND_ADD err; uint32_t friendnum = tox_friend_add_norequest(m, (uint8_t *) Blocked.list[bnum].pub_key, &err); if (err != TOX_ERR_FRIEND_ADD_OK) { line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to unblock friend (error %d)", err); return; } friendlist_add_blocked(m, friendnum, bnum); delete_blocked_friend(bnum); sort_blocklist_index(); sort_friendlist_index(); }
static void friendlist_onConnectionChange(ToxWindow *self, Tox *m, uint32_t num, TOX_CONNECTION connection_status) { if (num >= Friends.max_idx) return; if (connection_status == TOX_CONNECTION_NONE) { --Friends.num_online; } else if (Friends.list[num].connection_status == TOX_CONNECTION_NONE) { ++Friends.num_online; if (avatar_send(m, num) == -1) fprintf(stderr, "avatar_send failed for friend %d\n", num); } Friends.list[num].connection_status = connection_status; update_friend_last_online(num, get_unix_time()); store_data(m, DATA_FILE); sort_friendlist_index(); }
void friendlist_onFriendAdded(ToxWindow *self, Tox *m, int32_t num, bool sort) { if (max_friends_index < 0 || max_friends_index >= MAX_FRIENDS_NUM) return; int i; for (i = 0; i <= max_friends_index; ++i) { if (!friends[i].active) { friends[i].num = num; friends[i].active = true; friends[i].chatwin = -1; friends[i].online = false; friends[i].status = TOX_USERSTATUS_NONE; friends[i].logging_on = (bool) user_settings_->autolog == AUTOLOG_ON; tox_get_client_id(m, num, (uint8_t *) friends[i].pub_key); update_friend_last_online(i, tox_get_last_online(m, i)); char tempname[TOX_MAX_NAME_LENGTH] = {0}; int len = get_nick_truncate(m, tempname, num); if (len == -1 || tempname[0] == '\0') { strcpy(friends[i].name, UNKNOWN_NAME); friends[i].namelength = strlen(UNKNOWN_NAME); } else { /* Enforce toxic's maximum name length */ friends[i].namelength = len; snprintf(friends[i].name, sizeof(friends[i].name), "%s", tempname); } num_friends = tox_count_friendlist(m); if (i == max_friends_index) ++max_friends_index; if (sort) sort_friendlist_index(); return; } } }
static void delete_friend(Tox *m, int f_num) { tox_del_friend(m, f_num); memset(&friends[f_num], 0, sizeof(ToxicFriend)); int i; for (i = max_friends_index; i > 0; --i) { if (friends[i-1].active) break; } max_friends_index = i; num_friends = tox_count_friendlist(m); /* make sure num_selected stays within num_friends range */ if (num_friends && num_selected == num_friends) --num_selected; sort_friendlist_index(m); store_data(m, DATA_FILE); }
void friendlist_onFriendAdded(ToxWindow *self, Tox *m, int num, bool sort) { if (max_friends_index < 0 || max_friends_index >= MAX_FRIENDS_NUM) return; int i; for (i = 0; i <= max_friends_index; ++i) { if (!friends[i].active) { friends[i].num = num; friends[i].active = true; friends[i].chatwin = -1; friends[i].online = false; friends[i].status = TOX_USERSTATUS_NONE; friends[i].namelength = tox_get_name(m, num, friends[i].name); tox_get_client_id(m, num, friends[i].pub_key); if (friends[i].namelength == -1 || friends[i].name[0] == '\0') { strcpy(friends[i].name, (uint8_t *) UNKNOWN_NAME); friends[i].namelength = strlen(UNKNOWN_NAME) + 1; } else { /* Enforce toxic's maximum name length */ friends[i].name[TOXIC_MAX_NAME_LENGTH] = '\0'; friends[i].namelength = strlen(friends[i].name) + 1; } num_friends = tox_count_friendlist(m); if (i == max_friends_index) ++max_friends_index; if (sort) sort_friendlist_index(m); return; } } }
int main(int argc, char *argv[]) { char *user_config_dir = get_user_config_dir(); int config_err = 0; f_loadfromfile = 1; int f_flag = 0; int i = 0; int f_use_ipv4 = 0; /* Make sure all written files are read/writeable only by the current user. */ umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); for (i = 0; i < argc; ++i) { if (argv[i] == NULL) break; else if (argv[i][0] == '-') { if (argv[i][1] == 'f') { if (argv[i + 1] != NULL) DATA_FILE = strdup(argv[i + 1]); else f_flag = -1; } else if (argv[i][1] == 'n') { f_loadfromfile = 0; } else if (argv[i][1] == '4') { f_use_ipv4 = 1; } } } config_err = create_user_config_dir(user_config_dir); if (DATA_FILE == NULL ) { if (config_err) { DATA_FILE = strdup("data"); } else { DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); if (DATA_FILE != NULL) { strcpy(DATA_FILE, user_config_dir); strcat(DATA_FILE, CONFIGDIR); strcat(DATA_FILE, "data"); } else { endwin(); fprintf(stderr, "malloc() failed. Aborting...\n"); exit(EXIT_FAILURE); } } } free(user_config_dir); init_term(); Tox *m = init_tox(f_use_ipv4); if (m == NULL) { endwin(); fprintf(stderr, "Failed to initialize network. Aborting...\n"); exit(EXIT_FAILURE); } prompt = init_windows(m); #ifdef _SUPPORT_AUDIO attron(COLOR_PAIR(RED) | A_BOLD); wprintw(prompt->window, "Starting audio...\n"); attroff(COLOR_PAIR(RED) | A_BOLD); av = init_audio(prompt, m); if ( errors() == NoError ) wprintw(prompt->window, "Audio started with no problems.\n"); else /* Get error code and stuff */ wprintw(prompt->window, "Error starting audio!\n"); #endif /* _SUPPORT_AUDIO */ if (f_loadfromfile) load_data(m, DATA_FILE); if (f_flag == -1) { attron(COLOR_PAIR(RED) | A_BOLD); wprintw(prompt->window, "You passed '-f' without giving an argument.\n" "defaulting to 'data' for a keyfile...\n"); attroff(COLOR_PAIR(RED) | A_BOLD); } if (config_err) { attron(COLOR_PAIR(RED) | A_BOLD); wprintw(prompt->window, "Unable to determine configuration directory.\n" "defaulting to 'data' for a keyfile...\n"); attroff(COLOR_PAIR(RED) | A_BOLD); } prompt_init_statusbar(prompt, m); sort_friendlist_index(m); while (true) do_toxic(m, prompt); return 0; }
int main(int argc, char *argv[]) { char *user_config_dir = get_user_config_dir(); int config_err = 0; parse_args(argc, argv); /* Make sure all written files are read/writeable only by the current user. */ umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); signal(SIGINT, catch_SIGINT); config_err = create_user_config_dir(user_config_dir); if (DATA_FILE == NULL ) { if (config_err) { DATA_FILE = strdup("data"); if (DATA_FILE == NULL) exit_toxic_err("failed in main", FATALERR_MEMORY); } else { DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); if (DATA_FILE == NULL) exit_toxic_err("failed in main", FATALERR_MEMORY); strcpy(DATA_FILE, user_config_dir); strcat(DATA_FILE, CONFIGDIR); strcat(DATA_FILE, "data"); } } free(user_config_dir); /* init user_settings struct and load settings from conf file */ user_settings_ = calloc(1, sizeof(struct user_settings)); if (user_settings_ == NULL) exit_toxic_err("failed in main", FATALERR_MEMORY); char *p = arg_opts.config_path[0] ? arg_opts.config_path : NULL; int settings_err = settings_load(user_settings_, p); Tox *m = init_tox(arg_opts.use_ipv4); init_term(); if (m == NULL) exit_toxic_err("failed in main", FATALERR_NETWORKINIT); if (!arg_opts.ignore_data_file) load_data(m, DATA_FILE); prompt = init_windows(m); prompt_init_statusbar(prompt, m); /* thread for ncurses stuff */ if (pthread_mutex_init(&Winthread.lock, NULL) != 0) exit_toxic_err("failed in main", FATALERR_MUTEX_INIT); if (pthread_create(&Winthread.tid, NULL, thread_winref, (void *) m) != 0) exit_toxic_err("failed in main", FATALERR_THREAD_CREATE); #ifdef _AUDIO av = init_audio(prompt, m); set_primary_device(input, user_settings_->audio_in_dev); set_primary_device(output, user_settings_->audio_out_dev); #elif _SOUND_NOTIFY if ( init_devices() == de_InternalError ) line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to init devices"); #endif /* _AUDIO */ init_notify(60, 3000); #ifdef _SOUND_NOTIFY notify(prompt, self_log_in, 0); #endif /* _SOUND_NOTIFY */ const char *msg; if (config_err) { msg = "Unable to determine configuration directory. Defaulting to 'data' for a keyfile..."; line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, msg); } if (settings_err == -1) { msg = "Failed to load user settings"; line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, msg); } sort_friendlist_index(); uint64_t last_save = (uint64_t) time(NULL); while (true) { update_unix_time(); do_toxic(m, prompt); uint64_t cur_time = get_unix_time(); if (timed_out(last_save, cur_time, AUTOSAVE_FREQ)) { pthread_mutex_lock(&Winthread.lock); store_data(m, DATA_FILE); pthread_mutex_unlock(&Winthread.lock); last_save = cur_time; } usleep(40000); } return 0; }
int main(int argc, char *argv[]) { char *user_config_dir = get_user_config_dir(); int config_err = 0; parse_args(argc, argv); /* Make sure all written files are read/writeable only by the current user. */ umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); signal(SIGINT, ignore_SIGINT); config_err = create_user_config_dir(user_config_dir); if (DATA_FILE == NULL ) { if (config_err) { DATA_FILE = strdup("data"); } else { DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); if (DATA_FILE != NULL) { strcpy(DATA_FILE, user_config_dir); strcat(DATA_FILE, CONFIGDIR); strcat(DATA_FILE, "data"); } else { endwin(); fprintf(stderr, "malloc() failed. Aborting...\n"); exit(EXIT_FAILURE); } } } free(user_config_dir); /* init user_settings struct and load settings from conf file */ user_settings = malloc(sizeof(struct user_settings)); if (user_settings == NULL) { endwin(); fprintf(stderr, "malloc() failed. Aborting...\n"); exit(EXIT_FAILURE); } memset(user_settings, 0, sizeof(struct user_settings)); char *p = arg_opts.config_path[0] ? arg_opts.config_path : NULL; int settings_err = settings_load(user_settings, p); Tox *m = init_tox(arg_opts.use_ipv4); init_term(); if (m == NULL) { endwin(); fprintf(stderr, "Failed to initialize network. Aborting...\n"); exit(EXIT_FAILURE); } if (!arg_opts.ignore_data_file) load_data(m, DATA_FILE); prompt = init_windows(m); /* create new thread for ncurses stuff */ if (pthread_mutex_init(&Winthread.lock, NULL) != 0) { endwin(); fprintf(stderr, "Mutex init failed. Aborting...\n"); exit(EXIT_FAILURE); } if (pthread_create(&Winthread.tid, NULL, thread_winref, (void *) m) != 0) { endwin(); fprintf(stderr, "Thread creation failed. Aborting...\n"); exit(EXIT_FAILURE); } uint8_t *msg; #ifdef _SUPPORT_AUDIO av = init_audio(prompt, m); device_set(prompt, input, user_settings->audio_in_dev); device_set(prompt, output, user_settings->audio_out_dev); if ( errors() == NoError ) msg = "Audio initiated with no problems."; else /* Get error code and stuff */ msg = "Error initiating audio!"; line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); #endif /* _SUPPORT_AUDIO */ if (config_err) { msg = "Unable to determine configuration directory. Defaulting to 'data' for a keyfile..."; line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); } if (settings_err == -1) { msg = "Failed to load user settings"; line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); } sort_friendlist_index(); prompt_init_statusbar(prompt, m); while (true) { update_unix_time(); do_toxic(m, prompt); usleep(10000); } return 0; }
int main(int argc, char *argv[]) { char *user_config_dir = get_user_config_dir(); int config_err = 0; f_loadfromfile = 1; int f_flag = 0; int i = 0; int f_use_ipv4 = 0; /* Make sure all written files are read/writeable only by the current user. */ umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); for (i = 0; i < argc; ++i) { if (argv[i] == NULL) break; else if (argv[i][0] == '-') { if (argv[i][1] == 'f') { if (argv[i + 1] != NULL) DATA_FILE = strdup(argv[i + 1]); else f_flag = -1; } else if (argv[i][1] == 'n') { f_loadfromfile = 0; } else if (argv[i][1] == '4') { f_use_ipv4 = 1; } } } config_err = create_user_config_dir(user_config_dir); if (DATA_FILE == NULL ) { if (config_err) { DATA_FILE = strdup("data"); } else { DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); if (DATA_FILE != NULL) { strcpy(DATA_FILE, user_config_dir); strcat(DATA_FILE, CONFIGDIR); strcat(DATA_FILE, "data"); } else { endwin(); fprintf(stderr, "malloc() failed. Aborting...\n"); exit(EXIT_FAILURE); } } } free(user_config_dir); init_term(); Tox *m = init_tox(f_use_ipv4); if (m == NULL) { endwin(); fprintf(stderr, "Failed to initialize network. Aborting...\n"); exit(EXIT_FAILURE); } prompt = init_windows(m); /* create new thread for ncurses stuff */ if (pthread_mutex_init(&Winthread.lock, NULL) != 0) { endwin(); fprintf(stderr, "Mutex init failed. Aborting...\n"); exit(EXIT_FAILURE); } if (pthread_create(&Winthread.tid, NULL, thread_winref, (void *) m) != 0) { endwin(); fprintf(stderr, "Thread creation failed. Aborting...\n"); exit(EXIT_FAILURE); } uint8_t *msg; #ifdef _SUPPORT_AUDIO av = init_audio(prompt, m); if ( errors() == NoError ) msg = "Audio started with no problems."; else /* Get error code and stuff */ msg = "Error starting audio!"; line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); #endif /* _SUPPORT_AUDIO */ if (f_loadfromfile) load_data(m, DATA_FILE); if (f_flag == -1) { msg = "You passed '-f' without giving an argument. Defaulting to 'data' for a keyfile..."; line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); } if (config_err) { msg = "Unable to determine configuration directory. Defaulting to 'data' for a keyfile..."; line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); } sort_friendlist_index(); prompt_init_statusbar(prompt, m); while (true) { update_unix_time(); do_toxic(m, prompt); usleep(10000); } return 0; }