diff -r 30113bfbe723 -r b3afb9f1e801 lib/misc/maildir.cc --- 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; }