]> granicus.if.org Git - transmission/commitdiff
Fix tr_moveFile error reporting
authorMike Gelfand <mikedld@mikedld.com>
Wed, 10 Dec 2014 18:37:58 +0000 (18:37 +0000)
committerMike Gelfand <mikedld@mikedld.com>
Wed, 10 Dec 2014 18:37:58 +0000 (18:37 +0000)
Remove unused `renamed` argument.
Use tr_error instead of errno to report errors to support Win32 file
wrappers which do not map Windows error codes to POSIX ones.
Return bool instead of int (0/-1).

Uncomment tr_error_prefix and tr_error_propagate_prefixed functions.

libtransmission/error-types.h
libtransmission/error.c
libtransmission/error.h
libtransmission/torrent.c
libtransmission/utils.c
libtransmission/utils.h

index c12578f122ed216fa976a4bb6caa340e15ad02dd..f3689c59e62ae3ec84adccb2000c51a34456dff6 100644 (file)
 
 #define TR_ERROR_IS_ENOSPC(code) ((code) == ERROR_DISK_FULL)
 
+#define TR_ERROR_EINVAL ERROR_INVALID_PARAMETER
+
 #else /* _WIN32 */
 
 #include <errno.h>
 
 #define TR_ERROR_IS_ENOSPC(code) ((code) == ENOSPC)
 
+#define TR_ERROR_EINVAL EINVAL
+
 #endif /* _WIN32 */
 
 #endif /* TR_ERROR_TYPES_H */
index 6557b8049d2c69530a3917d77983bda561c983cf..0bc92687001a373646d137cf464c590b8e521969 100644 (file)
@@ -135,8 +135,6 @@ tr_error_clear (tr_error ** error)
   *error = NULL;
 }
 
