I noticed that the dirsize backend for quota didn't support any rules and figured it should be easy enough to add ``ignore'' at least. Using mbox storage and only tested with that, but it seems to work as expected for the time being. I'm attaching a relatively small patch for quota-dirsize.c against dovecot-1.1.18 just in case anyone's interested.

Best Regards,
Thanos Chatziathanassiou

--- quota-dirsize.c.orig	Tue Jan  6 16:33:51 2009
+++ quota-dirsize.c	Fri Aug 21 16:03:46 2009
@@ -39,7 +39,7 @@
 	return resources;
 }
 
-static int get_dir_usage(const char *dir, uint64_t *value)
+static int get_dir_usage(struct quota_root *root, const char *dir, uint64_t *value)
 {
 	DIR *dirp;
 	string_t *path;
@@ -47,6 +47,7 @@
 	struct stat st;
 	unsigned int path_pos;
         int ret;
+	struct quota_rule *rule;
 
 	dirp = opendir(dir);
 	if (dirp == NULL) {
@@ -82,11 +83,16 @@
 			ret = -1;
 			break;
 		} else if (S_ISDIR(st.st_mode)) {
-			if (get_dir_usage(str_c(path), value) < 0) {
+			if (get_dir_usage(root, str_c(path), value) < 0) {
 				ret = -1;
 				break;
 			}
 		} else {
+			/* check if we need to ignore this one as well */
+			rule = quota_root_rule_find(root, d->d_name);
+			if (rule != NULL && rule->ignore)
+				continue;
+
 			*value += st.st_size;
 		}
 	}
@@ -95,7 +101,7 @@
 	return ret;
 }
 
-static int get_usage(const char *path, bool is_file, uint64_t *value_r)
+static int get_usage(struct quota_root *root, const char *path, bool is_file, uint64_t *value_r)
 {
 	struct stat st;
 
@@ -109,7 +115,7 @@
 		}
 		*value_r += st.st_size;
 	} else {
-		if (get_dir_usage(path, value_r) < 0)
+		if (get_dir_usage(root, path, value_r) < 0)
 			return -1;
 	}
 	return 0;
@@ -154,6 +160,7 @@
 	unsigned int i, count;
 	const char *path;
 	bool is_file;
+	struct quota_rule *rule;
 
 	t_array_init(&paths, 8);
 	storages = array_get(&root->quota->storages, &count);
@@ -162,6 +169,11 @@
 		quota_count_path_add(&paths, path, FALSE);
 
 		/* INBOX may be in different path. */
+		/* ...but still ignored */
+		rule = quota_root_rule_find(root, "INBOX");
+		if (rule != NULL && rule->ignore) 
+			continue;
+		
 		path = mail_storage_get_mailbox_path(storages[i], "INBOX",
 						     &is_file);
 		quota_count_path_add(&paths, path, is_file);
@@ -171,7 +183,7 @@
 	*value_r = 0;
 	count_paths = array_get(&paths, &count);
 	for (i = 0; i < count; i++) {
-		if (get_usage(count_paths[i].path, count_paths[i].is_file,
+		if (get_usage(root, count_paths[i].path, count_paths[i].is_file,
 			      value_r) < 0)
 			return -1;
 	}

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to