changeset 843:32dbed7e0dc4

2006-11-2 Brian Masney <masneyb@gftp.org> * lib/local.c lib/misc.c lib/sshv2.c - more improvements to make sure that the filename is encoded in the proper character set.
author masneyb
date Fri, 03 Nov 2006 02:35:47 +0000
parents 0d6fba16c7db
children 1ece208d1357
files ChangeLog lib/local.c lib/misc.c lib/sshv2.c
diffstat 4 files changed, 50 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Nov 03 02:01:16 2006 +0000
+++ b/ChangeLog	Fri Nov 03 02:35:47 2006 +0000
@@ -1,4 +1,7 @@
 2006-11-2 Brian Masney <masneyb@gftp.org>
+	* lib/local.c lib/misc.c lib/sshv2.c - more improvements to make sure
+	that the filename is encoded in the proper character set.
+
 	* lib/gftp.h lib/protocols.c - added _do_convert_string(), which is
 	the common code that was in gftp_string_to_utf8() and
 	gftp_string_from_utf8(). 
@@ -3677,7 +3680,7 @@
 
 	* cvsclean - added this script
 
-	* *.[ch] - added $Id: ChangeLog,v 1.492 2006/11/03 02:01:16 masneyb Exp $ tags
+	* *.[ch] - added $Id: ChangeLog,v 1.493 2006/11/03 02:35:46 masneyb Exp $ tags
 
 	* debian/* - updated files from Debian maintainer
 
--- a/lib/local.c	Fri Nov 03 02:01:16 2006 +0000
+++ b/lib/local.c	Fri Nov 03 02:35:47 2006 +0000
@@ -69,7 +69,7 @@
       return (GFTP_ERETRYABLE);
     }
 
-  utf8 = gftp_string_from_utf8 (request, tempstr, &destlen);
+  utf8 = gftp_string_to_utf8 (request, tempstr, &destlen);
   if (utf8 != NULL)
     request->directory = utf8;
   else
@@ -397,10 +397,10 @@
 static int
 local_list_files (gftp_request * request)
 {
-  char *dir, *tempstr, *utf8;
   local_protocol_data *lpd;
-  int freeit, ret;
+  char *dir, *utf8;
   size_t destlen;
+  int ret;
 
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
   g_return_val_if_fail (request->directory != NULL, GFTP_EFATAL);
@@ -410,37 +410,32 @@
 
   g_return_val_if_fail (lpd != NULL, GFTP_EFATAL);
 
-  utf8 = gftp_string_from_utf8 (request, request->directory, &destlen);
-  dir = utf8 != NULL ? utf8 : request->directory;
+  if (request->directory[strlen (request->directory) - 1] != '/')
+    dir = g_strconcat (request->directory, "/", NULL);
+  else
+    dir = request->directory;
 
-  if (dir[strlen (dir) - 1] != '/')
+  utf8 = gftp_string_from_utf8 (request, dir, &destlen);
+  if (utf8 != NULL)
     {
-      tempstr = g_strconcat (dir, "/", NULL);
-      freeit = 1;
+      lpd->dir = opendir (utf8);
+      g_free (utf8);
     }
   else
-    {
-      tempstr = dir;
-      freeit = 0;
-    }
+    lpd->dir = opendir (dir);
 
-  if ((lpd->dir = opendir (tempstr)) == NULL)
+  if (dir != request->directory)
+    g_free (dir);
+
+  if (lpd->dir == NULL)
     {
       request->logging_function (gftp_logging_error, request,
                            _("Could not get local directory listing %s: %s\n"),
-                           tempstr, g_strerror (errno));
-      ret = GFTP_ERETRYABLE;
+                           request->directory, g_strerror (errno));
+      return (GFTP_ERETRYABLE);
     }
   else
-    ret = 0;
-
-  if (freeit)
-    g_free (tempstr);
-
-  if (utf8 != NULL)
-    g_free (utf8);
-
-  return (ret);
+    return (0);
 }
 
 
--- a/lib/misc.c	Fri Nov 03 02:01:16 2006 +0000
+++ b/lib/misc.c	Fri Nov 03 02:35:47 2006 +0000
@@ -874,6 +874,7 @@
                     char *file_prefixstr, char *file_suffixstr)
 {
   char *tempstr1, *tempstr2, *ret, tstr[50], *attribs, *utf8;
+  int old_encoding;
   size_t destlen;
   struct tm *lt;
   time_t t;
@@ -901,11 +902,19 @@
   if (file_suffixstr == NULL)
     file_suffixstr = "";
 
+  old_encoding = request->use_local_encoding;
   utf8 = gftp_string_from_utf8 (request, fle->file, &destlen);
-  ret = g_strdup_printf ("%s %s %s %s%s%s", tempstr1, tempstr2, tstr, 
-                         file_prefixstr, 
-                         utf8 != NULL ? utf8: fle->file,
-                         file_suffixstr);
+  request->use_local_encoding = old_encoding;
+
+  if (utf8 != NULL)
+    {
+      ret = g_strdup_printf ("%s %s %s %s%s%s", tempstr1, tempstr2, tstr,
+                             file_prefixstr, utf8, file_suffixstr);
+      g_free (utf8);
+    }
+  else
+    ret = g_strdup_printf ("%s %s %s %s%s%s", tempstr1, tempstr2, tstr,
+                           file_prefixstr, fle->file, file_suffixstr);
 
   g_free (tempstr1);
   g_free (tempstr2);
--- a/lib/sshv2.c	Fri Nov 03 02:01:16 2006 +0000
+++ b/lib/sshv2.c	Fri Nov 03 02:35:47 2006 +0000
@@ -1025,9 +1025,9 @@
 static int
 sshv2_getcwd (gftp_request * request)
 {
+  char *tempstr, *dir, *utf8;
   sshv2_message message;
-  char *tempstr, *dir;
-  size_t msglen;
+  size_t len;
   int ret;
 
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
@@ -1038,8 +1038,8 @@
   else
     dir = request->directory;
 
-  tempstr = sshv2_initialize_buffer_with_i18n_string (request, dir, &msglen);
-  ret = sshv2_send_command (request, SSH_FXP_REALPATH, tempstr, msglen);
+  tempstr = sshv2_initialize_buffer_with_i18n_string (request, dir, &len);
+  ret = sshv2_send_command (request, SSH_FXP_REALPATH, tempstr, len);
   g_free (tempstr);
   if (ret < 0)
     return (ret);
@@ -1059,9 +1059,18 @@
   if ((ret = sshv2_buffer_get_int32 (request, &message, 1, 1, NULL)) < 0)
     return (ret);
 
-  if ((request->directory = sshv2_buffer_get_string (request, &message, 1)) == NULL)
+  if ((dir = sshv2_buffer_get_string (request, &message, 1)) == NULL)
     return (GFTP_EFATAL);
 
+  utf8 = gftp_string_to_utf8 (request, dir, &len);
+  if (utf8 != NULL)
+    {
+      request->directory = utf8;
+      g_free (dir);
+    }
+  else
+    request->directory = dir;
+
   sshv2_message_free (&message);
   return (0);
 }