Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_full_name 函数

发布于:2025-02-20 ⋅ 阅读:(27) ⋅ 点赞:(0)

ngx_get_full_name

声明在 src/core/ngx_file.h

ngx_int_t ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix,
    ngx_str_t *name);

定义在 src\core\ngx_file.c

ngx_int_t
ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix, ngx_str_t *name)
{
    size_t      len;
    u_char     *p, *n;
    ngx_int_t   rc;

    rc = ngx_test_full_name(name);

    if (rc == NGX_OK) {
        return rc;
    }

    len = prefix->len;

#if (NGX_WIN32)

    if (rc == 2) {
        len = rc;
    }

#endif

    n = ngx_pnalloc(pool, len + name->len + 1);
    if (n == NULL) {
        return NGX_ERROR;
    }

    p = ngx_cpymem(n, prefix->data, len);
    ngx_cpystrn(p, name->data, name->len + 1);

    name->len += len;
    name->data = n;

    return NGX_OK;
}

ngx_get_full_name 是一个用于处理文件路径拼接的函数。它通过将前缀路径(prefix)和目标路径(name)组合成完整的路径名,确保路径的正确性和完整性 

ngx_int_t ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix, ngx_str_t *name)

 函数签名与参数说明

  • 返回值 ngx_int_t 类型,表示操作结果。
    • NGX_OK:成功。
    • NGX_ERROR:失败。
  • 参数
    • pool:内存池指针,用于分配动态内存。
    • prefix:前缀路径(如配置文件目录路径)。
    • name:目标路径(可能是相对路径或绝对路径)。
size_t      len;
u_char     *p, *n;
ngx_int_t   rc;

 变量声明

  • len:存储路径长度的变量。
  • pn:指向内存的指针,用于路径拼接。
  • rc:存储函数调用的返回值。

这些变量为后续路径拼接和内存分配提供了基础支持。

rc = ngx_test_full_name(name);
if (rc == NGX_OK) {
    return rc;
}

 检查是否已经是完整路径

  • 调用 ngx_test_full_name 检查 name 是否已经是完整路径(如绝对路径)。
    • 如果是完整路径,直接返回 NGX_OK,无需进一步处理。
  • 避免对已经完整的路径进行重复处理,提升效率。

ngx_test_full_name

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_test_full_name-CSDN博客

计算前缀路径长度
len = prefix->len;

 前缀路径的长度存储到 len

Windows 平台特殊处理
#if (NGX_WIN32)
if (rc == 2) {
    len = rc;
}
#endif

 

  • 在 Windows 平台上,如果 ngx_test_full_name 返回值为 2,表示路径以驱动器号开头(如 C:)。
    • 此时,将 len 设置为 2,以便只保留驱动器号部分。

分配内存 
n = ngx_pnalloc(pool, len + name->len + 1);
if (n == NULL) {
    return NGX_ERROR;
}
  • 使用 ngx_pnalloc 从内存池中分配一块内存,大小为 len + name->len + 1
    • len:前缀路径长度。
    • name->len:目标路径长度。
    • +1:为字符串末尾的 \0 留出空间。
  • 如果内存分配失败,返回 NGX_ERROR
  • 意图 :确保有足够的内存来存储完整的路径名。
拼接前缀路径 
p = ngx_cpymem(n, prefix->data, len);
  • 使用 ngx_cpymem 将前缀路径数据复制到新分配的内存中。
    • n:目标地址。
    • prefix->data:前缀路径数据。
    • len:前缀路径长度。
  • 返回值 p 指向已复制数据的末尾位置。
  • 意图 :将前缀路径写入新分配的内存。
拼接目标路径 
ngx_cpystrn(p, name->data, name->len + 1);
  • 使用 ngx_cpystrn 将目标路径数据复制到前缀路径之后。
    • p:目标地址(前缀路径末尾)。
    • name->data:目标路径数据。
    • name->len + 1:目标路径长度(包括末尾的 \0)。
  • 意图 :完成路径拼接,并确保字符串以 \0 结尾。

更新目标路径信息

name->len += len;
name->data = n;
  • 更新 name 的长度和数据指针:
    • name->len 增加前缀路径的长度。
    • name->data 指向新分配的完整路径。
  • 意图 :使调用者可以直接使用更新后的 name

返回成功状态

return NGX_OK;
  • 返回 NGX_OK,表示路径拼接成功。
  • 意图 :通知调用者操作已成功完成。

网站公告

今日签到

点亮在社区的每一天
去签到