equal
deleted
inserted
replaced
34 int i = dirname.find_last('/'); |
34 int i = dirname.find_last('/'); |
35 if(i > 0) { |
35 if(i > 0) { |
36 if(mkdirp(dirname.left(i), 0755)) |
36 if(mkdirp(dirname.left(i), 0755)) |
37 return -1; |
37 return -1; |
38 } |
38 } |
39 return mkdir(dirname.c_str(), mode); |
39 if(i != dirname.length() - 1) |
|
40 return mkdir(dirname.c_str(), mode); |
|
41 return 0; |
40 } |
42 } |
41 |
43 |
42 bool make_maildir(const mystring& dirname) |
44 bool make_maildir(const mystring& dirname) |
43 { |
45 { |
44 if(mkdirp(dirname, 0700)) |
46 if(mkdirp(dirname, 0700)) |
64 return true; |
66 return true; |
65 } |
67 } |
66 |
68 |
67 bool delete_directory(const mystring& dirname) |
69 bool delete_directory(const mystring& dirname) |
68 { |
70 { |
69 DIR* dir = opendir(dirname.c_str()); |
71 int retry; |
70 if(!dir) |
72 retry = 0; |
71 return false; |
73 do { |
72 while(dirent* entry = readdir(dir)) { |
74 DIR* dir = opendir(dirname.c_str()); |
73 const char* name = entry->d_name; |
75 if(!dir) |
74 if(name[0] == '.' && |
76 return false; |
75 (NAMLEN(entry) == 1 || |
77 while(dirent* entry = readdir(dir)) { |
76 (name[1] == '.' && NAMLEN(entry) == 2))) |
78 const char* name = entry->d_name; |
77 continue; |
79 if(name[0] == '.' && |
78 mystring fullname = dirname + "/"; |
80 (NAMLEN(entry) == 1 || |
79 fullname += mystring(name, NAMLEN(entry)); |
81 (name[1] == '.' && NAMLEN(entry) == 2))) |
80 if(is_dir(fullname.c_str())) { |
82 continue; |
81 if(!delete_directory(fullname)) { |
83 mystring fullname = dirname + "/"; |
|
84 fullname += mystring(name, NAMLEN(entry)); |
|
85 if(is_dir(fullname.c_str())) { |
|
86 if(!delete_directory(fullname)) { |
|
87 closedir(dir); |
|
88 return false; |
|
89 } |
|
90 } |
|
91 else if(unlink(fullname.c_str())) { |
82 closedir(dir); |
92 closedir(dir); |
83 return false; |
93 return false; |
84 } |
94 } |
85 } |
95 } |
86 else if(unlink(fullname.c_str())) { |
96 closedir(dir); |
87 closedir(dir); |
97 if (rmdir(dirname) == 0) |
88 return false; |
98 return true; |
89 } |
99 ++retry; |
90 } |
100 } while (retry < 3); |
91 closedir(dir); |
101 return false; |
92 return !rmdir(dirname); |
|
93 } |
102 } |