Changeset View
Changeset View
Standalone View
Standalone View
lib/libcasper/services/cap_pwd/cap_pwd.c
Show First 20 Lines • Show All 221 Lines • ▼ Show 20 Lines | cap_getpwcommon(cap_channel_t *chan, const char *cmd, const char *login, | ||||
return (result); | return (result); | ||||
} | } | ||||
struct passwd * | struct passwd * | ||||
cap_getpwent(cap_channel_t *chan) | cap_getpwent(cap_channel_t *chan) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getpwent()); | |||||
return (cap_getpwcommon(chan, "getpwent", NULL, 0)); | return (cap_getpwcommon(chan, "getpwent", NULL, 0)); | ||||
} | } | ||||
struct passwd * | struct passwd * | ||||
cap_getpwnam(cap_channel_t *chan, const char *login) | cap_getpwnam(cap_channel_t *chan, const char *login) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getpwnam(login)); | |||||
return (cap_getpwcommon(chan, "getpwnam", login, 0)); | return (cap_getpwcommon(chan, "getpwnam", login, 0)); | ||||
} | } | ||||
struct passwd * | struct passwd * | ||||
cap_getpwuid(cap_channel_t *chan, uid_t uid) | cap_getpwuid(cap_channel_t *chan, uid_t uid) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getpwuid(uid)); | |||||
return (cap_getpwcommon(chan, "getpwuid", NULL, uid)); | return (cap_getpwcommon(chan, "getpwuid", NULL, uid)); | ||||
} | } | ||||
int | int | ||||
cap_getpwent_r(cap_channel_t *chan, struct passwd *pwd, char *buffer, | cap_getpwent_r(cap_channel_t *chan, struct passwd *pwd, char *buffer, | ||||
size_t bufsize, struct passwd **result) | size_t bufsize, struct passwd **result) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getpwent_r(pwd, buffer, bufsize, result)); | |||||
return (cap_getpwcommon_r(chan, "getpwent_r", NULL, 0, pwd, buffer, | return (cap_getpwcommon_r(chan, "getpwent_r", NULL, 0, pwd, buffer, | ||||
bufsize, result)); | bufsize, result)); | ||||
} | } | ||||
int | int | ||||
cap_getpwnam_r(cap_channel_t *chan, const char *name, struct passwd *pwd, | cap_getpwnam_r(cap_channel_t *chan, const char *name, struct passwd *pwd, | ||||
char *buffer, size_t bufsize, struct passwd **result) | char *buffer, size_t bufsize, struct passwd **result) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getpwnam_r(name, pwd, buffer, bufsize, result)); | |||||
return (cap_getpwcommon_r(chan, "getpwnam_r", name, 0, pwd, buffer, | return (cap_getpwcommon_r(chan, "getpwnam_r", name, 0, pwd, buffer, | ||||
bufsize, result)); | bufsize, result)); | ||||
} | } | ||||
int | int | ||||
cap_getpwuid_r(cap_channel_t *chan, uid_t uid, struct passwd *pwd, char *buffer, | cap_getpwuid_r(cap_channel_t *chan, uid_t uid, struct passwd *pwd, char *buffer, | ||||
size_t bufsize, struct passwd **result) | size_t bufsize, struct passwd **result) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (getpwuid_r(uid, pwd, buffer, bufsize, result)); | |||||
return (cap_getpwcommon_r(chan, "getpwuid_r", NULL, uid, pwd, buffer, | return (cap_getpwcommon_r(chan, "getpwuid_r", NULL, uid, pwd, buffer, | ||||
bufsize, result)); | bufsize, result)); | ||||
} | } | ||||
int | int | ||||
cap_setpassent(cap_channel_t *chan, int stayopen) | cap_setpassent(cap_channel_t *chan, int stayopen) | ||||
{ | { | ||||
nvlist_t *nvl; | nvlist_t *nvl; | ||||
if (!cap_enable(chan)) | |||||
return (setpassent(stayopen)); | |||||
nvl = nvlist_create(0); | nvl = nvlist_create(0); | ||||
nvlist_add_string(nvl, "cmd", "setpassent"); | nvlist_add_string(nvl, "cmd", "setpassent"); | ||||
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"); | ||||
Show All 15 Lines | cap_set_end_pwent(cap_channel_t *chan, const char *cmd) | ||||
/* 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)); | ||||
} | } | ||||
void | void | ||||
cap_setpwent(cap_channel_t *chan) | cap_setpwent(cap_channel_t *chan) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (setpwent()); | |||||
cap_set_end_pwent(chan, "setpwent"); | cap_set_end_pwent(chan, "setpwent"); | ||||
} | } | ||||
void | void | ||||
cap_endpwent(cap_channel_t *chan) | cap_endpwent(cap_channel_t *chan) | ||||
{ | { | ||||
if (!cap_enable(chan)) | |||||
return (endpwent()); | |||||
cap_set_end_pwent(chan, "endpwent"); | cap_set_end_pwent(chan, "endpwent"); | ||||
} | } | ||||
int | int | ||||
cap_pwd_limit_cmds(cap_channel_t *chan, const char * const *cmds, size_t ncmds) | cap_pwd_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_pwd_limit_fields(cap_channel_t *chan, const char * const *fields, | cap_pwd_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_pwd_limit_users(cap_channel_t *chan, const char * const *names, | cap_pwd_limit_users(cap_channel_t *chan, const char * const *names, | ||||
size_t nnames, uid_t *uids, size_t nuids) | size_t nnames, uid_t *uids, size_t nuids) | ||||
{ | { | ||||
nvlist_t *limits, *users; | nvlist_t *limits, *users; | ||||
char nvlname[64]; | char nvlname[64]; | ||||
unsigned int i; | unsigned int i; | ||||
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, "users")) | if (nvlist_exists_nvlist(limits, "users")) | ||||
nvlist_free_nvlist(limits, "users"); | nvlist_free_nvlist(limits, "users"); | ||||
▲ Show 20 Lines • Show All 405 Lines • Show Last 20 Lines |