예제 #1
0
static ngx_int_t
ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename)
{
    off_t             size;
    u_char           *p;
    uint32_t          hash;
    ngx_buf_t        *buf;
    ngx_str_node_t   *sn;
    ngx_conf_dump_t  *cd;

    hash = ngx_crc32_long(filename->data, filename->len);

    sn = ngx_str_rbtree_lookup(&cf->cycle->config_dump_rbtree, filename, hash);

    if (sn) {
        cf->conf_file->dump = NULL;
        return NGX_OK;
    }

    p = ngx_pstrdup(cf->cycle->pool, filename);
    if (p == NULL) {
        return NGX_ERROR;
    }

    cd = ngx_array_push(&cf->cycle->config_dump);
    if (cd == NULL) {
        return NGX_ERROR;
    }

    size = ngx_file_size(&cf->conf_file->file.info);

    buf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size);
    if (buf == NULL) {
        return NGX_ERROR;
    }

    cd->name.data = p;
    cd->name.len = filename->len;
    cd->buffer = buf;

    cf->conf_file->dump = buf;

    sn = ngx_palloc(cf->temp_pool, sizeof(ngx_str_node_t));
    if (sn == NULL) {
        return NGX_ERROR;
    }

    sn->node.key = hash;
    sn->str = cd->name;

    ngx_rbtree_insert(&cf->cycle->config_dump_rbtree, &sn->node);

    return NGX_OK;
}
ngx_inline ngx_array_t *
yy_sec_waf_re_cache_get_value(ngx_rbtree_t *rbtree, ngx_str_t *name)
{
    uint32_t         hash;
    re_cache_node_t *cache_node;

    hash = ngx_crc32_long(name->data, name->len);

    cache_node = (re_cache_node_t *) ngx_str_rbtree_lookup(rbtree, name, hash);

    if (cache_node != NULL) {
        return cache_node->value;
    }

    return NULL;
}
ngx_int_t
yy_sec_waf_re_cache_set_value(ngx_pool_t *pool,
    ngx_str_t *name, ngx_array_t *value, ngx_rbtree_t *rbtree)
{
    uint32_t         hash;
    ngx_str_t       *val;
    re_cache_node_t *cache_node;

    hash = ngx_crc32_long(name->data, name->len);

    cache_node = (re_cache_node_t *) ngx_str_rbtree_lookup(rbtree, name, hash);

    if (cache_node != NULL) {
        return NGX_OK;
    }

    cache_node = ngx_palloc(pool, sizeof(re_cache_node_t));

    if (cache_node == NULL) {
        return NGX_ERROR;
    }

    val = ngx_palloc(pool, sizeof(ngx_str_t));

    if (value == NULL) {
        return NGX_ERROR;
    }

    val->len = value->len;
    val->data = ngx_pstrdup(pool, value);
    if (val->data == NULL) {
        return NGX_ERROR;
    }

    cache_node->sn.node.key = hash;
    cache_node->sn.str.len = name->len;
    cache_node->sn.str.data = name->data;
    cache_node->value = value;

    ngx_rbtree_insert(rbtree, &cache_node->sn.node);

    return NGX_OK;
}