char * ndk_conf_set_encoding_slot (ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { char *p = conf; ndk_encoding_t *ep; ngx_str_t *value; size_t len; iconv_t ic; ep = (ndk_encoding_t *) (p + cmd->offset); if (ep->from && ep->to) return "is duplicate"; value = cf->args->elts; if (ep->from) { ep->to = (char *) value[1].data; len = strlen (ep->from); } else if (ep->to) { ep->from = (char *) value[1].data; len = strlen (ep->to); } else { return "has no base encoding"; } if (len == value[1].len && !strncasecmp (ep->to, ep->from, len)) { ngx_log_error (NGX_LOG_WARN, cf->log, 0, "\"%V\" '%V' encoding is ignored (no conversion)", &value[0], &value[1]); return NGX_CONF_OK; } ic = iconv_open (ep->to, ep->from); if (ic == (iconv_t)-1) return "has an invalid encoding"; if (iconv_close (ic)) { ngx_log_error (NGX_LOG_EMERG, cf->log, errno, "iconv_close()"); return NGX_CONF_ERROR; } return NGX_CONF_OK; }