Fix string array conversion to C, simplify freeing
This commit is contained in:
parent
c75faed9ec
commit
a4fc5df066
31
ext/lxc.c
31
ext/lxc.c
|
@ -24,22 +24,23 @@ ruby_to_c_string_array(VALUE rb_arr)
|
||||||
char **arr;
|
char **arr;
|
||||||
|
|
||||||
len = RARRAY_LEN(rb_arr);
|
len = RARRAY_LEN(rb_arr);
|
||||||
arr = malloc(len);
|
arr = calloc(len + 1, sizeof(char *));
|
||||||
if (arr == NULL)
|
if (arr == NULL)
|
||||||
rb_raise(rb_eNoMemError, "unable to allocate array");
|
rb_raise(rb_eNoMemError, "unable to allocate array");
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
VALUE s = rb_ary_entry(rb_arr, i);
|
VALUE s = rb_ary_entry(rb_arr, i);
|
||||||
arr[i] = strdup(StringValuePtr(s));
|
arr[i] = strdup(StringValuePtr(s));
|
||||||
}
|
}
|
||||||
|
arr[len] = NULL;
|
||||||
|
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
free_char_pointer_array(char **arr, size_t len)
|
free_c_string_array(char **arr)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; arr[i] != NULL; i++)
|
||||||
free(arr[i]);
|
free(arr[i]);
|
||||||
free(arr);
|
free(arr);
|
||||||
}
|
}
|
||||||
|
@ -253,14 +254,10 @@ lxc_attach_free_options(lxc_attach_options_t *opts)
|
||||||
return;
|
return;
|
||||||
if (opts->initial_cwd)
|
if (opts->initial_cwd)
|
||||||
free(opts->initial_cwd);
|
free(opts->initial_cwd);
|
||||||
if (opts->extra_env_vars) {
|
if (opts->extra_env_vars)
|
||||||
free_char_pointer_array(opts->extra_env_vars,
|
free_c_string_array(opts->extra_env_vars);
|
||||||
RARRAY_LEN(opts->extra_env_vars));
|
if (opts->extra_keep_env)
|
||||||
}
|
free_c_string_array(opts->extra_keep_env);
|
||||||
if (opts->extra_keep_env) {
|
|
||||||
free_char_pointer_array(opts->extra_keep_env,
|
|
||||||
RARRAY_LEN(opts->extra_keep_env));
|
|
||||||
}
|
|
||||||
free(opts);
|
free(opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -484,7 +481,7 @@ container_clone(int argc, VALUE *argv, VALUE self)
|
||||||
: ruby_to_c_string_array(rb_hook_args);
|
: ruby_to_c_string_array(rb_hook_args);
|
||||||
|
|
||||||
if (hook_args)
|
if (hook_args)
|
||||||
free_char_pointer_array(hook_args, RARRAY_LEN(hook_args));
|
free_c_string_array(hook_args);
|
||||||
|
|
||||||
Data_Get_Struct(self, struct container_data, data);
|
Data_Get_Struct(self, struct container_data, data);
|
||||||
container = data->container;
|
container = data->container;
|
||||||
|
@ -576,7 +573,7 @@ container_create(int argc, VALUE *argv, VALUE self)
|
||||||
ret = container->create(container, template, NULL, NULL, flags, args);
|
ret = container->create(container, template, NULL, NULL, flags, args);
|
||||||
|
|
||||||
if (!NIL_P(rb_args))
|
if (!NIL_P(rb_args))
|
||||||
free_char_pointer_array(args, RARRAY_LEN(rb_args));
|
free_c_string_array(args);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
rb_raise(Error, "unable to create container");
|
rb_raise(Error, "unable to create container");
|
||||||
|
@ -739,7 +736,7 @@ container_interfaces(VALUE self)
|
||||||
for (i = 0; i < num_interfaces; i++)
|
for (i = 0; i < num_interfaces; i++)
|
||||||
rb_ary_store(rb_interfaces, i, rb_str_new2(interfaces[i]));
|
rb_ary_store(rb_interfaces, i, rb_str_new2(interfaces[i]));
|
||||||
|
|
||||||
free_char_pointer_array(interfaces, num_interfaces);
|
free_c_string_array(interfaces);
|
||||||
|
|
||||||
return rb_interfaces;
|
return rb_interfaces;
|
||||||
}
|
}
|
||||||
|
@ -771,7 +768,7 @@ container_ips(int argc, VALUE *argv, VALUE self)
|
||||||
for (i = 0; i < num_ips; i++)
|
for (i = 0; i < num_ips; i++)
|
||||||
rb_ary_store(rb_ips, i, rb_str_new2(ips[i]));
|
rb_ary_store(rb_ips, i, rb_str_new2(ips[i]));
|
||||||
|
|
||||||
free_char_pointer_array(ips, num_ips);
|
free_c_string_array(ips);
|
||||||
|
|
||||||
return rb_ips;
|
return rb_ips;
|
||||||
}
|
}
|
||||||
|
@ -1077,7 +1074,7 @@ container_start(int argc, VALUE *argv, VALUE self)
|
||||||
ret = data->container->start(data->container, use_init, args);
|
ret = data->container->start(data->container, use_init, args);
|
||||||
|
|
||||||
if (!NIL_P(rb_args))
|
if (!NIL_P(rb_args))
|
||||||
free_char_pointer_array(args, RARRAY_LEN(rb_args));
|
free_c_string_array(args);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
rb_raise(Error, "unable to start container");
|
rb_raise(Error, "unable to start container");
|
||||||
|
@ -1238,7 +1235,7 @@ lxc_list_containers(int argc, VALUE *argv, VALUE self)
|
||||||
rb_containers = rb_ary_new2(num_containers);
|
rb_containers = rb_ary_new2(num_containers);
|
||||||
for (i = 0; i < num_containers; i++)
|
for (i = 0; i < num_containers; i++)
|
||||||
rb_ary_store(rb_containers, i, rb_str_new2(names[i]));
|
rb_ary_store(rb_containers, i, rb_str_new2(names[i]));
|
||||||
free_char_pointer_array(names, num_containers);
|
free_c_string_array(names);
|
||||||
|
|
||||||
return rb_containers;
|
return rb_containers;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue