summaryrefslogtreecommitdiff
path: root/nslcd/db_passwd.c
diff options
context:
space:
mode:
Diffstat (limited to 'nslcd/db_passwd.c')
-rw-r--r--nslcd/db_passwd.c125
1 files changed, 68 insertions, 57 deletions
diff --git a/nslcd/db_passwd.c b/nslcd/db_passwd.c
index ed57098..5696aaf 100644
--- a/nslcd/db_passwd.c
+++ b/nslcd/db_passwd.c
@@ -67,104 +67,115 @@ static int write_passwd(TFILE *fp, struct passwd *entry, uid_t calleruid)
if ((passwd == NULL) || (calleruid != 0))
passwd = "!";
}
- if (entry->pw_uid >= nslcd_cfg->nss_min_uid)
- {
- WRITE_INT32(fp, NSLCD_RESULT_BEGIN);
- WRITE_STRING(fp, entry->pw_name );
- WRITE_STRING(fp, passwd );
- WRITE_INT32( fp, entry->pw_uid );
- WRITE_INT32( fp, entry->pw_gid );
- WRITE_STRING(fp, entry->pw_gecos);
- WRITE_STRING(fp, entry->pw_dir );
- WRITE_STRING(fp, entry->pw_shell);
- }
+ WRITE_STRING(fp, entry->pw_name );
+ WRITE_STRING(fp, passwd );
+ WRITE_INT32( fp, entry->pw_uid );
+ WRITE_INT32( fp, entry->pw_gid );
+ WRITE_STRING(fp, entry->pw_gecos);
+ WRITE_STRING(fp, entry->pw_dir );
+ WRITE_STRING(fp, entry->pw_shell);
return 0;
}
NSLCD_HANDLE_UID(PASSWD, BYNAME
- ,/* decls */
- char name[BUFLEN_NAME];
- ,/* int read(TFILE *fp) */
- READ_STRING(fp, name);
- log_setrequest("passwd=\"%s\"", name);
+ ,/* request data */
+ struct {
+ char name[BUFLEN_NAME];
+ }
+ ,/* search data */
+ struct { int cnt; }
+ ,/* entry type */
+ struct passwd
+ ,/* int read(TFILE *fp, *req) */
+ READ_STRING(fp, req->name);
+ log_setrequest("passwd=\"%s\"", req->name);
return 0;
- ,/* check */
- if (!isvalidname(name))
+ ,/* check(*req) */
+ if (!isvalidname(req->name))
{
log_log(LOG_WARNING, "request denied by validnames option");
return -1;
}
nsswitch_check_reload();
- ,/* tentry *search(struct session *session, int *rcp, bool *more) */
- struct passwd,
- *more = false;
+ return 0;
+ ,/* search(*session, *req, *searchdat, *entry) */
+ *entry = NULL;
+ if (searchdat->cnt++ != 0)
+ return 0;
for (size_t i = 0; i < session->cnt; i++)
{
if (session->users[i].pw_uid != UID_INVALID &&
- STR_CMP(name, session->users[i].pw_name)==0) {
- *rcp = 0;
- return &(session->users[i]);
+ STR_CMP(req->name, session->users[i].pw_name)==0) {
+ *entry = &(session->users[i]);
+ if ((*entry)->pw_uid < nslcd_cfg->nss_min_uid) {
+ *entry = NULL;
+ return -1;
+ }
+ break;
}
}
- return NULL;
+ return 0;
,/* int write(TFILE *fp, tentry *entry) */
return write_passwd(fp, entry, calleruid);
,/* cleanup */
)
NSLCD_HANDLE_UID(PASSWD, BYUID
- ,/* decls */
- uid_t uid;
+ ,/* request data */
+ struct { uid_t uid; }
+ ,/* search data */
+ struct { int cnt; }
+ ,/* entry type */
+ struct passwd
,/* int read(TFILe *fp) */
- READ_INT32(fp, uid);
- log_setrequest("passwd=%lu", (unsigned long int)uid);
+ READ_INT32(fp, req->uid);
+ log_setrequest("passwd=%lu", (unsigned long int)(req->uid));
return 0;
,/* check */
- if (uid < nslcd_cfg->nss_min_uid)
- {
- /* return an empty result */
- WRITE_INT32(_handle_fp, NSLCD_VERSION);
- WRITE_INT32(_handle_fp, NSLCD_ACTION_PASSWD_BYUID);
- WRITE_INT32(_handle_fp, NSLCD_RESULT_END);
- return 0;
- }
nsswitch_check_reload();
- ,/* tentry *search(struct session *session, int *rcp, bool *more) */
- struct passwd,
- *more = false;
+ return 0;
+ ,/* search(*session, *req, *searchdat, *entry) */
+ *entry = NULL;
+ if (req->uid < nslcd_cfg->nss_min_uid || searchdat->cnt++ != 0)
+ return 0;
for (size_t i = 0; i < session->cnt; i++)
{
- if (uid == session->users[i].pw_uid) {
- *rcp = 0;
- return &(session->users[i]);
+ if (req->uid == session->users[i].pw_uid) {
+ *entry = &(session->users[i]);
+ break;
}
}
- return NULL;
- ,/* int write(TFILe *fp, tentry *entry */
+ return 0;
+ ,/* int write(TFILe *fp, *entry) */
return write_passwd(fp, entry, calleruid);
,/* cleanup */
)
NSLCD_HANDLE_UID(PASSWD, ALL
- ,/* decls */
- ,/* int read(TFILE *fp) */
+ ,/* request data */
+ int
+ ,/* search data */
+ struct { size_t i; }
+ ,/* entry type */
+ struct passwd
+ ,/* int read(TFILE *fp, *req) */
log_setrequest("passwd(all)");
return 0;
,/* check */
nsswitch_check_reload();
- ,/* tentry *search(struct session *session, int *rcp, bool *more) */
- struct passwd,
- static __thread size_t i = 0;
- *more = true;
- for (; i < session->cnt; i++)
+ return 0;
+ ,/* search(*session, *req, *searchdat, *entry) */
+ *entry = NULL;
+ for (; searchdat->i < session->cnt; searchdat->i++)
{
- if (session->users[i].pw_uid != UID_INVALID) {
- *rcp = 0;
- return &(session->users[i]);
+ if (session->users[searchdat->i].pw_uid != UID_INVALID &&
+ session->users[searchdat->i].pw_uid >= nslcd_cfg->nss_min_uid) {
+ *entry = &(session->users[searchdat->i]);
+ searchdat->i++;
+ return 0;
}
}
- i = 0;
- return NULL;
+ return 0;
,/* int write(TFILE *fp, tentry *entry) */
return write_passwd(fp, entry, calleruid);
,/* cleanup */