コード例 #1
0
ファイル: funcs.c プロジェクト: carmark/illumos-gate
static const char *
check_proj(const char *proj)
{
	if (getprojidbyname(proj) < 0) {
		return (proj);
	} else {
		return (NULL);
	}
}
コード例 #2
0
ファイル: prstat.c プロジェクト: andreiw/polaris
static void
fill_prj_table(char *arg)
{
	projid_t projid;
	char *p = strtok(arg, ", ");

	if (p == NULL)
		Die(gettext("invalid argument for -j\n"));

	if ((projid = getprojidbyname(p)) == -1)
		projid = Atoi(p);
	add_element(&prj_tbl, (long)projid);

	while (p = strtok(NULL, ", ")) {
		if ((projid = getprojidbyname(p)) == -1)
			projid = Atoi(p);
		add_element(&prj_tbl, (long)projid);
	}
}
コード例 #3
0
ファイル: psecflags.c プロジェクト: bahamas10/openzfs
static id_t
getid(idtype_t type, char *value)
{
	struct passwd *pwd;
	struct group *grp;
	id_t ret;
	char *endp;

	switch (type) {
	case P_UID:
		if ((pwd = getpwnam(value)) != NULL)
			return (pwd->pw_uid);
		break;
	case P_GID:
		if ((grp = getgrnam(value)) != NULL)
			return (grp->gr_gid);
		break;
	case P_PROJID:
		if ((ret = getprojidbyname(value)) != (id_t)-1)
			return (ret);
		break;
	case P_ZONEID:
		if (zone_get_id(value, &ret) == 0)
			return (ret);
		break;
	default:
		break;
	}

	errno = 0;

	ret = (id_t)strtoul(value, &endp, 10);

	if ((errno != 0) || (*endp != '\0'))
		return ((id_t)-1);

	return (ret);
}
コード例 #4
0
ファイル: poolbind.c プロジェクト: AlainODea/illumos-gate
void
process_ids(char *pool_name, uint_t flags, idtype_t idtype, char *idstr,
    int argc, char *argv[])
{
	int i;
	id_t id;

	for (i = 0; i < argc; i++) {
		char *endp;
		char *poolname;

		errno = 0;
		id = (id_t)strtol(argv[i], &endp, 10);
		if (errno != 0 ||
		    (endp && endp != argv[i] + strlen(argv[i])) ||
		    (idtype == P_ZONEID &&
		    getzonenamebyid(id, NULL, 0) == -1)) {
			/*
			 * The string does not completely parse to
			 * an integer, or it represents an invalid
			 * zone id.
			 */

			/*
			 * It must be a project or zone name.
			 */
			if (idtype == P_ZONEID) {
				if (zone_get_id(argv[i], &id) != 0) {
					warn(gettext("invalid zone '%s'\n"),
					    argv[i]);
					error = E_ERROR;
					continue;
				}
				/* make sure the zone is booted */
				if (id == -1) {
					warn(gettext("zone '%s' is not "
					    "active\n"), argv[i]);
					error = E_ERROR;
					continue;
				}
			} else if (idtype == P_PROJID) {
				if ((id = getprojidbyname(argv[i])) < 0) {
					warn(gettext("failed to get project "
					    "id for project: '%s'"), argv[i]);
					error = E_ERROR;
					continue;
				}
			} else {
				warn(gettext("invalid %s '%s'\n"),
				    idstr, argv[i]);
				error = E_ERROR;
				continue;
			}
		}

		if (flags & pFLAG) {
			if (pool_set_binding(pool_name, idtype, id) !=
			    PO_SUCCESS) {
				warn(gettext("binding %s %ld to pool '%s': "
				    "%s\n"), idstr, id, pool_name,
				    get_errstr());
				error = E_ERROR;
			}
			continue;
		}

		if (flags & qFLAG) {
			if ((poolname = pool_get_binding(id)) == NULL) {
				warn(gettext("couldn't determine binding for "
				    "pid %ld: %s\n"), id, get_errstr());
				error = E_ERROR;
			} else {
				(void) printf("%ld\t%s\n", id, poolname);
				free(poolname);
			}
		}
		if (flags & QFLAG) {
			uint_t j, count;
			const char **resource_types;
			(void) pool_resource_type_list(NULL, &count);

			if ((resource_types = malloc(count *
			    sizeof (const char *))) == NULL) {
				warn(gettext("couldn't allocate query memory "
				    "for pid %ld: %s\n"), id, get_errstr());
				error = E_ERROR;
			}
			(void) pool_resource_type_list(resource_types, &count);

			for (j = 0; j < count; j++)
				(void) print_resource_binding(resource_types[j],
				    (pid_t)id);
			free(resource_types);
		}
	}
}