Commit 5a44f7f4 authored by Pavel Emelyanov's avatar Pavel Emelyanov

zdtm: Sanitize cgroup00 test

Prepare it for multiple tasks by moving cg creation and
checking code into helpers.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent f5e92084
...@@ -12,83 +12,105 @@ const char *test_author = "Pavel Emelianov <xemul@parallels.com>"; ...@@ -12,83 +12,105 @@ const char *test_author = "Pavel Emelianov <xemul@parallels.com>";
char *dirname; char *dirname;
TEST_OPTION(dirname, string, "cgroup directory name", 1); TEST_OPTION(dirname, string, "cgroup directory name", 1);
static const char *cgname = "zdtmtst"; static const char *cgname = "zdtmtst";
static const char *subname = "subcg"; #define SUBNAME "subcg"
int main(int argc, char **argv) static int cg_move(char *name)
{ {
int cgfd, l, ret = 1; int cgfd, l;
char aux[32], paux[1024]; char paux[256];
FILE *cgf;
test_init(argc, argv);
if (mkdir(dirname, 0700) < 0) {
err("Can't make dir");
goto out;
}
sprintf(aux, "none,name=%s", cgname);
if (mount("none", dirname, "cgroup", 0, aux)) {
err("Can't mount cgroups");
goto out_rd;
}
sprintf(paux, "%s/%s", dirname, subname); sprintf(paux, "%s/%s", dirname, name);
mkdir(paux, 0600); mkdir(paux, 0600);
l = sprintf(aux, "%d", getpid()); sprintf(paux, "%s/%s/tasks", dirname, name);
sprintf(paux, "%s/%s/tasks", dirname, subname);
cgfd = open(paux, O_WRONLY); cgfd = open(paux, O_WRONLY);
if (cgfd < 0) { if (cgfd < 0) {
err("Can't open tasks"); err("Can't open tasks");
goto out_rs; return -1;
} }
l = write(cgfd, aux, l); l = write(cgfd, "0", 2);
close(cgfd); close(cgfd);
if (l < 0) { if (l < 0) {
err("Can't move self to subcg"); err("Can't move self to subcg");
goto out_rs; return -1;
} }
close(cgfd); return 0;
}
test_daemon(); static int cg_check(char *name)
test_waitsig(); {
int found = 0;
FILE *cgf;
char paux[256], aux[128];
cgf = fopen("/proc/self/cgroup", "r"); cgf = fopen("/proc/self/cgroup", "r");
if (cgf == NULL) { if (cgf == NULL)
fail("No cgroups file"); return -1;
goto out_rs;
}
sprintf(aux, "name=%s:/%s\n", cgname, subname); sprintf(aux, "name=%s:/%s\n", cgname, name);
while (fgets(paux, sizeof(paux), cgf)) { while (fgets(paux, sizeof(paux), cgf)) {
char *s; char *s;
s = strchr(paux, ':') + 1; s = strchr(paux, ':') + 1;
test_msg("CMP [%s] vs [%s]\n", s, aux); test_msg("CMP [%s] vs [%s]\n", s, aux);
if (!strcmp(s, aux)) { if (!strcmp(s, aux)) {
ret = 0; found = 1;
break; break;
} }
} }
fclose(cgf); fclose(cgf);
if (!ret) return found ? 0 : -1;
}
static void cg_cleanup(void)
{
char paux[256];
sprintf(paux, "%s/%s", dirname, SUBNAME);
rmdir(paux);
}
int main(int argc, char **argv)
{
char aux[64];
test_init(argc, argv);
if (mkdir(dirname, 0700) < 0) {
err("Can't make dir");
goto out;
}
sprintf(aux, "none,name=%s", cgname);
if (mount("none", dirname, "cgroup", 0, aux)) {
err("Can't mount cgroups");
goto out_rd;
}
if (cg_move(SUBNAME))
goto out_rs;
test_daemon();
test_waitsig();
if (cg_check(SUBNAME)) {
fail("Top level task cg changed");
goto out_rs;
}
pass(); pass();
else
fail("Task is not in subgroups");
out_rs: out_rs:
sprintf(paux, "%s/%s", dirname, subname); cg_cleanup();
rmdir(paux);
umount(dirname); umount(dirname);
out_rd: out_rd:
rmdir(dirname); rmdir(dirname);
out: out:
return ret; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment