# HG changeset patch # User Timo Sirainen # Date 1500919664 -10800 # Node ID d802f801c8f90588fc85246d78d705899886546c # Parent 83f93173dadb8a6a5068ffe89a59ba69124da737 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. diff -r 83f93173dadb -r d802f801c8f9 src/lib-index/mail-index.c --- 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) { diff -r 83f93173dadb -r d802f801c8f9 src/lib-index/mail-index.h --- 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