[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [gftp] The problem about charset conv have been slove~



Using a command, patch...
First of all, you have to get a source code, and extra them.
then, you have a directory that called gftp-2.0.18.

Do't enter the directory, and keyin patch -p0 <
gftp_remote_charsets.patch
<http://www.teatime.com.tw/%7Etommy/linux/gftp_remote_charsets.patch>

Then you can get a new source code!!

Be sure you are under the utf-8 locale...

The patch only work you are under utf-8!!!
But the remote locale is nothing...

By the way, what are Tommy mean?
ya....Tsai is my family name, and my name is Dung-Bang.

I am a Chinese~~^_^


John Veitch wrote:

>Hello Tsai or are we calling you Tommy?
>
>Thank you so much for trying to rescue me. But I'm a newbie to this so
>having the patch doesn't help much. What do I do with it?
>
>I know I need to put it into the directory tree, but I don't know how. I
>know I need to compare two files and link them together, but which ones
>and how? 
>
>So two options: Point me to a new complete file to download, or tell me
>how to use the patch. 
>
>Sorry about this.  I'm a long time computer user, but 4 weeks new to
>Linux.  STEEP learning curve. But I'll get there.  I have a copy of
>Rute.pdf I know I need to apply the patch before I ./configure the
>package. But I don't understand how. 
>
>Regards
>John
>
>  
>
>
> ------------------------------------------------------------------------
>
> Subject:
> [gftp] The problem about charset conv have been slove~
> From:
> Tsai Dung-Bang <dbtsai@xxxxxxxxxxxxxxxx>
> Date:
> Mon, 28 Feb 2005 16:51:35 +0800
> To:
> masneyb@xxxxxxxx, gftp-users@xxxxxxxx
>
> To:
> masneyb@xxxxxxxx, gftp-users@xxxxxxxx
>
>
> The detial see the diff~~
>
> And using this patch, the problem will be slove,
> and the charset can auto change..
>
> http://www.teatime.com.tw/~tommy/linux/gftp_remote_charsets.patch
> <http://www.teatime.com.tw/%7Etommy/linux/gftp_remote_charsets.patch>
>
> Thanks~
>
>------------------------------------------------------------------------
>
>diff -Nur gftp-2.0.18/lib/local.c gftp-2.0.18.patched/lib/local.c
>--- gftp-2.0.18/lib/local.c	2005-02-02 09:24:51.000000000 +0800
>+++ gftp-2.0.18.patched/lib/local.c	2005-02-28 14:41:00.000000000 +0800
>@@ -26,6 +26,18 @@
>   GHashTable *userhash, *grouphash;
> } local_protocol_data;
> 
>+static char *
>+_local_force_to_utf8(gftp_request * request, const char *name)
>+{
>+  char *utf8_name;
>+
>+  if (name == NULL) return NULL;
>+
>+  if (g_utf8_validate (name, -1, NULL)) return g_strdup(name);
>+  utf8_name = gftp_string_to_utf8 (request, name);
>+  if (utf8_name == NULL) return g_strdup(name);
>+  return utf8_name;
>+}
> 
> static void
> local_remove_key (gpointer key, gpointer value, gpointer user_data)
>@@ -112,6 +124,7 @@
> {
>   off_t size;
>   int flags;
>+  char *utf8_name;
> 
>   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
>   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
>@@ -124,8 +137,15 @@
>       flags |= O_LARGEFILE;
> #endif
> 
>-      if ((request->datafd = gftp_fd_open (request, filename, flags, 0)) == -1)
>-        return (GFTP_ERETRYABLE); 
>+      utf8_name = _local_force_to_utf8(request, filename);
>+      if (utf8_name != NULL) {
>+        request->datafd = gftp_fd_open (request, utf8_name, flags, 0);
>+        g_free(utf8_name);
>+      }
>+      else
>+        request->datafd = gftp_fd_open (request, filename, flags, 0);
>+      if (request->datafd == -1)
>+        return (GFTP_ERETRYABLE);
>     }
>   else
>     request->datafd = fd;
>@@ -157,6 +177,7 @@
>                 off_t startsize, off_t totalsize)
> {
>   int flags;
>+  char *utf8_name;
> 
>   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
>   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
>@@ -171,8 +192,17 @@
>       flags |= O_LARGEFILE;
> #endif
> 
>-      if ((request->datafd = gftp_fd_open (request, filename, flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1)
>-        return (GFTP_ERETRYABLE);
>+      utf8_name = _local_force_to_utf8(request, filename);
>+      if (utf8_name != NULL) {
>+        request->datafd = gftp_fd_open (request, utf8_name, flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
>+        g_free(utf8_name);
>+      }
>+      else
>+        request->datafd = gftp_fd_open (request, filename, flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
>+
>+      if (request->datafd == -1) {
>+          return (GFTP_ERETRYABLE);
>+      }
>     }
>   else
>     request->datafd = fd;
>@@ -185,7 +215,7 @@
>       gftp_disconnect (request);
>       return (GFTP_ERETRYABLE);
>     }
>-    
>+
>   if (lseek (request->datafd, startsize, SEEK_SET) == -1)
>     {
>       request->logging_function (gftp_logging_error, request,
>@@ -229,8 +259,17 @@
>                      mode_t * mode)
> {
>   struct stat st;
>+  char *utf8_name;
>+  int rc;
> 
>-  if (stat (filename, &st) != 0)
>+  utf8_name = _local_force_to_utf8(request, filename);
>+  if (utf8_name != NULL) {
>+    rc = stat (utf8_name, &st);
>+    g_free(utf8_name);
>+  }
>+  else
>+    rc = stat (filename, &st);
>+  if (rc != 0)
>     return (GFTP_ERETRYABLE);
> 
>   *mode = st.st_mode;
>@@ -275,13 +314,13 @@
>   if (stat (fle->file, &fst) != 0)
>     return (GFTP_ERETRYABLE);
> 
>-  if ((user = g_hash_table_lookup (lpd->userhash, 
>+  if ((user = g_hash_table_lookup (lpd->userhash,
>                                    GUINT_TO_POINTER(st.st_uid))) != NULL)
>     fle->user = g_strdup (user);
>   else
>     {
>       if ((pw = getpwuid (st.st_uid)) == NULL)
>-        fle->user = g_strdup_printf ("%u", st.st_uid); 
>+        fle->user = g_strdup_printf ("%u", st.st_uid);
>       else
>         fle->user = g_strdup (pw->pw_name);
> 
>@@ -289,13 +328,13 @@
>       g_hash_table_insert (lpd->userhash, GUINT_TO_POINTER (st.st_uid), user);
>     }
> 
>-  if ((group = g_hash_table_lookup (lpd->grouphash, 
>+  if ((group = g_hash_table_lookup (lpd->grouphash,
>                                     GUINT_TO_POINTER(st.st_gid))) != NULL)
>     fle->group = g_strdup (group);
>   else
>     {
>       if ((gr = getgrgid (st.st_gid)) == NULL)
>-        fle->group = g_strdup_printf ("%u", st.st_gid); 
>+        fle->group = g_strdup_printf ("%u", st.st_gid);
>       else
>         fle->group = g_strdup (gr->gr_name);
> 
>@@ -358,12 +397,21 @@
> }
> 
> 
>-static off_t 
>+static off_t
> local_get_file_size (gftp_request * request, const char *filename)
> {
>   struct stat st;
>+  char *utf8_name;
>+  int rc;
> 
>-  if (stat (filename, &st) == -1)
>+  utf8_name = _local_force_to_utf8(request, filename);
>+  if (utf8_name != NULL) {
>+    rc = stat (utf8_name, &st);
>+    g_free(utf8_name);
>+  }
>+  else
>+    rc = stat (filename, &st);
>+  if (rc != 0)
>     return (GFTP_ERETRYABLE);
>   return (st.st_size);
> }
>@@ -373,24 +421,34 @@
> local_chdir (gftp_request * request, const char *directory)
> {
>   char tempstr[255];
>+  char *utf8_name;
>+  int need_free;
> 
>   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
>   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
>   g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
> 
>-  if (chdir (directory) == 0)
>+  need_free = 0;
>+  utf8_name = _local_force_to_utf8(request, directory);
>+  if (utf8_name != NULL)
>+    need_free = 1;
>+  else
>+    utf8_name = directory;
>+
>+  if (chdir (utf8_name) == 0)
>     {
>       request->logging_function (gftp_logging_misc, request,
>                           _("Successfully changed local directory to %s\n"),
>-                          directory);
>+                          utf8_name);
> 
>-      if (request->directory != directory)
>+      if (request->directory != utf8_name)
>         {
>           if (getcwd (tempstr, sizeof (tempstr)) == NULL)
>             {
>               request->logging_function (gftp_logging_error, request,
>                              _("Could not get current working directory: %s\n"),
>                              g_strerror (errno));
>+          if (need_free) g_free(utf8_name);
> 	      return (GFTP_ERETRYABLE);
>             }
> 
>@@ -399,13 +457,15 @@
>           request->directory = g_strdup (tempstr);
>         }
> 
>+      if (need_free) g_free(utf8_name);
>       return (0);
>     }
>   else
>     {
>       request->logging_function (gftp_logging_error, request,
>                               _("Could not change local directory to %s: %s\n"),
>-                              directory, g_strerror (errno));
>+                              utf8_name, g_strerror (errno));
>+      if (need_free) g_free(utf8_name);
>       return (GFTP_ERETRYABLE);
>     }
> }
>@@ -414,11 +474,22 @@
> static int
> local_rmdir (gftp_request * request, const char *directory)
> {
>+  char *utf8_name;
>+  int rc;
>+
>   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
>   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
>   g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
> 
>-  if (rmdir (directory) == 0)
>+  utf8_name = _local_force_to_utf8(request, directory);
>+  if (utf8_name != NULL) {
>+    rc = rmdir (utf8_name);
>+    g_free(utf8_name);
>+  }
>+  else
>+    rc = rmdir (directory);
>+
>+  if (rc == 0)
>     {
>       request->logging_function (gftp_logging_misc, request,
>                                  _("Successfully removed %s\n"), directory);
>@@ -437,11 +508,21 @@
> static int
> local_rmfile (gftp_request * request, const char *file)
> {
>+  char *utf8_name;
>+  int rc;
>+
>   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
>   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
>   g_return_val_if_fail (file != NULL, GFTP_EFATAL);
> 
>-  if (unlink (file) == 0)
>+  utf8_name = _local_force_to_utf8(request, file);
>+  if (utf8_name != NULL) {
>+    rc = unlink (utf8_name);
>+    g_free(utf8_name);
>+  }
>+  else
>+    rc = unlink (file);
>+  if (rc == 0)
>     {
>       request->logging_function (gftp_logging_misc, request,
>                                  _("Successfully removed %s\n"), file);
>@@ -460,11 +541,22 @@
> static int
> local_mkdir (gftp_request * request, const char *directory)
> {
>+  char *utf8_name;
>+  int rc;
>+
>   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
>   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
>   g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
> 
>-  if (mkdir (directory, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0)
>+  utf8_name = _local_force_to_utf8(request, directory);
>+  if (utf8_name != NULL) {
>+    rc = mkdir (utf8_name, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
>+    g_free(utf8_name);
>+  }
>+  else
>+    rc = mkdir (directory, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
>+
>+  if (rc == 0)
>     {
>       request->logging_function (gftp_logging_misc, request,
>                                  _("Successfully made directory %s\n"),
>@@ -485,12 +577,39 @@
> local_rename (gftp_request * request, const char *oldname,
> 	      const char *newname)
> {
>+  char *utf8_oldname, *utf8_newname;
>+  int rc;
>+
>   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
>   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
>   g_return_val_if_fail (oldname != NULL, GFTP_EFATAL);
>   g_return_val_if_fail (newname != NULL, GFTP_EFATAL);
> 
>-  if (rename (oldname, newname) == 0)
>+  utf8_oldname = _local_force_to_utf8(request, oldname);
>+  utf8_newname = _local_force_to_utf8(request, newname);
>+
>+  if (utf8_oldname != NULL) {
>+    if (utf8_newname != NULL) {
>+      rc = rename (utf8_oldname, utf8_newname);
>+      g_free(utf8_oldname);
>+      g_free(utf8_newname);
>+    }
>+    else {
>+      rc = rename (utf8_oldname, newname);
>+      g_free(utf8_oldname);
>+    }
>+  }
>+  else {
>+    if (utf8_newname != NULL) {
>+      rc = rename (oldname, utf8_newname);
>+      g_free(utf8_newname);
>+    }
>+    else {
>+      rc = rename (oldname, newname);
>+    }
>+  }
>+
>+  if (rc == 0)
>     {
>       request->logging_function (gftp_logging_misc, request,
>                                  _("Successfully renamed %s to %s\n"),
>@@ -510,20 +629,30 @@
> static int
> local_chmod (gftp_request * request, const char *file, mode_t mode)
> {
>+  char *utf8_name;
>+  int rc;
>+
>   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
>   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
>   g_return_val_if_fail (file != NULL, GFTP_EFATAL);
> 
>-  if (chmod (file, mode) == 0) 
>+  utf8_name = _local_force_to_utf8(request, file);
>+  if (utf8_name != NULL) {
>+    rc = chmod (utf8_name, mode);
>+    g_free(utf8_name);
>+  }
>+  else
>+    rc = chmod (file, mode);
>+  if (rc == 0)
>     {
>-      request->logging_function (gftp_logging_misc, request, 
>+      request->logging_function (gftp_logging_misc, request,
>                                  _("Successfully changed mode of %s to %o\n"),
>                                  file, mode);
>       return (0);
>     }
>-  else 
>+  else
>     {
>-      request->logging_function (gftp_logging_error, request, 
>+      request->logging_function (gftp_logging_error, request,
>                           _("Error: Could not change mode of %s to %o: %s\n"),
>                           file, mode, g_strerror (errno));
>       return (GFTP_ERETRYABLE);
>@@ -536,6 +665,8 @@
> 		     time_t datetime)
> {
>   struct utimbuf time_buf;
>+  char *utf8_name;
>+  int rc;
> 
>   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
>   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
>@@ -543,7 +674,16 @@
> 
>   time_buf.modtime = datetime;
>   time_buf.actime = datetime;
>-  return (utime (file, &time_buf) == 0 ? 0 : GFTP_ERETRYABLE);
>+
>+  utf8_name = _local_force_to_utf8(request, file);
>+  if (utf8_name != NULL) {
>+    rc = utime (utf8_name, &time_buf);
>+    g_free(utf8_name);
>+  }
>+  else
>+    rc = utime (file, &time_buf);
>+
>+  return (rc == 0 ? 0 : GFTP_ERETRYABLE);
> }
> 
> 
>@@ -561,7 +701,7 @@
> }
> 
> 
>-void 
>+void
> local_register_module (void)
> {
> }
>diff -Nur gftp-2.0.18/lib/protocols.c gftp-2.0.18.patched/lib/protocols.c
>--- gftp-2.0.18/lib/protocols.c	2005-01-25 10:34:18.000000000 +0800
>+++ gftp-2.0.18.patched/lib/protocols.c	2005-02-28 13:51:54.000000000 +0800
>@@ -450,11 +450,16 @@
>     {
>       ret = g_convert_with_iconv (str, -1, request->iconv, &bread, &bwrite, 
>                                   &error);
>-      if (ret == NULL)
>-        printf (_("Error converting string '%s' from character set %s to character set %s: %s\n"),
>-                str, _("<unknown>"), "UTF-8", error->message);
>-
>-      return (ret);
>+      if (ret == NULL) {
>+//        printf (_("Error converting string '%s' from character set %s to character set %s: %s\n"),
>+//                str, _("<unknown>"), "UTF-8", error->message);
>+        g_iconv_close (request->iconv);
>+        request->iconv = NULL;
>+        request->iconv_initialized = 0;
>+      }
>+      else {
>+        return (ret);
>+      }
>     }
> 
>   gftp_lookup_request_option (request, "remote_charsets", &tempstr);
>@@ -521,11 +526,16 @@
>     {
>       ret = g_convert_with_iconv (str, -1, request->iconv, &bread, &bwrite, 
>                                   &error);
>-      if (ret == NULL)
>-        printf (_("Error converting string '%s' from character set %s to character set %s: %s\n"),
>-                str, "UTF-8", _("<unknown>"), error->message);
>-
>-      return (ret);
>+      if (ret == NULL) {
>+//        printf (_("Error converting string '%s' from character set %s to character set %s: %s\n"),
>+//                str, "UTF-8", _("<unknown>"), error->message);
>+        g_iconv_close (request->iconv);
>+        request->iconv = NULL;
>+        request->iconv_initialized = 0;
>+      }
>+      else {
>+        return (ret);
>+      }
>     }
> 
>   gftp_lookup_request_option (request, "remote_charsets", &tempstr);
>@@ -597,6 +607,7 @@
> {
>   char *slashpos, *newfile;
>   int fd, ret;
>+  int rc;
> 
>   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
> 
>@@ -650,7 +661,10 @@
>               request->cachefd = -1;
>             }
>         }
>-    } while (ret > 0 && !gftp_match_filespec (fle->file, filespec));
>+        rc = gftp_match_filespec(fle->file, filespec);
>+	if (rc == 0 && fle->utf8_file != NULL) 
>+          rc = gftp_match_filespec(fle->utf8_file, filespec);
>+    } while (ret > 0 && !rc);
> 
>   return (ret);
> }
>diff -Nur gftp-2.0.18/src/uicommon/gftpuicallbacks.c gftp-2.0.18.patched/src/uicommon/gftpuicallbacks.c
>--- gftp-2.0.18/src/uicommon/gftpuicallbacks.c	2005-01-04 21:32:16.000000000 +0800
>+++ gftp-2.0.18.patched/src/uicommon/gftpuicallbacks.c	2005-02-28 13:52:31.000000000 +0800
>@@ -79,9 +79,20 @@
>     {
>       if (cdata->source_string == NULL)
>         matched_filespec = 1;
>-      else
>+      else {
>         matched_filespec = gftp_match_filespec (fle->file,
>                                                 cdata->source_string);
>+	if (matched_filespec == 0) {
>+	    char *remote_file;
>+
>+	    remote_file = gftp_string_to_utf8 (cdata->request, fle->file);
>+	    if (remote_file != NULL) {
>+               matched_filespec = gftp_match_filespec (remote_file,
>+                                                cdata->source_string);
>+	       g_free(remote_file);
>+	    }
>+	}
>+      }
> 
>       if (got < 0 || strcmp (fle->file, ".") == 0 || !matched_filespec)
>         {
>  
>