6 #include <l4/re/namespace>
7 #include <l4/re/util/cap_alloc>
15 namespace Lua { namespace {
18 __lookup(lua_State *l)
21 char const *s = lua_tolstring(l, lua_upvalueindex(2), &len);
22 Cap *_ns = Lua::check_cap(l, lua_upvalueindex(1));
23 L4_cap_fpage_rights rights
24 = (L4_cap_fpage_rights)lua_tointeger(l, lua_upvalueindex(3));
26 L4::Cap<L4Re::Namespace> ns(_ns->cap<L4Re::Namespace>().get());
28 L4Re::Util::Auto_cap<void>::Cap obj = L4Re::Util::cap_alloc.alloc<void>();
30 luaL_error(l, "out of caps");
32 lua_gc(l, LUA_GCCOLLECT, 0);
34 int r = ns->query(s, len, obj.get(), L4Re::Namespace::To_default);
46 luaL_error(l, "runtime error %s (%d)\n", l4sys_errtostr(r), r);
49 Lua::Cap *no = Lua::push_void_cap(l);
50 no->set(obj.release());
51 no->set_rights(rights);
61 //char const *s = luaL_checklstring(l, 2, &len);
62 int argc = lua_gettop(l);
64 luaL_error(l, "expected at least two arguments in name-space query");
71 lua_pushinteger(l, L4_FPAGE_RO);
73 lua_pushcclosure(l, __lookup, 3);
79 __register_link(lua_State *l)
82 char const *src_name = lua_tolstring(l, lua_upvalueindex(2), &src_len);
83 Cap *_src_ns = Lua::check_cap(l, lua_upvalueindex(1));
84 L4::Cap<L4Re::Namespace> src_ns(_src_ns->cap<L4Re::Namespace>().get());
85 lua_Integer flags = lua_tointeger(l, lua_upvalueindex(3));
89 char const *dst_name = lua_tolstring(l, 2, &dst_len);
90 Cap *_dst_ns = Lua::check_cap(l, 1);
91 L4::Cap<L4Re::Namespace> dst_ns(_dst_ns->cap<L4Re::Namespace>().get());
93 printf("do register link dst='%.*s' at %lx src='%.*s' at %lx\n",
94 dst_len, dst_name, dst_ns.cap(), src_len, src_name, src_ns.cap());
97 lua_gc(l, LUA_GCCOLLECT, 0);
99 int r = dst_ns->link(dst_name, dst_len, src_ns, src_name, src_len, flags);
101 luaL_error(l, "runtime error: %s (%d)", l4sys_errtostr(r), r);
115 lua_pushvalue(l, 1); // the source namespace
116 lua_pushvalue(l, 2); // the source name
117 lua_pushvalue(l, 3); // the flags
118 lua_pushcclosure(l, __register_link, 3);
123 __register(lua_State *l)
125 Cap *ns = check_cap(l, 1);
126 char const *key = luaL_checkstring(l, 2);
129 lua_Integer type = lua_type(l, 3);
130 lua_gc(l, LUA_GCCOLLECT, 0);
135 int r = ns->cap<L4Re::Namespace>()->unlink(key);
136 if (r >= 0 || r == -L4_ENOENT)
139 luaL_error(l, "runtime error %s (%d)", l4sys_errtostr(r), r);
145 n = Lua::check_cap(l, 3);
148 luaL_error(l, "unexpected value to register in namespace (%s)",
153 printf("register %s=%lx in %lx\n", key, n ? n->cap<void>().cap() : ~0, ns->cap<void>().cap());
156 int r = ns->cap<L4Re::Namespace>()->register_obj(key,
157 n ? n->cap<void>().get() : L4::Cap<void>::Invalid,
158 L4Re::Namespace::Overwrite | (n ? n->rights() : 0x0f));
160 luaL_error(l, "runtime error %s (%d)", l4sys_errtostr(r), r);
170 register_methods(lua_State *l)
172 static const luaL_Reg l4_cap_class[] =
175 { "query", __query },
176 { "__register", __register },
181 luaL_register(l, NULL, l4_cap_class);
182 Cap::add_class_metatable(l);
187 static Lua::Cap_type_lib<L4Re::Namespace, Ns_model> __lib;