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
:存储路径长度的变量。p
和n
:指向内存的指针,用于路径拼接。rc
:存储函数调用的返回值。这些变量为后续路径拼接和内存分配提供了基础支持。
rc = ngx_test_full_name(name); if (rc == NGX_OK) { return rc; }
检查是否已经是完整路径
- 调用
ngx_test_full_name
检查name
是否已经是完整路径(如绝对路径)。
- 如果是完整路径,直接返回
NGX_OK
,无需进一步处理。- 避免对已经完整的路径进行重复处理,提升效率。
ngx_test_full_name
计算前缀路径长度
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
,表示路径拼接成功。- 意图 :通知调用者操作已成功完成。