static int noit_lua_module_onload(noit_image_t *i) { int rv; lua_State *L; lua_module_closure_t *lmc; noit_lua_init(); lmc = noit_image_get_userdata(i); L = lmc->lua_state; lua_getglobal(L, "require"); lua_pushstring(L, lmc->object); rv = lua_pcall(L, 1, 1, 0); if(rv) { int i; noitL(nlerr, "lua: %s.onload failed\n", lmc->object); i = lua_gettop(L); if(i>0) { if(lua_isstring(L, i)) { const char *err; size_t len; err = lua_tolstring(L, i, &len); noitL(nlerr, "lua: %s\n", err); } } lua_pop(L,i); return -1; } lua_pop(L, lua_gettop(L)); noit_lua_pushmodule(L, lmc->object); if(lua_isnil(L, -1)) { lua_pop(L, 1); noitL(nlerr, "lua: no such object %s\n", lmc->object); return -1; } lua_getfield(L, -1, "onload"); lua_remove(L, -2); if(!lua_isfunction(L, -1)) { lua_pop(L, 1); /* No onload */ return 0; } noit_lua_setup_module(L, (noit_module_t *)i); lua_pcall(L, 1, 1, 0); if(lua_isnumber(L, -1)) { int rv; rv = lua_tointeger(L, -1); lua_pop(L, 1); return rv; } lua_pop(L,1); noitL(nlerr, "%s.onload must return a integer\n", lmc->object); return -1; }
static int lua_general_handler(noit_module_generic_t *self) { int status, rv; lua_general_conf_t *conf = get_config(self); lua_module_closure_t *lmc = &conf->lmc; noit_lua_resume_info_t *ri = NULL;; const char *err = NULL; char errbuf[128]; lua_State *L; if(!lmc || !conf || !conf->module || !conf->function) { goto boom; } ri = lua_general_new_resume_info(lmc); L = ri->coro_state; lua_getglobal(L, "require"); lua_pushstring(L, conf->module); rv = lua_pcall(L, 1, 1, 0); if(rv) { int i; noitL(nlerr, "lua: require %s failed\n", conf->module); i = lua_gettop(L); if(i>0) { if(lua_isstring(L, i)) { const char *err; size_t len; err = lua_tolstring(L, i, &len); noitL(nlerr, "lua: %s\n", err); } } lua_pop(L,i); goto boom; } lua_pop(L, lua_gettop(L)); noit_lua_pushmodule(L, conf->module); if(lua_isnil(L, -1)) { lua_pop(L, 1); snprintf(errbuf, sizeof(errbuf), "no such module: '%s'", conf->module); err = errbuf; goto boom; } lua_getfield(L, -1, conf->function); lua_remove(L, -2); if(!lua_isfunction(L, -1)) { lua_pop(L, 1); snprintf(errbuf, sizeof(errbuf), "no function '%s' in module '%s'", conf->function, conf->module); err = errbuf; goto boom; } status = lmc->resume(ri, 0); if(status == 0) return 0; /* If we've failed, resume has freed ri, so we should just return. */ noitL(nlerr, "lua dispatch error: %d\n", status); return 0; boom: if(err) noitL(nlerr, "lua dispatch error: %s\n", err); if(ri) lua_general_ctx_free(ri); return 0; }