声明

在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

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_slprintf函数-CSDN博客

获取错误信息并格式化

buf = ngx_strerror(err, buf, last - buf);

调用 ngx_strerror(err, buf, last - buf),将错误码转换为字符串,结果直接写入缓冲区,并返回更新后的 buf

ngx_strerror

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_strerror 函数-CSDN博客

检查是否还有空间并添加结束括号

if (buf < last) {
    *buf++ = ')';
}

如果 buf 指针还在 last 之前,说明还有空间,会在 buf 中写入一个右括号 )

返回更新后的 buf 指针

return buf;

最后返回更新后的 buf 指针,指向缓冲区中下一个可写入的位置

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