Пример #1
0
/** Load module. */
static int mod_load(lua_State *L)
{
    /* Check parameters */
    int n = lua_gettop(L);
    if (n != 1 || !lua_isstring(L, 1)) {
        format_error(L, "expected 'load(string name)'");
        lua_error(L);
    }
    /* Parse precedence declaration */
    auto_free char *declaration = strdup(lua_tostring(L, 1));
    if (!declaration) {
        return kr_error(ENOMEM);
    }
    const char *name = strtok(declaration, " ");
    const char *precedence = strtok(NULL, " ");
    const char *ref = strtok(NULL, " ");
    /* Load engine module */
    struct engine *engine = engine_luaget(L);
    int ret = engine_register(engine, name, precedence, ref);
    if (ret != 0) {
        if (ret == kr_error(EIDRM)) {
            format_error(L, "referenced module not found");
        } else {
            format_error(L, kr_strerror(ret));
        }
        lua_error(L);
    }

    lua_pushboolean(L, 1);
    return 1;
}
Пример #2
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);
}
Пример #3
0
static int ioctl_engine_open(struct drm_device *dev, void *data,
		struct drm_file *file)
{
	struct dce_file_priv *priv = omap_drm_file_priv(file, dce_mapper_id);
	struct drm_omap_dce_engine_open *arg = data;
	struct dce_rpc_engine_open_rsp *rsp;
	int ret;

	/* if we are not re-starting a syscall, send req */
	if (!arg->token) {
		struct dce_rpc_engine_open_req req = {
				.hdr = MKHDR(ENGINE_OPEN),
		};
		strncpy(req.name, arg->name, sizeof(req.name));
		ret = rpsend(priv, &arg->token, hdr(&req), sizeof(req));
		if (ret)
			return ret;
	}

	/* then wait for reply, which is interruptible */
	ret = rpwait(priv, arg->token, hdr(&rsp), sizeof(*rsp));
	if (ret)
		return ret;

	arg->eng_handle = engine_register(priv, rsp->engine);
	arg->error_code = rsp->error_code;

	if (!engine_valid(priv, arg->eng_handle)) {
		engine_close(priv, rsp->engine);
		ret = -ENOMEM;
	}

	kfree(rsp);

	return ret;
}