# HG changeset patch # User masneyb # Date 1161258064 0 # Node ID afbe37351940f982a67b024705515df10aba0ab0 # Parent 74f49d528c6837a06e286191a93cec837755e576 2006-10-19 Brian Masney WARNING: The CVS version of gFTP is currently broken, especially for international users. This will be fixed in a few days. * src/gtk/gtkui.c src/gtk/gtkui_transfer.c src/gtk/misc-gtk.c lib/gftp.h lib/misc.c lib/protocols.c - removed code that converts the filename to UTF8. This will be handled by the library. Removed utf8_file member from the gftp_file structure. * lib/rfc959.c - convert the file or directory from UTF8 to the proper locale when sending a command to the server. * src/uicommon/gftpui.c src/gtk/menu-items.c lib/misc.c lib/gftp.h (gftp_gen_ls_string) - convert the filename from UTF8 to the proper locale before it is displayed to the user. diff -r 74f49d528c68 -r afbe37351940 ChangeLog --- a/ChangeLog Sun Oct 15 18:45:06 2006 +0000 +++ b/ChangeLog Thu Oct 19 11:41:04 2006 +0000 @@ -1,3 +1,19 @@ +2006-10-19 Brian Masney + WARNING: The CVS version of gFTP is currently broken, especially for + international users. This will be fixed in a few days. + + * src/gtk/gtkui.c src/gtk/gtkui_transfer.c src/gtk/misc-gtk.c lib/gftp.h + lib/misc.c lib/protocols.c - removed code that converts the filename to + UTF8. This will be handled by the library. Removed utf8_file member from + the gftp_file structure. + + * lib/rfc959.c - convert the file or directory from UTF8 to the proper + locale when sending a command to the server. + + * src/uicommon/gftpui.c src/gtk/menu-items.c lib/misc.c lib/gftp.h + (gftp_gen_ls_string) - convert the filename from UTF8 to the proper + locale before it is displayed to the user. + 2006-10-15 Brian Masney * src/gtk/transfer.c - split the code that checks for finished view and edit processes into smaller functions. @@ -3633,7 +3649,7 @@ * cvsclean - added this script - * *.[ch] - added $Id: ChangeLog,v 1.484 2006/10/15 18:45:04 masneyb Exp $ tags + * *.[ch] - added $Id: ChangeLog,v 1.485 2006/10/19 11:41:02 masneyb Exp $ tags * debian/* - updated files from Debian maintainer diff -r 74f49d528c68 -r afbe37351940 lib/gftp.h --- a/lib/gftp.h Sun Oct 15 18:45:06 2006 +0000 +++ b/lib/gftp.h Thu Oct 19 11:41:04 2006 +0000 @@ -232,9 +232,6 @@ struct gftp_file_tag { /*@null@*/ char *file, /* Our filename */ - *utf8_file, /* UTF-8 encoded filename for display purposes - only. This is only set if file is not in - UTF-8 */ *user, /* User that owns it */ *group, /* Group that owns it */ *destfile; /* Full pathname to the destination for the @@ -772,7 +769,8 @@ int column, int asds ); -char * gftp_gen_ls_string ( gftp_file * fle, +char * gftp_gen_ls_string ( gftp_request * request, + gftp_file * fle, char *file_prefixstr, char *file_suffixstr ); diff -r 74f49d528c68 -r afbe37351940 lib/misc.c --- a/lib/misc.c Sun Oct 15 18:45:06 2006 +0000 +++ b/lib/misc.c Thu Oct 19 11:41:04 2006 +0000 @@ -458,9 +458,6 @@ if (fle->file) newfle->file = g_strdup (fle->file); - if (fle->utf8_file) - newfle->utf8_file = g_strdup (fle->utf8_file); - if (fle->user) newfle->user = g_strdup (fle->user); @@ -873,9 +870,10 @@ char * -gftp_gen_ls_string (gftp_file * fle, char *file_prefixstr, char *file_suffixstr) +gftp_gen_ls_string (gftp_request * request, gftp_file * fle, + char *file_prefixstr, char *file_suffixstr) { - char *tempstr1, *tempstr2, *ret, tstr[50], *attribs; + char *tempstr1, *tempstr2, *ret, tstr[50], *attribs, *utf8; struct tm *lt; time_t t; @@ -902,9 +900,10 @@ if (file_suffixstr == NULL) file_suffixstr = ""; + utf8 = gftp_string_from_utf8 (request, fle->file); ret = g_strdup_printf ("%s %s %s %s%s%s", tempstr1, tempstr2, tstr, file_prefixstr, - fle->utf8_file != NULL ? fle->utf8_file : fle->file, + utf8 != NULL ? utf8: fle->file, file_suffixstr); g_free (tempstr1); diff -r 74f49d528c68 -r afbe37351940 lib/protocols.c --- a/lib/protocols.c Sun Oct 15 18:45:06 2006 +0000 +++ b/lib/protocols.c Thu Oct 19 11:41:04 2006 +0000 @@ -106,8 +106,6 @@ if (file->file) g_free (file->file); - if (file->utf8_file) - g_free (file->utf8_file); if (file->user) g_free (file->user); if (file->group) @@ -594,7 +592,7 @@ gftp_get_next_file (gftp_request * request, const char *filespec, gftp_file * fle) { - char *slashpos, *newfile; + char *slashpos, *tmpfile, *utf8; int fd, ret; g_return_val_if_fail (request != NULL, GFTP_EFATAL); @@ -621,20 +619,28 @@ } *slashpos = '\0'; - newfile = g_strdup (slashpos + 1); + tmpfile = g_strdup (slashpos + 1); if (strcmp (fle->file, request->directory) != 0) request->logging_function (gftp_logging_error, request, _("Warning: Stripping path off of file '%s'. The stripped path (%s) doesn't match the current directory (%s)\n"), - newfile, fle->file, request->directory, + tmpfile, fle->file, request->directory, g_strerror (errno)); g_free (fle->file); - fle->file = newfile; + fle->file = tmpfile; } if (ret >= 0 && fle->file != NULL) - fle->utf8_file = gftp_string_to_utf8 (request, fle->file); + { + utf8 = gftp_string_to_utf8 (request, fle->file); + if (utf8 != NULL) + { + tmpfile = fle->file; + fle->file = utf8; + g_free (tmpfile); + } + } if (ret >= 0 && !request->cached && request->cachefd > 0 && request->last_dir_entry != NULL) diff -r 74f49d528c68 -r afbe37351940 lib/rfc959.c --- a/lib/rfc959.c Sun Oct 15 18:45:06 2006 +0000 +++ b/lib/rfc959.c Thu Oct 19 11:41:04 2006 +0000 @@ -192,6 +192,33 @@ return (0); } +static int +rfc959_generate_and_send_command (gftp_request * request, const char *command, + const char *argument, int read_response, + int dont_try_to_reconnect) +{ + char *tempstr, *utf8; + int resp; + + if (argument != NULL) + { + utf8 = gftp_string_from_utf8 (request, argument); + if (utf8 != NULL) + { + tempstr = g_strconcat (command, " ", utf8, "\r\n", NULL); + g_free (utf8); + } + tempstr = g_strconcat (command, " ", argument, "\r\n", NULL); + } + else + tempstr = g_strconcat (command, "\r\n", NULL); + + resp = rfc959_send_command (request, tempstr, read_response, + dont_try_to_reconnect); + g_free (tempstr); + return (resp); +} + static char * parse_ftp_proxy_string (gftp_request * request) @@ -322,7 +349,7 @@ static int rfc959_getcwd (gftp_request * request) { - char *pos, *dir; + char *pos, *dir, *utf8; int ret; ret = rfc959_send_command (request, "PWD\r\n", 1, 0); @@ -362,7 +389,12 @@ if (request->directory) g_free (request->directory); - request->directory = g_strdup (dir); + utf8 = gftp_string_to_utf8 (request, dir); + if (utf8 != NULL) + request->directory = utf8; + else + request->directory = g_strdup (dir); + return (0); } @@ -370,7 +402,6 @@ static int rfc959_chdir (gftp_request * request, const char *directory) { - char *tempstr; int ret; g_return_val_if_fail (request != NULL, GFTP_EFATAL); @@ -379,11 +410,7 @@ if (strcmp (directory, "..") == 0) ret = rfc959_send_command (request, "CDUP\r\n", 1, 0); else - { - tempstr = g_strconcat ("CWD ", directory, "\r\n", NULL); - ret = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); - } + ret = rfc959_generate_and_send_command (request, "CWD", directory, 1, 0); if (ret < 0) return (ret); @@ -401,13 +428,11 @@ rfc959_syst (gftp_request * request) { int ret, disable_ls_options; - rfc959_parms * parms; char *stpos, *endpos; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); - parms = request->protocol_data; ret = rfc959_send_command (request, "SYST\r\n", 1, 0); if (ret < 0) @@ -460,7 +485,7 @@ int rfc959_connect (gftp_request * request) { - char tempchar, *startpos, *endpos, *tempstr, *email, *proxy_hostname, *utf8; + char tempchar, *startpos, *endpos, *tempstr, *email, *proxy_hostname; intptr_t ascii_transfers, proxy_port; rfc959_parms * parms; int ret, resp; @@ -535,34 +560,23 @@ } else { - tempstr = g_strconcat ("USER ", request->username, "\r\n", NULL); - resp = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); + resp = rfc959_generate_and_send_command (request, "USER", + request->username, 1, 0); if (resp < 0) return (resp); if (resp == '3') { - utf8 = gftp_string_from_utf8 (request, request->password); - if (utf8 != NULL) - { - tempstr = g_strconcat ("PASS ", utf8, "\r\n", NULL); - g_free (utf8); - } - else - tempstr = g_strconcat ("PASS ", request->password, "\r\n", NULL); - - resp = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); + resp = rfc959_generate_and_send_command (request, "PASS", + request->password, 1, 0); if (resp < 0) return (resp); } if (resp == '3' && request->account != NULL) { - tempstr = g_strconcat ("ACCT ", request->account, "\r\n", NULL); - resp = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); + resp = rfc959_generate_and_send_command (request, "ACCT", + request->account, 1, 0); if (resp < 0) return (resp); } @@ -990,11 +1004,11 @@ static int rfc959_data_connection_new (gftp_request * request, int dont_try_to_reconnect) { + int ret; + g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); - int ret; - #ifdef HAVE_IPV6 if (request->ai_family == AF_INET6) ret = rfc959_ipv6_data_connection_new (request); @@ -1172,10 +1186,7 @@ } } - tempstr = g_strconcat ("RETR ", filename, "\r\n", NULL); - ret = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); - + ret = rfc959_generate_and_send_command (request, "RETR", filename, 1, 0); if (ret < 0) return (ret); else if (ret != '1') @@ -1207,7 +1218,7 @@ off_t startsize, off_t totalsize) { intptr_t passive_transfer; - char *command, *tempstr; + char *command; rfc959_parms * parms; int ret; @@ -1244,9 +1255,7 @@ } } - tempstr = g_strconcat ("STOR ", filename, "\r\n", NULL); - ret = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); + ret = rfc959_generate_and_send_command (request, "STOR", filename, 1, 0); if (ret < 0) return (ret); else if (ret != '1') @@ -1306,17 +1315,11 @@ else if (ret != '2') return (GFTP_ERETRYABLE); - tempstr = g_strconcat ("RETR ", fromfile, "\r\n", NULL); - ret = rfc959_send_command (fromreq, tempstr, 0, 0); - g_free (tempstr); - + ret = rfc959_generate_and_send_command (fromreq, "RETR", fromfile, 0, 0); if (ret < 0) return (ret); - tempstr = g_strconcat ("STOR ", tofile, "\r\n", NULL); - ret = rfc959_send_command (toreq, tempstr, 0, 0); - g_free (tempstr); - + ret = rfc959_generate_and_send_command (toreq, "STOR", tofile, 0, 0); if (ret < 0) return (ret); @@ -1610,21 +1613,19 @@ static off_t rfc959_get_file_size (gftp_request * request, const char *filename) { - char *tempstr; int ret; g_return_val_if_fail (request != NULL, 0); g_return_val_if_fail (filename != NULL, 0); g_return_val_if_fail (request->datafd > 0, 0); - tempstr = g_strconcat ("SIZE ", filename, "\r\n", NULL); - ret = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); + ret = rfc959_generate_and_send_command (request, "SIZE", filename, 1, 0); if (ret < 0) return (ret); if (*request->last_ftp_response != '2') return (0); + return (strtol (request->last_ftp_response + 4, NULL, 10)); } @@ -1632,17 +1633,13 @@ static int rfc959_rmdir (gftp_request * request, const char *directory) { - char *tempstr; int ret; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (directory != NULL, GFTP_EFATAL); g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); - tempstr = g_strconcat ("RMD ", directory, "\r\n", NULL); - ret = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); - + ret = rfc959_generate_and_send_command (request, "RMD", directory, 1, 0); if (ret < 0) return (ret); else if (ret == '2') @@ -1655,17 +1652,13 @@ static int rfc959_rmfile (gftp_request * request, const char *file) { - char *tempstr; int ret; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (file != NULL, GFTP_EFATAL); g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); - tempstr = g_strconcat ("DELE ", file, "\r\n", NULL); - ret = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); - + ret = rfc959_generate_and_send_command (request, "DELE", file, 1, 0); if (ret < 0) return (ret); else if (ret == '2') @@ -1678,17 +1671,13 @@ static int rfc959_mkdir (gftp_request * request, const char *directory) { - char *tempstr; int ret; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (directory != NULL, GFTP_EFATAL); g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); - tempstr = g_strconcat ("MKD ", directory, "\r\n", NULL); - ret = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); - + ret = rfc959_generate_and_send_command (request, "MKD", directory, 1, 0); if (ret < 0) return (ret); else if (ret == '2') @@ -1702,7 +1691,6 @@ rfc959_rename (gftp_request * request, const char *oldname, const char *newname) { - char *tempstr; int ret; g_return_val_if_fail (request != NULL, GFTP_EFATAL); @@ -1710,19 +1698,13 @@ g_return_val_if_fail (newname != NULL, GFTP_EFATAL); g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); - tempstr = g_strconcat ("RNFR ", oldname, "\r\n", NULL); - ret = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); - + ret = rfc959_generate_and_send_command (request, "RNFR", oldname, 1, 0); if (ret < 0) return (ret); else if (ret != '3') return (GFTP_ERETRYABLE); - tempstr = g_strconcat ("RNTO ", newname, "\r\n", NULL); - ret = rfc959_send_command (request, tempstr, 1, 0); - g_free (tempstr); - + ret = rfc959_generate_and_send_command (request, "RNTO", newname, 1, 0); if (ret < 0) return (ret); else if (ret == '2') @@ -1735,16 +1717,21 @@ static int rfc959_chmod (gftp_request * request, const char *file, mode_t mode) { - rfc959_parms * parms; - char *tempstr; + char *tempstr, *utf8; int ret; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (file != NULL, GFTP_EFATAL); g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); - parms = request->protocol_data; - tempstr = g_strdup_printf ("SITE CHMOD %o %s\r\n", mode, file); + utf8 = gftp_string_from_utf8 (request, file); + if (utf8 != NULL) + { + tempstr = g_strdup_printf ("SITE CHMOD %o %s\r\n", mode, utf8); + g_free (utf8); + } + else + tempstr = g_strdup_printf ("SITE CHMOD %o %s\r\n", mode, file); ret = rfc959_send_command (request, tempstr, 1, 0); g_free (tempstr); @@ -1761,17 +1748,30 @@ static int rfc959_site (gftp_request * request, int specify_site, const char *command) { - char *tempstr; + char *tempstr, *utf8; int ret; g_return_val_if_fail (request != NULL, GFTP_EFATAL); g_return_val_if_fail (command != NULL, GFTP_EFATAL); g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); - if (specify_site) - tempstr = g_strconcat ("SITE ", command, "\r\n", NULL); + utf8 = gftp_string_from_utf8 (request, command); + if (utf8 != NULL) + { + if (specify_site) + tempstr = g_strconcat ("SITE ", utf8, "\r\n", NULL); + else + tempstr = g_strconcat (utf8, "\r\n", NULL); + + g_free (utf8); + } else - tempstr = g_strconcat (command, "\r\n", NULL); + { + if (specify_site) + tempstr = g_strconcat ("SITE ", command, "\r\n", NULL); + else + tempstr = g_strconcat (command, "\r\n", NULL); + } ret = rfc959_send_command (request, tempstr, 1, 0); g_free (tempstr); @@ -1785,29 +1785,6 @@ } -static char * -rfc959_time_t_to_mdtm (gftp_request * request, time_t datetime) -{ - struct tm gt; - char *ret; - - if (localtime_r (&datetime, >) != NULL) - { - ret = g_strdup_printf ("%04d%02d%02d%02d%02d%02d", gt.tm_year + 1900, - gt.tm_mon + 1, gt.tm_mday, gt.tm_hour, gt.tm_min, - gt.tm_sec); - return (ret); - } - else - { - request->logging_function (gftp_logging_error, request, - "Cannot parse UNIX timestamp %d: %s\n", - datetime, g_strerror (errno)); - return (NULL); - } -} - - static int rfc959_set_config_options (gftp_request * request) { diff -r 74f49d528c68 -r afbe37351940 src/gtk/gtkui.c --- a/src/gtk/gtkui.c Sun Oct 15 18:45:06 2006 +0000 +++ b/src/gtk/gtkui.c Thu Oct 19 11:41:04 2006 +0000 @@ -469,17 +469,12 @@ char * gftpui_gtk_get_utf8_file_pos (gftp_file * fle) { - char *disp_item, *pos; + char *pos; - if (fle->utf8_file != NULL) - disp_item = fle->utf8_file; - else - disp_item = fle->file; - - if ((pos = strrchr (disp_item, '/')) != NULL) + if ((pos = strrchr (fle->file, '/')) != NULL) pos++; else - pos = disp_item; + pos = fle->file; return (pos); } diff -r 74f49d528c68 -r afbe37351940 src/gtk/gtkui_transfer.c --- a/src/gtk/gtkui_transfer.c Sun Oct 15 18:45:06 2006 +0000 +++ b/src/gtk/gtkui_transfer.c Thu Oct 19 11:41:04 2006 +0000 @@ -206,7 +206,7 @@ gftpui_ask_transfer (gftp_transfer * tdata) { char *dltitles[4], *add_data[4] = { NULL, NULL, NULL, NULL }, - tempstr[50], temp1str[50], *pos, *utf8_file; + tempstr[50], temp1str[50], *pos; GtkWidget * dialog, * tempwid, * scroll, * hbox; gftp_file * tempfle; GList * templist; @@ -293,8 +293,7 @@ if (strncmp (pos, tdata->toreq->directory, len) == 0) pos += len + 1; - utf8_file = gftp_string_to_utf8 (tdata->toreq, pos); - add_data[0] = utf8_file != NULL ? utf8_file : pos; + add_data[0] = pos; gftp_get_transfer_action (tdata->fromreq, tempfle); switch (tempfle->transfer_action) @@ -319,9 +318,6 @@ i = gtk_clist_append (GTK_CLIST (tdata->clist), add_data); gtk_clist_set_row_data (GTK_CLIST (tdata->clist), i, tempfle); - - if (utf8_file != NULL) - g_free (utf8_file); } gtk_clist_select_all (GTK_CLIST (tdata->clist)); diff -r 74f49d528c68 -r afbe37351940 src/gtk/menu-items.c --- a/src/gtk/menu-items.c Sun Oct 15 18:45:06 2006 +0000 +++ b/src/gtk/menu-items.c Thu Oct 19 11:41:04 2006 +0000 @@ -116,7 +116,7 @@ if (!tempfle->shown) continue; - tempstr = gftp_gen_ls_string (tempfle, NULL, NULL); + tempstr = gftp_gen_ls_string (NULL, tempfle, NULL, NULL); fprintf (fd, "%s\n", tempstr); g_free (tempstr); } diff -r 74f49d528c68 -r afbe37351940 src/gtk/misc-gtk.c --- a/src/gtk/misc-gtk.c Sun Oct 15 18:45:06 2006 +0000 +++ b/src/gtk/misc-gtk.c Thu Oct 19 11:41:04 2006 +0000 @@ -298,7 +298,7 @@ void update_window (gftp_window_data * wdata) { - char *tempstr, *hostname, *fspec, *utf8_directory; + char *tempstr, *hostname, *fspec; int connected, start; connected = GFTP_IS_CONNECTED (wdata->request); @@ -320,19 +320,8 @@ g_free (tempstr); if (wdata->request->directory != NULL) - { - utf8_directory = gftp_string_to_utf8 (wdata->request, - wdata->request->directory); - if (utf8_directory != NULL) - { - gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry), - utf8_directory); - g_free (utf8_directory); - } - else - gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry), - wdata->request->directory); - } + gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry), + wdata->request->directory); } else if (wdata->hoststxt != NULL) { @@ -757,10 +746,7 @@ gtk_clist_set_pixmap (GTK_CLIST (wdata->listbox), clist_num, 0, pix, bitmap); - if (fle->utf8_file) - gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 1, - fle->utf8_file); - else if (fle->file) + if (fle->file != NULL) gtk_clist_set_text (GTK_CLIST (wdata->listbox), clist_num, 1, fle->file); if (GFTP_IS_SPECIAL_DEVICE (fle->st_mode)) diff -r 74f49d528c68 -r afbe37351940 src/uicommon/gftpui.c --- a/src/uicommon/gftpui.c Sun Oct 15 18:45:06 2006 +0000 +++ b/src/uicommon/gftpui.c Thu Oct 19 11:41:04 2006 +0000 @@ -621,7 +621,7 @@ fle = templist->data; gftpui_lookup_file_colors (fle, &startcolor, &endcolor); - tempstr = gftp_gen_ls_string (fle, startcolor, endcolor); + tempstr = gftp_gen_ls_string (request, fle, startcolor, endcolor); request->logging_function (gftp_logging_misc_nolog, request, "%s\n", tempstr); g_free (tempstr);