sdbox-file.c revision 1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void sdbox_file_init_paths(struct sdbox_file *file, const char *fname)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen i_strdup_printf("%s/%s", file->mbox->ibox.box.path, fname);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen i_strdup_printf("%s/%s", file->mbox->alt_path, fname);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstruct dbox_file *sdbox_file_init(struct sdbox_mailbox *mbox, uint32_t uid)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen fname = t_strdup_printf(SDBOX_MAIL_FILE_FORMAT, uid);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen file_create_fd(&file->file, file->file.primary_path,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenint sdbox_file_assign_uid(struct sdbox_file *file, uint32_t uid)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen new_fname = t_strdup_printf(SDBOX_MAIL_FILE_FORMAT, uid);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen new_path = t_strdup_printf("%s/%s", file->mbox->ibox.box.path,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen mail_storage_set_critical(&file->file.storage->storage,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen "rename(%s, %s) failed: %m",
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenint sdbox_file_create_fd(struct dbox_file *file, const char *path, bool parents)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct sdbox_file *sfile = (struct sdbox_file *)file;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *p, *dir;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen old_mask = umask(0666 & ~box->file_create_mode);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (mkdir_parents_chgrp(dir, box->dir_create_mode,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* try again */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen old_mask = umask(0666 & ~box->file_create_mode);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen } else if (box->file_create_gid == (gid_t)-1) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* no group change */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen } else if (fchown(fd, (uid_t)-1, box->file_create_gid) < 0) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen "fchown(%s, -1, %ld) failed: %m",
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* continue anyway */