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
- 5.6.2 sigsetjmp/siglongjmp错误处理架构
- sigsetjmp & siglongjmp
- sigsetjmp, siglongjmp
- siglongjmp、sigsetjmp
- 信号处理函数的返回sigsetjmp/siglongjmp
- sigsetjmp,siglongjmp的使用
- sigsetjmp,siglongjmp的使用
- alarm,sigsetjmp,siglongjmp
- sigsetjmp,siglongjmp的使用
- alarm,sigsetjmp,siglongjmp 注意事项
- sigsetjmp, siglongjmp函数说明
- siglongjmp 和 sigsetjmp 用法
- 关于sigsetjmp和siglongjmp
- sigsetjmp和siglongjmp详解
- Sigsetjmp 和 Siglongjmp
- sigsetjmp,siglongjmp的使用
- 用sigsetjmp和siglongjmp 解决从信号处理程序返回后信号仍被屏蔽问题
- Linux Signal (8): sigsetjmp和siglongjmp
- java连接Neo4j服务器
- maven环境介绍及环境搭建
- FZU 2026代码问题
- PHP开发APP接口
- 将Drawable转为Bitmap
- 5.6.2 sigsetjmp/siglongjmp错误处理架构
- MYSQL报错 error: Got a packet bigger than ‘max_allowed_packet’ bytes
- web项目部署时的标准目录结构
- SDWebImage的缓存怎么不要
- Intellij IDEA 的 Test Restful Web Service 使用教程
- python开发笔记
- JS禁止网页被复制以及禁止鼠标右击代码
- Unity3d 读写文本
- springmvc hadoop nginx ffmpeg 在线转码实现点播服务demo