--- a/lib/misc/maildir.cc Sun Jan 20 00:12:17 2008 +0100
+++ b/lib/misc/maildir.cc Sun Jan 20 00:22:09 2008 +0100
@@ -36,7 +36,9 @@
if(mkdirp(dirname.left(i), 0755))
return -1;
}
- return mkdir(dirname.c_str(), mode);
+ if(i != dirname.length() - 1)
+ return mkdir(dirname.c_str(), mode);
+ return 0;
}
bool make_maildir(const mystring& dirname)
@@ -66,28 +68,35 @@
bool delete_directory(const mystring& dirname)
{
- DIR* dir = opendir(dirname.c_str());
- if(!dir)
- return false;
- while(dirent* entry = readdir(dir)) {
- const char* name = entry->d_name;
- if(name[0] == '.' &&
- (NAMLEN(entry) == 1 ||
- (name[1] == '.' && NAMLEN(entry) == 2)))
- continue;
- mystring fullname = dirname + "/";
- fullname += mystring(name, NAMLEN(entry));
- if(is_dir(fullname.c_str())) {
- if(!delete_directory(fullname)) {
+ int retry;
+ retry = 0;
+ do {
+ DIR* dir = opendir(dirname.c_str());
+ if(!dir)
+ return false;
+ while(dirent* entry = readdir(dir)) {
+ const char* name = entry->d_name;
+ if(name[0] == '.' &&
+ (NAMLEN(entry) == 1 ||
+ (name[1] == '.' && NAMLEN(entry) == 2)))
+ continue;
+ mystring fullname = dirname + "/";
+ fullname += mystring(name, NAMLEN(entry));
+ if(is_dir(fullname.c_str())) {
+ if(!delete_directory(fullname)) {
+ closedir(dir);
+ return false;
+ }
+ }
+ else if(unlink(fullname.c_str())) {
closedir(dir);
return false;
}
}
- else if(unlink(fullname.c_str())) {
- closedir(dir);
- return false;
- }
- }
- closedir(dir);
- return !rmdir(dirname);
+ closedir(dir);
+ if (rmdir(dirname) == 0)
+ return true;
+ ++retry;
+ } while (retry < 3);
+ return false;
}