changeset 9154:8206c38856ff HEAD

acl: If dovecot-acl-list writing fails, delete it so it gets rebuilt later.
author Timo Sirainen <tss@iki.fi>
date Mon, 22 Jun 2009 00:42:56 -0400
parents f2426d980426
children 1c91fa0d804b
files src/plugins/acl/acl-backend-vfile-acllist.c
diffstat 1 files changed, 23 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/acl/acl-backend-vfile-acllist.c	Mon Jun 22 00:29:13 2009 -0400
+++ b/src/plugins/acl/acl-backend-vfile-acllist.c	Mon Jun 22 00:42:56 2009 -0400
@@ -164,7 +164,8 @@
 	return ret < 0 ? -1 : 0;
 }
 
-int acl_backend_vfile_acllist_rebuild(struct acl_backend_vfile *backend)
+static int
+acl_backend_vfile_acllist_try_rebuild(struct acl_backend_vfile *backend)
 {
 	struct mailbox_list *list = backend->backend.list;
 	struct mail_namespace *ns;
@@ -224,6 +225,10 @@
 		}
 	}
 
+	if (output->stream_errno != 0) {
+		i_error("write(%s) failed: %m", str_c(path));
+		ret = -1;
+	}
 	if (mailbox_list_iter_deinit(&iter) < 0)
 		ret = -1;
 	o_stream_destroy(&output);
@@ -263,6 +268,23 @@
 	return ret;
 }
 
+int acl_backend_vfile_acllist_rebuild(struct acl_backend_vfile *backend)
+{
+	const char *rootdir, *acllist_path;
+
+	if (acl_backend_vfile_acllist_try_rebuild(backend) == 0)
+		return 0;
+	else {
+		/* delete it to make sure it gets rebuilt later */
+		rootdir = mailbox_list_get_path(backend->backend.list, NULL,
+						MAILBOX_LIST_PATH_TYPE_DIR);
+		acllist_path = t_strdup_printf("%s/"ACLLIST_FILENAME, rootdir);
+		if (unlink(acllist_path) < 0 && errno != ENOENT)
+			i_error("unlink(%s) failed: %m", acllist_path);
+		return -1;
+	}
+}
+
 static const struct acl_backend_vfile_acllist *
 acl_backend_vfile_acllist_find(struct acl_backend_vfile *backend,
 			       const char *name)