mailbox-list.h revision 48ce03445eaea184426156440116ca1da978bb54
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#ifndef MAILBOX_LIST_H
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#define MAILBOX_LIST_H
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "mail-error.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#ifdef PATH_MAX
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen# define MAILBOX_LIST_NAME_MAX_LENGTH PATH_MAX
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#else
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen# define MAILBOX_LIST_NAME_MAX_LENGTH 4096
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#endif
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mail_namespace;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mail_storage;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mailbox_list;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenenum mailbox_list_properties {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* maildir_name must always be empty */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PROP_NO_MAILDIR_NAME = 0x01,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* alt directories not supported */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PROP_NO_ALT_DIR = 0x02,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* no support for \noselect directories, only mailboxes */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PROP_NO_NOSELECT = 0x04,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* mail root directory isn't required */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PROP_NO_ROOT = 0x08,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Automatically create mailbox directories when needed */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PROP_AUTOCREATE_DIRS = 0x10
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenenum mailbox_list_flags {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Mailboxes are files, not directories. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_FLAG_MAILBOX_FILES = 0x01,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Namespace already has a mailbox list, don't assign this
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mailbox list to it. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_FLAG_SECONDARY = 0x02
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenenum mailbox_info_flags {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_NOSELECT = 0x001,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_NONEXISTENT = 0x002,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_CHILDREN = 0x004,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_NOCHILDREN = 0x008,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_NOINFERIORS = 0x010,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_MARKED = 0x020,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_UNMARKED = 0x040,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_SUBSCRIBED = 0x080,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_CHILD_SUBSCRIBED = 0x100,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_CHILD_SPECIALUSE = 0x200,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Internally used by lib-storage */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_SELECT = 0x20000000,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_MATCHED = 0x40000000
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenenum mailbox_list_path_type {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Return directory's path (eg. ~/dbox/INBOX) */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PATH_TYPE_DIR,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PATH_TYPE_ALT_DIR,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Return mailbox path (eg. ~/dbox/INBOX/dbox-Mails) */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PATH_TYPE_MAILBOX,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Return control directory */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PATH_TYPE_CONTROL,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Return index directory ("" for in-memory) */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PATH_TYPE_INDEX,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Return the private index directory (NULL if none) */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenenum mailbox_list_file_type {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_FILE_TYPE_UNKNOWN = 0,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_FILE_TYPE_FILE,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_FILE_TYPE_DIR,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_FILE_TYPE_SYMLINK,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen MAILBOX_LIST_FILE_TYPE_OTHER
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mailbox_list_settings {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *layout; /* FIXME: shouldn't be here */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *root_dir;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *index_dir;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *index_pvt_dir;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *control_dir;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *alt_dir; /* FIXME: dbox-specific.. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *inbox_path;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *subscription_fname;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* If non-empty, it means that mails exist in a maildir_name
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen subdirectory. eg. if you have a directory containing directories:
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail/
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail/foo/
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail/foo/Maildir
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen If mailbox_name is empty, you have mailboxes "mail", "mail/foo" and
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen "mail/foo/Maildir".
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen If mailbox_name is "Maildir", you have a non-selectable mailbox
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen "mail" and a selectable mailbox "mail/foo". */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *maildir_name;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* if set, store mailboxes under root_dir/mailbox_dir_name/.
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen this setting contains either "" or "dir/". */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *mailbox_dir_name;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Encode "bad" characters in mailbox names as <escape_char><hex> */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen char escape_char;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* Use UTF-8 mailbox names on filesystem instead of mUTF-7 */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen bool utf8;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mailbox_permissions {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* The actual uid/gid of the mailbox */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen uid_t file_uid;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen gid_t file_gid;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* mode and GID to use for newly created files/dirs.
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (gid_t)-1 is used if the default GID can be used. */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mode_t file_create_mode, dir_create_mode;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen gid_t file_create_gid;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* origin (e.g. path) where the file_create_gid was got from */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *file_create_gid_origin;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen bool mail_index_permissions_set;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen};
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
/* register all drivers */
void mailbox_list_register_all(void);
void mailbox_list_register(const struct mailbox_list *list);
void mailbox_list_unregister(const struct mailbox_list *list);
const struct mailbox_list *
mailbox_list_find_class(const char *driver);
/* Returns 0 if ok, -1 if driver was unknown. */
int mailbox_list_create(const char *driver, struct mail_namespace *ns,
const struct mailbox_list_settings *set,
enum mailbox_list_flags flags,
struct mailbox_list **list_r, const char **error_r);
void mailbox_list_destroy(struct mailbox_list **list);
const char *
mailbox_list_get_driver_name(const struct mailbox_list *list) ATTR_PURE;
enum mailbox_list_flags
mailbox_list_get_flags(const struct mailbox_list *list) ATTR_PURE;
struct mail_namespace *
mailbox_list_get_namespace(const struct mailbox_list *list) ATTR_PURE;
struct mail_user *
mailbox_list_get_user(const struct mailbox_list *list) ATTR_PURE;
int mailbox_list_get_storage(struct mailbox_list **list, const char *vname,
struct mail_storage **storage_r);
void mailbox_list_get_closest_storage(struct mailbox_list *list,
struct mail_storage **storage);
char mailbox_list_get_hierarchy_sep(struct mailbox_list *list);
/* Returns the mode and GID that should be used when creating new files and
directories to the specified mailbox. (gid_t)-1 is returned if it's not
necessary to change the default gid. */
void mailbox_list_get_permissions(struct mailbox_list *list, const char *name,
struct mailbox_permissions *permissions_r);
/* Like mailbox_list_get_permissions(), but for creating files/dirs to the
mail root directory (or even the root dir itself). */
void mailbox_list_get_root_permissions(struct mailbox_list *list,
mode_t *file_mode_r, mode_t *dir_mode_r,
gid_t *gid_r, const char **gid_origin_r);
/* Create path's directory with proper permissions. Returns 1 if created,
0 if it already existed, -1 if error. */
int mailbox_list_mkdir(struct mailbox_list *list,
const char *mailbox, const char *path) ATTR_NULL(2);
/* Like mailbox_list_mkdir(), but create path's parent parent directory.
Since most directories are created lazily, this function can be used to
easily create them whenever file creation fails with ENOENT. */
int mailbox_list_mkdir_parent(struct mailbox_list *list,
const char *mailbox, const char *path)
ATTR_NULL(2);
/* mkdir() a root directory of given type with proper permissions. */
int mailbox_list_mkdir_root(struct mailbox_list *list, const char *path,
enum mailbox_list_path_type type,
const char **error_r);
/* Returns TRUE if name is ok, FALSE if it can't be safely passed to
mailbox_list_*() functions */
bool mailbox_list_is_valid_name(struct mailbox_list *list,
const char *name, const char **error_r);
const char *mailbox_list_get_storage_name(struct mailbox_list *list,
const char *vname);
const char *mailbox_list_get_vname(struct mailbox_list *list, const char *name);
/* Return full path for the given mailbox name. The name must be a valid
existing mailbox name. For INDEX=MEMORY it returns "" as the path. */
const char *mailbox_list_get_path(struct mailbox_list *list, const char *name,
enum mailbox_list_path_type type);
/* Returns root directory path for given type. */
const char *mailbox_list_get_root_path(struct mailbox_list *list,
enum mailbox_list_path_type type);
/* Returns mailbox's change log, or NULL if it doesn't have one. */
struct mailbox_log *mailbox_list_get_changelog(struct mailbox_list *list);
/* Specify timestamp to use when writing mailbox changes to changelog.
The same timestamp is used until stamp is set to (time_t)-1, after which
current time is used */
void mailbox_list_set_changelog_timestamp(struct mailbox_list *list,
time_t stamp);
/* Returns a prefix that temporary files should use without conflicting
with the namespace. */
const char *mailbox_list_get_temp_prefix(struct mailbox_list *list);
/* Returns prefix that's common to all get_temp_prefix() calls.
Typically this returns either "temp." or ".temp.". */
const char *mailbox_list_get_global_temp_prefix(struct mailbox_list *list);
/* Subscribe/unsubscribe mailbox. There should be no error when
subscribing to already subscribed mailbox. Subscribing to
unexisting mailboxes is optional. */
int mailbox_list_set_subscribed(struct mailbox_list *list,
const char *name, bool set);
/* Delete a non-selectable mailbox. Fail if the mailbox is selectable. */
int mailbox_list_delete_dir(struct mailbox_list *list, const char *name);
/* Delete a symlinked mailbox. Fail if the mailbox isn't a symlink. */
int mailbox_list_delete_symlink(struct mailbox_list *list, const char *name);
/* Returns the error message of last occurred error. */
const char * ATTR_NOWARN_UNUSED_RESULT
mailbox_list_get_last_error(struct mailbox_list *list,
enum mail_error *error_r);
#endif