-#if 0
-
 static void
 error_prefix_valist (tr_error   ** error,
                      const char  * prefix_format,
@@ -194,5 +192,3 @@ tr_error_propagate_prefixed (tr_error   ** new_error,
   error_prefix_valist (new_error, prefix_format, args);
   va_end (args);
 }
-
-#endif /* 0 */
index d300f6a7aa35f4f6e4746737e2d712e9d4d00326..5670d9645b08adae921760bb10097fe4182348d7 100644 (file)
@@ -134,8 +134,6 @@ void       tr_error_propagate          (tr_error   ** new_error,
  */
 void       tr_error_clear              (tr_error   ** error);
 
-#if 0
-
 /**
  * @brief Prefix message of exising error object.
  *
@@ -167,8 +165,6 @@ void       tr_error_propagate_prefixed (tr_error   ** new_error,
                                         const char  * prefix_format,
                                                       ...) TR_GNUC_PRINTF (3, 4);
 
-#endif /* 0 */
-
 /** @} */
 
 #ifdef __cplusplus
index ff36fb8e60ed953a88207da3c1270b2ff6c9c12a..0e85484d1d1d27bcc71592d30e6afcabf6cffa17 100644 (file)
@@ -3094,14 +3094,15 @@ setLocation (void * vdata)
 
               if (do_move && !tr_sys_path_is_same (oldpath, newpath, NULL))
                 {
-                  bool renamed = false;
-                  errno = 0;
+                  tr_error * error = NULL;
+
                   tr_logAddTorInfo (tor, "moving \"%s\" to \"%s\"", oldpath, newpath);
-                  if (tr_moveFile (oldpath, newpath, &renamed))
+                  if (!tr_moveFile (oldpath, newpath, &error))
                     {
                       err = true;
                       tr_logAddTorErr (tor, "error moving \"%s\" to \"%s\": %s",
-                                       oldpath, newpath, tr_strerror (errno));
+                                       oldpath, newpath, error->message);
+                      tr_error_free (error);
                     }
                 }
 
index 7e0f0f70736dcf25f2a3bd45eba9def283aa4155..538f0c937d84f92f1036c6d28a6525ca51dd4b7a 100644 (file)
@@ -46,6 +46,7 @@
 
 #include "transmission.h"
 #include "error.h"
+#include "error-types.h"
 #include "file.h"
 #include "ConvertUTF.h"
 #include "list.h"
@@ -1410,67 +1411,72 @@ tr_strratio (char * buf, size_t buflen, double ratio, const char * infinity)
 ****
 ***/
 
-int
-tr_moveFile (const char * oldpath, const char * newpath, bool * renamed)
+bool
+tr_moveFile (const char * oldpath, const char * newpath, tr_error ** error)
 {
   tr_sys_file_t in;
   tr_sys_file_t out;
-  char * buf;
+  char * buf = NULL;
   tr_sys_path_info info;
   uint64_t bytesLeft;
   const size_t buflen = 1024 * 128; /* 128 KiB buffer */
-  tr_error * error = NULL;
 
   /* make sure the old file exists */
-  if (!tr_sys_path_get_info (oldpath, 0, &info, &error))
+  if (!tr_sys_path_get_info (oldpath, 0, &info, error))
     {
-      const int err = error->code;
-      tr_error_free (error);
-      errno = err;
-      return -1;
+      tr_error_prefix (error, "Unable to get information on old file: ");
+      return false;
     }
   if (info.type != TR_SYS_PATH_IS_FILE)
     {
-      errno = ENOENT;
-      return -1;
+      tr_error_set_literal (error, TR_ERROR_EINVAL, "Old path does not point to a file.");
+      return false;
     }
-  bytesLeft = info.size;
 
   /* make sure the target directory exists */
   {
     char * newdir = tr_sys_path_dirname (newpath, NULL);
-    const bool i = tr_sys_dir_create (newdir, TR_SYS_DIR_CREATE_PARENTS, 0777, &error);
+    const bool i = tr_sys_dir_create (newdir, TR_SYS_DIR_CREATE_PARENTS, 0777, error);
     tr_free (newdir);
     if (!i)
       {
-        const int err = error->code;
-        tr_error_free (error);
-        errno = err;
-        return -1;
+        tr_error_prefix (error, "Unable to create directory for new file: ");
+        return false;
       }
   }
 
   /* they might be on the same filesystem... */
-  {
-    const bool i = tr_sys_path_rename (oldpath, newpath, NULL);
-    if (renamed != NULL)
-      *renamed = i;
-    if (i)
-      return 0;
-  }
+  if (tr_sys_path_rename (oldpath, newpath, NULL))
+    return true;
 
   /* copy the file */
-  in = tr_sys_file_open (oldpath, TR_SYS_FILE_READ | TR_SYS_FILE_SEQUENTIAL, 0, NULL);
-  out = tr_sys_file_open (newpath, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE | TR_SYS_FILE_TRUNCATE, 0666, NULL);
+  in = tr_sys_file_open (oldpath, TR_SYS_FILE_READ | TR_SYS_FILE_SEQUENTIAL, 0, error);
+  if (in == TR_BAD_SYS_FILE)
+    {
+      tr_error_prefix (error, "Unable to open old file: ");
+      return false;
+    }
+
+  out = tr_sys_file_open (newpath, TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE | TR_SYS_FILE_TRUNCATE, 0666, error);
+  if (out == TR_BAD_SYS_FILE)
+    {
+      tr_error_prefix (error, "Unable to open new file: ");
+      tr_sys_file_close (in, NULL);
+      return false;
+    }
+
   buf = tr_valloc (buflen);
+  bytesLeft = info.size;
   while (bytesLeft > 0)
     {
       const uint64_t bytesThisPass = MIN (bytesLeft, buflen);
       uint64_t numRead, bytesWritten;
-      if (!tr_sys_file_read (in, buf, bytesThisPass, &numRead, NULL))
+      if (!tr_sys_file_read (in, buf, bytesThisPass, &numRead, error))
         break;
-      if (!tr_sys_file_write (out, buf, numRead, &bytesWritten, NULL))
+      if (!tr_sys_file_write (out, buf, numRead, &bytesWritten, error))
         break;
+      assert (numRead == bytesWritten);
+      assert (bytesWritten <= bytesLeft);
       bytesLeft -= bytesWritten;
     }
 
@@ -1478,11 +1484,23 @@ tr_moveFile (const char * oldpath, const char * newpath, bool * renamed)
   tr_free (buf);
   tr_sys_file_close (out, NULL);
   tr_sys_file_close (in, NULL);
+
   if (bytesLeft != 0)
-    return -1;
+    {
+      tr_error_prefix (error, "Unable to read/write: ");
+      return false;
+    }
 
-  tr_sys_path_remove (oldpath, NULL);
-  return 0;
+  {
+    tr_error * my_error = NULL;
+    if (!tr_sys_path_remove (oldpath, &my_error))
+      {
+        tr_logAddError ("Unable to remove file at old path: %s", my_error->message);
+        tr_error_free (my_error);
+      }
+  }
+
+  return true;
 }
 
 /***
index f32d568b46f04a75d414151a5899322ddc59db0d..beb3ff3ac289d56615cb58597e36267cab9cbfad 100644 (file)
@@ -15,6 +15,7 @@
 #include <stddef.h> /* size_t */
 #include <time.h> /* time_t */
 
+#include "error.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -396,10 +397,10 @@ int tr_gettimeofday (struct timeval * tv);
 
 /**
  * @brief move a file
- * @return 0 on success; otherwise, return -1 and set errno
+ * @return `True` on success, `false` otherwise (with `error` set accordingly).
  */
-int tr_moveFile (const char * oldpath, const char * newpath,
-                 bool * renamed) TR_GNUC_NONNULL (1,2);
+bool tr_moveFile (const char * oldpath, const char * newpath,
+                  tr_error ** error) TR_GNUC_NONNULL (1,2);
 
 /** @brief convenience function to remove an item from an array */
 void tr_removeElementFromArray (void         * array,