diff --git a/src/chat.c b/src/chat.c index 9dc6dc2..488c31a 100644 --- a/src/chat.c +++ b/src/chat.c @@ -49,7 +49,7 @@ static void chat_onMessage(ToxWindow *self, Tox *m, int num, uint8_t *msg, uint1 struct tm *timeinfo = get_time(); uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'}; - tox_getname(m, num, (uint8_t *) &nick); + tox_getname(m, num, nick); wattron(ctx->history, COLOR_PAIR(CYAN)); wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); @@ -81,7 +81,7 @@ static void chat_onAction(ToxWindow *self, Tox *m, int num, uint8_t *action, uin struct tm *timeinfo = get_time(); uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'}; - tox_getname(m, num, (uint8_t *) &nick); + tox_getname(m, num, nick); wattron(ctx->history, COLOR_PAIR(CYAN)); wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); @@ -133,7 +133,7 @@ int string_is_empty(char *string) } /* convert wide characters to null terminated string */ -static char *wcs_to_char(wchar_t *string) +static uint8_t *wcs_to_char(wchar_t *string) { size_t len = 0; char *ret = NULL; @@ -142,12 +142,22 @@ static char *wcs_to_char(wchar_t *string) if (len != (size_t) -1) { len++; ret = malloc(len); - wcstombs(ret, string, len); + if (ret != NULL) + wcstombs(ret, string, len); } else { ret = malloc(2); - ret[0] = ' '; - ret[1] = '\0'; + if (ret != NULL) { + ret[0] = ' '; + ret[1] = '\0'; + } } + + if (ret == NULL) { + fprintf(stderr, "malloc() failed. Aborting...\n"); + endwin(); + exit(EXIT_FAILURE); + } + return ret; } @@ -203,16 +213,12 @@ static void execute(ToxWindow *self, ChatContext *ctx, StatusBar *statusbar, Tox print_help(ctx); else if (!strcmp(cmd, "/quit") || !strcmp(cmd, "/exit") || !strcmp(cmd, "/q")) { - endwin(); - store_data(m, DATA_FILE); - free(DATA_FILE); - tox_kill(m); - exit(0); + exit_toxic(m); } else if (!strncmp(cmd, "/me ", strlen("/me "))) { struct tm *timeinfo = get_time(); - char *action = strchr(cmd, ' '); + uint8_t *action = strchr(cmd, ' '); if (action == NULL) { wprintw(self->window, "Invalid syntax.\n"); @@ -233,7 +239,7 @@ static void execute(ToxWindow *self, ChatContext *ctx, StatusBar *statusbar, Tox wattroff(ctx->history, COLOR_PAIR(YELLOW)); if (!statusbar->is_online - || tox_sendaction(m, self->friendnum, (uint8_t *) action, strlen(action) + 1) == 0) { + || tox_sendaction(m, self->friendnum, action, strlen(action) + 1) == 0) { wattron(ctx->history, COLOR_PAIR(RED)); wprintw(ctx->history, " * Failed to send action\n"); wattroff(ctx->history, COLOR_PAIR(RED)); @@ -373,7 +379,7 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key) /* RETURN key: Execute command or print line */ else if (key == '\n') { - char *line = wcs_to_char(ctx->line); + uint8_t *line = wcs_to_char(ctx->line); wclear(ctx->linewin); wmove(self->window, y2 - CURS_Y_OFFSET, 0); wclrtobot(self->window); @@ -403,7 +409,7 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key) wprintw(ctx->history, "%s\n", line); if (!statusbar->is_online - || tox_sendmessage(m, self->friendnum, (uint8_t *) line, strlen(line) + 1) == 0) { + || tox_sendmessage(m, self->friendnum, line, strlen(line) + 1) == 0) { wattron(ctx->history, COLOR_PAIR(RED)); wprintw(ctx->history, " * Failed to send message.\n"); wattroff(ctx->history, COLOR_PAIR(RED)); @@ -532,13 +538,20 @@ ToxWindow new_chat(Tox *m, ToxWindow *prompt, int friendnum) ret.onAction = &chat_onAction; uint8_t name[TOX_MAX_NAME_LENGTH] = {'\0'}; - tox_getname(m, friendnum, (uint8_t *) &name); + tox_getname(m, friendnum, name); snprintf(ret.name, sizeof(ret.name), "%s", name); ChatContext *x = calloc(1, sizeof(ChatContext)); StatusBar *s = calloc(1, sizeof(StatusBar)); - ret.x = x; - ret.s = s; + + if (s != NULL && x != NULL) { + ret.x = x; + ret.s = s; + } else { + fprintf(stderr, "calloc() failed. Aborting...\n"); + endwin(); + exit(EXIT_FAILURE); + } ret.prompt = prompt; ret.friendnum = friendnum; diff --git a/src/friendlist.c b/src/friendlist.c index a68823f..b831959 100644 --- a/src/friendlist.c +++ b/src/friendlist.c @@ -17,8 +17,6 @@ #include "friendlist.h" extern char *DATA_FILE; -extern int store_data(Tox *m, char *path); - extern ToxWindow *prompt; typedef struct { @@ -136,9 +134,10 @@ static void select_friend(Tox *m, wint_t key) } else return; /* Bad key input */ /* If we reach this something is wrong */ + fprintf(stderr, "select_friend() failed. Aborting...\n"); endwin(); tox_kill(m); - exit(2); + exit(EXIT_FAILURE); } static void delete_friend(Tox *m, ToxWindow *self, int f_num, wint_t key) diff --git a/src/main.c b/src/main.c index beef19b..4555789 100644 --- a/src/main.c +++ b/src/main.c @@ -60,9 +60,9 @@ static void init_term() signal(SIGWINCH, on_window_resize); #if HAVE_WIDECHAR if (setlocale(LC_ALL, "") == NULL) { - printf("Could not set your locale, plese check your locale settings or" + fprintf(stderr, "Could not set your locale, plese check your locale settings or" "disable wide char support\n"); - exit(1); + exit(EXIT_FAILURE); } #endif initscr(); @@ -91,7 +91,7 @@ static Tox *init_tox() { /* Init core */ Tox *m = tox_new(); - if (!m) + if (m == NULL) return NULL; /* Callbacks */ @@ -184,7 +184,7 @@ int init_connection(Tox *m) fp = fopen(SRVLIST_FILE, "r"); - if (!fp) + if (fp == NULL) return 1; char servers[MAXSERVERS][MAXLINE]; @@ -208,7 +208,7 @@ int init_connection(Tox *m) char *port = strtok(NULL, " "); char *key = strtok(NULL, " "); - if (!ip || !port || !key) + if (ip == NULL || port == NULL || key == NULL) return 3; tox_IP_Port dht; @@ -317,18 +317,18 @@ static void load_data(Tox *m, char *path) buf = malloc(len); if (buf == NULL) { - fprintf(stderr, "malloc() failed.\n"); + fprintf(stderr, "malloc() failed. Aborting...\n"); fclose(fd); endwin(); - exit(1); + exit(EXIT_FAILURE); } if (fread(buf, len, 1, fd) != 1) { - fprintf(stderr, "fread() failed.\n"); + fprintf(stderr, "fread() failed. Aborting...\n"); free(buf); fclose(fd); endwin(); - exit(1); + exit(EXIT_FAILURE); } tox_load(m, buf, len); @@ -349,11 +349,22 @@ static void load_data(Tox *m, char *path) if ((st = store_data(m, path)) != 0) { fprintf(stderr, "Store messenger failed with return code: %d\n", st); endwin(); - exit(1); + exit(EXIT_FAILURE); } } } +void exit_toxic(Tox *m) +{ + store_data(m, DATA_FILE); + free(DATA_FILE); + free(SRVLIST_FILE); + free(prompt->s); + tox_kill(m); + endwin(); + exit(EXIT_SUCCESS); +} + int main(int argc, char *argv[]) { char *user_config_dir = get_user_config_dir(); @@ -386,17 +397,20 @@ int main(int argc, char *argv[]) SRVLIST_FILE = strdup(PACKAGE_DATADIR "/DHTservers"); } else { DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); - if (DATA_FILE != NULL) { + SRVLIST_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("DHTservers") + 1); + + if (DATA_FILE != NULL && SRVLIST_FILE != NULL) { strcpy(DATA_FILE, user_config_dir); strcat(DATA_FILE, CONFIGDIR); strcat(DATA_FILE, "data"); - } - SRVLIST_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("DHTservers") + 1); - if (SRVLIST_FILE != NULL) { strcpy(SRVLIST_FILE, user_config_dir); strcat(SRVLIST_FILE, CONFIGDIR); strcat(SRVLIST_FILE, "DHTservers"); + } else { + fprintf(stderr, "malloc() failed. Aborting...\n"); + endwin(); + exit(EXIT_FAILURE); } } } @@ -405,10 +419,11 @@ int main(int argc, char *argv[]) init_term(); Tox *m = init_tox(); - if (!m) { + + if (m == NULL) { endwin(); fprintf(stderr, "Failed to initialize network. Aborting...\n"); - exit(1); + exit(EXIT_FAILURE); } prompt = init_windows(m); @@ -440,8 +455,6 @@ int main(int argc, char *argv[]) draw_active_window(m); } - tox_kill(m); - free(DATA_FILE); - free(SRVLIST_FILE); + exit_toxic(m); return 0; } diff --git a/src/prompt.c b/src/prompt.c index bd26010..e581f55 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -10,11 +10,9 @@ #include #include -#include "toxic_windows.h" #include "prompt.h" extern char *DATA_FILE; -extern int store_data(Tox *m, char *path); uint8_t pending_requests[MAX_STR_SIZE][TOX_CLIENT_ID_SIZE]; // XXX uint8_t num_requests = 0; // XXX @@ -115,6 +113,13 @@ unsigned char *hex_string_to_bin(char hex_string[]) { size_t len = strlen(hex_string); unsigned char *val = malloc(len); + + if (val == NULL) { + fprintf(stderr, "malloc() failed. Aborting...\n"); + endwin(); + exit(EXIT_FAILURE); + } + char *pos = hex_string; int i; @@ -294,11 +299,7 @@ void cmd_connect(ToxWindow *self, Tox *m, int argc, char **argv) void cmd_quit(ToxWindow *self, Tox *m, int argc, char **argv) { - endwin(); - store_data(m, DATA_FILE); - free(DATA_FILE); - tox_kill(m); - exit(0); + exit_toxic(m); } void cmd_help(ToxWindow *self, Tox *m, int argc, char **argv) @@ -694,7 +695,14 @@ ToxWindow new_prompt() strcpy(ret.name, "prompt"); StatusBar *s = calloc(1, sizeof(StatusBar)); - ret.s = s; + + if (s != NULL) + ret.s = s; + else { + fprintf(stderr, "calloc() failed. Aborting...\n"); + endwin(); + exit(EXIT_FAILURE); + } return ret; } diff --git a/src/prompt.h b/src/prompt.h index 9c68831..c4d51df 100644 --- a/src/prompt.h +++ b/src/prompt.h @@ -9,5 +9,3 @@ unsigned char *hex_string_to_bin(char hex_string[]); void prompt_init_statusbar(ToxWindow *self, Tox *m); #endif /* end of include guard: PROMPT_H_UZYGWFFL */ - - diff --git a/src/toxic_windows.h b/src/toxic_windows.h index 12e83bf..41f6b14 100644 --- a/src/toxic_windows.h +++ b/src/toxic_windows.h @@ -21,6 +21,9 @@ #define N_DEFAULT_WINS 3 #define UNKNOWN_NAME "Unknown" + +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 #ifndef TOXICVER #define TOXICVER "NOVER" //Use the -D flag to set this @@ -85,4 +88,3 @@ int add_window(Tox *m, ToxWindow w); void del_window(ToxWindow *w); void set_active_window(int ch); #endif - diff --git a/src/windows.c b/src/windows.c index f24e892..e36a9af 100644 --- a/src/windows.c +++ b/src/windows.c @@ -10,7 +10,6 @@ #include "toxic_windows.h" extern char *DATA_FILE; -extern int store_data(Tox *m, char *path); static ToxWindow windows[MAX_WINDOWS_NUM]; static ToxWindow *active_window; @@ -31,7 +30,7 @@ void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void *userd void on_connectionchange(Tox *m, int friendnumber, uint8_t status, void *userdata) { uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'}; - tox_getname(m, friendnumber, (uint8_t *) &nick); + tox_getname(m, friendnumber, nick); if (!nick[0]) snprintf(nick, sizeof(nick), "%s", UNKNOWN_NAME); @@ -177,7 +176,8 @@ void set_next_window(int ch) if (active_window == inf) { // infinite loop check endwin(); - exit(2); + fprintf(stderr, "set_next_window() failed. Aborting...\n"); + exit(EXIT_FAILURE); } } } @@ -195,9 +195,9 @@ ToxWindow *init_windows() int n_prompt = add_window(m, new_prompt()); if (n_prompt == -1 || add_window(m, new_friendlist()) == -1) { - fprintf(stderr, "add_window() failed.\n"); + fprintf(stderr, "add_window() failed. Aborting...\n"); endwin(); - exit(1); + exit(EXIT_FAILURE); } prompt = &windows[n_prompt];