5.6.2 sigsetjmp/siglongjmp错误处理架构

来源:互联网 发布:ubuntu重启搜狗输入法 编辑:程序博客网 时间:2024/06/07 01:15

smtp_proto采用了sigsetjmp和siglongjmp来进行异常处理。当在协议解析过程中遇到异常时,可以通过siglongjmp跳到错误处理代码:

/smtpd/smtpd.c4754    while ((status = vstream_setjmp(state->client)) == SMTP_ERR_NONE)4755          /* void */ ;4756    switch (status) {47574758    default:4759        msg_panic("smtpd_proto: unknown error reading from %s",4760                   state->namaddr);4761        break;47624763    case SMTP_ERR_TIME:4764        state->reason = REASON_TIMEOUT;4765        if (vstream_setjmp(state->client) == 0)4766             smtpd_chat_reply(state, "4214.4.2 %s Error: timeout exceeded",4767                              var_myhostname);4768        break;47694770    case SMTP_ERR_EOF:4771        state->reason = REASON_LOST_CONNECTION;4772        break;47734774    case SMTP_ERR_QUIET:4775        break;47764777    case SMTP_ERR_DATA:4778        msg_info("%s: reject: %s from %s: "4779                  "421 4.3.0 %s Serverlocal data error",4780                  (state->queue_id ?state->queue_id : "NOQUEUE"),4781                  state->where,state->namaddr, var_myhostname);4782        state->error_mask |= MAIL_ERROR_DATA;4783        if (vstream_setjmp(state->client) == 0)4784             smtpd_chat_reply(state, "4214.3.0 %s Server local data error",4785                              var_myhostname);4786        break;47874788    case 0:


出错情况分为以下五种

/*

  *External interface. The following codes are meant for use in longjmp(),

  *so they must all be non-zero.

  */

#define SMTP_ERR_EOF 1                /* unexpectedclient disconnect */

客户端连接断开。

#define SMTP_ERR_TIME        2                /*time out */

超时。

#define SMTP_ERR_QUIET      3                /*silent cleanup (application) */

对此错误不做处理。

#define SMTP_ERR_NONE       4                /*non-error case */

无错误。

#define SMTP_ERR_DATA        5                /*application data error */

数据处理错误。

 

         一般情况下我们记录错误原因,给出告警信息并继续。发生未知错误则退出程序。

 

以下是用到错误处理的例子:

SMTP_ERR_TIME和SMTP_ERR_EOF错误

/smtpd/smtpd_chat.c212     /*213      * Abort immediately if the connection isbroken.214      */215     if (vstream_ftimeout(state->client))216         vstream_longjmp(state->client,SMTP_ERR_TIME);217     if (vstream_ferror(state->client))218         vstream_longjmp(state->client,SMTP_ERR_EOF);

SMTP_ERR_DATA错误

/smtpd/smtpd.c1761     if (ehlo_discard_maps &&ehlo_discard_maps->error) {1762         msg_warn("don't know what EHLOfeatures to announce to %s",1763                  state->namaddr);1764         vstream_longjmp(state->client,SMTP_ERR_DATA);1765     }


0 0