Ubuntu 下 nginx-1.24.0 源码分析 - ngx_log_errno 函数
·
声明
在ngx_log.h:
u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err);
实现
在 ngx_log.c
u_char * ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err) { if (buf > last - 50) { /* leave a space for an error code */ buf = last - 50; *buf++ = '.'; *buf++ = '.'; *buf++ = '.'; } #if (NGX_WIN32) buf = ngx_slprintf(buf, last, ((unsigned) err < 0x80000000) ? " (%d: " : " (%Xd: ", err); #else buf = ngx_slprintf(buf, last, " (%d: ", err); #endif buf = ngx_strerror(err, buf, last - buf); if (buf < last) { *buf++ = ')'; } return buf; }它的作用是将错误码转换为可读的错误信息,并将其格式化到一个缓冲区中。
参数:
u_char *buf:这是一个指向缓冲区的指针,用来存放格式化后的错误信息。缓冲区内存需预先分配,写入时会逐步移动指针(通过
buf++操作),直到达到last的限制
u_char *last:这是缓冲区的末尾指针,用来限制buf的最大边界,防止缓冲区溢出。ngx_err_t err:这是一个错误码,表示具体的错误类型,函数会将其转换为可读的字符串描述返回值:
返回值是
u_char *,即更新后的buf指针,指向缓冲区中下一个可写入的位置,方便链式调用
ngx_err_t 类型是什么呢?
它的定义在 ngx_errno.h 中有
typedef int ngx_err_t;其本质是 int 类型
函数的实现逻辑:
检查缓冲区是否足够:
if (buf > last - 50) { buf = last - 50; *buf++ = '.'; *buf++ = '.'; *buf++ = '.'; }
如果
buf距离last的距离小于 50 个字节,说明缓冲区空间不足,为了给错误码留出空间,调整buf至last - 50处,并在buf中写入...来表示缓冲区不足,通过...提示用户此处有截断
格式化错误码:
在 Windows 系统下(
NGX_WIN32宏定义),会根据错误码的值选择不同的格式化方式:
如果错误码小于
0x80000000,系统错误码使用十进制格式化(%d)。否则,使用十六进制格式化(
%Xd)。在非 Windows 系统下,直接使用十进制格式化。
#if (NGX_WIN32) buf = ngx_slprintf(buf, last, ((unsigned) err < 0x80000000) ? " (%d: " : " (%Xd: ", err); #else buf = ngx_slprintf(buf, last, " (%d: ", err); #endif调用
ngx_slprintf实现格式化,该函数负责安全写入并返回新的缓冲区位置
ngx_slprintf
获取错误信息并格式化
buf = ngx_strerror(err, buf, last - buf);调用
ngx_strerror(err, buf, last - buf),将错误码转换为字符串,结果直接写入缓冲区,并返回更新后的buf
ngx_strerror
检查是否还有空间并添加结束括号
if (buf < last) { *buf++ = ')'; }如果
buf指针还在last之前,说明还有空间,会在buf中写入一个右括号)
返回更新后的
buf指针:return buf;最后返回更新后的
buf指针,指向缓冲区中下一个可写入的位置
更多推荐
所有评论(0)