void doveadm_mail_failed_error(struct doveadm_mail_cmd_context *ctx,
enum mail_error error)
{
- int exit_code = 0;
+ int exit_code = EX_TEMPFAIL;
switch (error) {
case MAIL_ERROR_NONE:
i_unreached();
case MAIL_ERROR_TEMP:
- exit_code = EX_TEMPFAIL;
break;
case MAIL_ERROR_NOTPOSSIBLE:
case MAIL_ERROR_EXISTS:
break;
case MAIL_ERROR_EXPUNGED:
case MAIL_ERROR_INUSE:
- exit_code = EX_TEMPFAIL;
+ break;
+ case MAIL_ERROR_LIMIT:
+ exit_code = DOVEADM_EX_NOTPOSSIBLE;
break;
}
/* tempfail overrides all other exit codes, otherwise use whatever
case MAIL_ERROR_CONVERSION:
case MAIL_ERROR_INVALIDDATA:
break;
+ case MAIL_ERROR_LIMIT:
+ resp_code = IMAP_RESP_CODE_LIMIT;
+ break;
}
if (resp_code == NULL || *error_string == '[')
return t_strconcat("NO ", error_string, NULL);
/* we're getting close to the 64k limit. fail early
to make it less likely that two processes increase
the refcount enough times to cross the limit */
- mail_storage_set_error(MAP_STORAGE(map), MAIL_ERROR_NOTPOSSIBLE,
+ mail_storage_set_error(MAP_STORAGE(map), MAIL_ERROR_LIMIT,
t_strdup_printf("Message has been copied too many times (%d + %d)",
old_diff, new_diff));
return -1;
{ IMAP_RESP_CODE_SERVERBUG, MAIL_ERROR_TEMP },
/* { IMAP_RESP_CODE_CLIENTBUG, 0 }, */
{ IMAP_RESP_CODE_CANNOT, MAIL_ERROR_NOTPOSSIBLE },
- { IMAP_RESP_CODE_LIMIT, MAIL_ERROR_NOTPOSSIBLE },
+ { IMAP_RESP_CODE_LIMIT, MAIL_ERROR_LIMIT },
{ IMAP_RESP_CODE_OVERQUOTA, MAIL_ERROR_NOQUOTA },
{ IMAP_RESP_CODE_ALREADYEXISTS, MAIL_ERROR_EXISTS },
{ IMAP_RESP_CODE_NONEXISTENT, MAIL_ERROR_NOTFOUND }
/* 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,
};
/* Convert errno to mail_error and an error string. Returns TRUE if successful,