[CRIU] [PATCH] criu: use strtok in parse_ns_string
Pavel Emelyanov
xemul at parallels.com
Tue Aug 5 00:39:04 PDT 2014
On 08/05/2014 12:10 AM, Sophie Blee-Goldman wrote:
Hi, Sophie
> Use strtok to parse the -n option in crtools.c. Will be needed for implementing
> user namespace support.
Can you shed more light on this? The -n option only makes effect if
used on restore from images generated by quite old version of criu.
The prepare_pstree_kobj_ids()'s code
if (!item->ids) {
if (item == root_item) {
cflags = opts.rst_namespaces_flags;
goto set_mask;
}
is about this -- item->ids is NULL only when images are created by
criu older than 1.0.
> Change-Id: Ifb7dc11c94c216a52cf9da7aab4fdf0af4f74152
Remember putting the signed-off-by: line.
> ---
> crtools.c | 40 ++++++++++++++++++++++------------------
> 1 file changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/crtools.c b/crtools.c
> index b7ca833..49b488a 100644
> --- a/crtools.c
> +++ b/crtools.c
> @@ -53,30 +53,34 @@ void init_opts(void)
>
> static int parse_ns_string(const char *ptr)
> {
> - const char *end = ptr + strlen(ptr);
> + int ret = 0;
> + char *ns;
>
> - do {
> - if (ptr[3] != ',' && ptr[3] != '\0')
> - goto bad_ns;
> - if (!strncmp(ptr, "uts", 3))
> + char *copy = strdup(ptr);
> + if (!copy) {
> + pr_msg("Error: malloc failed");
> + return -1;
> + }
> +
> + for (ns = strtok(copy, ","); ns ; ns = strtok(NULL, ",")) {
> + if (!strcmp(ns, "uts")) {
> opts.rst_namespaces_flags |= CLONE_NEWUTS;
> - else if (!strncmp(ptr, "ipc", 3))
> + } else if (!strcmp(ns, "ipc")) {
> opts.rst_namespaces_flags |= CLONE_NEWIPC;
> - else if (!strncmp(ptr, "mnt", 3))
> + } else if (!strcmp(ns, "mnt")) {
> opts.rst_namespaces_flags |= CLONE_NEWNS;
> - else if (!strncmp(ptr, "pid", 3))
> + } else if (!strcmp(ns, "pid")) {
> opts.rst_namespaces_flags |= CLONE_NEWPID;
> - else if (!strncmp(ptr, "net", 3))
> + } else if (!strcmp(ns, "net")) {
> opts.rst_namespaces_flags |= CLONE_NEWNET;
> - else
> - goto bad_ns;
> - ptr += 4;
> - } while (ptr < end);
> - return 0;
> -
> -bad_ns:
> - pr_msg("Error: unknown namespace: %s\n", ptr);
> - return -1;
> + } else {
> + pr_msg("Error: unknown namespace: %s\n", ns);
> + ret = -1;
> + break;
> + }
> + }
> + free(copy);
> + return ret;
> }
>
> char criu_dir_name[PATH_MAX];
>
More information about the CRIU
mailing list