]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/ned/server/src/lua_factory.cc
c381fe255741364eca84717ba5addfdeed583a04
[l4.git] / l4 / pkg / ned / server / src / lua_factory.cc
1 #include <lua.h>
2 #include <lauxlib.h>
3 #include <lualib.h>
4
5 #include <l4/re/util/cap_alloc>
6 #include <l4/re/env>
7 #include <l4/sys/factory>
8
9 #include "lua_cap.h"
10 #include "lua.h"
11
12 #include <cstring>
13 #include <cstdio>
14
15
16 namespace Lua { namespace {
17
18 static int
19 __alloc(lua_State *l)
20 {
21   int argc = lua_gettop(l);
22   Lua::Cap *n = check_cap(l, 1);
23   int objt = luaL_checkint(l, 2);
24
25   L4Re::Util::Auto_cap<L4::Kobject>::Cap obj
26     = L4Re::Util::cap_alloc.alloc<L4::Kobject>();
27
28   if (!obj.is_valid())
29     luaL_error(l, "out of caps");
30
31   L4::Cap<L4::Factory> f(n->cap<L4::Factory>().get());
32   L4::Factory::S s = f->create(obj.get(), objt);
33   for (int i = 3; i <= argc; ++i)
34     {
35       if (lua_isnumber(l, i))
36         s << (l4_mword_t)luaL_checkint(l, i);
37       else if (lua_isstring(l, i))
38         s << (char const *)luaL_checkstring(l, i);
39       else if (lua_isnil(l, i))
40         s << L4::Factory::Nil();
41     }
42
43   l4_msgtag_t t = s;
44   int r = l4_error(t);
45
46   if (r < 0)
47     luaL_error(l, "runtime error %s (%d)", l4sys_errtostr(r), r);
48
49   lua_pushinteger(l, objt);
50   Cap *nc = Lua::push_new_cap(l, true);
51   nc->set(obj.get());
52
53   obj.release();
54   return 1;
55 }
56
57
58 struct Factory_model
59 {
60   static void
61   register_methods(lua_State *l)
62   {
63     static const luaL_Reg l4_cap_class[] =
64     {
65       { "create", __alloc },
66       { NULL, NULL }
67     };
68     luaL_register(l, NULL, l4_cap_class);
69     Cap::add_class_metatable(l);
70   }
71 };
72
73 static Lua::Cap_type_lib<L4::Factory, Factory_model> __lib;
74
75 }}