int cap_dns_family_limit(cap_channel_t *chan, const int *families, size_t nfamilies) { nvlist_t *limits; unsigned int i; if (cap_limit_get(chan, &limits) < 0) return (-1); if (limits == NULL) limits = nvlist_create(0); else limit_remove(limits, "family"); for (i = 0; i < nfamilies; i++) { nvlist_addf_number(limits, (uint64_t)families[i], "family%u", i); } return (cap_limit_set(chan, limits)); }
int cap_pwd_limit_users(cap_channel_t *chan, const char * const *names, size_t nnames, uid_t *uids, size_t nuids) { nvlist_t *limits, *users; unsigned int i; if (cap_limit_get(chan, &limits) < 0) return (-1); if (limits == NULL) { limits = nvlist_create(0); } else { if (nvlist_exists_nvlist(limits, "users")) nvlist_free_nvlist(limits, "users"); } users = nvlist_create(0); for (i = 0; i < nuids; i++) nvlist_addf_number(users, (uint64_t)uids[i], "uid%u", i); for (i = 0; i < nnames; i++) nvlist_addf_string(users, names[i], "name%u", i); nvlist_move_nvlist(limits, "users", users); return (cap_limit_set(chan, limits)); }
void nvlist_add_number(nvlist_t *nvl, const char *name, uint64_t value) { nvlist_addf_number(nvl, value, "%s", name); }