详解(9)
获取并存储主机名
if (gethostname(hostname, NGX_MAXHOSTNAMELEN) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "gethostname() failed");ngx_destroy_pool(pool);return NULL;}/* on Linux gethostname() silently truncates name that does not fit */hostname[NGX_MAXHOSTNAMELEN - 1] = '\0';cycle->hostname.len = ngx_strlen(hostname);cycle->hostname.data = ngx_pnalloc(pool, cycle->hostname.len);if (cycle->hostname.data == NULL) {ngx_destroy_pool(pool);return NULL;}ngx_strlow(cycle->hostname.data, (u_char *) hostname, cycle->hostname.len);
1 获取主机名
if (gethostname(hostname, NGX_MAXHOSTNAMELEN) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "gethostname() failed");ngx_destroy_pool(pool);return NULL;
}
调用 gethostname()
系统调用获取本地主机名,存储到 hostname
缓冲区。
缓冲区大小为 NGX_MAXHOSTNAMELEN
若调用失败(返回 -1
),记录致命错误(NGX_LOG_EMERG
),销毁内存池并终止初始化。
2 强制截断主机名
hostname[NGX_MAXHOSTNAMELEN - 1] = '\0';
确保 hostname
以 \0
结尾,避免未终止字符串导致的安全风险。
Linux 的 gethostname()
在缓冲区不足时静默截断,但不会添加 \0
。
手动设置最后一个字节为 \0
,确保字符串合法性。
3 记录主机名长度
cycle->hostname.len = ngx_strlen(hostname);
计算主机名的实际长度(不含终止符),存储到 cycle->hostname.len
。
4 分配内存存储主机名
cycle->hostname.data = ngx_pnalloc(pool, cycle->hostname.len);
if (cycle->hostname.data == NULL) {ngx_destroy_pool(pool);return NULL;
}
从内存池 pool
分配内存,存储主机名的副本
ngx_pnalloc
分配指定长度的内存
若分配失败,销毁内存池并终止初始化。
5 转换主机名为小写
ngx_strlow(cycle->hostname.data, (u_char *) hostname, cycle->hostname.len);
将主机名转换为全小写,存储到 cycle->hostname.data
。
ngx_strlow
是 Nginx 的封装函数,逐字符转换为小写。
主机名在 DNS 和 HTTP 协议中通常不区分大小写,统一格式避免配置或路由问题。
统一小写格式,简化后续比较和匹配逻辑(如虚拟主机配置)。