static char * ngx_tcp_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { char *rv; ngx_uint_t i, m, mi, s; ngx_conf_t pcf; ngx_array_t ports; ngx_tcp_listen_t *listen; ngx_tcp_module_t *module; ngx_tcp_conf_ctx_t *ctx; ngx_tcp_core_srv_conf_t **cscfp; ngx_tcp_core_main_conf_t *cmcf; /* the main tcp context */ ctx = ngx_pcalloc(cf->pool, sizeof(ngx_tcp_conf_ctx_t)); if (ctx == NULL) { return NGX_CONF_ERROR; } *(ngx_tcp_conf_ctx_t **) conf = ctx; /* count the number of the tcp modules and set up their indices */ ngx_tcp_max_module = 0; for (m = 0; ngx_modules[m]; m++) { if (ngx_modules[m]->type != NGX_TCP_MODULE) { continue; } ngx_modules[m]->ctx_index = ngx_tcp_max_module++; } /* the tcp main_conf context, it is the same in the all tcp contexts */ ctx->main_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_tcp_max_module); if (ctx->main_conf == NULL) { return NGX_CONF_ERROR; } /* * the tcp null srv_conf context, it is used to merge * the server{}s' srv_conf's */ ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_tcp_max_module); if (ctx->srv_conf == NULL) { return NGX_CONF_ERROR; } /* * create the main_conf's, and the null srv_conf's * of the all tcp modules */ for (m = 0; ngx_modules[m]; m++) { if (ngx_modules[m]->type != NGX_TCP_MODULE) { continue; } module = ngx_modules[m]->ctx; mi = ngx_modules[m]->ctx_index; if (module->create_main_conf) { ctx->main_conf[mi] = module->create_main_conf(cf); if (ctx->main_conf[mi] == NULL) { return NGX_CONF_ERROR; } } if (module->create_srv_conf) { ctx->srv_conf[mi] = module->create_srv_conf(cf); if (ctx->srv_conf[mi] == NULL) { return NGX_CONF_ERROR; } } } /* parse inside the tcp{} block */ pcf = *cf; cf->ctx = ctx; cf->module_type = NGX_TCP_MODULE; cf->cmd_type = NGX_TCP_MAIN_CONF; rv = ngx_conf_parse(cf, NULL); if (rv != NGX_CONF_OK) { *cf = pcf; return rv; } /* init tcp{} main_conf's, merge the server{}s' srv_conf's */ cmcf = ctx->main_conf[ngx_tcp_core_module.ctx_index]; cscfp = cmcf->servers.elts; for (m = 0; ngx_modules[m]; m++) { if (ngx_modules[m]->type != NGX_TCP_MODULE) { continue; } module = ngx_modules[m]->ctx; mi = ngx_modules[m]->ctx_index; /* init tcp{} main_conf's */ cf->ctx = ctx; if (module->init_main_conf) { rv = module->init_main_conf(cf, ctx->main_conf[mi]); if (rv != NGX_CONF_OK) { *cf = pcf; return rv; } } for (s = 0; s < cmcf->servers.nelts; s++) { /* merge the server{}s' srv_conf's */ cf->ctx = cscfp[s]->ctx; if (module->merge_srv_conf) { rv = module->merge_srv_conf(cf, ctx->srv_conf[mi], cscfp[s]->ctx->srv_conf[mi]); if (rv != NGX_CONF_OK) { *cf = pcf; return rv; } } } } for (m = 0; ngx_modules[m]; m++) { if (ngx_modules[m]->type != NGX_TCP_MODULE) { continue; } module = ngx_modules[m]->ctx; if (module->postconfiguration) { if (module->postconfiguration(cf) != NGX_OK) { return NGX_CONF_ERROR; } } } /* * tcp{}'s cf->ctx was needed while the configuration merging * and in postconfiguration process */ *cf = pcf; if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_tcp_conf_port_t)) != NGX_OK) { return NGX_CONF_ERROR; } listen = cmcf->listen.elts; for (i = 0; i < cmcf->listen.nelts; i++) { if (ngx_tcp_add_ports(cf, &ports, &listen[i]) != NGX_OK) { return NGX_CONF_ERROR; } if (ngx_tcp_add_virtual_servers(cf, cmcf, &listen[i]) != NGX_OK) { return NGX_CONF_ERROR; } } if (ngx_tcp_optimize_servers(cf, cmcf, &ports) != NGX_OK) { return NGX_CONF_ERROR; } return NGX_CONF_OK; }
static char * ngx_tcp_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { char *rv; ngx_uint_t i, m, mi, s; ngx_conf_t pcf; ngx_array_t ports; ngx_tcp_listen_t *listen; ngx_tcp_module_t *module; ngx_tcp_conf_ctx_t *ctx; ngx_tcp_core_srv_conf_t **cscfp; ngx_tcp_core_main_conf_t *cmcf; if (cmd->name.data[0] == 'i') { ngx_conf_log_error(NGX_LOG_WARN, cf, 0, "the \"imap\" directive is deprecated, " "use the \"tcp\" directive instead"); } /* the main tcp context */ ctx = ngx_pcalloc(cf->pool, sizeof(ngx_tcp_conf_ctx_t)); if (ctx == NULL) { return NGX_CONF_ERROR; } *(ngx_tcp_conf_ctx_t **) conf = ctx; /* count the number of the http modules and set up their indices */ ngx_tcp_max_module = 0; for (m = 0; ngx_modules[m]; m++) { if (ngx_modules[m]->type != NGX_TCP_MODULE) { continue; } ngx_modules[m]->ctx_index = ngx_tcp_max_module++; } /* the tcp main_conf context, it is the same in the all tcp contexts */ ctx->main_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_tcp_max_module); if (ctx->main_conf == NULL) { return NGX_CONF_ERROR; } /* * the tcp null srv_conf context, it is used to merge * the server{}s' srv_conf's */ ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_tcp_max_module); if (ctx->srv_conf == NULL) { return NGX_CONF_ERROR; } /* * create the main_conf's, the null srv_conf's, and the null loc_conf's * of the all tcp modules */ for (m = 0; ngx_modules[m]; m++) { if (ngx_modules[m]->type != NGX_TCP_MODULE) { continue; } module = ngx_modules[m]->ctx; mi = ngx_modules[m]->ctx_index; if (module->create_main_conf) { ctx->main_conf[mi] = module->create_main_conf(cf); if (ctx->main_conf[mi] == NULL) { return NGX_CONF_ERROR; } } if (module->create_srv_conf) { ctx->srv_conf[mi] = module->create_srv_conf(cf); if (ctx->srv_conf[mi] == NULL) { return NGX_CONF_ERROR; } } } /* parse inside the tcp{} block */ pcf = *cf; cf->ctx = ctx; cf->module_type = NGX_TCP_MODULE; cf->cmd_type = NGX_TCP_MAIN_CONF; rv = ngx_conf_parse(cf, NULL); if (rv != NGX_CONF_OK) { *cf = pcf; return rv; } /* init tcp{} main_conf's, merge the server{}s' srv_conf's */ cmcf = ctx->main_conf[ngx_tcp_core_module.ctx_index]; cscfp = cmcf->servers.elts; for (m = 0; ngx_modules[m]; m++) { if (ngx_modules[m]->type != NGX_TCP_MODULE) { continue; } module = ngx_modules[m]->ctx; mi = ngx_modules[m]->ctx_index; /* init tcp{} main_conf's */ cf->ctx = ctx; if (module->init_main_conf) { rv = module->init_main_conf(cf, ctx->main_conf[mi]); if (rv != NGX_CONF_OK) { *cf = pcf; return rv; } } for (s = 0; s < cmcf->servers.nelts; s++) { /* merge the server{}s' srv_conf's */ cf->ctx = cscfp[s]->ctx; if (module->merge_srv_conf) { rv = module->merge_srv_conf(cf, ctx->srv_conf[mi], cscfp[s]->ctx->srv_conf[mi]); if (rv != NGX_CONF_OK) { *cf = pcf; return rv; } } } } *cf = pcf; if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_tcp_conf_port_t)) != NGX_OK) { return NGX_CONF_ERROR; } listen = cmcf->listen.elts; for (i = 0; i < cmcf->listen.nelts; i++) { if (ngx_tcp_add_ports(cf, &ports, &listen[i]) != NGX_OK) { return NGX_CONF_ERROR; } } return ngx_tcp_optimize_servers(cf, &ports); }