From 40dcfc82d2b39b601dfa233c5f25ff02e8e3e86c Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Wed, 11 Sep 2013 00:02:27 -0400 Subject: [PATCH 1/4] made error handling more consistent and added exit function --- src/friendlist.c | 5 ++--- src/main.c | 21 +++++++++++---------- src/prompt.c | 4 +--- src/prompt.h | 2 -- src/toxic_windows.h | 4 +++- src/windows.c | 8 ++++---- 6 files changed, 21 insertions(+), 23 deletions(-) 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..11bc1c9 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; @@ -320,7 +320,7 @@ static void load_data(Tox *m, char *path) fprintf(stderr, "malloc() failed.\n"); fclose(fd); endwin(); - exit(1); + exit(EXIT_FAILURE); } if (fread(buf, len, 1, fd) != 1) { @@ -328,7 +328,7 @@ static void load_data(Tox *m, char *path) free(buf); fclose(fd); endwin(); - exit(1); + exit(EXIT_FAILURE); } tox_load(m, buf, len); @@ -349,7 +349,7 @@ 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); } } } @@ -405,10 +405,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); diff --git a/src/prompt.c b/src/prompt.c index bd26010..3fa10d6 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 @@ -298,7 +296,7 @@ void cmd_quit(ToxWindow *self, Tox *m, int argc, char **argv) store_data(m, DATA_FILE); free(DATA_FILE); tox_kill(m); - exit(0); + exit(EXIT_SUCCESS); } void cmd_help(ToxWindow *self, Tox *m, int argc, char **argv) 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..e0583c4 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; @@ -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]; From f004a4ba82be5c1dc39be289f9de04b0676fe7d7 Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Wed, 11 Sep 2013 00:12:03 -0400 Subject: [PATCH 2/4] added exit_toxic function (for real this time) --- src/chat.c | 6 +----- src/main.c | 19 ++++++++++++++++--- src/prompt.c | 6 +----- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/chat.c b/src/chat.c index 9dc6dc2..ec6063f 100644 --- a/src/chat.c +++ b/src/chat.c @@ -203,11 +203,7 @@ 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 "))) { diff --git a/src/main.c b/src/main.c index 11bc1c9..16c3e7a 100644 --- a/src/main.c +++ b/src/main.c @@ -354,6 +354,21 @@ static void load_data(Tox *m, char *path) } } +void exit_toxic(Tox *m) +{ + store_data(m, DATA_FILE); + + if (DATA_FILE != NULL) + free(DATA_FILE); + + if (SRVLIST_FILE != NULL) + free(SRVLIST_FILE); + + tox_kill(m); + endwin(); + exit(EXIT_SUCCESS); +} + int main(int argc, char *argv[]) { char *user_config_dir = get_user_config_dir(); @@ -441,8 +456,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 3fa10d6..6b14045 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -292,11 +292,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(EXIT_SUCCESS); + exit_toxic(m); } void cmd_help(ToxWindow *self, Tox *m, int argc, char **argv) From 052f9f9936b21fe51a7d7c18e96bdb75a1c6fb37 Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Wed, 11 Sep 2013 18:07:26 -0400 Subject: [PATCH 3/4] more error handling --- src/chat.c | 28 +++++++++++++++++++++++----- src/main.c | 25 ++++++++++++------------- src/prompt.c | 16 +++++++++++++++- 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/chat.c b/src/chat.c index ec6063f..78ae720 100644 --- a/src/chat.c +++ b/src/chat.c @@ -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; } @@ -533,8 +543,16 @@ ToxWindow new_chat(Tox *m, ToxWindow *prompt, int friendnum) 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/main.c b/src/main.c index 16c3e7a..4555789 100644 --- a/src/main.c +++ b/src/main.c @@ -317,14 +317,14 @@ 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(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(); @@ -357,13 +357,9 @@ static void load_data(Tox *m, char *path) void exit_toxic(Tox *m) { store_data(m, DATA_FILE); - - if (DATA_FILE != NULL) - free(DATA_FILE); - - if (SRVLIST_FILE != NULL) - free(SRVLIST_FILE); - + free(DATA_FILE); + free(SRVLIST_FILE); + free(prompt->s); tox_kill(m); endwin(); exit(EXIT_SUCCESS); @@ -401,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); } } } diff --git a/src/prompt.c b/src/prompt.c index 6b14045..e581f55 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -113,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; @@ -688,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; } From c06189526614232af74d43bc18cf2431da72708d Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Wed, 11 Sep 2013 21:44:39 -0400 Subject: [PATCH 4/4] Unnecessary casting --- src/chat.c | 17 ++++++++--------- src/windows.c | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/chat.c b/src/chat.c index 78ae720..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; @@ -218,7 +218,7 @@ static void execute(ToxWindow *self, ChatContext *ctx, StatusBar *statusbar, Tox 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"); @@ -239,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)); @@ -379,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); @@ -409,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)); @@ -538,13 +538,12 @@ 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)); - if (s != NULL && x != NULL) { ret.x = x; ret.s = s; diff --git a/src/windows.c b/src/windows.c index e0583c4..e36a9af 100644 --- a/src/windows.c +++ b/src/windows.c @@ -30,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);