summaryrefslogtreecommitdiff
path: root/src/maildir-delete.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/maildir-delete.cc')
-rw-r--r--src/maildir-delete.cc88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/maildir-delete.cc b/src/maildir-delete.cc
new file mode 100644
index 0000000..9ed162b
--- /dev/null
+++ b/src/maildir-delete.cc
@@ -0,0 +1,88 @@
+/** --------------------------------------------------------------------
+ * @file maildir-delete.cc
+ * @brief Implementation of the Maildir class.
+ * @author Andreas Aardal Hanssen
+ * @date 2002-2005
+ * ----------------------------------------------------------------- **/
+#include "maildir.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <dirent.h>
+#include <unistd.h>
+
+using namespace ::std;
+using namespace Binc;
+
+namespace {
+
+ bool recursiveDelete(const string &path)
+ {
+ DIR *mydir = opendir(path.c_str());
+ if (mydir == 0)
+ return false;
+
+ struct dirent *mydirent;
+ while ((mydirent = readdir(mydir)) != 0) {
+ string d = mydirent->d_name;
+ if (d == "." || d == "..")
+ continue;
+
+ string f = path + "/" + d;
+
+ struct stat mystat;
+ if (lstat(f.c_str(), &mystat) != 0) {
+ if (errno == ENOENT)
+ continue;
+ return false;
+ }
+
+ if (S_ISDIR(mystat.st_mode)) {
+ if (!recursiveDelete(f)) {
+ closedir(mydir);
+ return false;
+ }
+ if (rmdir(f.c_str()) != 0 && errno != ENOENT) {
+ closedir(mydir);
+ return false;
+ }
+ } else {
+ if (unlink(f.c_str()) != 0 && errno != ENOENT) {
+ closedir(mydir);
+ return false;
+ }
+ }
+ }
+
+ closedir(mydir);
+ return true;
+ }
+}
+
+//------------------------------------------------------------------------
+bool Binc::Maildir::deleteMailbox(const string &s_in)
+{
+ if (s_in == ".") {
+ setLastError("disallowed by rule");
+ return false;
+ }
+
+ if (!recursiveDelete(s_in)) {
+ setLastError("error deleting Maildir - status is undefined");
+ return false;
+ }
+
+ if (rmdir(s_in.c_str()) != 0) {
+ setLastError("error deleting Maildir: "
+ + string(strerror(errno))
+ + " - status is undefined");
+ return false;
+ }
+
+ return true;
+}