<div dir="ltr">I wasn&#39;t aware that the -n option was no longer relevant, but in that case this patch probably won&#39;t be needed. It was just there to prepare for the user namespace support patches, which I will be sending out soon.<div>

<br></div><div>Thanks,</div><div><br></div><div>Sophie</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Aug 5, 2014 at 12:39 AM, Pavel Emelyanov <span dir="ltr">&lt;<a href="mailto:xemul@parallels.com" target="_blank">xemul@parallels.com</a>&gt;</span> wrote:<br>

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