f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen/*
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen * lua-lxc: lua bindings for lxc
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen *
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen * Copyright © 2012 Oracle.
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen *
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen * Authors:
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen * Dwight Engen <dwight.engen@oracle.com>
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen *
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
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
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
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define LUA_LIB
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define _GNU_SOURCE
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#include <lua.h>
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#include <lauxlib.h>
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa#include <assert.h>
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#include <string.h>
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa#include <unistd.h>
c25c2970a6aabc45ee6375cc127ed45efea2f9bfNatanael Copa#include <libgen.h>
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#include <lxc/lxccontainer.h>
f2363e38d07db2ad4796b5580b95e3665ed34a88S.Çağlar Onur#include "lxc/commands.h"
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa#if LUA_VERSION_NUM < 502
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)
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa#endif
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa
67f69573777d35b291c853733752c2c079bf14e8Thomas Moschny#if LUA_VERSION_NUM >= 503
98088cfbeeb8fb7649a6882dbb32dd9bdcd87838Thomas Moschny#ifndef luaL_checkunsigned
67f69573777d35b291c853733752c2c079bf14e8Thomas Moschny#define luaL_checkunsigned(L,n) ((lua_Unsigned)luaL_checkinteger(L,n))
67f69573777d35b291c853733752c2c079bf14e8Thomas Moschny#endif
98088cfbeeb8fb7649a6882dbb32dd9bdcd87838Thomas Moschny#endif
67f69573777d35b291c853733752c2c079bf14e8Thomas Moschny
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#ifdef NO_CHECK_UDATA
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define checkudata(L,i,tname) lua_touserdata(L, i)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#else
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define checkudata(L,i,tname) luaL_checkudata(L, i, tname)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#endif
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define lua_boxpointer(L,u) \
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen (*(void **) (lua_newuserdata(L, sizeof(void *))) = (u))
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define lua_unboxpointer(L,i,tname) \
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen (*(void **) (checkudata(L, i, tname)))
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define CONTAINER_TYPENAME "lxc.container"
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov/* Max Lua arguments for function */
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov#define MAXVARS 200
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_new(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen struct lxc_container *c;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *name = luaL_checkstring(L, 1);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen const char *configpath = NULL;
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen int argc = lua_gettop(L);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen if (argc > 1)
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen configpath = luaL_checkstring(L, 2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen c = lxc_container_new(name, configpath);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (c) {
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_boxpointer(L, c);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen luaL_getmetatable(L, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_setmetatable(L, -2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen } else {
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushnil(L);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen }
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_gc(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen /* XXX what to do if this fails? */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lxc_container_put(c);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 0;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_config_file_name(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen char *config_file_name;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen config_file_name = c->config_file_name(c);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushstring(L, config_file_name);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen free(config_file_name);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_defined(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->is_defined(c));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_name(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushstring(L, c->name);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_create(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen char *template_name = strdupa(luaL_checkstring(L, 2));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int argc = lua_gettop(L);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen char **argv;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int i;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen argv = alloca((argc+1) * sizeof(char *));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen for (i = 0; i < argc-2; i++)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen argv[i] = strdupa(luaL_checkstring(L, i+3));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen argv[i] = NULL;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
dc23c1c817da5c13529432270e51d0f7f3b1e95eSerge Hallyn lua_pushboolean(L, !!c->create(c, template_name, NULL, NULL, 0, argv));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_destroy(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->destroy(c));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen/* container state */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_start(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int argc = lua_gettop(L);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen char **argv = NULL;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int i,j;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int useinit = 0;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (argc > 1) {
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen argv = alloca((argc+1) * sizeof(char *));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen for (i = 0, j = 0; i < argc-1; i++) {
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *arg = luaL_checkstring(L, i+2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (!strcmp(arg, "useinit"))
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen useinit = 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen else
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen argv[j++] = strdupa(arg);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen }
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen argv[j] = NULL;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen }
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
540f932aeb28274e8e7ea1e8f3a8e5889b88e1d6Stéphane Graber c->want_daemonize(c, true);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->start(c, useinit, argv));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_stop(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->stop(c));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_shutdown(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int timeout = luaL_checkinteger(L, 2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->shutdown(c, timeout));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_wait(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *state = luaL_checkstring(L, 2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int timeout = luaL_checkinteger(L, 3);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->wait(c, state, timeout));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikovstatic int container_rename(lua_State *L)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov{
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov const char *new_name;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov int argc = lua_gettop(L);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov if (argc > 1) {
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov new_name = luaL_checkstring(L, 2);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov lua_pushboolean(L, !!c->rename(c, new_name));
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov } else
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov lua_pushnil(L);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov return 1;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov}
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_freeze(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->freeze(c));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_unfreeze(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->unfreeze(c));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_running(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->is_running(c));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_state(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushstring(L, c->state(c));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_init_pid(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushinteger(L, c->init_pid(c));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen/* configuration file methods */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_load_config(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int arg_cnt = lua_gettop(L);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *alt_path = NULL;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (arg_cnt > 1)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen alt_path = luaL_checkstring(L, 2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->load_config(c, alt_path));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_save_config(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int arg_cnt = lua_gettop(L);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *alt_path = NULL;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (arg_cnt > 1)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen alt_path = luaL_checkstring(L, 2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->save_config(c, alt_path));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engenstatic int container_get_config_path(lua_State *L)
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen{
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen const char *config_path;
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen config_path = c->get_config_path(c);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen lua_pushstring(L, config_path);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen return 1;
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen}
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engenstatic int container_set_config_path(lua_State *L)
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen{
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen const char *config_path = luaL_checkstring(L, 2);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen lua_pushboolean(L, !!c->set_config_path(c, config_path));
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen return 1;
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen}
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_clear_config_item(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *key = luaL_checkstring(L, 2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->clear_config_item(c, key));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engenstatic int container_get_cgroup_item(lua_State *L)
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen{
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen const char *key = luaL_checkstring(L, 2);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen int len;
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen char *value;
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen len = c->get_cgroup_item(c, key, NULL, 0);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen if (len <= 0)
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen goto not_found;
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen value = alloca(sizeof(char)*len + 1);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen if (c->get_cgroup_item(c, key, value, len + 1) != len)
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen goto not_found;
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen lua_pushstring(L, value);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen return 1;
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engennot_found:
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen lua_pushnil(L);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen return 1;
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen}
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_get_config_item(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *key = luaL_checkstring(L, 2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int len;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen char *value;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen len = c->get_config_item(c, key, NULL, 0);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (len <= 0)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen goto not_found;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen value = alloca(sizeof(char)*len + 1);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (c->get_config_item(c, key, value, len + 1) != len)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen goto not_found;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushstring(L, value);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engennot_found:
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushnil(L);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engenstatic int container_set_cgroup_item(lua_State *L)
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen{
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen const char *key = luaL_checkstring(L, 2);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen const char *value = luaL_checkstring(L, 3);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen lua_pushboolean(L, !!c->set_cgroup_item(c, key, value));
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen return 1;
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen}
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_set_config_item(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *key = luaL_checkstring(L, 2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *value = luaL_checkstring(L, 3);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->set_config_item(c, key, value));
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_get_keys(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *key = NULL;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int len;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen char *value;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen int arg_cnt = lua_gettop(L);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (arg_cnt > 1)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen key = luaL_checkstring(L, 2);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen len = c->get_keys(c, key, NULL, 0);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (len <= 0)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen goto not_found;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen value = alloca(sizeof(char)*len + 1);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen if (c->get_keys(c, key, value, len + 1) != len)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen goto not_found;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushstring(L, value);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engennot_found:
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushnil(L);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXystatic int container_attach(lua_State *L)
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy{
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy int argc = lua_gettop(L);
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy char **argv = NULL;
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth int i;
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy if (argc > 1) {
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy argv = alloca((argc+1) * sizeof(char *));
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth for (i = 0; i < argc-1; i++) {
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth const char *arg = luaL_checkstring(L, i+2);
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth argv[i] = strdupa(arg);
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy }
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth argv[i] = NULL;
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth }
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth else
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth {
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth lua_pushnil(L);
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth return 1;
2f64d6314461dd1dc48afeb97ad29c5a8affd126ashtoreth }
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy
4086cea56d351ddaf3c16ed556431297276a6e90Dwight Engen lua_pushboolean(L, !(c->attach_run_wait(c, NULL, argv[0], (const char**)argv)));
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy return 1;
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy}
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikovstatic int container_get_interfaces(lua_State *L)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov{
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov char **ifaces;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov int i;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov ifaces = c->get_interfaces(c);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov if (!ifaces){
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov lua_pushnil(L);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov return 1;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov }
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov for (i = 0; ifaces[i]; i++);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
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 free(ifaces[i]);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov lua_pushnil(L);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov return 1;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov }
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov for (i = 0; ifaces[i]; i++){
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov lua_pushstring(L, ifaces[i]);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov free(ifaces[i]);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov }
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov return i;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov}
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikovstatic int container_get_ips(lua_State *L)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov{
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov int argc = lua_gettop(L);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov char **addresses;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov char *iface = NULL, *family = NULL;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov int i, scope = 0;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov if (argc > 1)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov iface = (char *)luaL_checkstring(L, 2);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov if (argc > 2)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov family = (char *)luaL_checkstring(L, 3);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov if (argc > 3)
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov scope = luaL_checkinteger(L, 4);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov addresses = c->get_ips(c, iface, family, scope);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov if (!addresses){
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov lua_pushnil(L);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov return 1;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov }
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov for (i = 0; addresses[i]; i++);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
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 free(addresses[i]);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov lua_pushnil(L);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov return 1;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov }
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov for (i = 0; addresses[i]; i++){
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov lua_pushstring(L, addresses[i]);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov free(addresses[i]);
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov }
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov return i;
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov}
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic luaL_Reg lxc_container_methods[] =
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy {"attach", container_attach},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"create", container_create},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"defined", container_defined},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"destroy", container_destroy},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"init_pid", container_init_pid},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"name", container_name},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"running", container_running},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"state", container_state},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"freeze", container_freeze},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"unfreeze", container_unfreeze},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"start", container_start},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"stop", container_stop},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"shutdown", container_shutdown},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"wait", container_wait},
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov {"rename", container_rename},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"config_file_name", container_config_file_name},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"load_config", container_load_config},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"save_config", container_save_config},
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},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"get_keys", container_get_keys},
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov {"get_interfaces", container_get_interfaces},
9bfdc2235cd71004b68a010c3575d564efe48378Andrey Jr. Melnikov {"get_ips", container_get_ips},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {NULL, NULL}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen};
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int lxc_version_get(lua_State *L) {
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushstring(L, VERSION);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engenstatic int lxc_default_config_path_get(lua_State *L) {
593e84786e2b4709059989bee489deab5c923779Stéphane Graber const char *lxcpath = lxc_get_global_config_item("lxc.lxcpath");
2a59a68183e55e38beedb6442938e31eb7d4749cSerge Hallyn
2a59a68183e55e38beedb6442938e31eb7d4749cSerge Hallyn lua_pushstring(L, lxcpath);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engenstatic int cmd_get_config_item(lua_State *L)
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen{
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen int arg_cnt = lua_gettop(L);
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen const char *name = luaL_checkstring(L, 1);
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen const char *key = luaL_checkstring(L, 2);
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen const char *lxcpath = NULL;
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen char *value;
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen if (arg_cnt > 2)
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen lxcpath = luaL_checkstring(L, 3);
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen value = lxc_cmd_get_config_item(name, key, lxcpath);
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen if (!value)
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen goto not_found;
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen lua_pushstring(L, value);
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen return 1;
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engennot_found:
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen lua_pushnil(L);
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen return 1;
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen}
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa/* utility functions */
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copastatic int lxc_util_usleep(lua_State *L) {
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa usleep((useconds_t)luaL_checkunsigned(L, 1));
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa return 0;
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa}
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa
c25c2970a6aabc45ee6375cc127ed45efea2f9bfNatanael Copastatic int lxc_util_dirname(lua_State *L) {
c25c2970a6aabc45ee6375cc127ed45efea2f9bfNatanael Copa char *path = strdupa(luaL_checkstring(L, 1));
c25c2970a6aabc45ee6375cc127ed45efea2f9bfNatanael Copa lua_pushstring(L, dirname(path));
c25c2970a6aabc45ee6375cc127ed45efea2f9bfNatanael Copa return 1;
c25c2970a6aabc45ee6375cc127ed45efea2f9bfNatanael Copa}
c25c2970a6aabc45ee6375cc127ed45efea2f9bfNatanael Copa
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic luaL_Reg lxc_lib_methods[] = {
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"version_get", lxc_version_get},
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen {"default_config_path_get", lxc_default_config_path_get},
8585f20444203f9fb9970d1b176c38e0efd62ea8Dwight Engen {"cmd_get_config_item", cmd_get_config_item},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"container_new", container_new},
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa {"usleep", lxc_util_usleep},
c25c2970a6aabc45ee6375cc127ed45efea2f9bfNatanael Copa {"dirname", lxc_util_dirname},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {NULL, NULL}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen};
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int lxc_lib_uninit(lua_State *L) {
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen (void) L;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen /* this is where we would fini liblxc.so if we needed to */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 0;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight EngenLUALIB_API int luaopen_lxc_core(lua_State *L) {
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen /* this is where we would initialize liblxc.so if we needed to */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa luaL_newlib(L, lxc_lib_methods);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_newuserdata(L, 0);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_newtable(L); /* metatable */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushvalue(L, -1);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushliteral(L, "__gc");
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushcfunction(L, lxc_lib_uninit);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_rawset(L, -3);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_setmetatable(L, -3);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_rawset(L, -3);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen luaL_newmetatable(L, CONTAINER_TYPENAME);
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa luaL_setfuncs(L, lxc_container_methods, 0);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushvalue(L, -1); /* push metatable */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushstring(L, "__gc");
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushcfunction(L, container_gc);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_settable(L, -3);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pop(L, 1);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}