static const char * check_proj(const char *proj) { if (getprojidbyname(proj) < 0) { return (proj); } else { return (NULL); } }
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); } }
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); }
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); } } }