예제 #1
0
void network_init(struct network *net, uv_loop_t *loop)
{
	if (net != NULL) {
		/* No multiplexing now, I/O in single thread. */
		net->loop = loop;
		net->endpoints = map_make();
	}
}
예제 #2
0
static int validate_section(kr_rrset_validation_ctx_t *vctx, knot_mm_t *pool)
{
	if (!vctx) {
		return kr_error(EINVAL);
	}

	const knot_pktsection_t *sec = knot_pkt_section(vctx->pkt,
							vctx->section_id);
	if (!sec) {
		return kr_ok();
	}

	int ret = kr_ok();

	map_t stash = map_make();
	stash.malloc = (map_alloc_f) mm_alloc;
	stash.free = (map_free_f) mm_free;
	stash.baton = pool;

	/* Determine RR types contained in the section. */
	for (unsigned i = 0; i < sec->count; ++i) {
		const knot_rrset_t *rr = knot_pkt_rr(sec, i);
		if (rr->type == KNOT_RRTYPE_RRSIG) {
			continue;
		}
		if ((rr->type == KNOT_RRTYPE_NS) && (vctx->section_id == KNOT_AUTHORITY)) {
			continue;
		}
		/* Only validate answers from current cut, records above the cut are stripped. */
		if (!knot_dname_in(vctx->zone_name, rr->owner)) {
			continue;
		}
		ret = kr_rrmap_add(&stash, rr, 0, pool);
		if (ret != 0) {
			goto fail;
		}
	}

	/* Can't use qry->zone_cut.name directly, as this name can
	 * change when updating cut information before validation.
	 */
	vctx->zone_name = vctx->keys ? vctx->keys->owner  : NULL;

	ret = map_walk(&stash, &validate_rrset, vctx);
	if (ret != 0) {
		return ret;
	}
	ret = vctx->result;

fail:
	return ret;
}
예제 #3
0
static int init_resolver(struct engine *engine)
{
	/* Open resolution context */
	engine->resolver.trust_anchors = map_make();
	engine->resolver.negative_anchors = map_make();
	engine->resolver.pool = engine->pool;
	engine->resolver.modules = &engine->modules;
	/* Create OPT RR */
	engine->resolver.opt_rr = mm_alloc(engine->pool, sizeof(knot_rrset_t));
	if (!engine->resolver.opt_rr) {
		return kr_error(ENOMEM);
	}
	knot_edns_init(engine->resolver.opt_rr, KR_EDNS_PAYLOAD, 0, KR_EDNS_VERSION, engine->pool);
	/* Set default root hints */
	kr_zonecut_init(&engine->resolver.root_hints, (const uint8_t *)"", engine->pool);
	kr_zonecut_set_sbelt(&engine->resolver, &engine->resolver.root_hints);
	/* Open NS rtt + reputation cache */
	engine->resolver.cache_rtt = mm_alloc(engine->pool, lru_size(kr_nsrep_lru_t, LRU_RTT_SIZE));
	if (engine->resolver.cache_rtt) {
		lru_init(engine->resolver.cache_rtt, LRU_RTT_SIZE);
	}
	engine->resolver.cache_rep = mm_alloc(engine->pool, lru_size(kr_nsrep_lru_t, LRU_REP_SIZE));
	if (engine->resolver.cache_rep) {
		lru_init(engine->resolver.cache_rep, LRU_REP_SIZE);
	}

	/* Load basic modules */
	engine_register(engine, "iterate", NULL, NULL);
	engine_register(engine, "validate", NULL, NULL);
	engine_register(engine, "rrcache", NULL, NULL);
	engine_register(engine, "pktcache", NULL, NULL);

	/* Initialize storage backends */
	struct storage_api lmdb = {
		"lmdb://", knot_db_lmdb_api, knot_db_lmdb_mkopts
	};

	return array_push(engine->storage_registry, lmdb);
}
예제 #4
0
파일: test.c 프로젝트: 54niyu/CuteHttpd
void test_map() {

    map *m = map_make();
    m->hash = sdbmHash;
    m->copyKey = copyKey;
    m->compare = compareKey;

    char *test[] = {
            "asd",
            "bsddj",
            "csdf",
            "dsdf",
            "esdafasd",
            "fasdf",
            "gsadf",
            "gs",
            "f**k",
            "safsd",
            "sadfasd",
            "asddfasdf",
            "asdfasdf",
            "sadfe",
            "asdfasd",
            "erer",
            "rtert",
            "asdf",
            "4erwerw",
            "sawe23",

    };
    int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};

    int i = 0;
    for (; i < 200; i++) {
        map_set(m, test[i % 17], a + i % 17);
    }

    printf("Over\n");
    for (i = 0; i < 200; i++) {
        bucket* val = map_get(m, test[i % 17]);
        if (val == NULL) {
            printf("not found");
        } else {
//            printf(" %p %s %d\n", val,(char*)val->key, *((int*)(val->val)));
        }
    }
    map_print(m);
}