2 * (c) 2010 Alexander Warg <warg@os.inf.tu-dresden.de>
3 * economic rights: Technische Universität Dresden (Germany)
5 * This file is part of TUD:OS and distributed under the terms of the
6 * GNU General Public License 2.
7 * Please see the COPYING-GPL-2 file for details.
14 #include <l4/re/namespace>
15 #include <l4/re/util/cap_alloc>
23 namespace Lua { namespace {
26 __lookup(lua_State *l)
29 char const *s = lua_tolstring(l, lua_upvalueindex(2), &len);
30 Cap *_ns = Lua::check_cap(l, lua_upvalueindex(1));
31 L4_cap_fpage_rights rights
32 = (L4_cap_fpage_rights)lua_tointeger(l, lua_upvalueindex(3));
34 L4::Cap<L4Re::Namespace> ns(_ns->cap<L4Re::Namespace>().get());
36 L4Re::Util::Auto_cap<void>::Cap obj = L4Re::Util::cap_alloc.alloc<void>();
38 luaL_error(l, "out of caps");
40 lua_gc(l, LUA_GCCOLLECT, 0);
42 int r = ns->query(s, len, obj.get(), L4Re::Namespace::To_default);
54 luaL_error(l, "runtime error %s (%d)\n", l4sys_errtostr(r), r);
57 Lua::Cap *no = Lua::push_void_cap(l);
58 no->set(obj.release());
59 no->set_rights(rights);
69 //char const *s = luaL_checklstring(l, 2, &len);
70 int argc = lua_gettop(l);
72 luaL_error(l, "expected at least two arguments in name-space query");
79 lua_pushinteger(l, L4_FPAGE_RO);
81 lua_pushcclosure(l, __lookup, 3);
87 __register_link(lua_State *l)
90 char const *src_name = lua_tolstring(l, lua_upvalueindex(2), &src_len);
91 Cap *_src_ns = Lua::check_cap(l, lua_upvalueindex(1));
92 L4::Cap<L4Re::Namespace> src_ns(_src_ns->cap<L4Re::Namespace>().get());
93 lua_Integer flags = lua_tointeger(l, lua_upvalueindex(3));
97 char const *dst_name = lua_tolstring(l, 2, &dst_len);
98 Cap *_dst_ns = Lua::check_cap(l, 1);
99 L4::Cap<L4Re::Namespace> dst_ns(_dst_ns->cap<L4Re::Namespace>().get());
101 printf("do register link dst='%.*s' at %lx src='%.*s' at %lx\n",
102 dst_len, dst_name, dst_ns.cap(), src_len, src_name, src_ns.cap());
105 lua_gc(l, LUA_GCCOLLECT, 0);
107 int r = dst_ns->link(dst_name, dst_len, src_ns, src_name, src_len, flags);
109 luaL_error(l, "runtime error: %s (%d)", l4sys_errtostr(r), r);
123 lua_pushvalue(l, 1); // the source namespace
124 lua_pushvalue(l, 2); // the source name
125 lua_pushvalue(l, 3); // the flags
126 lua_pushcclosure(l, __register_link, 3);
131 __register(lua_State *l)
133 Cap *ns = check_cap(l, 1);
134 char const *key = luaL_checkstring(l, 2);
137 lua_Integer type = lua_type(l, 3);
138 lua_gc(l, LUA_GCCOLLECT, 0);
143 int r = ns->cap<L4Re::Namespace>()->unlink(key);
144 if (r >= 0 || r == -L4_ENOENT)
147 luaL_error(l, "runtime error %s (%d)", l4sys_errtostr(r), r);
153 n = Lua::check_cap(l, 3);
156 luaL_error(l, "unexpected value to register in namespace (%s)",
161 printf("register %s=%lx in %lx\n", key, n ? n->cap<void>().cap() : ~0, ns->cap<void>().cap());
164 int r = ns->cap<L4Re::Namespace>()->register_obj(key,
165 n ? n->cap<void>().get() : L4::Cap<void>::Invalid,
166 L4Re::Namespace::Overwrite | (n ? n->rights() : 0x0f));
168 luaL_error(l, "runtime error %s (%d)", l4sys_errtostr(r), r);
178 register_methods(lua_State *l)
180 static const luaL_Reg l4_cap_class[] =
183 { "query", __query },
184 { "__register", __register },
189 luaL_register(l, NULL, l4_cap_class);
190 Cap::add_class_metatable(l);
195 static Lua::Cap_type_lib<L4Re::Namespace, Ns_model> __lib;