当前位置: 首页 > article >正文

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(9)

详解(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 协议中通常不区分大小写,统一格式避免配置或路由问题。

统一小写格式,简化后续比较和匹配逻辑(如虚拟主机配置)。



http://www.kler.cn/a/568537.html

相关文章:

  • LeetCode 2353. 设计食物评分系统题解
  • Qt 的 Lambda 捕获局部变量导致 UI 更新异常的分析与解决
  • Solar2月应急响应公益月赛
  • 虚拟机中的指示命令
  • 使用SPI总线与外部传感器通信,使用ECU抽象
  • rust学习笔记9-结构体与206.反转链表
  • 知识图谱neo4j+vue+flask课程在线学习系统
  • 聊一聊 IM 如何优化缓存
  • WSBDF レクチア 定义2 引理3 wsbdf的乘子
  • cellphonedb v5受配体多组比较气泡图(原创函数)
  • Visual Studio Code集成MarsCode AI
  • DeepSeek on AWS:解锁高效AI训练与部署的云端密码
  • rust基础-宏与方法之间的区别
  • MongoDB Compass中MONGOSH常用查询整理
  • 洛谷P1004方格取数(两个题解)P1359租用游艇 P2285打鼹鼠 P1725琪露诺 P1886滑动窗口/单调序列
  • 【沙漠之心:揭秘尘封奇迹的终极之旅】
  • Redis通用命令
  • Java 容器之 List
  • 2024年时间序列预测领域的SOTA模型总结
  • 代数结构—笔记