f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen * lua-lxc: lua bindings for lxc
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen * Copyright © 2012 Oracle.
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen * Dwight Engen <dwight.engen@oracle.com>
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * This library is free software; you can redistribute it and/or
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * modify it under the terms of the GNU Lesser General Public
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * License as published by the Free Software Foundation; either
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * version 2.1 of the License, or (at your option) any later version.
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * This library is distributed in the hope that it will be useful,
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * but WITHOUT ANY WARRANTY; without even the implied warranty of
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * Lesser General Public License for more details.
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * You should have received a copy of the GNU Lesser General Public
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * License along with this library; if not, write to the Free Software
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa#define luaL_newlib(L,l) (lua_newtable(L), luaL_register(L,NULL,l))
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa#define luaL_setfuncs(L,l,n) (assert(n==0), luaL_register(L,NULL,l))
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa#define luaL_checkunsigned(L,n) luaL_checknumber(L,n)
67f69573777d35b291c853733752c2c079bf14e8Thomas Moschny#define luaL_checkunsigned(L,n) ((lua_Unsigned)luaL_checkinteger(L,n))
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define checkudata(L,i,tname) lua_touserdata(L, i)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define checkudata(L,i,tname) luaL_checkudata(L, i, tname)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen (*(void **) (lua_newuserdata(L, sizeof(void *))) = (u))
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov/* Max Lua arguments for function */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen /* XXX what to do if this fails? */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_config_file_name(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen char *template_name = strdupa(luaL_checkstring(L, 2));
dc23c1c817da5c13529432270e51d0f7f3b1e95eSerge Hallyn lua_pushboolean(L, !!c->create(c, template_name, NULL, NULL, 0, argv));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen/* container state */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->start(c, useinit, argv));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->wait(c, state, timeout));
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikovstatic int container_rename(lua_State *L)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov lua_pushboolean(L, !!c->rename(c, new_name));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen/* configuration file methods */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->load_config(c, alt_path));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->save_config(c, alt_path));
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engenstatic int container_get_config_path(lua_State *L)
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engenstatic int container_set_config_path(lua_State *L)
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen const char *config_path = luaL_checkstring(L, 2);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen lua_pushboolean(L, !!c->set_config_path(c, config_path));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_clear_config_item(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->clear_config_item(c, key));
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engenstatic int container_get_cgroup_item(lua_State *L)
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen if (c->get_cgroup_item(c, key, value, len + 1) != len)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_get_config_item(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (c->get_config_item(c, key, value, len + 1) != len)
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engenstatic int container_set_cgroup_item(lua_State *L)
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen lua_pushboolean(L, !!c->set_cgroup_item(c, key, value));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_set_config_item(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->set_config_item(c, key, value));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (c->get_keys(c, key, value, len + 1) != len)
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
4086cea56d351ddaf3c16ed556431297276a6e90Dwight Engen lua_pushboolean(L, !(c->attach_run_wait(c, NULL, argv[0], (const char**)argv)));
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikovstatic int container_get_interfaces(lua_State *L)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov for (i = 0; ifaces[i]; i++);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov /* protect LUA stack form overflow */
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov if (i > MAXVARS || !lua_checkstack(L, i)){
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov for (i = 0; ifaces[i]; i++)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov for (i = 0; ifaces[i]; i++){
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikovstatic int container_get_ips(lua_State *L)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov family = (char *)luaL_checkstring(L, 3);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov addresses = c->get_ips(c, iface, family, scope);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov for (i = 0; addresses[i]; i++);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov /* protect LUA stack form overflow */
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov if (i > MAXVARS || !lua_checkstack(L, i)){
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov for (i = 0; addresses[i]; i++)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov for (i = 0; addresses[i]; i++){
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"config_file_name", container_config_file_name},
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen {"get_cgroup_item", container_get_cgroup_item},
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen {"set_cgroup_item", container_set_cgroup_item},
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen {"get_config_path", container_get_config_path},
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen {"set_config_path", container_set_config_path},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"get_config_item", container_get_config_item},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"set_config_item", container_set_config_item},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"clear_config_item", container_clear_config_item},
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov {"get_interfaces", container_get_interfaces},
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engenstatic int lxc_default_config_path_get(lua_State *L) {
593e84786e2b4709059989bee489deab5c923779Stéphane Graber const char *lxcpath = lxc_get_global_config_item("lxc.lxcpath");
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen value = lxc_cmd_get_config_item(name, key, lxcpath);
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa/* utility functions */
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen {"default_config_path_get", lxc_default_config_path_get},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen /* this is where we would fini liblxc.so if we needed to */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen /* this is where we would initialize liblxc.so if we needed to */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */