Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix compatibility with liblxc 4.0.4 and newer #46

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 23 additions & 35 deletions ext/lxc/lxc.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,6 @@ extern void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1,
#define RELEASING_GVL2(func, arg, killfunc, killarg) func(arg)
#endif

extern int lxc_wait_for_pid_status(pid_t pid);
extern long lxc_config_parse_arch(const char *arch);

static VALUE Container;
static VALUE Error;

Expand Down Expand Up @@ -90,33 +87,6 @@ free_c_string_array(char **arr)
* container-specific methods are contained in the +LXC::Container+ class.
*/

/*
* call-seq:
* LXC.arch_to_personality(arch)
*
* Converts an architecture string (x86, i686, x86_64 or amd64) to a
* "personality", either +:linux32+ or +:linux+, for the 32-bit and 64-bit
* architectures, respectively.
*/
static VALUE
lxc_arch_to_personality(VALUE self, VALUE rb_arch)
{
int ret;
char *arch;

arch = StringValuePtr(rb_arch);
ret = lxc_config_parse_arch(arch);

switch (ret) {
case PER_LINUX32:
return SYMBOL("linux32");
case PER_LINUX:
return SYMBOL("linux");
default:
rb_raise(Error, "unknown personality");
}
}

/*
* call-seq:
* LXC.run_command(command)
Expand Down Expand Up @@ -705,10 +675,30 @@ lxc_attach_parse_options(VALUE rb_opts)
return NULL;
}

static int
wait_for_pid_status(pid_t pid)
{
int status, ret;

again:
ret = waitpid(pid, &status, 0);
if (ret == -1) {
if (errno == EINTR)
goto again;

return -1;
}

if (ret != pid)
goto again;

return status;
}

static RETURN_WITHOUT_GVL_TYPE
lxc_wait_for_pid_status_without_gvl(void *pid)
wait_for_pid_status_without_gvl(void *pid)
{
RETURN_WITHOUT_GVL(lxc_wait_for_pid_status(*(pid_t*)pid));
RETURN_WITHOUT_GVL(wait_for_pid_status(*(pid_t*)pid));
}

#if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) || defined(HAVE_RB_THREAD_BLOCKING_REGION)
Expand Down Expand Up @@ -776,7 +766,7 @@ container_attach(int argc, VALUE *argv, VALUE self)
goto out;

if (wait) {
ret = RELEASING_GVL2(lxc_wait_for_pid_status_without_gvl, &pid,
ret = RELEASING_GVL2(wait_for_pid_status_without_gvl, &pid,
kill_pid_without_gvl, &pid);
/* handle case where attach fails */
if (WIFEXITED(ret) && WEXITSTATUS(ret) == 255)
Expand Down Expand Up @@ -2127,8 +2117,6 @@ Init_lxc(void)
{
VALUE LXC = rb_define_module("LXC");

rb_define_singleton_method(LXC, "arch_to_personality",
lxc_arch_to_personality, 1);
rb_define_singleton_method(LXC, "run_command", lxc_run_command, 1);
rb_define_singleton_method(LXC, "run_shell", lxc_run_shell, 0);
rb_define_singleton_method(LXC, "global_config_item",
Expand Down
5 changes: 0 additions & 5 deletions test/test_lxc_class_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,4 @@ def setup
def test_list_containers
assert(LXC.list_containers.include?('test'))
end

def test_arch_to_personality
assert_equal(:linux32, LXC.arch_to_personality('x86'))
assert_equal(:linux, LXC.arch_to_personality('x86_64'))
end
end