changeset 831:739462d1bfb5

2006-10-19 Brian Masney <masneyb@gftp.org> WARNING: The CVS version of gFTP is currently broken, especially for international users. This will be fixed in a few days. * lib/local.c - convert the file or directory to the proper locale
author masneyb
date Thu, 19 Oct 2006 12:32:11 +0000
parents afbe37351940
children f2772ac00751
files ChangeLog lib/local.c
diffstat 2 files changed, 235 insertions(+), 88 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Oct 19 11:41:04 2006 +0000
+++ b/ChangeLog	Thu Oct 19 12:32:11 2006 +0000
@@ -2,6 +2,8 @@
 	WARNING: The CVS version of gFTP is currently broken, especially for
 	international users. This will be fixed in a few days.
 
+	* lib/local.c - convert the file or directory to the proper locale
+
 	* 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
@@ -3649,7 +3651,7 @@
 
 	* cvsclean - added this script
 
-	* *.[ch] - added $Id: ChangeLog,v 1.485 2006/10/19 11:41:02 masneyb Exp $ tags
+	* *.[ch] - added $Id: ChangeLog,v 1.486 2006/10/19 12:32:10 masneyb Exp $ tags
 
 	* debian/* - updated files from Debian maintainer
 
--- a/lib/local.c	Thu Oct 19 11:41:04 2006 +0000
+++ b/lib/local.c	Thu Oct 19 12:32:11 2006 +0000
@@ -52,40 +52,83 @@
 
 
 static int
+local_getcwd (gftp_request * request)
+{
+  char tempstr[PATH_MAX], *utf8;
+  
+  if (request->directory != NULL)
+    g_free (request->directory);
+
+  if (getcwd (tempstr, sizeof (tempstr)) == NULL)
+    {
+      request->logging_function (gftp_logging_error, request,
+                                 _("Could not get current working directory: %s\n"),
+                                 g_strerror (errno));
+      request->directory = NULL;
+      return (GFTP_ERETRYABLE);
+    }
+
+  utf8 = gftp_string_from_utf8 (request, tempstr);
+  if (utf8 != NULL)
+    request->directory = utf8;
+  else
+    request->directory = g_strdup (tempstr);
+
+  return (0);
+}
+
+
+static int
+local_chdir (gftp_request * request, const char *directory)
+{
+  char *utf8;
+  int ret;
+
+  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);
+
+  utf8 = gftp_string_from_utf8 (request, directory);
+  if (utf8 != NULL)
+    {
+      ret = chdir (utf8);
+      g_free (utf8);
+    }
+  else
+    ret = chdir (directory);
+
+  if (ret == 0)
+    {
+      request->logging_function (gftp_logging_misc, request,
+                          _("Successfully changed local directory to %s\n"),
+                          directory);
+      ret = local_getcwd (request);
+    }
+  else
+    {
+      request->logging_function (gftp_logging_error, request,
+                                 _("Could not change local directory to %s: %s\n"),
+                                 directory, g_strerror (errno));
+      ret = GFTP_ERETRYABLE;
+    }
+
+  if (utf8 != NULL)
+    g_free (utf8);
+
+  return (ret);
+}
+
+
+static int
 local_connect (gftp_request * request)
 {
-  char tempstr[PATH_MAX];
-
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
 
   if (request->directory != NULL)
-    {
-      if (getcwd (tempstr, sizeof (tempstr)) != NULL &&
-          strcmp (tempstr, request->directory) == 0)
-        return (0);
-
-      if (chdir (request->directory) != 0)
-        {
-          request->logging_function (gftp_logging_error, request,
-                             _("Could not change local directory to %s: %s\n"),
-                             request->directory, g_strerror (errno));
-        }
-      g_free (request->directory);
-      request->directory = NULL;
-    }
-
-  if (getcwd (tempstr, sizeof (tempstr)) != NULL)
-    {
-      tempstr[sizeof (tempstr) - 1] = '\0';
-      request->directory = g_strdup (tempstr);
-    }
+    return (local_chdir (request, request->directory));
   else
-    request->logging_function (gftp_logging_error, request,
-                             _("Could not get current working directory: %s\n"),
-                             g_strerror (errno));
-
-  return (0);
+    return (local_getcwd (request));
 }
 
 
@@ -110,6 +153,7 @@
 local_get_file (gftp_request * request, const char *filename, int fd,
                 off_t startsize)
 {
+  char *utf8;
   off_t size;
   int flags;
 
@@ -124,7 +168,16 @@
       flags |= O_LARGEFILE;
 #endif
 
-      if ((request->datafd = gftp_fd_open (request, filename, flags, 0)) == -1)
+      utf8 = gftp_string_from_utf8 (request, filename);
+      if (utf8 != NULL)
+        {
+          request->datafd = gftp_fd_open (request, utf8, flags, 0);
+          g_free (utf8);
+        }
+      else
+        request->datafd = gftp_fd_open (request, filename, flags, 0);
+
+      if (request->datafd == -1)
         return (GFTP_ERETRYABLE); 
     }
   else
@@ -156,7 +209,8 @@
 local_put_file (gftp_request * request, const char *filename, int fd,
                 off_t startsize, off_t totalsize)
 {
-  int flags;
+  int flags, perms;
+  char *utf8;
 
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
@@ -171,7 +225,17 @@
       flags |= O_LARGEFILE;
 #endif
 
-      if ((request->datafd = gftp_fd_open (request, filename, flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1)
+      perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
+      utf8 = gftp_string_from_utf8 (request, filename);
+      if (utf8 != NULL)
+        {
+          request->datafd = gftp_fd_open (request, utf8, flags, perms);
+          g_free (utf8);
+        }
+      else
+        request->datafd = gftp_fd_open (request, filename, flags, perms);
+
+      if (request->datafd == -1)
         return (GFTP_ERETRYABLE);
     }
   else
@@ -229,8 +293,19 @@
                      mode_t * mode, off_t * filesize)
 {
   struct stat st;
+  char *utf8;
+  int ret;
 
-  if (stat (filename, &st) != 0)
+  utf8 = gftp_string_from_utf8 (request, filename);
+  if (utf8 != NULL)
+    {
+      ret = stat (utf8, &st);
+      g_free (utf8);
+    }
+  else
+    ret = stat (filename, &st);
+
+  if (ret != 0)
     return (GFTP_ERETRYABLE);
 
   *mode = st.st_mode;
@@ -320,9 +395,9 @@
 static int
 local_list_files (gftp_request * request)
 {
+  char *dir, *tempstr, *utf8;
   local_protocol_data *lpd;
-  char *tempstr;
-  int freeit;
+  int freeit, ret;
 
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
   g_return_val_if_fail (request->directory != NULL, GFTP_EFATAL);
@@ -332,14 +407,17 @@
 
   g_return_val_if_fail (lpd != NULL, GFTP_EFATAL);
 
-  if (request->directory[strlen (request->directory) - 1] != '/')
+  utf8 = gftp_string_from_utf8 (request, request->directory);
+  dir = utf8 != NULL ? utf8 : request->directory;
+
+  if (dir[strlen (dir) - 1] != '/')
     {
-      tempstr = g_strconcat (request->directory, "/", NULL);
+      tempstr = g_strconcat (dir, "/", NULL);
       freeit = 1;
     }
   else
     {
-      tempstr = request->directory;
+      tempstr = dir;
       freeit = 0;
     }
 
@@ -348,15 +426,18 @@
       request->logging_function (gftp_logging_error, request,
                            _("Could not get local directory listing %s: %s\n"),
                            tempstr, g_strerror (errno));
-      if (freeit)
-        g_free (tempstr);
-      return (GFTP_ERETRYABLE);
+      ret = GFTP_ERETRYABLE;
     }
+  else
+    ret = 0;
 
   if (freeit)
     g_free (tempstr);
 
-  return (0);
+  if (utf8 != NULL)
+    g_free (utf8);
+
+  return (ret);
 }
 
 
@@ -364,60 +445,45 @@
 local_get_file_size (gftp_request * request, const char *filename)
 {
   struct stat st;
-
-  if (stat (filename, &st) == -1)
-    return (GFTP_ERETRYABLE);
-  return (st.st_size);
-}
-
+  char *utf8;
+  int ret;
 
-static int
-local_chdir (gftp_request * request, const char *directory)
-{
-  char tempstr[MAXNAMLEN];
-
-  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)
+  utf8 = gftp_string_from_utf8 (request, filename);
+  if (utf8 != NULL)
     {
-      request->logging_function (gftp_logging_misc, request,
-                          _("Successfully changed local directory to %s\n"),
-                          directory);
-
-      if (getcwd (tempstr, sizeof (tempstr)) == NULL)
-        {
-          request->logging_function (gftp_logging_error, request,
-                                     _("Could not get current working directory: %s\n"),
-                                     g_strerror (errno));
-          return (GFTP_ERETRYABLE);
-        }
-
-      if (request->directory)
-        g_free (request->directory);
-
-      request->directory = g_strdup (tempstr);
-      return (0);
+      ret = stat (utf8, &st);
+      g_free (utf8);
     }
   else
-    {
-      request->logging_function (gftp_logging_error, request,
-                                 _("Could not change local directory to %s: %s\n"),
-                                 directory, g_strerror (errno));
-      return (GFTP_ERETRYABLE);
-    }
+    ret = stat (filename, &st);
+
+  if (ret == -1)
+    return (GFTP_ERETRYABLE);
+
+  return (st.st_size);
 }
 
 
 static int
 local_rmdir (gftp_request * request, const char *directory)
 {
+  char *utf8;
+  int ret;
+
   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 = gftp_string_from_utf8 (request, directory);
+  if (utf8 != NULL)
+    {
+      ret = rmdir (utf8);
+      g_free (utf8);
+    }
+  else
+    ret = rmdir (directory);
+
+  if (ret == 0)
     {
       request->logging_function (gftp_logging_misc, request,
                                  _("Successfully removed %s\n"), directory);
@@ -436,11 +502,23 @@
 static int
 local_rmfile (gftp_request * request, const char *file)
 {
+  char *utf8;
+  int ret;
+
   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 = gftp_string_from_utf8 (request, file);
+  if (utf8 != NULL)
+    {
+      ret = unlink (utf8);
+      g_free (utf8);
+    }
+  else
+    ret = unlink (file);
+
+  if (ret == 0)
     {
       request->logging_function (gftp_logging_misc, request,
                                  _("Successfully removed %s\n"), file);
@@ -459,11 +537,25 @@
 static int
 local_mkdir (gftp_request * request, const char *directory)
 {
+  int ret, perms;
+  char *utf8;
+
   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)
+  perms = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
+
+  utf8 = gftp_string_from_utf8 (request, directory);
+  if (utf8 != NULL)
+    {
+      ret = mkdir (utf8, perms);
+      g_free (utf8);
+    }
+  else
+    ret = mkdir (directory, perms);
+
+  if (ret == 0)
     {
       request->logging_function (gftp_logging_misc, request,
                                  _("Successfully made directory %s\n"),
@@ -484,36 +576,64 @@
 local_rename (gftp_request * request, const char *oldname,
 	      const char *newname)
 {
+  const char *conv_oldname, *conv_newname;
+  char *old_utf8, *new_utf8;
+  int ret;
+
   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)
+  old_utf8 = gftp_string_from_utf8 (request, oldname);
+  conv_oldname = old_utf8 != NULL ? old_utf8 : oldname;
+  new_utf8 = gftp_string_from_utf8 (request, newname);
+  conv_newname = new_utf8 != NULL ? new_utf8 : newname;
+
+  if (rename (conv_oldname, conv_newname) == 0)
     {
       request->logging_function (gftp_logging_misc, request,
                                  _("Successfully renamed %s to %s\n"),
                                  oldname, newname);
-      return (0);
+      ret = 0;
     }
   else
     {
       request->logging_function (gftp_logging_error, request,
                                  _("Error: Could not rename %s to %s: %s\n"),
                                  oldname, newname, g_strerror (errno));
-      return (GFTP_ERETRYABLE);
+      ret = GFTP_ERETRYABLE;
     }
+
+  if (old_utf8 != NULL)
+    g_free (old_utf8);
+  if (new_utf8 != NULL)
+    g_free (new_utf8);
+
+  return (ret);
 }
 
 
 static int
 local_chmod (gftp_request * request, const char *file, mode_t mode)
 {
+  char *utf8;
+  int ret;
+
   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 = gftp_string_from_utf8 (request, file);
+  if (utf8 != NULL)
+    {
+      ret = chmod (utf8, mode);
+      g_free (utf8);
+    }
+  else
+    ret = chmod (file, mode);
+
+  if (ret == 0) 
     {
       request->logging_function (gftp_logging_misc, request, 
                                  _("Successfully changed mode of %s to %o\n"),
@@ -535,6 +655,8 @@
 		     time_t datetime)
 {
   struct utimbuf time_buf;
+  char *utf8;
+  int ret;
 
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
@@ -542,7 +664,30 @@
 
   time_buf.modtime = datetime;
   time_buf.actime = datetime;
-  return (utime (file, &time_buf) == 0 ? 0 : GFTP_ERETRYABLE);
+
+  utf8 = gftp_string_from_utf8 (request, file);
+  if (utf8 != NULL)
+    {
+      ret = utime (utf8, &time_buf);
+      g_free (utf8);
+    }
+  else
+    ret = utime (file, &time_buf);
+
+  if (ret == 0)
+    {
+      request->logging_function (gftp_logging_misc, request,
+                                 _("Successfully changed the time stamp of %s\n"),
+                                 file);
+      return (0);
+    }
+  else
+    {
+      request->logging_function (gftp_logging_error, request,
+                                 _("Error: Could not change the time stamp of %s: %s\n"),
+                                 file, g_strerror (errno));
+      return (GFTP_ERETRYABLE);
+    }
 }