On Fri, Apr 17, 2015 at 04:28:33PM +0000, Serge Hallyn wrote:
> Quoting Tycho Andersen (tycho.ander...@canonical.com):
> > Note that we allow both a tagged version or a git build that has sufficient
> > patches for the features we require.
> > 
> > Signed-off-by: Tycho Andersen <tycho.ander...@canonical.com>
> 
> Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com>
> 
> just one q below,
> 
> > ---
> >  src/lxc/criu.c | 89 
> > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 89 insertions(+)
> > 
> > diff --git a/src/lxc/criu.c b/src/lxc/criu.c
> > index 043db36..12b3be9 100644
> > --- a/src/lxc/criu.c
> > +++ b/src/lxc/criu.c
> > @@ -193,6 +193,92 @@ err:
> >     free(argv);
> >  }
> >  
> > +/*
> > + * Check to see if the criu version is recent enough for all the features 
> > we
> > + * use. This version allows either CRIU_VERSION or (CRIU_GITID_VERSION and
> > + * CRIU_GITID_PATCHLEVEL) to work, enabling users building from git to c/r
> > + * things potentially before a version is released with a particular 
> > feature.
> > + *
> > + * The intent is that when criu development slows down, we can drop this, 
> > but
> > + * for now we shouldn't attempt to c/r with versions that we know won't 
> > work.
> > + */
> > +static bool criu_version_ok()
> > +{
> > +   int pipes[2];
> > +   pid_t pid;
> > +
> > +   if (pipe(pipes) < 0) {
> > +           SYSERROR("pipe() failed");
> > +           return false;
> > +   }
> > +
> > +   pid = fork();
> > +   if (pid < 0) {
> > +           SYSERROR("fork() failed");
> > +           return false;
> > +   }
> > +
> > +   if (pid == 0) {
> > +           char *args[] = { "criu", "--version", NULL };
> > +           close(pipes[0]);
> > +
> > +           if (dup2(pipes[1], STDOUT_FILENO) < 0)
> > +                   exit(1);
> 
> Should you also close stderr?

Yes, that's probably a good idea. I'll resend with that.

Tycho

> > +           execv("/usr/local/sbin/criu", args);
> > +           exit(1);
> > +   } else {
> > +           FILE *f;
> > +           char version[1024];
> > +           int patch;
> > +
> > +           close(pipes[1]);
> > +           if (wait_for_pid(pid) < 0) {
> > +                   close(pipes[0]);
> > +                   return false;
> > +           }
> > +
> > +           f = fdopen(pipes[0], "r");
> > +           if (!f) {
> > +                   close(pipes[0]);
> > +                   return false;
> > +           }
> > +
> > +           if (fscanf(f, "Version: %1024[^\n]s", version) != 1)
> > +                   goto version_error;
> > +
> > +           if (fgetc(f) != '\n')
> > +                   goto version_error;
> > +
> > +           if (strcmp(version, CRIU_VERSION) >= 0)
> > +                   goto version_match;
> > +
> > +           if (fscanf(f, "GitID: v%1024[^-]s", version) != 1)
> > +                   goto version_error;
> > +
> > +           if (fgetc(f) != '-')
> > +                   goto version_error;
> > +
> > +           if (fscanf(f, "%d", &patch) != 1)
> > +                   goto version_error;
> > +
> > +           if (strcmp(version, CRIU_GITID_VERSION) < 0)
> > +                   goto version_error;
> > +
> > +           if (patch < CRIU_GITID_PATCHLEVEL)
> > +                   goto version_error;
> > +
> > +version_match:
> > +           close(pipes[0]);
> > +           return true;
> > +
> > +version_error:
> > +           close(pipes[0]);
> > +           ERROR("must have criu " CRIU_VERSION " or greater to 
> > checkpoint/restore\n");
> > +           return false;
> > +   }
> > +}
> > +
> >  /* Check and make sure the container has a configuration that we know CRIU 
> > can
> >   * dump. */
> >  bool criu_ok(struct lxc_container *c)
> > @@ -200,6 +286,9 @@ bool criu_ok(struct lxc_container *c)
> >     struct lxc_list *it;
> >     bool found_deny_rule = false;
> >  
> > +   if (!criu_version_ok())
> > +           return false;
> > +
> >     if (geteuid()) {
> >             ERROR("Must be root to checkpoint\n");
> >             return false;
> > -- 
> > 2.1.4
> > 
> > _______________________________________________
> > lxc-devel mailing list
> > lxc-devel@lists.linuxcontainers.org
> > http://lists.linuxcontainers.org/listinfo/lxc-devel
> _______________________________________________
> lxc-devel mailing list
> lxc-devel@lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to