]> git.llucax.com Git - software/mutt-debian.git/blobdiff - bcache.c
upstream/603288-split-fetches.patch: split FETCH's into smaller chunks, workaround...
[software/mutt-debian.git] / bcache.c
index ac07849253d90224cb097729db791786347a159d..b61a2073a61ab936ed5617abc641d6bfaa807649 100644 (file)
--- a/bcache.c
+++ b/bcache.c
@@ -1,6 +1,6 @@
 /*
- * Copyright (C) 2006 Brendan Cully <brendan@kublai.com>
- * Copyright (C) 2006 Rocco Rutte <pdmef@gmx.net>
+ * Copyright (C) 2006-7 Brendan Cully <brendan@kublai.com>
+ * Copyright (C) 2006, 2009 Rocco Rutte <pdmef@gmx.net>
  *
  *     This program is free software; you can redistribute it and/or modify
  *     it under the terms of the GNU General Public License as published by
@@ -42,8 +42,9 @@ static int bcache_path(ACCOUNT *account, const char *mailbox,
                       char *dst, size_t dstlen)
 {
   char host[STRING];
+  char path[_POSIX_PATH_MAX];
   ciss_url_t url;
-  size_t len;
+  int len;
 
   if (!account || !MessageCachedir || !*MessageCachedir || !dst || !dstlen)
     return -1;
@@ -62,12 +63,14 @@ static int bcache_path(ACCOUNT *account, const char *mailbox,
     return -1;
   }
 
-  dprint (3, (debugfile, "bcache_path: URL: '%s'\n", host));
+  mutt_encode_path (path, sizeof (path), NONULL (mailbox));
 
   len = snprintf (dst, dstlen-1, "%s/%s%s%s", MessageCachedir,
-                 host, NONULL(mailbox),
-                 (mailbox && *mailbox &&
-                  mailbox[mutt_strlen(mailbox) - 1] == '/') ? "" : "/");
+                 host, path,
+                 (*path && path[mutt_strlen (path) - 1] == '/') ? "" : "/");
+
+  dprint (3, (debugfile, "bcache_path: rc: %d, path: '%s'\n", len, dst));
+
   if (len < 0 || len >= dstlen-1)
     return -1;
 
@@ -136,6 +139,13 @@ FILE* mutt_bcache_put(body_cache_t *bcache, const char *id, int tmp)
   snprintf (path, sizeof (path), "%s%s%s", bcache->path, id,
             tmp ? ".tmp" : "");
 
+  if ((fp = safe_fopen (path, "w+")))
+    goto out;
+
+  if (errno == EEXIST)
+    /* clean up leftover tmp file */
+    mutt_unlink (path);
+
   s = strchr (path + 1, '/');
   while (!(fp = safe_fopen (path, "w+")) && errno == ENOENT && s)
   {
@@ -147,6 +157,7 @@ FILE* mutt_bcache_put(body_cache_t *bcache, const char *id, int tmp)
     s = strchr (s + 1, '/');
   }
 
+  out:
   dprint (3, (debugfile, "bcache: put: '%s'\n", path));
 
   return fp;