From 9dce121a76c5a70bb79a0c08d4e7f3df5c1519bb Mon Sep 17 00:00:00 2001 From: irungentoo Date: Fri, 16 Aug 2013 13:11:09 -0400 Subject: [PATCH] Passed everything through astyle. --- chat.c | 631 +++++++++++++++++++++++++------------------------ configdir.c | 77 +++--- configdir.h | 2 +- dhtstatus.c | 134 ++++++----- friendlist.c | 227 +++++++++--------- friendlist.h | 2 +- main.c | 299 +++++++++++++----------- prompt.c | 647 +++++++++++++++++++++++++++------------------------ windows.c | 336 ++++++++++++++------------ windows.h | 38 +-- 10 files changed, 1256 insertions(+), 1137 deletions(-) diff --git a/chat.c b/chat.c index d5edf95..ef932cd 100644 --- a/chat.c +++ b/chat.c @@ -19,376 +19,391 @@ #define CURS_Y_OFFSET 3 typedef struct { - int friendnum; - char line[MAX_STR_SIZE]; - size_t pos; - WINDOW* history; - WINDOW* linewin; + int friendnum; + char line[MAX_STR_SIZE]; + size_t pos; + WINDOW *history; + WINDOW *linewin; } ChatContext; void print_help(ChatContext *self); void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd); -struct tm *get_time(void) +struct tm *get_time(void) { - struct tm *timeinfo; - time_t now; - time(&now); - timeinfo = localtime(&now); - return timeinfo; + struct tm *timeinfo; + time_t now; + time(&now); + timeinfo = localtime(&now); + return timeinfo; } static void chat_onMessage(ToxWindow *self, Messenger *m, int num, uint8_t *msg, uint16_t len) { - ChatContext *ctx = (ChatContext*) self->x; - uint8_t nick[MAX_NAME_LENGTH] = {0}; - struct tm *timeinfo = get_time(); + ChatContext *ctx = (ChatContext *) self->x; + uint8_t nick[MAX_NAME_LENGTH] = {0}; + struct tm *timeinfo = get_time(); - if (ctx->friendnum != num) - return; + if (ctx->friendnum != num) + return; - getname(m, num, (uint8_t*) &nick); - msg[len-1] = '\0'; - nick[MAX_NAME_LENGTH-1] = '\0'; - fix_name(msg); - fix_name(nick); + getname(m, num, (uint8_t *) &nick); + msg[len - 1] = '\0'; + nick[MAX_NAME_LENGTH - 1] = '\0'; + fix_name(msg); + fix_name(nick); - wattron(ctx->history, COLOR_PAIR(2)); - wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); - wattroff(ctx->history, COLOR_PAIR(2)); - wattron(ctx->history, COLOR_PAIR(4)); - wprintw(ctx->history, "%s: ", nick); - wattroff(ctx->history, COLOR_PAIR(4)); - wprintw(ctx->history, "%s\n", msg); + wattron(ctx->history, COLOR_PAIR(2)); + wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + wattroff(ctx->history, COLOR_PAIR(2)); + wattron(ctx->history, COLOR_PAIR(4)); + wprintw(ctx->history, "%s: ", nick); + wattroff(ctx->history, COLOR_PAIR(4)); + wprintw(ctx->history, "%s\n", msg); - self->blink = true; - beep(); + self->blink = true; + beep(); } static void chat_onAction(ToxWindow *self, Messenger *m, int num, uint8_t *action, uint16_t len) { - ChatContext *ctx = (ChatContext*) self->x; - struct tm *timeinfo = get_time(); - - if (ctx->friendnum != num) - return; - - action[len-1] = '\0'; - fix_name(action); - - wattron(ctx->history, COLOR_PAIR(2)); - wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); - wattroff(ctx->history, COLOR_PAIR(2)); - - wattron(ctx->history, COLOR_PAIR(5)); - wprintw(ctx->history, "%s\n", action); - wattroff(ctx->history, COLOR_PAIR(5)); - - self->blink = true; - beep(); -} - -static void chat_onNickChange(ToxWindow *self, int num, uint8_t *nick, uint16_t len) -{ - ChatContext *ctx = (ChatContext*) self->x; - struct tm *timeinfo = get_time(); - if (ctx->friendnum != num) - return; - - wattron(ctx->history, COLOR_PAIR(2)); - wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); - wattroff(ctx->history, COLOR_PAIR(2)); - - nick[len-1] = '\0'; - fix_name(nick); - snprintf(self->title, sizeof(self->title), "[%s (%d)]", nick, num); - - wattron(ctx->history, COLOR_PAIR(3)); - wprintw(ctx->history, "* Your partner changed nick to '%s'\n", nick); - wattroff(ctx->history, COLOR_PAIR(3)); -} - -static void chat_onStatusChange(ToxWindow *self, int num, uint8_t *status, uint16_t len) -{ - ChatContext *ctx = (ChatContext*) self->x; - struct tm *timeinfo = get_time(); - if (ctx->friendnum != num) - return; - - wattron(ctx->history, COLOR_PAIR(2)); - wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); - wattroff(ctx->history, COLOR_PAIR(2)); - - status[len-1] = '\0'; - fix_name(status); - snprintf(self->title, sizeof(self->title), "[%s (%d)]", status, num); - - wattron(ctx->history, COLOR_PAIR(3)); - wprintw(ctx->history, "* Your partner changed status to '%s'\n", status); - wattroff(ctx->history, COLOR_PAIR(3)); - -} - -/* check that the string has one non-space character */ -int string_is_empty(char *string) -{ - int rc = 0; - char *copy = strdup(string); - rc = ((strtok(copy, " ") == NULL) ? 1:0); - free(copy); - return rc; -} - -static void chat_onKey(ToxWindow *self, Messenger *m, int key) -{ - ChatContext *ctx = (ChatContext*) self->x; - struct tm *timeinfo = get_time(); - - int x, y, y2, x2; - getyx(self->window, y, x); - getmaxyx(self->window, y2, x2); - - /* Add printable chars to buffer and print on input space */ - if (isprint(key)) { - if (ctx->pos != sizeof(ctx->line)-1) { - mvwaddch(self->window, y, x, key); - ctx->line[ctx->pos++] = key; - ctx->line[ctx->pos] = '\0'; - } - } - - /* BACKSPACE key: Remove one character from line */ - else if (key == 0x107 || key == 0x8 || key == 0x7f) { - if (ctx->pos > 0) { - ctx->line[--ctx->pos] = '\0'; - if (x == 0) - mvwdelch(self->window, y-1, x2-1); - else - mvwdelch(self->window, y, x-1); - } - } - - /* RETURN key: Execute command or print line */ - else if (key == '\n') { - wclear(ctx->linewin); - wmove(self->window, y2-CURS_Y_OFFSET, 0); - wclrtobot(self->window); - if (ctx->line[0] == '/') - execute(self, ctx, m, ctx->line); - else { - /* make sure the string has at least non-space character */ - if (!string_is_empty(ctx->line)) { - uint8_t selfname[MAX_NAME_LENGTH]; - getself_name(m, selfname, sizeof(selfname)); - fix_name(selfname); - - wattron(ctx->history, COLOR_PAIR(2)); - wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); - wattroff(ctx->history, COLOR_PAIR(2)); - wattron(ctx->history, COLOR_PAIR(1)); - wprintw(ctx->history, "%s: ", selfname); - wattroff(ctx->history, COLOR_PAIR(1)); - wprintw(ctx->history, "%s\n", ctx->line); - if (m_sendmessage(m, ctx->friendnum, (uint8_t*) ctx->line, strlen(ctx->line)+1) == 0) { - wattron(ctx->history, COLOR_PAIR(3)); - wprintw(ctx->history, " * Failed to send message.\n"); - wattroff(ctx->history, COLOR_PAIR(3)); - } - } - } - ctx->line[0] = '\0'; - ctx->pos = 0; - } -} - -void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd) -{ - if (!strcmp(cmd, "/clear") || !strcmp(cmd, "/c")) { - wclear(self->window); - wclear(ctx->history); - int x, y; - getmaxyx(self->window, y, x); - (void) x; - wmove(self->window, y-CURS_Y_OFFSET, 0); - } - - else if (!strcmp(cmd, "/help") || !strcmp(cmd, "/h")) - print_help(ctx); - - else if (!strcmp(cmd, "/quit") || !strcmp(cmd, "/exit") || !strcmp(cmd, "/q")) { - endwin(); - exit(0); - } - - else if (!strncmp(cmd, "/me ", strlen("/me "))) { + ChatContext *ctx = (ChatContext *) self->x; struct tm *timeinfo = get_time(); - char *action = strchr(cmd, ' '); - if (action == NULL) { - wprintw(self->window, "Invalid syntax.\n"); - return; - } - action++; + + if (ctx->friendnum != num) + return; + + action[len - 1] = '\0'; + fix_name(action); wattron(ctx->history, COLOR_PAIR(2)); wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); wattroff(ctx->history, COLOR_PAIR(2)); - uint8_t selfname[MAX_NAME_LENGTH]; - int len = getself_name(m, selfname, sizeof(selfname)); - char msg[MAX_STR_SIZE-len-4]; - snprintf(msg, sizeof(msg), "* %s %s\n", (uint8_t*) selfname, action); - wattron(ctx->history, COLOR_PAIR(5)); - wprintw(ctx->history, msg); + wprintw(ctx->history, "%s\n", action); wattroff(ctx->history, COLOR_PAIR(5)); - if (m_sendaction(m, ctx->friendnum, (uint8_t*) msg, strlen(msg)+1) < 0) { - wattron(ctx->history, COLOR_PAIR(3)); - wprintw(ctx->history, " * Failed to send action\n"); - wattroff(ctx->history, COLOR_PAIR(3)); - } - } - else if (!strncmp(cmd, "/status ", strlen("/status "))) { - char *status = strchr(cmd, ' '); - char *msg; - char *status_text; - if (status == NULL) { - wprintw(ctx->history, "Invalid syntax.\n"); - return; - } - status++; - USERSTATUS status_kind; - if (!strncmp(status, "online", strlen("online"))) { - status_kind = USERSTATUS_NONE; - status_text = "ONLINE"; + self->blink = true; + beep(); +} + +static void chat_onNickChange(ToxWindow *self, int num, uint8_t *nick, uint16_t len) +{ + ChatContext *ctx = (ChatContext *) self->x; + struct tm *timeinfo = get_time(); + + if (ctx->friendnum != num) + return; + + wattron(ctx->history, COLOR_PAIR(2)); + wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + wattroff(ctx->history, COLOR_PAIR(2)); + + nick[len - 1] = '\0'; + fix_name(nick); + snprintf(self->title, sizeof(self->title), "[%s (%d)]", nick, num); + + wattron(ctx->history, COLOR_PAIR(3)); + wprintw(ctx->history, "* Your partner changed nick to '%s'\n", nick); + wattroff(ctx->history, COLOR_PAIR(3)); +} + +static void chat_onStatusChange(ToxWindow *self, int num, uint8_t *status, uint16_t len) +{ + ChatContext *ctx = (ChatContext *) self->x; + struct tm *timeinfo = get_time(); + + if (ctx->friendnum != num) + return; + + wattron(ctx->history, COLOR_PAIR(2)); + wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + wattroff(ctx->history, COLOR_PAIR(2)); + + status[len - 1] = '\0'; + fix_name(status); + snprintf(self->title, sizeof(self->title), "[%s (%d)]", status, num); + + wattron(ctx->history, COLOR_PAIR(3)); + wprintw(ctx->history, "* Your partner changed status to '%s'\n", status); + wattroff(ctx->history, COLOR_PAIR(3)); + +} + +/* check that the string has one non-space character */ +int string_is_empty(char *string) +{ + int rc = 0; + char *copy = strdup(string); + rc = ((strtok(copy, " ") == NULL) ? 1 : 0); + free(copy); + return rc; +} + +static void chat_onKey(ToxWindow *self, Messenger *m, int key) +{ + ChatContext *ctx = (ChatContext *) self->x; + struct tm *timeinfo = get_time(); + + int x, y, y2, x2; + getyx(self->window, y, x); + getmaxyx(self->window, y2, x2); + + /* Add printable chars to buffer and print on input space */ + if (isprint(key)) { + if (ctx->pos != sizeof(ctx->line) - 1) { + mvwaddch(self->window, y, x, key); + ctx->line[ctx->pos++] = key; + ctx->line[ctx->pos] = '\0'; + } } - else if (!strncmp(status, "away", strlen("away"))) { - status_kind = USERSTATUS_AWAY; - status_text = "AWAY"; + /* BACKSPACE key: Remove one character from line */ + else if (key == 0x107 || key == 0x8 || key == 0x7f) { + if (ctx->pos > 0) { + ctx->line[--ctx->pos] = '\0'; + + if (x == 0) + mvwdelch(self->window, y - 1, x2 - 1); + else + mvwdelch(self->window, y, x - 1); + } } - else if (!strncmp(status, "busy", strlen("busy"))) { - status_kind = USERSTATUS_BUSY; - status_text = "BUSY"; + /* RETURN key: Execute command or print line */ + else if (key == '\n') { + wclear(ctx->linewin); + wmove(self->window, y2 - CURS_Y_OFFSET, 0); + wclrtobot(self->window); + + if (ctx->line[0] == '/') + execute(self, ctx, m, ctx->line); + else { + /* make sure the string has at least non-space character */ + if (!string_is_empty(ctx->line)) { + uint8_t selfname[MAX_NAME_LENGTH]; + getself_name(m, selfname, sizeof(selfname)); + fix_name(selfname); + + wattron(ctx->history, COLOR_PAIR(2)); + wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + wattroff(ctx->history, COLOR_PAIR(2)); + wattron(ctx->history, COLOR_PAIR(1)); + wprintw(ctx->history, "%s: ", selfname); + wattroff(ctx->history, COLOR_PAIR(1)); + wprintw(ctx->history, "%s\n", ctx->line); + + if (m_sendmessage(m, ctx->friendnum, (uint8_t *) ctx->line, strlen(ctx->line) + 1) == 0) { + wattron(ctx->history, COLOR_PAIR(3)); + wprintw(ctx->history, " * Failed to send message.\n"); + wattroff(ctx->history, COLOR_PAIR(3)); + } + } + } + + ctx->line[0] = '\0'; + ctx->pos = 0; + } +} + +void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd) +{ + if (!strcmp(cmd, "/clear") || !strcmp(cmd, "/c")) { + wclear(self->window); + wclear(ctx->history); + int x, y; + getmaxyx(self->window, y, x); + (void) x; + wmove(self->window, y - CURS_Y_OFFSET, 0); } - else { - wprintw(ctx->history, "Invalid status.\n"); - return; + else if (!strcmp(cmd, "/help") || !strcmp(cmd, "/h")) + print_help(ctx); + + else if (!strcmp(cmd, "/quit") || !strcmp(cmd, "/exit") || !strcmp(cmd, "/q")) { + endwin(); + exit(0); } - msg = strchr(status, ' '); - if (msg == NULL) { - m_set_userstatus(m, status_kind); - wprintw(ctx->history, "Status set to: %s\n", status_text); - } - else { - msg++; - m_set_userstatus(m, status_kind); - m_set_statusmessage(m, ( uint8_t*) msg, strlen(msg)+1); - wprintw(ctx->history, "Status set to: %s, %s\n", status_text, msg); - } - } + else if (!strncmp(cmd, "/me ", strlen("/me "))) { + struct tm *timeinfo = get_time(); + char *action = strchr(cmd, ' '); - else if (!strncmp(cmd, "/nick ", strlen("/nick "))) { - char *nick; - nick = strchr(cmd, ' '); - if (nick == NULL) { - wprintw(ctx->history, "Invalid syntax.\n"); - return; + if (action == NULL) { + wprintw(self->window, "Invalid syntax.\n"); + return; + } + + action++; + + wattron(ctx->history, COLOR_PAIR(2)); + wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + wattroff(ctx->history, COLOR_PAIR(2)); + + uint8_t selfname[MAX_NAME_LENGTH]; + int len = getself_name(m, selfname, sizeof(selfname)); + char msg[MAX_STR_SIZE - len - 4]; + snprintf(msg, sizeof(msg), "* %s %s\n", (uint8_t *) selfname, action); + + wattron(ctx->history, COLOR_PAIR(5)); + wprintw(ctx->history, msg); + wattroff(ctx->history, COLOR_PAIR(5)); + + if (m_sendaction(m, ctx->friendnum, (uint8_t *) msg, strlen(msg) + 1) < 0) { + wattron(ctx->history, COLOR_PAIR(3)); + wprintw(ctx->history, " * Failed to send action\n"); + wattroff(ctx->history, COLOR_PAIR(3)); + } } - nick++; - setname(m, (uint8_t*) nick, strlen(nick)+1); - wprintw(ctx->history, "Nickname set to: %s\n", nick); - } + else if (!strncmp(cmd, "/status ", strlen("/status "))) { + char *status = strchr(cmd, ' '); + char *msg; + char *status_text; - else if (!strcmp(cmd, "/myid")) { - char id[FRIEND_ADDRESS_SIZE*2+1] = {0}; - int i; - uint8_t address[FRIEND_ADDRESS_SIZE]; - getaddress(m, address); - for (i = 0; i < FRIEND_ADDRESS_SIZE; i++) { - char xx[3]; - snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff); - strcat(id, xx); + if (status == NULL) { + wprintw(ctx->history, "Invalid syntax.\n"); + return; + } + + status++; + USERSTATUS status_kind; + + if (!strncmp(status, "online", strlen("online"))) { + status_kind = USERSTATUS_NONE; + status_text = "ONLINE"; + } + + else if (!strncmp(status, "away", strlen("away"))) { + status_kind = USERSTATUS_AWAY; + status_text = "AWAY"; + } + + else if (!strncmp(status, "busy", strlen("busy"))) { + status_kind = USERSTATUS_BUSY; + status_text = "BUSY"; + } + + else { + wprintw(ctx->history, "Invalid status.\n"); + return; + } + + msg = strchr(status, ' '); + + if (msg == NULL) { + m_set_userstatus(m, status_kind); + wprintw(ctx->history, "Status set to: %s\n", status_text); + } else { + msg++; + m_set_userstatus(m, status_kind); + m_set_statusmessage(m, ( uint8_t *) msg, strlen(msg) + 1); + wprintw(ctx->history, "Status set to: %s, %s\n", status_text, msg); + } } - wprintw(ctx->history, "%s\n", id); - } - else if (strcmp(ctx->line, "/close") == 0) { - int f_num = ctx->friendnum; - delwin(ctx->linewin); - del_window(self, f_num); - } + else if (!strncmp(cmd, "/nick ", strlen("/nick "))) { + char *nick; + nick = strchr(cmd, ' '); - else - wprintw(ctx->history, "Invalid command.\n"); + if (nick == NULL) { + wprintw(ctx->history, "Invalid syntax.\n"); + return; + } + + nick++; + setname(m, (uint8_t *) nick, strlen(nick) + 1); + wprintw(ctx->history, "Nickname set to: %s\n", nick); + } + + else if (!strcmp(cmd, "/myid")) { + char id[FRIEND_ADDRESS_SIZE * 2 + 1] = {0}; + int i; + uint8_t address[FRIEND_ADDRESS_SIZE]; + getaddress(m, address); + + for (i = 0; i < FRIEND_ADDRESS_SIZE; i++) { + char xx[3]; + snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff); + strcat(id, xx); + } + + wprintw(ctx->history, "%s\n", id); + } + + else if (strcmp(ctx->line, "/close") == 0) { + int f_num = ctx->friendnum; + delwin(ctx->linewin); + del_window(self, f_num); + } + + else + wprintw(ctx->history, "Invalid command.\n"); } static void chat_onDraw(ToxWindow *self) { - curs_set(1); - int x, y; - getmaxyx(self->window, y, x); - (void) y; - ChatContext *ctx = (ChatContext*) self->x; - mvwhline(ctx->linewin, 0, 0, '_', x); - wrefresh(self->window); + curs_set(1); + int x, y; + getmaxyx(self->window, y, x); + (void) y; + ChatContext *ctx = (ChatContext *) self->x; + mvwhline(ctx->linewin, 0, 0, '_', x); + wrefresh(self->window); } static void chat_onInit(ToxWindow *self, Messenger *m) { - int x, y; - ChatContext *ctx = (ChatContext*) self->x; - getmaxyx(self->window, y, x); - ctx->history = subwin(self->window, y-4, x, 0, 0); - scrollok(ctx->history, 1); - ctx->linewin = subwin(self->window, 2, x, y-4, 0); - print_help(ctx); - wmove(self->window, y-CURS_Y_OFFSET, 0); + int x, y; + ChatContext *ctx = (ChatContext *) self->x; + getmaxyx(self->window, y, x); + ctx->history = subwin(self->window, y - 4, x, 0, 0); + scrollok(ctx->history, 1); + ctx->linewin = subwin(self->window, 2, x, y - 4, 0); + print_help(ctx); + wmove(self->window, y - CURS_Y_OFFSET, 0); } void print_help(ChatContext *self) { - wattron(self->history, COLOR_PAIR(2) | A_BOLD); - wprintw(self->history, "Commands:\n"); - wattroff(self->history, A_BOLD); + wattron(self->history, COLOR_PAIR(2) | A_BOLD); + wprintw(self->history, "Commands:\n"); + wattroff(self->history, A_BOLD); - wprintw(self->history, " /status : Set your status\n"); - wprintw(self->history, " /nick : Set your nickname\n"); - wprintw(self->history, " /me : Do an action\n"); - wprintw(self->history, " /myid : Print your ID\n"); - wprintw(self->history, " /clear : Clear the screen\n"); - wprintw(self->history, " /close : Close the current chat window\n"); - wprintw(self->history, " /quit or /exit : Exit program\n"); - wprintw(self->history, " /help : Print this message again\n\n"); + wprintw(self->history, " /status : Set your status\n"); + wprintw(self->history, " /nick : Set your nickname\n"); + wprintw(self->history, " /me : Do an action\n"); + wprintw(self->history, " /myid : Print your ID\n"); + wprintw(self->history, " /clear : Clear the screen\n"); + wprintw(self->history, " /close : Close the current chat window\n"); + wprintw(self->history, " /quit or /exit : Exit program\n"); + wprintw(self->history, " /help : Print this message again\n\n"); - wattroff(self->history, COLOR_PAIR(2)); + wattroff(self->history, COLOR_PAIR(2)); } ToxWindow new_chat(Messenger *m, int friendnum) { - ToxWindow ret; - memset(&ret, 0, sizeof(ret)); + ToxWindow ret; + memset(&ret, 0, sizeof(ret)); - ret.onKey = &chat_onKey; - ret.onDraw = &chat_onDraw; - ret.onInit = &chat_onInit; - ret.onMessage = &chat_onMessage; - ret.onNickChange = &chat_onNickChange; - ret.onStatusChange = &chat_onStatusChange; - ret.onAction = &chat_onAction; + ret.onKey = &chat_onKey; + ret.onDraw = &chat_onDraw; + ret.onInit = &chat_onInit; + ret.onMessage = &chat_onMessage; + ret.onNickChange = &chat_onNickChange; + ret.onStatusChange = &chat_onStatusChange; + ret.onAction = &chat_onAction; - uint8_t nick[MAX_NAME_LENGTH] = {0}; - getname(m, friendnum, (uint8_t*) &nick); - fix_name(nick); + uint8_t nick[MAX_NAME_LENGTH] = {0}; + getname(m, friendnum, (uint8_t *) &nick); + fix_name(nick); - snprintf(ret.title, sizeof(ret.title), "[%s (%d)]", nick, friendnum); + snprintf(ret.title, sizeof(ret.title), "[%s (%d)]", nick, friendnum); - ChatContext *x = calloc(1, sizeof(ChatContext)); - x->friendnum = friendnum; - ret.x = (void*) x; - return ret; + ChatContext *x = calloc(1, sizeof(ChatContext)); + x->friendnum = friendnum; + ret.x = (void *) x; + return ret; } diff --git a/configdir.c b/configdir.c index 18e211c..1a62e8e 100644 --- a/configdir.c +++ b/configdir.c @@ -50,6 +50,7 @@ char *get_user_config_dir(void) BOOL ok; ok = SHGetSpecialFolderPathA(NULL, appdata, CSIDL_PROFILE, TRUE); + if (!ok) { return NULL; } @@ -72,13 +73,16 @@ char *get_user_config_dir(void) int rc; rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf); + if (rc == 0) { home = pwd.pw_dir; } else { home = getenv("HOME"); + if (home == NULL) { return NULL; } + /* env variables can be tainted */ snprintf(buf, sizeof(buf), "%s", home); home = buf; @@ -87,6 +91,7 @@ char *get_user_config_dir(void) # if defined(__APPLE__) len = strlen(home) + strlen("/Library/Application Support") + 1; user_config_dir = malloc(len); + if (user_config_dir == NULL) { return NULL; } @@ -95,6 +100,7 @@ char *get_user_config_dir(void) # else /* __APPLE__ */ len = strlen(home) + strlen("/.config") + 1; user_config_dir = malloc(len); + if (user_config_dir == NULL) { return NULL; } @@ -111,44 +117,45 @@ char *get_user_config_dir(void) * Creates the config directory. */ int create_user_config_dir(char *path) -{ +{ - int mkdir_err; + int mkdir_err; - #ifdef WIN32 +#ifdef WIN32 - char *fullpath = malloc(strlen(path) + strlen(CONFIGDIR) + 1); - strcpy(fullpath, path); - strcat(fullpath, CONFIGDIR); + char *fullpath = malloc(strlen(path) + strlen(CONFIGDIR) + 1); + strcpy(fullpath, path); + strcat(fullpath, CONFIGDIR); - mkdir_err = _mkdir(fullpath); - struct __stat64 buf; - if (mkdir_err && (errno != EEXIST || _wstat64(fullpath, &buf) || !S_ISDIR(buf.st_mode))) { + mkdir_err = _mkdir(fullpath); + struct __stat64 buf; + + if (mkdir_err && (errno != EEXIST || _wstat64(fullpath, &buf) || !S_ISDIR(buf.st_mode))) { + free(fullpath); + return -1; + } + +#else + + mkdir_err = mkdir(path, 0700); + struct stat buf; + + if (mkdir_err && (errno != EEXIST || stat(path, &buf) || !S_ISDIR(buf.st_mode))) { + return -1; + } + + char *fullpath = malloc(strlen(path) + strlen(CONFIGDIR) + 1); + strcpy(fullpath, path); + strcat(fullpath, CONFIGDIR); + + mkdir_err = mkdir(fullpath, 0700); + + if (mkdir_err && (errno != EEXIST || stat(fullpath, &buf) || !S_ISDIR(buf.st_mode))) { + free(fullpath); + return -1; + } + +#endif free(fullpath); - return -1; - } - - #else - - mkdir_err = mkdir(path, 0700); - struct stat buf; - - if(mkdir_err && (errno != EEXIST || stat(path, &buf) || !S_ISDIR(buf.st_mode))) { - return -1; - } - - char *fullpath = malloc(strlen(path) + strlen(CONFIGDIR) + 1); - strcpy(fullpath, path); - strcat(fullpath, CONFIGDIR); - - mkdir_err = mkdir(fullpath, 0700); - - if(mkdir_err && (errno != EEXIST || stat(fullpath, &buf) || !S_ISDIR(buf.st_mode))) { - free(fullpath); - return -1; - } - - #endif - free(fullpath); - return 0; + return 0; } diff --git a/configdir.h b/configdir.h index fad949c..17d9510 100644 --- a/configdir.h +++ b/configdir.h @@ -23,7 +23,7 @@ #else #define CONFIGDIR "/toxic/" #endif - + #ifndef S_ISDIR #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #endif diff --git a/dhtstatus.c b/dhtstatus.c index e026a17..a11dc61 100644 --- a/dhtstatus.c +++ b/dhtstatus.c @@ -3,87 +3,97 @@ #include "../../core/network.h" #include "../../core/DHT.h" -typedef uint8_t ipbuf[3*4+3+1]; +typedef uint8_t ipbuf[3 * 4 + 3 + 1]; static int num_selected = 0; -static void printip(ipbuf buf, IP ip) +static void printip(ipbuf buf, IP ip) { - sprintf((char*)buf, "%u.%u.%u.%u", ip.c[0], ip.c[1], ip.c[2], ip.c[3]); + sprintf((char *)buf, "%u.%u.%u.%u", ip.c[0], ip.c[1], ip.c[2], ip.c[3]); } static void dhtstatus_onKey(ToxWindow *self, Messenger *m, int key) { - switch(key) { - case KEY_UP: - case 'k': - if (--num_selected < 0) - num_selected = CLIENT_ID_SIZE-1; - break; - - case KEY_DOWN: - case 'j': - num_selected = (num_selected+1) % CLIENT_ID_SIZE; - break; - - case '\n': - break; - - default: - break; - } + switch (key) { + case KEY_UP: + case 'k': + if (--num_selected < 0) + num_selected = CLIENT_ID_SIZE - 1; + + break; + + case KEY_DOWN: + case 'j': + num_selected = (num_selected + 1) % CLIENT_ID_SIZE; + break; + + case '\n': + break; + + default: + break; + } } static void dhtstatus_onDraw(ToxWindow *self) { - Client_data * close_clientlist = DHT_get_close_list(); - curs_set(0); - werase(self->window); - - uint64_t now = unix_time(); - uint32_t i, j; - ipbuf ipbuf; - wprintw(self->window,"\n%llu ______________________ CLOSE LIST ________________________ ___ IP ADDR ___ _PRT_ LST PNG ____ SELF ____ _PRT_ LST\n\n", now); - for(i = 0; i < 32; i++) { /*Number of nodes in closelist*/ - Client_data * client = close_clientlist + i; - if (i == num_selected) wattron(self->window, COLOR_PAIR(3)); - wprintw(self->window,"[%02i] ", i); - uint16_t port = ntohs(client->ip_port.port); - if(port) { - for(j = 0; j < CLIENT_ID_SIZE; j++) - wprintw(self->window, "%02hhx", client->client_id[j]); - - printip(ipbuf, client->ip_port.ip); - wprintw(self->window, " %15s %5u ", ipbuf, port); - wprintw(self->window, " %3llu ", now - client->timestamp); - wprintw(self->window, " %3llu ", now - client->last_pinged); - - port = ntohs(client->ret_ip_port.port); - if(port) { - printip(ipbuf, client->ret_ip_port.ip); - wprintw(self->window, " %15s %5u %3llu", ipbuf, port, now - close_clientlist[i].ret_timestamp); - } + Client_data *close_clientlist = DHT_get_close_list(); + curs_set(0); + werase(self->window); + + uint64_t now = unix_time(); + uint32_t i, j; + ipbuf ipbuf; + wprintw(self->window, + "\n%llu ______________________ CLOSE LIST ________________________ ___ IP ADDR ___ _PRT_ LST PNG ____ SELF ____ _PRT_ LST\n\n", + now); + + for (i = 0; i < 32; i++) { /*Number of nodes in closelist*/ + Client_data *client = close_clientlist + i; + + if (i == num_selected) wattron(self->window, COLOR_PAIR(3)); + + wprintw(self->window, "[%02i] ", i); + uint16_t port = ntohs(client->ip_port.port); + + if (port) { + for (j = 0; j < CLIENT_ID_SIZE; j++) + wprintw(self->window, "%02hhx", client->client_id[j]); + + printip(ipbuf, client->ip_port.ip); + wprintw(self->window, " %15s %5u ", ipbuf, port); + wprintw(self->window, " %3llu ", now - client->timestamp); + wprintw(self->window, " %3llu ", now - client->last_pinged); + + port = ntohs(client->ret_ip_port.port); + + if (port) { + printip(ipbuf, client->ret_ip_port.ip); + wprintw(self->window, " %15s %5u %3llu", ipbuf, port, now - close_clientlist[i].ret_timestamp); + } + } + + wprintw(self->window, "\n"); + + if (i == num_selected) wattroff(self->window, COLOR_PAIR(3)); } - wprintw(self->window, "\n"); - if (i == num_selected) wattroff(self->window, COLOR_PAIR(3)); - } - - wrefresh(self->window); + + wrefresh(self->window); } static void dhtstatus_onInit(ToxWindow *self, Messenger *m) { } - -ToxWindow new_dhtstatus() + +ToxWindow new_dhtstatus() { - ToxWindow ret; - memset(&ret, 0, sizeof(ret)); + ToxWindow ret; + memset(&ret, 0, sizeof(ret)); - ret.onKey = &dhtstatus_onKey; - ret.onDraw = &dhtstatus_onDraw; - ret.onInit = &dhtstatus_onInit; + ret.onKey = &dhtstatus_onKey; + ret.onDraw = &dhtstatus_onDraw; + ret.onInit = &dhtstatus_onInit; - strcpy(ret.title, "[dht status]"); - return ret; + strcpy(ret.title, "[dht status]"); + return ret; } diff --git a/friendlist.c b/friendlist.c index e7504fb..c85fd3a 100644 --- a/friendlist.c +++ b/friendlist.c @@ -13,13 +13,13 @@ #include "windows.h" #include "friendlist.h" -static char * WINDOW_STATUS; +static char *WINDOW_STATUS; typedef struct { - uint8_t name[MAX_NAME_LENGTH]; - uint8_t status[MAX_STATUSMESSAGE_LENGTH]; - int num; - int chatwin; + uint8_t name[MAX_NAME_LENGTH]; + uint8_t status[MAX_STATUSMESSAGE_LENGTH]; + int num; + int chatwin; } friend_t; static friend_t friends[MAX_FRIENDS_NUM]; @@ -28,135 +28,143 @@ static int num_selected = 0; void fix_name(uint8_t *name) { - /* Remove all non alphanumeric characters */ - uint8_t *p = name; - uint8_t *q = name; - while(*p != 0) { - if (isprint(*p)) - *q++ = *p; - p++; - } - *q = 0; + /* Remove all non alphanumeric characters */ + uint8_t *p = name; + uint8_t *q = name; + + while (*p != 0) { + if (isprint(*p)) + *q++ = *p; + + p++; + } + + *q = 0; } void friendlist_onMessage(ToxWindow *self, Messenger *m, int num, uint8_t *str, uint16_t len) { - if (num >= num_friends) - return; + if (num >= num_friends) + return; - if (friends[num].chatwin == -1) { - friends[num].chatwin = num; - int i; - /* Find first open slot to hold chat window */ - for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { - if (WINDOW_STATUS[i] == -1) { - WINDOW_STATUS[i] = num; - add_window(m, new_chat(m, num), i); - break; - } + if (friends[num].chatwin == -1) { + friends[num].chatwin = num; + int i; + + /* Find first open slot to hold chat window */ + for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { + if (WINDOW_STATUS[i] == -1) { + WINDOW_STATUS[i] = num; + add_window(m, new_chat(m, num), i); + break; + } + } } - } } void friendlist_onNickChange(ToxWindow *self, int num, uint8_t *str, uint16_t len) { - if (len >= MAX_NAME_LENGTH || num >= num_friends) - return; + if (len >= MAX_NAME_LENGTH || num >= num_friends) + return; - memcpy((char*) &friends[num].name, (char*) str, len); - friends[num].name[len] = 0; - fix_name(friends[num].name); + memcpy((char *) &friends[num].name, (char *) str, len); + friends[num].name[len] = 0; + fix_name(friends[num].name); } void friendlist_onStatusChange(ToxWindow *self, int num, uint8_t *str, uint16_t len) { - if (len >= MAX_STATUSMESSAGE_LENGTH || num >= num_friends) - return; + if (len >= MAX_STATUSMESSAGE_LENGTH || num >= num_friends) + return; - memcpy((char*) &friends[num].status, (char*) str, len); - friends[num].status[len] = 0; - fix_name(friends[num].status); + memcpy((char *) &friends[num].status, (char *) str, len); + friends[num].status[len] = 0; + fix_name(friends[num].status); } int friendlist_onFriendAdded(Messenger *m, int num) { - if (num_friends == MAX_FRIENDS_NUM) - return -1; + if (num_friends == MAX_FRIENDS_NUM) + return -1; - friends[num_friends].num = num; - getname(m, num, friends[num_friends].name); - strcpy((char*) friends[num_friends].name, "unknown"); - strcpy((char*) friends[num_friends].status, "unknown"); - friends[num_friends++].chatwin = -1; - return 0; + friends[num_friends].num = num; + getname(m, num, friends[num_friends].name); + strcpy((char *) friends[num_friends].name, "unknown"); + strcpy((char *) friends[num_friends].status, "unknown"); + friends[num_friends++].chatwin = -1; + return 0; } static void friendlist_onKey(ToxWindow *self, Messenger *m, int key) { - if (key == KEY_UP) { - if (--num_selected < 0) - num_selected = num_friends-1; - } - else if (key == KEY_DOWN) { - if (num_friends != 0) - num_selected = (num_selected+1) % num_friends; - } - else if (key == '\n') { - /* Jump to chat window if already open */ - if (friends[num_selected].chatwin != -1) { - int i; - for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { - if (WINDOW_STATUS[i] == num_selected) { - set_active_window(i); - break; + if (key == KEY_UP) { + if (--num_selected < 0) + num_selected = num_friends - 1; + } else if (key == KEY_DOWN) { + if (num_friends != 0) + num_selected = (num_selected + 1) % num_friends; + } else if (key == '\n') { + /* Jump to chat window if already open */ + if (friends[num_selected].chatwin != -1) { + int i; + + for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { + if (WINDOW_STATUS[i] == num_selected) { + set_active_window(i); + break; + } + } + } else { + int i; + + for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { + if (WINDOW_STATUS[i] == -1) { + WINDOW_STATUS[i] = num_selected; + friends[num_selected].chatwin = num_selected; + add_window(m, new_chat(m, num_selected), i); + break; + } + } } - } - }else { - int i; - for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { - if (WINDOW_STATUS[i] == -1) { - WINDOW_STATUS[i] = num_selected; - friends[num_selected].chatwin = num_selected; - add_window(m, new_chat(m, num_selected), i); - break; - } - } } - } } static void friendlist_onDraw(ToxWindow *self) { - curs_set(0); - werase(self->window); - if (num_friends == 0) { - wprintw(self->window, "Empty. Add some friends! :-)\n"); - } - else { - wattron(self->window, COLOR_PAIR(2) | A_BOLD); - wprintw(self->window, "Open chat with.. (up/down keys, enter)\n"); - wattroff(self->window, COLOR_PAIR(2) | A_BOLD); - } + curs_set(0); + werase(self->window); - wprintw(self->window, "\n"); - int i; - for (i = 0; i < num_friends; ++i) { - if (i == num_selected) wattron(self->window, COLOR_PAIR(3)); - wprintw(self->window, " [#%d] ", friends[i].num); - if (i == num_selected) wattroff(self->window, COLOR_PAIR(3)); + if (num_friends == 0) { + wprintw(self->window, "Empty. Add some friends! :-)\n"); + } else { + wattron(self->window, COLOR_PAIR(2) | A_BOLD); + wprintw(self->window, "Open chat with.. (up/down keys, enter)\n"); + wattroff(self->window, COLOR_PAIR(2) | A_BOLD); + } - attron(A_BOLD); - wprintw(self->window, "%s ", friends[i].name); - attroff(A_BOLD); + wprintw(self->window, "\n"); + int i; - wprintw(self->window, "(%s)\n", friends[i].status); - } - wrefresh(self->window); + for (i = 0; i < num_friends; ++i) { + if (i == num_selected) wattron(self->window, COLOR_PAIR(3)); + + wprintw(self->window, " [#%d] ", friends[i].num); + + if (i == num_selected) wattroff(self->window, COLOR_PAIR(3)); + + attron(A_BOLD); + wprintw(self->window, "%s ", friends[i].name); + attroff(A_BOLD); + + wprintw(self->window, "(%s)\n", friends[i].status); + } + + wrefresh(self->window); } void disable_chatwin(int f_num) { - friends[f_num].chatwin = -1; + friends[f_num].chatwin = -1; } static void friendlist_onInit(ToxWindow *self, Messenger *m) @@ -164,19 +172,20 @@ static void friendlist_onInit(ToxWindow *self, Messenger *m) } -ToxWindow new_friendlist(char * ws) { - WINDOW_STATUS = ws; - ToxWindow ret; - memset(&ret, 0, sizeof(ret)); +ToxWindow new_friendlist(char *ws) +{ + WINDOW_STATUS = ws; + ToxWindow ret; + memset(&ret, 0, sizeof(ret)); - ret.onKey = &friendlist_onKey; - ret.onDraw = &friendlist_onDraw; - ret.onInit = &friendlist_onInit; - ret.onMessage = &friendlist_onMessage; - ret.onAction = &friendlist_onMessage; // Action has identical behaviour to message - ret.onNickChange = &friendlist_onNickChange; - ret.onStatusChange = &friendlist_onStatusChange; + ret.onKey = &friendlist_onKey; + ret.onDraw = &friendlist_onDraw; + ret.onInit = &friendlist_onInit; + ret.onMessage = &friendlist_onMessage; + ret.onAction = &friendlist_onMessage; // Action has identical behaviour to message + ret.onNickChange = &friendlist_onNickChange; + ret.onStatusChange = &friendlist_onStatusChange; - strcpy(ret.title, "[friends]"); - return ret; + strcpy(ret.title, "[friends]"); + return ret; } diff --git a/friendlist.h b/friendlist.h index c3d8dac..f0c27f5 100644 --- a/friendlist.h +++ b/friendlist.h @@ -4,7 +4,7 @@ #include "windows.h" #include "chat.h" -ToxWindow new_friendlist(char * ws); +ToxWindow new_friendlist(char *ws); int friendlist_onFriendAdded(Messenger *m, int num); void disable_chatwin(int f_num); void fix_name(uint8_t *name); diff --git a/main.c b/main.c index 38c20df..816873b 100644 --- a/main.c +++ b/main.c @@ -28,7 +28,7 @@ /* Export for use in Callbacks */ char *DATA_FILE = NULL; -void on_window_resize(int sig) +void on_window_resize(int sig) { endwin(); refresh(); @@ -37,44 +37,45 @@ void on_window_resize(int sig) static void init_term() { - /* Setup terminal */ - signal(SIGWINCH, on_window_resize); - initscr(); - cbreak(); - keypad(stdscr, 1); - noecho(); - timeout(100); + /* Setup terminal */ + signal(SIGWINCH, on_window_resize); + initscr(); + cbreak(); + keypad(stdscr, 1); + noecho(); + timeout(100); - if (has_colors()) { - start_color(); - init_pair(1, COLOR_GREEN, COLOR_BLACK); - init_pair(2, COLOR_CYAN, COLOR_BLACK); - init_pair(3, COLOR_RED, COLOR_BLACK); - init_pair(4, COLOR_BLUE, COLOR_BLACK); - init_pair(5, COLOR_YELLOW, COLOR_BLACK); - } - refresh(); + if (has_colors()) { + start_color(); + init_pair(1, COLOR_GREEN, COLOR_BLACK); + init_pair(2, COLOR_CYAN, COLOR_BLACK); + init_pair(3, COLOR_RED, COLOR_BLACK); + init_pair(4, COLOR_BLUE, COLOR_BLACK); + init_pair(5, COLOR_YELLOW, COLOR_BLACK); + } + + refresh(); } static Messenger *init_tox() { - /* Init core */ - Messenger *m = initMessenger(); + /* Init core */ + Messenger *m = initMessenger(); - /* Callbacks */ - m_callback_friendrequest(m, on_request, NULL); - m_callback_friendmessage(m, on_message, NULL); - m_callback_namechange(m, on_nickchange, NULL); - m_callback_statusmessage(m, on_statuschange, NULL); - m_callback_action(m, on_action, NULL); + /* Callbacks */ + m_callback_friendrequest(m, on_request, NULL); + m_callback_friendmessage(m, on_message, NULL); + m_callback_namechange(m, on_nickchange, NULL); + m_callback_statusmessage(m, on_statuschange, NULL); + m_callback_action(m, on_action, NULL); #ifdef __linux__ - setname(m, (uint8_t*) "Cool guy", sizeof("Cool guy")); + setname(m, (uint8_t *) "Cool guy", sizeof("Cool guy")); #elif WIN32 - setname(m, (uint8_t*) "I should install GNU/Linux", sizeof("I should install GNU/Linux")); + setname(m, (uint8_t *) "I should install GNU/Linux", sizeof("I should install GNU/Linux")); #else - setname(m, (uint8_t*) "Hipster", sizeof("Hipster")); + setname(m, (uint8_t *) "Hipster", sizeof("Hipster")); #endif - return m; + return m; } #define MAXLINE 90 /* Approx max number of chars in a sever line (IP + port + key) */ @@ -84,67 +85,75 @@ static Messenger *init_tox() /* Connects to a random DHT server listed in the DHTservers file */ int init_connection(void) { - if (DHT_isconnected()) - return 0; + if (DHT_isconnected()) + return 0; - FILE *fp = fopen("../../../other/DHTservers", "r"); - if (!fp) - return 1; + FILE *fp = fopen("../../../other/DHTservers", "r"); + + if (!fp) + return 1; + + char servers[MAXSERVERS][MAXLINE]; + char line[MAXLINE]; + int linecnt = 0; + + while (fgets(line, sizeof(line), fp) && linecnt < MAXSERVERS) { + if (strlen(line) > MINLINE) + strcpy(servers[linecnt++], line); + } + + if (linecnt < 1) { + fclose(fp); + return 2; + } - char servers[MAXSERVERS][MAXLINE]; - char line[MAXLINE]; - int linecnt = 0; - while (fgets(line, sizeof(line), fp) && linecnt < MAXSERVERS) { - if (strlen(line) > MINLINE) - strcpy(servers[linecnt++], line); - } - if (linecnt < 1) { fclose(fp); - return 2; - } - fclose(fp); - char *server = servers[rand() % linecnt]; - char *ip = strtok(server, " "); - char *port = strtok(NULL, " "); - char *key = strtok(NULL, " "); - if (!ip || !port || !key) - return 3; + char *server = servers[rand() % linecnt]; + char *ip = strtok(server, " "); + char *port = strtok(NULL, " "); + char *key = strtok(NULL, " "); - IP_Port dht; - dht.port = htons(atoi(port)); - uint32_t resolved_address = resolve_addr(ip); - if (resolved_address == 0) + if (!ip || !port || !key) + return 3; + + IP_Port dht; + dht.port = htons(atoi(port)); + uint32_t resolved_address = resolve_addr(ip); + + if (resolved_address == 0) + return 0; + + dht.ip.i = resolved_address; + unsigned char *binary_string = hex_string_to_bin(key); + DHT_bootstrap(dht, binary_string); + free(binary_string); return 0; - dht.ip.i = resolved_address; - unsigned char *binary_string = hex_string_to_bin(key); - DHT_bootstrap(dht, binary_string); - free(binary_string); - return 0; } -static void do_tox(Messenger *m, ToxWindow * prompt) +static void do_tox(Messenger *m, ToxWindow *prompt) { - static int conn_try = 0; - static int conn_err = 0; - static bool dht_on = false; - if (!dht_on && !DHT_isconnected() && !(conn_try++ % 100)) { - if (!conn_err) { - conn_err = init_connection(); - wprintw(prompt->window, "\nEstablishing connection...\n"); - if (conn_err) - wprintw(prompt->window, "\nAuto-connect failed with error code %d\n", conn_err); + static int conn_try = 0; + static int conn_err = 0; + static bool dht_on = false; + + if (!dht_on && !DHT_isconnected() && !(conn_try++ % 100)) { + if (!conn_err) { + conn_err = init_connection(); + wprintw(prompt->window, "\nEstablishing connection...\n"); + + if (conn_err) + wprintw(prompt->window, "\nAuto-connect failed with error code %d\n", conn_err); + } + } else if (!dht_on && DHT_isconnected()) { + dht_on = true; + wprintw(prompt->window, "\nDHT connected.\n"); + } else if (dht_on && !DHT_isconnected()) { + dht_on = false; + wprintw(prompt->window, "\nDHT disconnected. Attempting to reconnect.\n"); } - } - else if (!dht_on && DHT_isconnected()) { - dht_on = true; - wprintw(prompt->window, "\nDHT connected.\n"); - } - else if (dht_on && !DHT_isconnected()) { - dht_on = false; - wprintw(prompt->window, "\nDHT disconnected. Attempting to reconnect.\n"); - } - doMessenger(m); + + doMessenger(m); } int f_loadfromfile; @@ -160,18 +169,22 @@ int store_data(Messenger *m, char *path) { if (f_loadfromfile == 0) /*If file loading/saving is disabled*/ return 0; + FILE *fd; size_t len; uint8_t *buf; len = Messenger_size(m); buf = malloc(len); + if (buf == NULL) { return 1; } + Messenger_save(m, buf); fd = fopen(path, "w"); + if (fd == NULL) { free(buf); return 2; @@ -192,6 +205,7 @@ static void load_data(Messenger *m, char *path) { if (f_loadfromfile == 0) /*If file loading/saving is disabled*/ return; + FILE *fd; size_t len; uint8_t *buf; @@ -202,12 +216,14 @@ static void load_data(Messenger *m, char *path) fseek(fd, 0, SEEK_SET); buf = malloc(len); + if (buf == NULL) { fprintf(stderr, "malloc() failed.\n"); fclose(fd); endwin(); exit(1); } + if (fread(buf, len, 1, fd) != 1) { fprintf(stderr, "fread() failed.\n"); free(buf); @@ -215,9 +231,11 @@ static void load_data(Messenger *m, char *path) endwin(); exit(1); } + Messenger_load(m, buf, len); uint32_t i; + for (i = 0; i < m->numfriends; i++) { on_friendadded(m, i); } @@ -226,6 +244,7 @@ static void load_data(Messenger *m, char *path) fclose(fd); } else { int st; + if ((st = store_data(m, path)) != 0) { fprintf(stderr, "Store messenger failed with return code: %d\n", st); endwin(); @@ -236,70 +255,74 @@ static void load_data(Messenger *m, char *path) int main(int argc, char *argv[]) { - char *user_config_dir = get_user_config_dir(); - int config_err = 0; + char *user_config_dir = get_user_config_dir(); + int config_err = 0; - f_loadfromfile = 1; - int f_flag = 0; - int i = 0; - 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; - } + f_loadfromfile = 1; + int f_flag = 0; + int i = 0; + + 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; + } + } + } + + if (DATA_FILE == NULL ) { + config_err = create_user_config_dir(user_config_dir); + + if (config_err) { + DATA_FILE = strdup("data"); + } else { + DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); + strcpy(DATA_FILE, user_config_dir); + strcat(DATA_FILE, CONFIGDIR); + strcat(DATA_FILE, "data"); + } + } + + free(user_config_dir); + + init_term(); + Messenger *m = init_tox(); + ToxWindow *prompt = init_windows(m); + init_window_status(); + + if (f_loadfromfile) + load_data(m, DATA_FILE); + + if (f_flag == -1) { + attron(COLOR_PAIR(3) | A_BOLD); + wprintw(prompt->window, "You passed '-f' without giving an argument.\n" + "defaulting to 'data' for a keyfile...\n"); + attroff(COLOR_PAIR(3) | A_BOLD); } - } - if (DATA_FILE == NULL ) { - config_err = create_user_config_dir(user_config_dir); if (config_err) { - DATA_FILE = strdup("data"); - } else { - DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); - strcpy(DATA_FILE, user_config_dir); - strcat(DATA_FILE, CONFIGDIR); - strcat(DATA_FILE, "data"); + attron(COLOR_PAIR(3) | A_BOLD); + wprintw(prompt->window, "Unable to determine configuration directory.\n" + "defaulting to 'data' for a keyfile...\n"); + attroff(COLOR_PAIR(3) | A_BOLD); } - } - free(user_config_dir); - init_term(); - Messenger *m = init_tox(); - ToxWindow *prompt = init_windows(m); - init_window_status(); + while (true) { + /* Update tox */ + do_tox(m, prompt); - if(f_loadfromfile) - load_data(m, DATA_FILE); + /* Draw */ + draw_active_window(m); + } - if (f_flag == -1) { - attron(COLOR_PAIR(3) | A_BOLD); - wprintw(prompt->window, "You passed '-f' without giving an argument.\n" - "defaulting to 'data' for a keyfile...\n"); - attroff(COLOR_PAIR(3) | A_BOLD); - } - - if(config_err) { - attron(COLOR_PAIR(3) | A_BOLD); - wprintw(prompt->window, "Unable to determine configuration directory.\n" - "defaulting to 'data' for a keyfile...\n"); - attroff(COLOR_PAIR(3) | A_BOLD); - } - while(true) { - /* Update tox */ - do_tox(m, prompt); - - /* Draw */ - draw_active_window(m); - } - - cleanupMessenger(m); - free(DATA_FILE); - return 0; + cleanupMessenger(m); + free(DATA_FILE); + return 0; } diff --git a/prompt.c b/prompt.c index 1d0e014..f6d3e21 100644 --- a/prompt.c +++ b/prompt.c @@ -14,7 +14,7 @@ #include "prompt.h" uint8_t pending_requests[MAX_STR_SIZE][CLIENT_ID_SIZE]; // XXX -uint8_t num_requests=0; // XXX +uint8_t num_requests = 0; // XXX static friendAddedFn *on_friendadded_cb; static char prompt_buf[MAX_STR_SIZE] = {0}; @@ -36,412 +36,441 @@ void cmd_statusmsg(ToxWindow *, Messenger *m, char **); #define NUM_COMMANDS 13 static struct { - char *name; - int numargs; - void (*func)(ToxWindow *, Messenger *m, char **); + char *name; + int numargs; + void (*func)(ToxWindow *, Messenger *m, char **); } commands[] = { - { "accept", 1, cmd_accept }, - { "add", 1, cmd_add }, - { "clear", 0, cmd_clear }, - { "connect", 3, cmd_connect }, - { "exit", 0, cmd_quit }, - { "help", 0, cmd_help }, - { "msg", 2, cmd_msg }, - { "myid", 0, cmd_myid }, - { "nick", 1, cmd_nick }, - { "q", 0, cmd_quit }, - { "quit", 0, cmd_quit }, - { "status", 2, cmd_status }, - { "statusmsg", 1, cmd_statusmsg }, + { "accept", 1, cmd_accept }, + { "add", 1, cmd_add }, + { "clear", 0, cmd_clear }, + { "connect", 3, cmd_connect }, + { "exit", 0, cmd_quit }, + { "help", 0, cmd_help }, + { "msg", 2, cmd_msg }, + { "myid", 0, cmd_myid }, + { "nick", 1, cmd_nick }, + { "q", 0, cmd_quit }, + { "quit", 0, cmd_quit }, + { "status", 2, cmd_status }, + { "statusmsg", 1, cmd_statusmsg }, }; // XXX: int add_req(uint8_t *public_key) { - memcpy(pending_requests[num_requests], public_key, CLIENT_ID_SIZE); - ++num_requests; - return num_requests-1; + memcpy(pending_requests[num_requests], public_key, CLIENT_ID_SIZE); + ++num_requests; + return num_requests - 1; } // XXX: FIX unsigned char *hex_string_to_bin(char hex_string[]) { - size_t len = strlen(hex_string); - unsigned char *val = malloc(len); - char *pos = hex_string; - int i; - for (i = 0; i < len; ++i, pos+=2) - sscanf(pos,"%2hhx",&val[i]); - return val; + size_t len = strlen(hex_string); + unsigned char *val = malloc(len); + char *pos = hex_string; + int i; + + for (i = 0; i < len; ++i, pos += 2) + sscanf(pos, "%2hhx", &val[i]); + + return val; } void cmd_accept(ToxWindow *self, Messenger *m, char **args) { - int num = atoi(args[1]); - if (num >= num_requests) { - wprintw(self->window, "Invalid syntax.\n"); - return; - } + int num = atoi(args[1]); - num = m_addfriend_norequest(m, pending_requests[num]); - if (num == -1) - wprintw(self->window, "Failed to add friend.\n"); - else { - wprintw(self->window, "Friend accepted as: %d.\n", num); - on_friendadded_cb(m, num); - } + if (num >= num_requests) { + wprintw(self->window, "Invalid syntax.\n"); + return; + } + + num = m_addfriend_norequest(m, pending_requests[num]); + + if (num == -1) + wprintw(self->window, "Failed to add friend.\n"); + else { + wprintw(self->window, "Friend accepted as: %d.\n", num); + on_friendadded_cb(m, num); + } } void cmd_add(ToxWindow *self, Messenger *m, char **args) { - uint8_t id_bin[FRIEND_ADDRESS_SIZE]; - char xx[3]; - uint32_t x; - char *id = args[1]; - char *msg = args[2]; + uint8_t id_bin[FRIEND_ADDRESS_SIZE]; + char xx[3]; + uint32_t x; + char *id = args[1]; + char *msg = args[2]; - if (!id) { - wprintw(self->window, "Invalid command: add expected at least one argument.\n"); - return; - } - if (!msg) - msg = ""; - - if (strlen(id) != 2*FRIEND_ADDRESS_SIZE) { - wprintw(self->window, "Invalid ID length.\n"); - return; - } - int i; - for (i = 0; i < FRIEND_ADDRESS_SIZE; ++i) { - xx[0] = id[2*i]; - xx[1] = id[2*i+1]; - xx[2] = '\0'; - if (sscanf(xx, "%02x", &x) != 1) { - wprintw(self->window, "Invalid ID.\n"); - return; + if (!id) { + wprintw(self->window, "Invalid command: add expected at least one argument.\n"); + return; + } + + if (!msg) + msg = ""; + + if (strlen(id) != 2 * FRIEND_ADDRESS_SIZE) { + wprintw(self->window, "Invalid ID length.\n"); + return; + } + + int i; + + for (i = 0; i < FRIEND_ADDRESS_SIZE; ++i) { + xx[0] = id[2 * i]; + xx[1] = id[2 * i + 1]; + xx[2] = '\0'; + + if (sscanf(xx, "%02x", &x) != 1) { + wprintw(self->window, "Invalid ID.\n"); + return; + } + + id_bin[i] = x; + } + + for (i = 0; i < FRIEND_ADDRESS_SIZE; i++) { + id[i] = toupper(id[i]); + } + + int num = m_addfriend(m, id_bin, (uint8_t *) msg, strlen(msg) + 1); + + switch (num) { + case FAERR_TOOLONG: + wprintw(self->window, "Message is too long.\n"); + break; + + case FAERR_NOMESSAGE: + wprintw(self->window, "Please add a message to your request.\n"); + break; + + case FAERR_OWNKEY: + wprintw(self->window, "That appears to be your own ID.\n"); + break; + + case FAERR_ALREADYSENT: + wprintw(self->window, "Friend request already sent.\n"); + break; + + case FAERR_UNKNOWN: + wprintw(self->window, "Undefined error when adding friend.\n"); + break; + + case FAERR_BADCHECKSUM: + wprintw(self->window, "Bad checksum in address.\n"); + break; + + case FAERR_SETNEWNOSPAM: + wprintw(self->window, "Nospam was different.\n"); + break; + + default: + wprintw(self->window, "Friend added as %d.\n", num); + on_friendadded_cb(m, num); + break; } - id_bin[i] = x; - } - - for (i = 0; i < FRIEND_ADDRESS_SIZE; i++) { - id[i] = toupper(id[i]); - } - - int num = m_addfriend(m, id_bin, (uint8_t*) msg, strlen(msg)+1); - switch (num) { - case FAERR_TOOLONG: - wprintw(self->window, "Message is too long.\n"); - break; - case FAERR_NOMESSAGE: - wprintw(self->window, "Please add a message to your request.\n"); - break; - case FAERR_OWNKEY: - wprintw(self->window, "That appears to be your own ID.\n"); - break; - case FAERR_ALREADYSENT: - wprintw(self->window, "Friend request already sent.\n"); - break; - case FAERR_UNKNOWN: - wprintw(self->window, "Undefined error when adding friend.\n"); - break; - case FAERR_BADCHECKSUM: - wprintw(self->window, "Bad checksum in address.\n"); - break; - case FAERR_SETNEWNOSPAM: - wprintw(self->window, "Nospam was different.\n"); - break; - default: - wprintw(self->window, "Friend added as %d.\n", num); - on_friendadded_cb(m, num); - break; - } } void cmd_clear(ToxWindow *self, Messenger *m, char **args) { - wclear(self->window); + wclear(self->window); } void cmd_connect(ToxWindow *self, Messenger *m, char **args) { - IP_Port dht; - char *ip = args[1]; - char *port = args[2]; - char *key = args[3]; + IP_Port dht; + char *ip = args[1]; + char *port = args[2]; + char *key = args[3]; - if (atoi(port) == 0) { - wprintw(self->window, "Invalid syntax.\n"); - return; - } + if (atoi(port) == 0) { + wprintw(self->window, "Invalid syntax.\n"); + return; + } - dht.port = htons(atoi(port)); - uint32_t resolved_address = resolve_addr(ip); - if (resolved_address == 0) { - return; - } + dht.port = htons(atoi(port)); + uint32_t resolved_address = resolve_addr(ip); - dht.ip.i = resolved_address; - unsigned char *binary_string = hex_string_to_bin(key); - DHT_bootstrap(dht, binary_string); - free(binary_string); + if (resolved_address == 0) { + return; + } + + dht.ip.i = resolved_address; + unsigned char *binary_string = hex_string_to_bin(key); + DHT_bootstrap(dht, binary_string); + free(binary_string); } void cmd_quit(ToxWindow *self, Messenger *m, char **args) { - endwin(); - exit(0); + endwin(); + exit(0); } void cmd_help(ToxWindow *self, Messenger *m, char **args) { - wclear(self->window); - wattron(self->window, COLOR_PAIR(2) | A_BOLD); - wprintw(self->window, "Commands:\n"); - wattroff(self->window, A_BOLD); + wclear(self->window); + wattron(self->window, COLOR_PAIR(2) | A_BOLD); + wprintw(self->window, "Commands:\n"); + wattroff(self->window, A_BOLD); - wprintw(self->window, " connect : Connect to DHT server\n"); - wprintw(self->window, " add : Add friend\n"); - wprintw(self->window, " status : Set your status\n"); - wprintw(self->window, " statusmsg : Set your status\n"); - wprintw(self->window, " nick : Set your nickname\n"); - wprintw(self->window, " accept : Accept friend request\n"); - wprintw(self->window, " myid : Print your ID\n"); - wprintw(self->window, " quit/exit : Exit program\n"); - wprintw(self->window, " help : Print this message again\n"); - wprintw(self->window, " clear : Clear this window\n"); + wprintw(self->window, " connect : Connect to DHT server\n"); + wprintw(self->window, " add : Add friend\n"); + wprintw(self->window, " status : Set your status\n"); + wprintw(self->window, " statusmsg : Set your status\n"); + wprintw(self->window, " nick : Set your nickname\n"); + wprintw(self->window, " accept : Accept friend request\n"); + wprintw(self->window, " myid : Print your ID\n"); + wprintw(self->window, " quit/exit : Exit program\n"); + wprintw(self->window, " help : Print this message again\n"); + wprintw(self->window, " clear : Clear this window\n"); - wattron(self->window, A_BOLD); - wprintw(self->window, "TIP: Use the TAB key to navigate through the tabs.\n\n"); - wattroff(self->window, A_BOLD); + wattron(self->window, A_BOLD); + wprintw(self->window, "TIP: Use the TAB key to navigate through the tabs.\n\n"); + wattroff(self->window, A_BOLD); - wattroff(self->window, COLOR_PAIR(2)); + wattroff(self->window, COLOR_PAIR(2)); } void cmd_msg(ToxWindow *self, Messenger *m, char **args) { - char *id = args[1]; - char *msg = args[2]; - if (m_sendmessage(m, atoi(id), (uint8_t*) msg, strlen(msg)+1) == 0) - wprintw(self->window, "Error occurred while sending message.\n"); - else - wprintw(self->window, "Message successfully sent.\n"); + char *id = args[1]; + char *msg = args[2]; + + if (m_sendmessage(m, atoi(id), (uint8_t *) msg, strlen(msg) + 1) == 0) + wprintw(self->window, "Error occurred while sending message.\n"); + else + wprintw(self->window, "Message successfully sent.\n"); } void cmd_myid(ToxWindow *self, Messenger *m, char **args) { - char id[FRIEND_ADDRESS_SIZE*2 + 1] = {0}; - size_t i; - uint8_t address[FRIEND_ADDRESS_SIZE]; - getaddress(m, address); - for (i = 0; i < FRIEND_ADDRESS_SIZE; ++i) { - char xx[3]; - snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff); - strcat(id, xx); - } - wprintw(self->window, "%s\n", id); + char id[FRIEND_ADDRESS_SIZE * 2 + 1] = {0}; + size_t i; + uint8_t address[FRIEND_ADDRESS_SIZE]; + getaddress(m, address); + + for (i = 0; i < FRIEND_ADDRESS_SIZE; ++i) { + char xx[3]; + snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff); + strcat(id, xx); + } + + wprintw(self->window, "%s\n", id); } void cmd_nick(ToxWindow *self, Messenger *m, char **args) { - char *nick = args[1]; - setname(m, (uint8_t*) nick, strlen(nick)+1); - wprintw(self->window, "Nickname set to: %s\n", nick); + char *nick = args[1]; + setname(m, (uint8_t *) nick, strlen(nick) + 1); + wprintw(self->window, "Nickname set to: %s\n", nick); } void cmd_status(ToxWindow *self, Messenger *m, char **args) { - char *status = args[1]; - char *status_text; + char *status = args[1]; + char *status_text; - USERSTATUS status_kind; - if (!strncmp(status, "online", strlen("online"))) { - status_kind = USERSTATUS_NONE; - status_text = "ONLINE"; - } - else if (!strncmp(status, "away", strlen("away"))) { - status_kind = USERSTATUS_AWAY; - status_text = "AWAY"; - } - else if (!strncmp(status, "busy", strlen("busy"))) { - status_kind = USERSTATUS_BUSY; - status_text = "BUSY"; - } - else - { - wprintw(self->window, "Invalid status.\n"); - return; - } + USERSTATUS status_kind; - char *msg = args[2]; - if (msg == NULL) { - m_set_userstatus(m, status_kind); - wprintw(self->window, "Status set to: %s\n", status_text); - } - else { - m_set_userstatus(m, status_kind); - m_set_statusmessage(m, (uint8_t*) msg, strlen(msg)+1); - wprintw(self->window, "Status set to: %s, %s\n", status_text, msg); - } + if (!strncmp(status, "online", strlen("online"))) { + status_kind = USERSTATUS_NONE; + status_text = "ONLINE"; + } else if (!strncmp(status, "away", strlen("away"))) { + status_kind = USERSTATUS_AWAY; + status_text = "AWAY"; + } else if (!strncmp(status, "busy", strlen("busy"))) { + status_kind = USERSTATUS_BUSY; + status_text = "BUSY"; + } else { + wprintw(self->window, "Invalid status.\n"); + return; + } + + char *msg = args[2]; + + if (msg == NULL) { + m_set_userstatus(m, status_kind); + wprintw(self->window, "Status set to: %s\n", status_text); + } else { + m_set_userstatus(m, status_kind); + m_set_statusmessage(m, (uint8_t *) msg, strlen(msg) + 1); + wprintw(self->window, "Status set to: %s, %s\n", status_text, msg); + } } void cmd_statusmsg(ToxWindow *self, Messenger *m, char **args) { char *msg = args[1]; - m_set_statusmessage(m, (uint8_t*) msg, strlen(msg)+1); + m_set_statusmessage(m, (uint8_t *) msg, strlen(msg) + 1); wprintw(self->window, "Status set to: %s\n", msg); } static void execute(ToxWindow *self, Messenger *m, char *u_cmd) { - int newlines = 0; - char cmd[MAX_STR_SIZE] = {0}; - int i; - for (i = 0; i < strlen(prompt_buf); ++i) { - if (u_cmd[i] == '\n') - ++newlines; - else - cmd[i - newlines] = u_cmd[i]; - } + int newlines = 0; + char cmd[MAX_STR_SIZE] = {0}; + int i; - int leading_spc = 0; - for (i = 0; i < MAX_STR_SIZE && isspace(cmd[i]); ++i) - leading_spc++; - memmove(cmd, cmd + leading_spc, MAX_STR_SIZE - leading_spc); - - int cmd_end = strlen(cmd); - while (cmd_end > 0 && cmd_end--) - if (!isspace(cmd[cmd_end])) - break; - cmd[cmd_end + 1] = '\0'; - - /* insert \0 at argument boundaries */ - int numargs = 0; - for (i = 0; i < MAX_STR_SIZE; i++) { - if (cmd[i] == '\"') - while (cmd[++i] != '\"'); /* skip over strings */ - if (cmd[i] == ' ') { - cmd[i] = '\0'; - numargs++; + for (i = 0; i < strlen(prompt_buf); ++i) { + if (u_cmd[i] == '\n') + ++newlines; + else + cmd[i - newlines] = u_cmd[i]; } - } - /* excessive arguments */ - if (numargs > 3) { - wprintw(self->window, "Invalid command: too many arguments.\n"); - return; - } + int leading_spc = 0; - /* read arguments into array */ - char *cmdargs[5]; - int pos = 0; - for (i = 0; i < 5; i++) { - cmdargs[i] = cmd + pos; - pos += strlen(cmdargs[i]) + 1; - } + for (i = 0; i < MAX_STR_SIZE && isspace(cmd[i]); ++i) + leading_spc++; - /* no input */ - if (strlen(cmdargs[0]) == 0) - return; + memmove(cmd, cmd + leading_spc, MAX_STR_SIZE - leading_spc); - /* match input to command list */ - for (i = 0; i < NUM_COMMANDS; i++) { - if (!strcmp(cmdargs[0], commands[i].name)) { - /* check for missing arguments */ - int j; - for (j = 0; j <= commands[i].numargs; j++) { - if (strlen(cmdargs[j]) == 0) { - wprintw(self->window, "Invalid command: %s expected %d arguments, got %d.\n", - commands[i].name, commands[i].numargs, j - 1); - return; + int cmd_end = strlen(cmd); + + while (cmd_end > 0 && cmd_end--) + if (!isspace(cmd[cmd_end])) + break; + + cmd[cmd_end + 1] = '\0'; + + /* insert \0 at argument boundaries */ + int numargs = 0; + + for (i = 0; i < MAX_STR_SIZE; i++) { + if (cmd[i] == '\"') + while (cmd[++i] != '\"'); /* skip over strings */ + + if (cmd[i] == ' ') { + cmd[i] = '\0'; + numargs++; } - } - /* check for excess arguments */ - if (strcmp(cmdargs[0], "add") && strlen(cmdargs[j]) != 0) { - wprintw(self->window, "Invalid command: too many arguments to %s.\n", commands[i].name); - return; - } - /* pass arguments to command function */ - (commands[i].func)(self, m, cmdargs); - return; } - } - /* no match */ - wprintw(self->window, "Invalid command.\n"); + /* excessive arguments */ + if (numargs > 3) { + wprintw(self->window, "Invalid command: too many arguments.\n"); + return; + } + + /* read arguments into array */ + char *cmdargs[5]; + int pos = 0; + + for (i = 0; i < 5; i++) { + cmdargs[i] = cmd + pos; + pos += strlen(cmdargs[i]) + 1; + } + + /* no input */ + if (strlen(cmdargs[0]) == 0) + return; + + /* match input to command list */ + for (i = 0; i < NUM_COMMANDS; i++) { + if (!strcmp(cmdargs[0], commands[i].name)) { + /* check for missing arguments */ + int j; + + for (j = 0; j <= commands[i].numargs; j++) { + if (strlen(cmdargs[j]) == 0) { + wprintw(self->window, "Invalid command: %s expected %d arguments, got %d.\n", + commands[i].name, commands[i].numargs, j - 1); + return; + } + } + + /* check for excess arguments */ + if (strcmp(cmdargs[0], "add") && strlen(cmdargs[j]) != 0) { + wprintw(self->window, "Invalid command: too many arguments to %s.\n", commands[i].name); + return; + } + + /* pass arguments to command function */ + (commands[i].func)(self, m, cmdargs); + return; + } + } + + /* no match */ + wprintw(self->window, "Invalid command.\n"); } static void prompt_onKey(ToxWindow *self, Messenger *m, int key) { - /* Add printable characters to line */ - if (isprint(key)) { - if (prompt_buf_pos == (sizeof(prompt_buf) - 1)) { - wprintw(self->window, "\nToo Long.\n"); - prompt_buf_pos = 0; - prompt_buf[0] = 0; - } - else if (!(prompt_buf_pos == 0) && (prompt_buf_pos < COLS) - && (prompt_buf_pos % (COLS - 3) == 0)) { - prompt_buf[prompt_buf_pos++] = '\n'; - } - else if (!(prompt_buf_pos == 0) && (prompt_buf_pos > COLS) - && ((prompt_buf_pos - (COLS - 3)) % (COLS) == 0)) { - prompt_buf[prompt_buf_pos++] = '\n'; - } - prompt_buf[prompt_buf_pos++] = key; - prompt_buf[prompt_buf_pos] = 0; - } + /* Add printable characters to line */ + if (isprint(key)) { + if (prompt_buf_pos == (sizeof(prompt_buf) - 1)) { + wprintw(self->window, "\nToo Long.\n"); + prompt_buf_pos = 0; + prompt_buf[0] = 0; + } else if (!(prompt_buf_pos == 0) && (prompt_buf_pos < COLS) + && (prompt_buf_pos % (COLS - 3) == 0)) { + prompt_buf[prompt_buf_pos++] = '\n'; + } else if (!(prompt_buf_pos == 0) && (prompt_buf_pos > COLS) + && ((prompt_buf_pos - (COLS - 3)) % (COLS) == 0)) { + prompt_buf[prompt_buf_pos++] = '\n'; + } - /* RETURN key: execute command */ - else if (key == '\n') { - wprintw(self->window, "\n"); - execute(self, m, prompt_buf); - prompt_buf_pos = 0; - prompt_buf[0] = 0; - } - - /* BACKSPACE key: Remove one character from line */ - else if (key == 0x107 || key == 0x8 || key == 0x7f) { - if (prompt_buf_pos != 0) { - prompt_buf[--prompt_buf_pos] = 0; + prompt_buf[prompt_buf_pos++] = key; + prompt_buf[prompt_buf_pos] = 0; + } + + /* RETURN key: execute command */ + else if (key == '\n') { + wprintw(self->window, "\n"); + execute(self, m, prompt_buf); + prompt_buf_pos = 0; + prompt_buf[0] = 0; + } + + /* BACKSPACE key: Remove one character from line */ + else if (key == 0x107 || key == 0x8 || key == 0x7f) { + if (prompt_buf_pos != 0) { + prompt_buf[--prompt_buf_pos] = 0; + } } - } } static void prompt_onDraw(ToxWindow *self) { - curs_set(1); - int x, y; - getyx(self->window, y, x); - (void) x; - int i; - for (i = 0; i < (strlen(prompt_buf)); ++i) { - if ((prompt_buf[i] == '\n') && (y != 0)) - --y; - } + curs_set(1); + int x, y; + getyx(self->window, y, x); + (void) x; + int i; - wattron(self->window, COLOR_PAIR(1)); - mvwprintw(self->window, y, 0, "# "); - wattroff(self->window, COLOR_PAIR(1)); - mvwprintw(self->window, y, 2, "%s", prompt_buf); - wclrtoeol(self->window); - wrefresh(self->window); + for (i = 0; i < (strlen(prompt_buf)); ++i) { + if ((prompt_buf[i] == '\n') && (y != 0)) + --y; + } + + wattron(self->window, COLOR_PAIR(1)); + mvwprintw(self->window, y, 0, "# "); + wattroff(self->window, COLOR_PAIR(1)); + mvwprintw(self->window, y, 2, "%s", prompt_buf); + wclrtoeol(self->window); + wrefresh(self->window); } static void prompt_onInit(ToxWindow *self, Messenger *m) { - scrollok(self->window, 1); - cmd_help(self, m, NULL); - wclrtoeol(self->window); + scrollok(self->window, 1); + cmd_help(self, m, NULL); + wclrtoeol(self->window); } ToxWindow new_prompt(friendAddedFn *f) { - on_friendadded_cb = f; - ToxWindow ret; - memset(&ret, 0, sizeof(ret)); - ret.onKey = &prompt_onKey; - ret.onDraw = &prompt_onDraw; - ret.onInit = &prompt_onInit; - strcpy(ret.title, "[prompt]"); - return ret; + on_friendadded_cb = f; + ToxWindow ret; + memset(&ret, 0, sizeof(ret)); + ret.onKey = &prompt_onKey; + ret.onDraw = &prompt_onDraw; + ret.onInit = &prompt_onInit; + strcpy(ret.title, "[prompt]"); + return ret; } diff --git a/windows.c b/windows.c index 15caddf..183c0f9 100644 --- a/windows.c +++ b/windows.c @@ -14,232 +14,258 @@ static ToxWindow windows[MAX_WINDOW_SLOTS]; static Messenger *m; int active_window; -static ToxWindow* prompt; +static ToxWindow *prompt; /* CALLBACKS START */ -void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userdata) +void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void *userdata) { - int n = add_req(public_key); - wprintw(prompt->window, "\nFriend request from:\n"); + int n = add_req(public_key); + wprintw(prompt->window, "\nFriend request from:\n"); - int i; - for (i = 0; i < KEY_SIZE_BYTES; ++i) { - wprintw(prompt->window, "%02x", public_key[i] & 0xff); - } + int i; - wprintw(prompt->window, "\nWith the message: %s\n", data); - wprintw(prompt->window, "\nUse \"accept %d\" to accept it.\n", n); + for (i = 0; i < KEY_SIZE_BYTES; ++i) { + wprintw(prompt->window, "%02x", public_key[i] & 0xff); + } - for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { - if (windows[i].onFriendRequest != NULL) - windows[i].onFriendRequest(&windows[i], public_key, data, length); - } + wprintw(prompt->window, "\nWith the message: %s\n", data); + wprintw(prompt->window, "\nUse \"accept %d\" to accept it.\n", n); + + for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { + if (windows[i].onFriendRequest != NULL) + windows[i].onFriendRequest(&windows[i], public_key, data, length); + } } -void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) +void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) { - int i; - for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { - if (windows[i].onMessage != NULL) - windows[i].onMessage(&windows[i], m, friendnumber, string, length); - } + int i; + + for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { + if (windows[i].onMessage != NULL) + windows[i].onMessage(&windows[i], m, friendnumber, string, length); + } } -void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) +void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) { - int i; - for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { - if (windows[i].onAction != NULL) - windows[i].onAction(&windows[i], m, friendnumber, string, length); - } + int i; + + for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { + if (windows[i].onAction != NULL) + windows[i].onAction(&windows[i], m, friendnumber, string, length); + } } -void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) +void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) { - wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string); - int i; - for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { - if (windows[i].onNickChange != NULL) - windows[i].onNickChange(&windows[i], friendnumber, string, length); - } + wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string); + int i; + + for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { + if (windows[i].onNickChange != NULL) + windows[i].onNickChange(&windows[i], friendnumber, string, length); + } } -void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) +void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) { - wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string); - int i; - for (i=0; iwindow, "\n(statuschange) %d: %s\n", friendnumber, string); + int i; + + for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { + if (windows[i].onStatusChange != NULL) + windows[i].onStatusChange(&windows[i], friendnumber, string, length); + } } void on_friendadded(Messenger *m, int friendnumber) { - friendlist_onFriendAdded(m, friendnumber); - if (store_data(m, DATA_FILE) != 0) { - wprintw(prompt->window, "\nCould not store Messenger data\n"); - } + friendlist_onFriendAdded(m, friendnumber); + + if (store_data(m, DATA_FILE) != 0) { + wprintw(prompt->window, "\nCould not store Messenger data\n"); + } } /* CALLBACKS END */ int add_window(Messenger *m, ToxWindow w, int n) { - if (w_num >= TOXWINDOWS_MAX_NUM) - return -1; + if (w_num >= TOXWINDOWS_MAX_NUM) + return -1; - if (LINES < 2) - return -1; + if (LINES < 2) + return -1; - w.window = newwin(LINES - 2, COLS, 0, 0); - if (w.window == NULL) - return -1; + w.window = newwin(LINES - 2, COLS, 0, 0); - windows[n] = w; - w.onInit(&w, m); - w_num++; - active_window = n; - return n; + if (w.window == NULL) + return -1; + + windows[n] = w; + w.onInit(&w, m); + w_num++; + active_window = n; + return n; } /* Deletes window w and cleans up */ void del_window(ToxWindow *w, int f_num) { - active_window = 0; // Go to prompt screen - delwin(w->window); - int i; - for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { - if (WINDOW_STATUS[i] == f_num) { - WINDOW_STATUS[i] = -1; - disable_chatwin(f_num); - break; + active_window = 0; // Go to prompt screen + delwin(w->window); + int i; + + for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { + if (WINDOW_STATUS[i] == f_num) { + WINDOW_STATUS[i] = -1; + disable_chatwin(f_num); + break; + } } - } - clear(); - refresh(); + + clear(); + refresh(); } /* Shows next window when tab or back-tab is pressed */ void set_active_window(int ch) { - int f_inf = 0; - int max = MAX_WINDOW_SLOTS-1; - if (ch == '\t') { - int i = (active_window + 1) % max; - while (true) { - if (WINDOW_STATUS[i] != -1) { - active_window = i; - return; - } - i = (i + 1) % max; - if (f_inf++ > max) { // infinite loop check - endwin(); - exit(2); - } + int f_inf = 0; + int max = MAX_WINDOW_SLOTS - 1; + + if (ch == '\t') { + int i = (active_window + 1) % max; + + while (true) { + if (WINDOW_STATUS[i] != -1) { + active_window = i; + return; + } + + i = (i + 1) % max; + + if (f_inf++ > max) { // infinite loop check + endwin(); + exit(2); + } + } + } else { + int i = active_window - 1; + + if (i < 0) i = max; + + while (true) { + if (WINDOW_STATUS[i] != -1) { + active_window = i; + return; + } + + if (--i < 0) i = max; + + if (f_inf++ > max) { + endwin(); + exit(2); + } + } } - }else { - int i = active_window - 1; - if (i < 0) i = max; - while (true) { - if (WINDOW_STATUS[i] != -1) { - active_window = i; - return; - } - if (--i < 0) i = max; - if (f_inf++ > max) { - endwin(); - exit(2); - } - } - } } void init_window_status() { - /* Default window values decrement from -2 */ - int i; - for (i = 0; i < N_DEFAULT_WINS; ++i) - WINDOW_STATUS[i] = -(i+2); + /* Default window values decrement from -2 */ + int i; - int j; - for (j = N_DEFAULT_WINS; j < MAX_WINDOW_SLOTS; j++) - WINDOW_STATUS[j] = -1; + for (i = 0; i < N_DEFAULT_WINS; ++i) + WINDOW_STATUS[i] = -(i + 2); + + int j; + + for (j = N_DEFAULT_WINS; j < MAX_WINDOW_SLOTS; j++) + WINDOW_STATUS[j] = -1; } ToxWindow *init_windows() { - w_num = 0; - int n_prompt = 0; - int n_friendslist = 1; - int n_dhtstatus = 2; - if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1 - || add_window(m, new_friendlist(WINDOW_STATUS), n_friendslist) == -1 - || add_window(m, new_dhtstatus(), n_dhtstatus) == -1) { - fprintf(stderr, "add_window() failed.\n"); - endwin(); - exit(1); - } - active_window = n_prompt; - prompt = &windows[n_prompt]; - return prompt; + w_num = 0; + int n_prompt = 0; + int n_friendslist = 1; + int n_dhtstatus = 2; + + if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1 + || add_window(m, new_friendlist(WINDOW_STATUS), n_friendslist) == -1 + || add_window(m, new_dhtstatus(), n_dhtstatus) == -1) { + fprintf(stderr, "add_window() failed.\n"); + endwin(); + exit(1); + } + + active_window = n_prompt; + prompt = &windows[n_prompt]; + return prompt; } static void draw_bar() { - static int odd = 0; - int blinkrate = 30; + static int odd = 0; + int blinkrate = 30; - attron(COLOR_PAIR(4)); - mvhline(LINES - 2, 0, '_', COLS); - attroff(COLOR_PAIR(4)); + attron(COLOR_PAIR(4)); + mvhline(LINES - 2, 0, '_', COLS); + attroff(COLOR_PAIR(4)); - move(LINES - 1, 0); + move(LINES - 1, 0); - attron(COLOR_PAIR(4) | A_BOLD); - printw(" TOXIC " TOXICVER "|"); - attroff(COLOR_PAIR(4) | A_BOLD); + attron(COLOR_PAIR(4) | A_BOLD); + printw(" TOXIC " TOXICVER "|"); + attroff(COLOR_PAIR(4) | A_BOLD); - int i; - for (i = 0; i < (MAX_WINDOW_SLOTS); ++i) { - if (WINDOW_STATUS[i] != -1) { - if (i == active_window) - attron(A_BOLD); + int i; - odd = (odd+1) % blinkrate; - if (windows[i].blink && (odd < (blinkrate/2))) - attron(COLOR_PAIR(3)); + for (i = 0; i < (MAX_WINDOW_SLOTS); ++i) { + if (WINDOW_STATUS[i] != -1) { + if (i == active_window) + attron(A_BOLD); - printw(" %s", windows[i].title); - if (windows[i].blink && (odd < (blinkrate/2))) - attroff(COLOR_PAIR(3)); + odd = (odd + 1) % blinkrate; - if (i == active_window) { - attroff(A_BOLD); - } + if (windows[i].blink && (odd < (blinkrate / 2))) + attron(COLOR_PAIR(3)); + + printw(" %s", windows[i].title); + + if (windows[i].blink && (odd < (blinkrate / 2))) + attroff(COLOR_PAIR(3)); + + if (i == active_window) { + attroff(A_BOLD); + } + } } - } - refresh(); + + refresh(); } void prepare_window(WINDOW *w) { - mvwin(w, 0, 0); - wresize(w, LINES-2, COLS); + mvwin(w, 0, 0); + wresize(w, LINES - 2, COLS); } void draw_active_window(Messenger *m) { - ToxWindow *a = &windows[active_window]; - prepare_window(a->window); - a->blink = false; - draw_bar(); - a->onDraw(a); + ToxWindow *a = &windows[active_window]; + prepare_window(a->window); + a->blink = false; + draw_bar(); + a->onDraw(a); - /* Handle input */ - int ch = getch(); - if (ch == '\t' || ch == KEY_BTAB) - set_active_window(ch); - else if (ch != ERR) - a->onKey(a, m, ch); + /* Handle input */ + int ch = getch(); + + if (ch == '\t' || ch == KEY_BTAB) + set_active_window(ch); + else if (ch != ERR) + a->onKey(a, m, ch); } diff --git a/windows.h b/windows.h index 9f4d74a..553a620 100644 --- a/windows.h +++ b/windows.h @@ -26,31 +26,31 @@ typedef struct ToxWindow_ ToxWindow; struct ToxWindow_ { - void(*onKey)(ToxWindow*, Messenger*, int); - void(*onDraw)(ToxWindow*); - void(*onInit)(ToxWindow*, Messenger*); - void(*onFriendRequest)(ToxWindow*, uint8_t*, uint8_t*, uint16_t); - void(*onMessage)(ToxWindow*, Messenger*, int, uint8_t*, uint16_t); - void(*onNickChange)(ToxWindow*, int, uint8_t*, uint16_t); - void(*onStatusChange)(ToxWindow*, int, uint8_t*, uint16_t); - void(*onAction)(ToxWindow*, Messenger*, int, uint8_t*, uint16_t); - char title[256]; + void(*onKey)(ToxWindow *, Messenger *, int); + void(*onDraw)(ToxWindow *); + void(*onInit)(ToxWindow *, Messenger *); + void(*onFriendRequest)(ToxWindow *, uint8_t *, uint8_t *, uint16_t); + void(*onMessage)(ToxWindow *, Messenger *, int, uint8_t *, uint16_t); + void(*onNickChange)(ToxWindow *, int, uint8_t *, uint16_t); + void(*onStatusChange)(ToxWindow *, int, uint8_t *, uint16_t); + void(*onAction)(ToxWindow *, Messenger *, int, uint8_t *, uint16_t); + char title[256]; - void* x; - bool blink; + void *x; + bool blink; - WINDOW* window; + WINDOW *window; }; -void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userdata); -void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata); -void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata); -void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata); -void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata); +void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void *userdata); +void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata); +void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata); +void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata); +void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata); void on_friendadded(Messenger *m, int friendnumber); void init_window_status(); -ToxWindow * init_windows(); -void draw_active_window(Messenger * m); +ToxWindow *init_windows(); +void draw_active_window(Messenger *m); int add_window(Messenger *m, ToxWindow w, int n); void del_window(ToxWindow *w, int f_num); void set_active_window(int ch);