Updating branch refs/heads/master to 614f909f006f0e4a2c508ee2c2a7c66281140fd0 (commit) from 6aa6ae683341c307f8497587d3570d91f12a24ad (commit)
commit 614f909f006f0e4a2c508ee2c2a7c66281140fd0 Author: Enrico Tröger <enrico.troe...@uvena.de> Date: Mon Jan 3 01:09:57 2011 +0100 Refactor get_answer a bit to make it more flexible and ensure to read the server's answer after quitting the session. This should fix connection resets on server-side, we closed the connection too early. While at it, fix some typos. lib/dictd.c | 73 +++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 46 insertions(+), 27 deletions(-) diff --git a/lib/dictd.c b/lib/dictd.c index 8a52686..9929812 100644 --- a/lib/dictd.c +++ b/lib/dictd.c @@ -397,7 +397,7 @@ static gboolean process_server_response(DictData *dd) if (! NZV(dd->query_buffer)) { - dict_gui_status_add(dd, _("Unknown error while quering the server.")); + dict_gui_status_add(dd, _("Unknown error while querying the server.")); g_free(dd->query_buffer); return FALSE; } @@ -453,7 +453,7 @@ static gboolean process_server_response(DictData *dd) } else if (strncmp("150", answer, 3) != 0 && dd->query_status != NOTHING_FOUND) { - dict_gui_status_add(dd, _("Unknown error while quering the server.")); + dict_gui_status_add(dd, _("Unknown error while querying the server.")); g_free(dd->query_buffer); return FALSE; } @@ -494,14 +494,18 @@ static gboolean process_server_response(DictData *dd) } -static gchar *get_answer(DictData *dd, gint fd) +static gint get_answer(gint fd, gchar **buffer) { gboolean fol = TRUE; gboolean sol = FALSE; gboolean tol = FALSE; - GString *str = g_string_sized_new(100); + GString *str; gchar c; gchar ec[3]; + gint query_status; + + if (buffer != NULL) + str = g_string_sized_new(100); alarm(10); /* abort after 10 seconds, there should went wrong something */ while (read(fd, &c, 1) > 0) @@ -529,7 +533,9 @@ static gchar *get_answer(DictData *dd, gint fd) tol = FALSE; } - g_string_append_c(str, c); + if (buffer != NULL) + g_string_append_c(str, c); + if (tol) { if (strncmp(ec, "250", 3) == 0 || /* ok */ @@ -538,45 +544,50 @@ static gchar *get_answer(DictData *dd, gint fd) { break; } - else if (strncmp(ec, "220", 3) == 0) /* server ready */ + else if (strncmp(ec, "220", 3) == 0 || /* server ready */ + strncmp(ec, "221", 3) == 0) /* good bye */ { - dd->query_status = NO_ERROR; + query_status = NO_ERROR; break; } else if (strncmp(ec, "420", 3) == 0 || strncmp(ec, "421", 3) == 0) /* server not ready (server down or shutdown) */ { - dd->query_status = SERVER_NOT_READY; + query_status = SERVER_NOT_READY; break; } else if (strncmp(ec, "500", 3) == 0 || strncmp(ec, "501", 3) == 0) /* bad command or parameters */ { - dd->query_status = BAD_COMMAND; + query_status = BAD_COMMAND; break; } else if (strncmp(ec, "550", 3) == 0) /* invalid database */ { - dd->query_status = UNKNOWN_DATABASE; + query_status = UNKNOWN_DATABASE; break; } else if (strncmp(ec, "552", 3) == 0) /* nothing found */ { - dd->query_status = NOTHING_FOUND; + query_status = NOTHING_FOUND; break; } else if (strncmp(ec, "554", 3) == 0) /* no databases present */ { - dd->query_status = NO_DATABASES; + query_status = NO_DATABASES; break; } } } alarm(0); - g_string_append_c(str, '\0'); + if (buffer != NULL) + { + g_string_append_c(str, '\0'); + *buffer = g_string_free(str, FALSE); + } - return g_string_free(str, FALSE); + return query_status; } @@ -584,7 +595,6 @@ static gpointer ask_server(DictData *dd) { gint fd, i; static gchar cmd[BUF_SIZE]; - gchar *tmp_buf; if ((fd = open_socket(dd->server, dd->port)) == -1) { @@ -596,8 +606,7 @@ static gpointer ask_server(DictData *dd) dd->query_is_running = TRUE; dd->query_status = NO_CONNECTION; - tmp_buf = get_answer(dd, fd); - g_free(tmp_buf); + dd->query_status = get_answer(fd, NULL); if (dd->query_status == NO_ERROR) { /* take only the first part of the dictionary string, so let the string end at the space */ @@ -612,9 +621,10 @@ static gpointer ask_server(DictData *dd) /* and now, "append" again the rest of the dictionary string again */ dd->dictionary[i] = ' '; - dd->query_buffer = get_answer(dd, fd); + dd->query_status = get_answer(fd, &(dd->query_buffer)); } send_command(fd, "QUIT"); + get_answer(fd, NULL); close(fd); dd->query_is_running = FALSE; @@ -691,7 +701,7 @@ void dict_dictd_get_information(GtkWidget *button, DictData *dd) dd->query_status = NO_CONNECTION; - g_free(get_answer(dd, fd)); + dd->query_status = get_answer(fd, NULL); if (dd->query_status != NO_ERROR) { dict_show_msgbox(dd, GTK_MESSAGE_ERROR, _("Could not connect to server.")); @@ -701,12 +711,15 @@ void dict_dictd_get_information(GtkWidget *button, DictData *dd) send_command(fd, "SHOW SERVER"); /* read all server output */ - answer = buffer = get_answer(dd, fd); + dd->query_status = get_answer(fd, &answer); + buffer = answer; send_command(fd, "QUIT"); + get_answer(fd, NULL); close(fd); /* go to next line */ - while (*buffer != '\n') buffer++; + while (*buffer != '\n') + buffer++; buffer++; if (strncmp("114", buffer, 3) != 0) @@ -717,7 +730,9 @@ void dict_dictd_get_information(GtkWidget *button, DictData *dd) } /* go to next line */ - while (*buffer != '\n') buffer++; + while (*buffer != '\n') + buffer++; + buffer++; end = strstr(buffer, ".\r\n250"); @@ -783,7 +798,7 @@ void dict_dictd_get_list(GtkWidget *button, DictData *dd) dd->query_status = NO_CONNECTION; - g_free(get_answer(dd, fd)); + dd->query_status = get_answer(fd, NULL); if (dd->query_status != NO_ERROR) { dict_show_msgbox(dd, GTK_MESSAGE_ERROR, _("Could not connect to server.")); @@ -793,12 +808,15 @@ void dict_dictd_get_list(GtkWidget *button, DictData *dd) send_command(fd, "SHOW DATABASES"); /* read all server output */ - answer = buffer = get_answer(dd, fd); + dd->query_status = get_answer(fd, &answer); + buffer = answer; send_command(fd, "QUIT"); + get_answer(fd, NULL); close(fd); /* go to next line */ - while (*buffer != '\n') buffer++; + while (*buffer != '\n') + buffer++; buffer++; if (strncmp("554", buffer, 3) == 0) @@ -808,12 +826,13 @@ void dict_dictd_get_list(GtkWidget *button, DictData *dd) } else if (strncmp("110", buffer, 3) != 0 && strncmp("554", buffer, 3) != 0) { - dict_show_msgbox(dd, GTK_MESSAGE_ERROR, _("Unknown error while quering the server.")); + dict_show_msgbox(dd, GTK_MESSAGE_ERROR, _("Unknown error while querying the server.")); return; } /* go to next line */ - while (*buffer != '\n') buffer++; + while (*buffer != '\n') + buffer++; buffer++; /* clear the combo box */ _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits