diff options
Diffstat (limited to 'src/lib-storage/mail-error.h')
-rw-r--r-- | src/lib-storage/mail-error.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/lib-storage/mail-error.h b/src/lib-storage/mail-error.h new file mode 100644 index 0000000..9a0b08d --- /dev/null +++ b/src/lib-storage/mail-error.h @@ -0,0 +1,70 @@ +#ifndef MAIL_ERROR_H +#define MAIL_ERROR_H + +/* Some error strings that should be used everywhere to avoid + permissions checks from revealing mailbox's existence */ +#define MAIL_ERRSTR_MAILBOX_NOT_FOUND "Mailbox doesn't exist: %s" +#define MAIL_ERRSTR_NO_PERMISSION "Permission denied" + +/* And just for making error strings consistent: */ +#define MAIL_ERRSTR_NO_QUOTA "Not enough disk quota" +#define MAIL_ERRSTR_LOCK_TIMEOUT "Timeout while waiting for lock" + +/* Message to show to users when critical error occurs */ +#define MAIL_ERRSTR_CRITICAL_MSG \ + "Internal error occurred. Refer to server log for more information." +#define MAIL_ERRSTR_CRITICAL_MSG_STAMP \ + MAIL_ERRSTR_CRITICAL_MSG " [%Y-%m-%d %H:%M:%S]" + +#define T_MAIL_ERR_MAILBOX_NOT_FOUND(name) \ + t_strdup_printf(MAIL_ERRSTR_MAILBOX_NOT_FOUND, name) + +enum mail_error { + MAIL_ERROR_NONE = 0, + + /* Temporary internal error */ + MAIL_ERROR_TEMP, + /* Temporary failure because a subsystem is down */ + MAIL_ERROR_UNAVAILABLE, + /* It's not possible to do the wanted operation */ + MAIL_ERROR_NOTPOSSIBLE, + /* Invalid parameters (eg. mailbox name not valid) */ + MAIL_ERROR_PARAMS, + /* No permission to do the request */ + MAIL_ERROR_PERM, + /* Out of disk quota for user */ + MAIL_ERROR_NOQUOTA, + /* Item (e.g. mailbox) doesn't exist or it's not visible to us */ + MAIL_ERROR_NOTFOUND, + /* Item (e.g. mailbox) already exists */ + MAIL_ERROR_EXISTS, + /* Tried to access an expunged message */ + MAIL_ERROR_EXPUNGED, + /* Operation cannot be done because another session prevents it + (e.g. lock timeout) */ + MAIL_ERROR_INUSE, + /* Can't do the requested data conversion (e.g. IMAP BINARY's + UNKNOWN-CTE code) */ + MAIL_ERROR_CONVERSION, + /* Can't do the requested data conversion because the original data + isn't valid. */ + MAIL_ERROR_INVALIDDATA, + /* Operation ran against some kind of a limit. */ + MAIL_ERROR_LIMIT, + /* Operation couldn't be finished as efficiently as required by + mail.lookup_abort. */ + MAIL_ERROR_LOOKUP_ABORTED, +}; + +/* Convert errno to mail_error and an error string. Returns TRUE if successful, + FALSE if we couldn't handle the errno. */ +bool mail_error_from_errno(enum mail_error *error_r, + const char **error_string_r); + +/* Build a helpful error message for a failed EACCES syscall. */ +const char *mail_error_eacces_msg(const char *func, const char *path); +/* Build a helpful error message for a failed EACCES syscall that tried to + write to directory (create, rename, etc). */ +const char *mail_error_create_eacces_msg(const char *func, const char *path); + +#endif |