lib/misc/maildir.cc
changeset 2 b3afb9f1e801
parent 0 6f7a81934006
equal deleted inserted replaced
1:30113bfbe723 2:b3afb9f1e801
    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 }