changeset 22459:d802f801c8f9

lib-index: Add mail_index_use_existing_permissions() This has annoyingly lot of copy&pasting from mailbox_list_get_permissions_stat(), but there didn't seem to be any nice place where to share the code.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 24 Jul 2017 21:07:44 +0300
parents 83f93173dadb
children 18726a70209b
files src/lib-index/mail-index.c src/lib-index/mail-index.h
diffstat 2 files changed, 32 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index.c	Mon Jul 24 20:48:25 2017 +0300
+++ b/src/lib-index/mail-index.c	Mon Jul 24 21:07:44 2017 +0300
@@ -104,6 +104,34 @@
 	index->fsync_mask = mask;
 }
 
+bool mail_index_use_existing_permissions(struct mail_index *index)
+{
+	struct stat st;
+
+	if (stat(index->dir, &st) < 0)
+		return FALSE;
+
+	index->mode = st.st_mode & 0666;
+	if (S_ISDIR(st.st_mode) && (st.st_mode & S_ISGID) != 0) {
+		/* directory's GID is used automatically for new files */
+		index->gid = (gid_t)-1;
+	} else if ((st.st_mode & 0070) >> 3 == (st.st_mode & 0007)) {
+		/* group has same permissions as world, so don't bother
+		   changing it */
+		index->gid = (gid_t)-1;
+	} else if (getegid() == st.st_gid) {
+		/* using our own gid, no need to change it */
+		index->gid = (gid_t)-1;
+	} else {
+		index->gid = st.st_gid;
+	}
+
+	i_free(index->gid_origin);
+	if (index->gid != (gid_t)-1)
+		index->gid_origin = i_strdup("preserved existing GID");
+	return TRUE;
+}
+
 void mail_index_set_permissions(struct mail_index *index,
 				mode_t mode, gid_t gid, const char *gid_origin)
 {
--- a/src/lib-index/mail-index.h	Mon Jul 24 20:48:25 2017 +0300
+++ b/src/lib-index/mail-index.h	Mon Jul 24 21:07:44 2017 +0300
@@ -251,6 +251,10 @@
    can be used to specify which transaction types to fsync. */
 void mail_index_set_fsync_mode(struct mail_index *index, enum fsync_mode mode,
 			       enum mail_index_fsync_mask mask);
+/* Try to set the index's permissions based on its index directory. Returns
+   TRUE if successful (directory existed), FALSE if mail_index_set_permissions()
+   should be called. */
+bool mail_index_use_existing_permissions(struct mail_index *index);
 void mail_index_set_permissions(struct mail_index *index,
 				mode_t mode, gid_t gid, const char *gid_origin);
 /* Set locking method and maximum time to wait for a lock