Mercurial > dovecot > core-2.2
diff src/doveadm/dsync/dsync-brain.c @ 18371:b900b50085fc
dsync: Use storage's mail_error to choose the doveadm exit code.
Instead of always assuming that all errors are EX_TEMPFAIL.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 19 Mar 2015 00:41:19 +0200 |
parents | b4dbe64c0032 |
children | 3fc9658c9712 |
line wrap: on
line diff
--- a/src/doveadm/dsync/dsync-brain.c Thu Mar 19 00:38:01 2015 +0200 +++ b/src/doveadm/dsync/dsync-brain.c Thu Mar 19 00:41:19 2015 +0200 @@ -288,7 +288,7 @@ } } -int dsync_brain_deinit(struct dsync_brain **_brain) +int dsync_brain_deinit(struct dsync_brain **_brain, enum mail_error *error_r) { struct dsync_brain *brain = *_brain; int ret; @@ -338,6 +338,9 @@ ret = brain->failed ? -1 : 0; mail_user_unref(&brain->user); + + *error_r = !brain->failed ? 0 : + (brain->mail_error == 0 ? MAIL_ERROR_TEMP : brain->mail_error); pool_unref(&brain->pool); return ret; } @@ -558,18 +561,25 @@ static bool dsync_brain_finish(struct dsync_brain *brain) { const char *error; + enum mail_error mail_error; + enum dsync_ibc_recv_ret ret; if (!brain->master_brain) { dsync_ibc_send_finish(brain->ibc, - brain->failed ? "dsync failed" : NULL); + brain->failed ? "dsync failed" : NULL, + brain->mail_error); brain->state = DSYNC_STATE_DONE; return TRUE; } - if (dsync_ibc_recv_finish(brain->ibc, &error) == DSYNC_IBC_RECV_RET_TRYAGAIN) + ret = dsync_ibc_recv_finish(brain->ibc, &error, &mail_error); + if (ret == DSYNC_IBC_RECV_RET_TRYAGAIN) return FALSE; if (error != NULL) { i_error("Remote dsync failed: %s", error); brain->failed = TRUE; + if (mail_error != 0 && + (brain->mail_error == 0 || brain->mail_error == MAIL_ERROR_TEMP)) + brain->mail_error = mail_error; } brain->state = DSYNC_STATE_DONE; return TRUE;