Cross Reference: /lxc/src/lua-lxc/core.c
core.c revision f080ffd7d656fbd9505a8e8eb52a05d61355c677
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
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 modify
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * it under the terms of the GNU General Public License version 2, as
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * published by the Free Software Foundation.
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn *
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * This program 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
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * GNU General Public License for more details.
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn *
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * You should have received a copy of the GNU General Public License along
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * with this program; if not, write to the Free Software Foundation, Inc.,
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
c66e9b01f04840c5abc34d235dbbb2ec9ca55205Serge Hallyn */
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define LUA_LIB
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#define _GNU_SOURCE
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#include <lua.h>
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#include <lauxlib.h>
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#include <string.h>
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa#include <lxc/lxccontainer.h>
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa#ifdef NO_CHECK_UDATA
c25c2970a6aabc45ee6375cc127ed45efea2f9bfNatanael Copa#define checkudata(L,i,tname) lua_touserdata(L, i)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#else
f2363e38d07db2ad4796b5580b95e3665ed34a88S.Çağlar Onur#define checkudata(L,i,tname) luaL_checkudata(L, i, tname)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen#endif
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa#define lua_boxpointer(L,u) \
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa (*(void **) (lua_newuserdata(L, sizeof(void *))) = (u))
ac8255280d2e4348ab0eba5ec6982edc92ee6fbdNatanael Copa
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa#define lua_unboxpointer(L,i,tname) \
44a80d675ffb81ebb1a66a62c162e93a4c5882a0Natanael Copa (*(void **) (checkudata(L, i, tname)))
67f69573777d35b291c853733752c2c079bf14e8Thomas Moschny
67f69573777d35b291c853733752c2c079bf14e8Thomas Moschny#define CONTAINER_TYPENAME "lxc.container"
67f69573777d35b291c853733752c2c079bf14e8Thomas Moschny
67f69573777d35b291c853733752c2c079bf14e8Thomas Moschnystatic int container_new(lua_State *L)
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen{
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen const char *name = luaL_checkstring(L, 1);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen struct lxc_container *c = lxc_container_new(name);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
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{
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen /* XXX what to do if this fails? */
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen lxc_container_put(c);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen return 0;
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen}
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic int container_config_file_name(lua_State *L)
83c98d825e4e644b18276dde5deaa555ee36b629Dwight 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
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pushboolean(L, !!c->create(c, template_name, 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
dc23c1c817da5c13529432270e51d0f7f3b1e95eSerge Hallyn 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
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen c->want_daemonize(c);
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}
540f932aeb28274e8e7ea1e8f3a8e5889b88e1d6Stéphane Graber
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
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
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
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);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen if (c->get_config_item(c, key, value, len + 1) != len)
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen goto not_found;
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen lua_pushstring(L, value);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen return 1;
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engennot_found:
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen lua_pushnil(L);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen return 1;
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen}
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engenstatic int container_set_config_item(lua_State *L)
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen{
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen struct lxc_container *c = lua_unboxpointer(L, 1, CONTAINER_TYPENAME);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen const char *key = luaL_checkstring(L, 2);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen const char *value = luaL_checkstring(L, 3);
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen
83c98d825e4e644b18276dde5deaa555ee36b629Dwight Engen lua_pushboolean(L, !!c->set_config_item(c, key, value));
83c98d825e4e644b18276dde5deaa555ee36b629Dwight 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);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen if (arg_cnt > 1)
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen key = luaL_checkstring(L, 2);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen len = c->get_keys(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_keys(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
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engenstatic luaL_Reg lxc_container_methods[] =
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen{
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight 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},
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},
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},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {NULL, NULL}
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen};
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engenstatic int lxc_version_get(lua_State *L) {
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen lua_pushstring(L, VERSION);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen return 1;
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen}
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engenstatic int lxc_path_get(lua_State *L) {
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen lua_pushstring(L, LXCPATH);
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen return 1;
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen}
80ee22284b4172f9ff1d55c62e4a0ef01a4be92eDwight Engen
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engenstatic luaL_Reg lxc_lib_methods[] = {
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"version_get", lxc_version_get},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"path_get", lxc_path_get},
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen {"container_new", container_new},
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
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen luaL_register(L, "lxc", 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);
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 luaL_register(L, NULL, lxc_container_methods);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen lua_pop(L, 1);
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen return 1;
f080ffd7d656fbd9505a8e8eb52a05d61355c677Dwight Engen}
ed70d0783942201facdcbe2b4acdae0f43da5f05PiXy