예제 #1
0
/*
 * called during cgroup.c:cgroup_ops_init(), at startup.  No threads.
 * We check whether we can talk to cgmanager, escape to root cgroup if
 * we are root, then close the connection.
 */
struct cgroup_ops *cgm_ops_init(void)
{
	check_supports_multiple_controllers(-1);
	if (!collect_subsytems())
		return NULL;

	if (api_version < CGM_SUPPORTS_MULT_CONTROLLERS)
		cgm_supports_multiple_controllers = false;

	// if root, try to escape to root cgroup
	if (geteuid() == 0 && !cgm_escape()) {
		free_subsystems();
		return NULL;
	}

	return &cgmanager_ops;
}
예제 #2
0
파일: cgmanager.c 프로젝트: MSylvia/koding
/*
 * called during cgroup.c:cgroup_ops_init(), at startup.  No threads.
 * We check whether we can talk to cgmanager, escape to root cgroup if
 * we are root, then close the connection.
 */
struct cgroup_ops *cgm_ops_init(void)
{
	if (!collect_subsytems())
		return NULL;
	if (!cgm_dbus_connect())
		goto err1;

	// root;  try to escape to root cgroup
	if (geteuid() == 0 && !lxc_cgmanager_escape())
		goto err2;
	cgm_dbus_disconnect();

	return &cgmanager_ops;

err2:
	cgm_dbus_disconnect();
err1:
	free_subsystems();
	return NULL;
}
예제 #3
0
static bool collect_subsytems(void)
{
	char *line = NULL;
	nih_local char **cgm_subsys_list = NULL;
	size_t sz = 0;
	FILE *f = NULL;

	if (subsystems) // already initialized
		return true;

	subsystems_inone = malloc(2 * sizeof(char *));
	if (!subsystems_inone)
		return false;
	subsystems_inone[0] = "all";
	subsystems_inone[1] = NULL;

	if (lxc_list_controllers(&cgm_subsys_list)) {
		while (cgm_subsys_list[nr_subsystems]) {
			char **tmp = NIH_MUST( realloc(subsystems,
						(nr_subsystems+2)*sizeof(char *)) );
			tmp[nr_subsystems] = NIH_MUST(
					strdup(cgm_subsys_list[nr_subsystems++]) );
			subsystems = tmp;
		}
		if (nr_subsystems)
			subsystems[nr_subsystems] = NULL;
		goto collected;
	}

	INFO("cgmanager_list_controllers failed, falling back to /proc/self/cgroups");
	f = fopen_cloexec("/proc/self/cgroup", "r");
	if (!f) {
		f = fopen_cloexec("/proc/1/cgroup", "r");
		if (!f)
			return false;
	}
	while (getline(&line, &sz, f) != -1) {
		/* file format: hierarchy:subsystems:group,
		 * with multiple subsystems being ,-separated */
		char *slist, *end, *p, *saveptr = NULL, **tmp;

		if (!line[0])
			continue;

		slist = strchr(line, ':');
		if (!slist)
			continue;
		slist++;
		end = strchr(slist, ':');
		if (!end)
			continue;
		*end = '\0';

		for (p = strtok_r(slist, ",", &saveptr);
				p;
				p = strtok_r(NULL, ",", &saveptr)) {
			tmp = realloc(subsystems, (nr_subsystems+2)*sizeof(char *));
			if (!tmp)
				goto out_free;

			subsystems = tmp;
			tmp[nr_subsystems] = strdup(p);
			tmp[nr_subsystems+1] = NULL;
			if (!tmp[nr_subsystems])
				goto out_free;
			nr_subsystems++;
		}
	}
	fclose(f);
	f = NULL;

	free(line);
	line = NULL;

collected:
	if (!nr_subsystems) {
		ERROR("No cgroup subsystems found");
		return false;
	}

	/* make sure that cgroup.use can be and is honored */
	const char *cgroup_use = lxc_global_config_value("lxc.cgroup.use");
	if (!cgroup_use && errno != 0)
		goto final_verify;
	if (cgroup_use) {
		if (!verify_and_prune(cgroup_use)) {
			free_subsystems();
			return false;
		}
		subsystems_inone[0] = NIH_MUST( strdup(cgroup_use) );
		cgm_all_controllers_same = false;
	}

final_verify:
	return verify_final_subsystems(cgroup_use);

out_free:
	free(line);
	if (f)
		fclose(f);
	free_subsystems();
	return false;
}
예제 #4
0
static bool collect_subsytems(void)
{
    char *line = NULL;
    size_t sz = 0;
    FILE *f;

    if (subsystems) // already initialized
        return true;

    subsystems_inone = malloc(2 * sizeof(char *));
    if (!subsystems_inone)
        return false;
    subsystems_inone[0] = "all";
    subsystems_inone[1] = NULL;

    f = fopen_cloexec("/proc/self/cgroup", "r");
    if (!f) {
        f = fopen_cloexec("/proc/1/cgroup", "r");
        if (!f)
            return false;
    }
    while (getline(&line, &sz, f) != -1) {
        /* file format: hierarchy:subsystems:group,
         * with multiple subsystems being ,-separated */
        char *slist, *end, *p, *saveptr = NULL, **tmp;

        if (!line[0])
            continue;

        slist = strchr(line, ':');
        if (!slist)
            continue;
        slist++;
        end = strchr(slist, ':');
        if (!end)
            continue;
        *end = '\0';

        for (p = strtok_r(slist, ",", &saveptr);
                p;
                p = strtok_r(NULL, ",", &saveptr)) {
            tmp = realloc(subsystems, (nr_subsystems+2)*sizeof(char *));
            if (!tmp)
                goto out_free;

            subsystems = tmp;
            tmp[nr_subsystems] = strdup(p);
            tmp[nr_subsystems+1] = NULL;
            if (!tmp[nr_subsystems])
                goto out_free;
            nr_subsystems++;
        }
    }
    fclose(f);

    free(line);
    if (!nr_subsystems) {
        ERROR("No cgroup subsystems found");
        return false;
    }

    return true;

out_free:
    free(line);
    fclose(f);
    free_subsystems();
    return false;
}