Changeset View
Changeset View
Standalone View
Standalone View
lib/libcasper/services/cap_grp/cap_grp.c
Show First 20 Lines • Show All 261 Lines • ▼ Show 20 Lines | cap_getgrcommon(cap_channel_t *chan, const char *cmd, const char *name, | ||||
return (result); | return (result); | ||||
} | } | ||||
struct group * | struct group * | ||||
cap_getgrent(cap_channel_t *chan) | cap_getgrent(cap_channel_t *chan) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getgrent()); | |||||
return (cap_getgrcommon(chan, "getgrent", NULL, 0)); | return (cap_getgrcommon(chan, "getgrent", NULL, 0)); | ||||
} | } | ||||
struct group * | struct group * | ||||
cap_getgrnam(cap_channel_t *chan, const char *name) | cap_getgrnam(cap_channel_t *chan, const char *name) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getgrnam(name)); | |||||
return (cap_getgrcommon(chan, "getgrnam", name, 0)); | return (cap_getgrcommon(chan, "getgrnam", name, 0)); | ||||
} | } | ||||
struct group * | struct group * | ||||
cap_getgrgid(cap_channel_t *chan, gid_t gid) | cap_getgrgid(cap_channel_t *chan, gid_t gid) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getgrgid(gid)); | |||||
return (cap_getgrcommon(chan, "getgrgid", NULL, gid)); | return (cap_getgrcommon(chan, "getgrgid", NULL, gid)); | ||||
} | } | ||||
int | int | ||||
cap_getgrent_r(cap_channel_t *chan, struct group *grp, char *buffer, | cap_getgrent_r(cap_channel_t *chan, struct group *grp, char *buffer, | ||||
size_t bufsize, struct group **result) | size_t bufsize, struct group **result) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getgrent_r(grp, buffer, bufsize, result)); | |||||
return (cap_getgrcommon_r(chan, "getgrent_r", NULL, 0, grp, buffer, | return (cap_getgrcommon_r(chan, "getgrent_r", NULL, 0, grp, buffer, | ||||
bufsize, result)); | bufsize, result)); | ||||
} | } | ||||
int | int | ||||
cap_getgrnam_r(cap_channel_t *chan, const char *name, struct group *grp, | cap_getgrnam_r(cap_channel_t *chan, const char *name, struct group *grp, | ||||
char *buffer, size_t bufsize, struct group **result) | char *buffer, size_t bufsize, struct group **result) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getgrnam_r(name, grp, buffer, bufsize, result)); | |||||
return (cap_getgrcommon_r(chan, "getgrnam_r", name, 0, grp, buffer, | return (cap_getgrcommon_r(chan, "getgrnam_r", name, 0, grp, buffer, | ||||
bufsize, result)); | bufsize, result)); | ||||
} | } | ||||
int | int | ||||
cap_getgrgid_r(cap_channel_t *chan, gid_t gid, struct group *grp, char *buffer, | cap_getgrgid_r(cap_channel_t *chan, gid_t gid, struct group *grp, char *buffer, | ||||
size_t bufsize, struct group **result) | size_t bufsize, struct group **result) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getgrgid_r(gid, grp, buffer, bufsize, result)); | |||||
return (cap_getgrcommon_r(chan, "getgrgid_r", NULL, gid, grp, buffer, | return (cap_getgrcommon_r(chan, "getgrgid_r", NULL, gid, grp, buffer, | ||||
bufsize, result)); | bufsize, result)); | ||||
} | } | ||||
int | int | ||||
cap_setgroupent(cap_channel_t *chan, int stayopen) | cap_setgroupent(cap_channel_t *chan, int stayopen) | ||||
{ | { | ||||
nvlist_t *nvl; | nvlist_t *nvl; | ||||
if (!cap_enable(chan)) | |||||
return (setgroupent(stayopen)); | |||||
nvl = nvlist_create(0); | nvl = nvlist_create(0); | ||||
nvlist_add_string(nvl, "cmd", "setgroupent"); | nvlist_add_string(nvl, "cmd", "setgroupent"); | ||||
nvlist_add_bool(nvl, "stayopen", stayopen != 0); | nvlist_add_bool(nvl, "stayopen", stayopen != 0); | ||||
nvl = cap_xfer_nvlist(chan, nvl, 0); | nvl = cap_xfer_nvlist(chan, nvl, 0); | ||||
if (nvl == NULL) | if (nvl == NULL) | ||||
return (0); | return (0); | ||||
if (nvlist_get_number(nvl, "error") != 0) { | if (nvlist_get_number(nvl, "error") != 0) { | ||||
errno = nvlist_get_number(nvl, "error"); | errno = nvlist_get_number(nvl, "error"); | ||||
nvlist_destroy(nvl); | nvlist_destroy(nvl); | ||||
return (0); | return (0); | ||||
} | } | ||||
nvlist_destroy(nvl); | nvlist_destroy(nvl); | ||||
return (1); | return (1); | ||||
} | } | ||||
int | int | ||||
cap_setgrent(cap_channel_t *chan) | cap_setgrent(cap_channel_t *chan) | ||||
{ | { | ||||
nvlist_t *nvl; | nvlist_t *nvl; | ||||
if (!cap_enable(chan)) | |||||
return (setgrent()); | |||||
nvl = nvlist_create(0); | nvl = nvlist_create(0); | ||||
nvlist_add_string(nvl, "cmd", "setgrent"); | nvlist_add_string(nvl, "cmd", "setgrent"); | ||||
nvl = cap_xfer_nvlist(chan, nvl, 0); | nvl = cap_xfer_nvlist(chan, nvl, 0); | ||||
if (nvl == NULL) | if (nvl == NULL) | ||||
return (0); | return (0); | ||||
if (nvlist_get_number(nvl, "error") != 0) { | if (nvlist_get_number(nvl, "error") != 0) { | ||||
errno = nvlist_get_number(nvl, "error"); | errno = nvlist_get_number(nvl, "error"); | ||||
nvlist_destroy(nvl); | nvlist_destroy(nvl); | ||||
return (0); | return (0); | ||||
} | } | ||||
nvlist_destroy(nvl); | nvlist_destroy(nvl); | ||||
return (1); | return (1); | ||||
} | } | ||||
void | void | ||||
cap_endgrent(cap_channel_t *chan) | cap_endgrent(cap_channel_t *chan) | ||||
{ | { | ||||
nvlist_t *nvl; | nvlist_t *nvl; | ||||
if (!cap_enable(chan)) | |||||
return (endgrent()); | |||||
nvl = nvlist_create(0); | nvl = nvlist_create(0); | ||||
nvlist_add_string(nvl, "cmd", "endgrent"); | nvlist_add_string(nvl, "cmd", "endgrent"); | ||||
/* Ignore any errors, we have no way to report them. */ | /* Ignore any errors, we have no way to report them. */ | ||||
nvlist_destroy(cap_xfer_nvlist(chan, nvl, 0)); | nvlist_destroy(cap_xfer_nvlist(chan, nvl, 0)); | ||||
} | } | ||||
int | int | ||||
cap_grp_limit_cmds(cap_channel_t *chan, const char * const *cmds, size_t ncmds) | cap_grp_limit_cmds(cap_channel_t *chan, const char * const *cmds, size_t ncmds) | ||||
{ | { | ||||
nvlist_t *limits, *nvl; | nvlist_t *limits, *nvl; | ||||
unsigned int i; | unsigned int i; | ||||
if (!cap_enable(chan)) | |||||
return (0); | |||||
if (cap_limit_get(chan, &limits) < 0) | if (cap_limit_get(chan, &limits) < 0) | ||||
return (-1); | return (-1); | ||||
if (limits == NULL) { | if (limits == NULL) { | ||||
limits = nvlist_create(0); | limits = nvlist_create(0); | ||||
} else { | } else { | ||||
if (nvlist_exists_nvlist(limits, "cmds")) | if (nvlist_exists_nvlist(limits, "cmds")) | ||||
nvlist_free_nvlist(limits, "cmds"); | nvlist_free_nvlist(limits, "cmds"); | ||||
} | } | ||||
nvl = nvlist_create(0); | nvl = nvlist_create(0); | ||||
for (i = 0; i < ncmds; i++) | for (i = 0; i < ncmds; i++) | ||||
nvlist_add_null(nvl, cmds[i]); | nvlist_add_null(nvl, cmds[i]); | ||||
nvlist_move_nvlist(limits, "cmds", nvl); | nvlist_move_nvlist(limits, "cmds", nvl); | ||||
return (cap_limit_set(chan, limits)); | return (cap_limit_set(chan, limits)); | ||||
} | } | ||||
int | int | ||||
cap_grp_limit_fields(cap_channel_t *chan, const char * const *fields, | cap_grp_limit_fields(cap_channel_t *chan, const char * const *fields, | ||||
size_t nfields) | size_t nfields) | ||||
{ | { | ||||
nvlist_t *limits, *nvl; | nvlist_t *limits, *nvl; | ||||
unsigned int i; | unsigned int i; | ||||
if (!cap_enable(chan)) | |||||
return (0); | |||||
if (cap_limit_get(chan, &limits) < 0) | if (cap_limit_get(chan, &limits) < 0) | ||||
return (-1); | return (-1); | ||||
if (limits == NULL) { | if (limits == NULL) { | ||||
limits = nvlist_create(0); | limits = nvlist_create(0); | ||||
} else { | } else { | ||||
if (nvlist_exists_nvlist(limits, "fields")) | if (nvlist_exists_nvlist(limits, "fields")) | ||||
nvlist_free_nvlist(limits, "fields"); | nvlist_free_nvlist(limits, "fields"); | ||||
} | } | ||||
nvl = nvlist_create(0); | nvl = nvlist_create(0); | ||||
for (i = 0; i < nfields; i++) | for (i = 0; i < nfields; i++) | ||||
nvlist_add_null(nvl, fields[i]); | nvlist_add_null(nvl, fields[i]); | ||||
nvlist_move_nvlist(limits, "fields", nvl); | nvlist_move_nvlist(limits, "fields", nvl); | ||||
return (cap_limit_set(chan, limits)); | return (cap_limit_set(chan, limits)); | ||||
} | } | ||||
int | int | ||||
cap_grp_limit_groups(cap_channel_t *chan, const char * const *names, | cap_grp_limit_groups(cap_channel_t *chan, const char * const *names, | ||||
size_t nnames, gid_t *gids, size_t ngids) | size_t nnames, gid_t *gids, size_t ngids) | ||||
{ | { | ||||
nvlist_t *limits, *groups; | nvlist_t *limits, *groups; | ||||
unsigned int i; | unsigned int i; | ||||
char nvlname[64]; | char nvlname[64]; | ||||
int n; | int n; | ||||
if (!cap_enable(chan)) | |||||
return (0); | |||||
if (cap_limit_get(chan, &limits) < 0) | if (cap_limit_get(chan, &limits) < 0) | ||||
return (-1); | return (-1); | ||||
if (limits == NULL) { | if (limits == NULL) { | ||||
limits = nvlist_create(0); | limits = nvlist_create(0); | ||||
} else { | } else { | ||||
if (nvlist_exists_nvlist(limits, "groups")) | if (nvlist_exists_nvlist(limits, "groups")) | ||||
nvlist_free_nvlist(limits, "groups"); | nvlist_free_nvlist(limits, "groups"); | ||||
▲ Show 20 Lines • Show All 365 Lines • Show Last 20 Lines |