store criu version

- If version != NULL criu_version_ok() stores the detected criu version in
  version. Allocates memory for version which must be freed by caller.
- If version == NULL criu_version_ok() will return true when the version
  matches, false in all other cases.

Signed-off-by: Christian Brauner <cbrauner@suse.de>
This commit is contained in:
Christian Brauner 2016-07-05 16:52:21 +02:00
parent a715a9bcb2
commit 5407e2abae

View File

@ -402,8 +402,11 @@ err:
* *
* The intent is that when criu development slows down, we can drop this, but * 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. * for now we shouldn't attempt to c/r with versions that we know won't work.
*
* Note: If version != NULL criu_version() stores the detected criu version in
* version. Allocates memory for version which must be freed by caller.
*/ */
static bool criu_version_ok() static bool criu_version_ok(char **version)
{ {
int pipes[2]; int pipes[2];
pid_t pid; pid_t pid;
@ -436,7 +439,7 @@ static bool criu_version_ok()
exit(1); exit(1);
} else { } else {
FILE *f; FILE *f;
char version[1024]; char *tmp;
int patch; int patch;
close(pipes[1]); close(pipes[1]);
@ -452,16 +455,22 @@ static bool criu_version_ok()
return false; return false;
} }
if (fscanf(f, "Version: %1023[^\n]s", version) != 1) tmp = malloc(1024);
if (!tmp) {
fclose(f);
return false;
}
if (fscanf(f, "Version: %1023[^\n]s", tmp) != 1)
goto version_error; goto version_error;
if (fgetc(f) != '\n') if (fgetc(f) != '\n')
goto version_error; goto version_error;
if (strcmp(version, CRIU_VERSION) >= 0) if (strcmp(tmp, CRIU_VERSION) >= 0)
goto version_match; goto version_match;
if (fscanf(f, "GitID: v%1023[^-]s", version) != 1) if (fscanf(f, "GitID: v%1023[^-]s", tmp) != 1)
goto version_error; goto version_error;
if (fgetc(f) != '-') if (fgetc(f) != '-')
@ -470,7 +479,7 @@ static bool criu_version_ok()
if (fscanf(f, "%d", &patch) != 1) if (fscanf(f, "%d", &patch) != 1)
goto version_error; goto version_error;
if (strcmp(version, CRIU_GITID_VERSION) < 0) if (strcmp(tmp, CRIU_GITID_VERSION) < 0)
goto version_error; goto version_error;
if (patch < CRIU_GITID_PATCHLEVEL) if (patch < CRIU_GITID_PATCHLEVEL)
@ -478,10 +487,15 @@ static bool criu_version_ok()
version_match: version_match:
fclose(f); fclose(f);
if (!version)
free(tmp);
else
*version = tmp;
return true; return true;
version_error: version_error:
fclose(f); fclose(f);
free(tmp);
ERROR("must have criu " CRIU_VERSION " or greater to checkpoint/restore\n"); ERROR("must have criu " CRIU_VERSION " or greater to checkpoint/restore\n");
return false; return false;
} }
@ -493,7 +507,7 @@ static bool criu_ok(struct lxc_container *c)
{ {
struct lxc_list *it; struct lxc_list *it;
if (!criu_version_ok()) if (!criu_version_ok(NULL))
return false; return false;
if (geteuid()) { if (geteuid()) {