2013年10月26日土曜日

nginx plus::statusモジュールを作る#3

create main configuration

モジュール内のメインの設定用の構造体を生成する。


ngx_http_json_status_module.h


struct  ngx_http_json_status_main_conf_s {
  char            hostname[NGX_MAXHOSTNAMELEN];
  u_char          addr[16]; /* xxx.xxx.xxx.xxx\0 */
};
...
static void *ngx_http_json_status_create_main_conf(ngx_conf_t *cf);
static void *ngx_http_json_status_init_main_conf(ngx_conf_t *cf);

ngx_http_json_status_module.c


  • ngx_http_json_status_module_ctxのcreate_main_confに構造体を生成する関数を指定
  • ngx_http_json_status_create_main_confでhostnameとip addressを取得してセットする
  • 今回はinit_main_conf使用しないけど一応用意しておいた

static ngx_http_module_t ngx_http_json_status_module_ctx = {
NULL,                              /* preconfiguration */
NULL,                              /* postconfiguration */

ngx_http_json_status_create_main_conf, /* create main configuration */
ngx_http_json_status_init_main_conf,   /* init main configuration */

NULL,                              /* create server configuration */
NULL,                              /* merge server configuration */

NULL,                              /* create location configuration */
NULL                               /* merge location configuration */
};
...
static void *
ngx_http_json_status_create_main_conf(ngx_conf_t *cf)
{
  ngx_http_json_status_main_conf_t *jsmcf;
  struct hostent *host;
  
  jsmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_json_status_main_conf_t));
  if (jsmcf == NULL) {
    return NULL;
  }

  if (gethostname(jsmcf->hostname, NGX_MAXHOSTNAMELEN) == -1) {
    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "gethostname() failed");
    return NULL;
  }
  host = gethostbyname(jsmcf->hostname);
  if (host == NULL) {
    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "gethostbyname() failed");
    return NULL;
  }
  ngx_sprintf(jsmcf->addr, "%d.%d.%d.%d",
        (BYTE)*(host->h_addr),
        (BYTE)*(host->h_addr + 1),
        (BYTE)*(host->h_addr + 2),
        (BYTE)*(host->h_addr + 3));

  ngx_conf_log_error(NGX_LOG_DEBUG, cf, 0, "hostname:%s, address:%s", &jsmcf->hostname, jsmcf->addr);

  return jsmcf;
}

static char *
ngx_http_json_status_init_main_conf(ngx_conf_t *cf, void *conf)
{
  return NGX_CONF_OK;
}
#4に続く 

0 件のコメント:

コメントを投稿