122095Smckusick /* 236215Sbostic * Copyright (c) 1988 The Regents of the University of California. 336215Sbostic * All rights reserved. 436215Sbostic * 542624Sbostic * %sccs.include.redist.c% 622095Smckusick */ 722095Smckusick 826560Sdonn #if defined(LIBC_SCCS) && !defined(lint) 9*47290Sbostic static char sccsid[] = "@(#)getpwent.c 5.20 (Berkeley) 03/13/91"; 1036215Sbostic #endif /* LIBC_SCCS and not lint */ 1122095Smckusick 1246376Sbostic #include <sys/param.h> 1346376Sbostic #include <fcntl.h> 1446949Sbostic #include <db.h> 152019Swnj #include <pwd.h> 1646615Sbostic #include <utmp.h> 1746615Sbostic #include <errno.h> 1846376Sbostic #include <unistd.h> 1946615Sbostic #include <stdlib.h> 2046615Sbostic #include <string.h> 2146376Sbostic #include <limits.h> 222019Swnj 2346376Sbostic static struct passwd _pw_passwd; /* password structure */ 2446949Sbostic static DB *_pw_db; /* password database */ 2546376Sbostic static int _pw_keynum; /* key counter */ 2646376Sbostic static int _pw_stayopen; /* keep fd's open */ 2746615Sbostic static int __hashpw(), __initdb(); 282019Swnj 2936855Sbostic struct passwd * 3036855Sbostic getpwent() 3136855Sbostic { 3246949Sbostic DBT key; 3346376Sbostic char bf[sizeof(_pw_keynum) + 1]; 3436855Sbostic 3546376Sbostic if (!_pw_db && !__initdb()) 3636855Sbostic return((struct passwd *)NULL); 3746376Sbostic 3846376Sbostic ++_pw_keynum; 3946376Sbostic bf[0] = _PW_KEYBYNUM; 4046376Sbostic bcopy((char *)&_pw_keynum, bf + 1, sizeof(_pw_keynum)); 4146949Sbostic key.data = (u_char *)bf; 4246949Sbostic key.size = sizeof(_pw_keynum) + 1; 4346949Sbostic return(__hashpw(&key) ? &_pw_passwd : (struct passwd *)NULL); 4436855Sbostic } 4536855Sbostic 4636855Sbostic struct passwd * 4746376Sbostic getpwnam(name) 4846615Sbostic const char *name; 4936855Sbostic { 5046949Sbostic DBT key; 5146376Sbostic int len, rval; 5246376Sbostic char bf[UT_NAMESIZE + 1]; 5336855Sbostic 5446376Sbostic if (!_pw_db && !__initdb()) 5536855Sbostic return((struct passwd *)NULL); 5636855Sbostic 5746376Sbostic bf[0] = _PW_KEYBYNAME; 5846376Sbostic len = strlen(name); 5946376Sbostic bcopy(name, bf + 1, MIN(len, UT_NAMESIZE)); 6046949Sbostic key.data = (u_char *)bf; 6146949Sbostic key.size = len + 1; 6246949Sbostic rval = __hashpw(&key); 6346376Sbostic 6446659Sbostic if (!_pw_stayopen) { 6546949Sbostic (void)(_pw_db->close)(_pw_db); 6646949Sbostic _pw_db = (DB *)NULL; 6746376Sbostic } 6836855Sbostic return(rval ? &_pw_passwd : (struct passwd *)NULL); 6936855Sbostic } 7036855Sbostic 7136855Sbostic struct passwd * 7246615Sbostic #ifdef __STDC__ 7346615Sbostic getpwuid(uid_t uid) 7446615Sbostic #else 7536855Sbostic getpwuid(uid) 7636855Sbostic int uid; 7746615Sbostic #endif 7836855Sbostic { 7946949Sbostic DBT key; 8046659Sbostic int keyuid, rval; 8146660Sbostic char bf[sizeof(keyuid) + 1]; 8236855Sbostic 8346376Sbostic if (!_pw_db && !__initdb()) 8436855Sbostic return((struct passwd *)NULL); 8536855Sbostic 8646376Sbostic bf[0] = _PW_KEYBYUID; 8746659Sbostic keyuid = uid; 8846659Sbostic bcopy(&keyuid, bf + 1, sizeof(keyuid)); 8946949Sbostic key.data = (u_char *)bf; 9046949Sbostic key.size = sizeof(keyuid) + 1; 9146949Sbostic rval = __hashpw(&key); 9236855Sbostic 9346659Sbostic if (!_pw_stayopen) { 9446949Sbostic (void)(_pw_db->close)(_pw_db); 9546949Sbostic _pw_db = (DB *)NULL; 9636855Sbostic } 9746376Sbostic return(rval ? &_pw_passwd : (struct passwd *)NULL); 9836855Sbostic } 9936855Sbostic 10046615Sbostic int 10136855Sbostic setpassent(stayopen) 10236855Sbostic int stayopen; 10336855Sbostic { 10446376Sbostic _pw_keynum = 0; 10536855Sbostic _pw_stayopen = stayopen; 10636855Sbostic return(1); 10736855Sbostic } 10836855Sbostic 10946615Sbostic int 11046376Sbostic setpwent() 11146376Sbostic { 11246376Sbostic _pw_keynum = 0; 11346376Sbostic _pw_stayopen = 0; 11446376Sbostic return(1); 11546376Sbostic } 11646376Sbostic 11736855Sbostic void 11836855Sbostic endpwent() 11936855Sbostic { 12046376Sbostic _pw_keynum = 0; 12136855Sbostic if (_pw_db) { 12246949Sbostic (void)(_pw_db->close)(_pw_db); 12346949Sbostic _pw_db = (DB *)NULL; 12441572Sedward } 12536855Sbostic } 12636855Sbostic 12736855Sbostic static 12846376Sbostic __initdb() 12936855Sbostic { 13046376Sbostic static int warned; 13146376Sbostic char *p; 13236215Sbostic 13346659Sbostic p = (geteuid()) ? _PATH_MP_DB : _PATH_SMP_DB; 13446949Sbostic _pw_db = hash_open(p, O_RDONLY, 0, NULL); 13546949Sbostic if (_pw_db) 13636855Sbostic return(1); 137*47290Sbostic if (!warned) 138*47290Sbostic syslog(LOG_ERR, "%s: %m", p); 13946376Sbostic return(0); 1402019Swnj } 1412019Swnj 14236215Sbostic static 14346376Sbostic __hashpw(key) 14446949Sbostic DBT *key; 1452019Swnj { 14636855Sbostic register char *p, *t; 14746376Sbostic static u_int max; 14846376Sbostic static char *line; 14946949Sbostic DBT data; 15036215Sbostic 15146949Sbostic if ((_pw_db->get)(_pw_db, key, &data, 0)) 15236215Sbostic return(0); 15346949Sbostic p = (char *)data.data; 15446949Sbostic if (data.size > max && !(line = realloc(line, max += 1024))) 15536215Sbostic return(0); 15646376Sbostic 15736855Sbostic t = line; 15836855Sbostic #define EXPAND(e) e = t; while (*t++ = *p++); 15936855Sbostic EXPAND(_pw_passwd.pw_name); 16036855Sbostic EXPAND(_pw_passwd.pw_passwd); 16136855Sbostic bcopy(p, (char *)&_pw_passwd.pw_uid, sizeof(int)); 16236855Sbostic p += sizeof(int); 16336855Sbostic bcopy(p, (char *)&_pw_passwd.pw_gid, sizeof(int)); 16436855Sbostic p += sizeof(int); 16536855Sbostic bcopy(p, (char *)&_pw_passwd.pw_change, sizeof(time_t)); 16636855Sbostic p += sizeof(time_t); 16736855Sbostic EXPAND(_pw_passwd.pw_class); 16836855Sbostic EXPAND(_pw_passwd.pw_gecos); 16936855Sbostic EXPAND(_pw_passwd.pw_dir); 17036855Sbostic EXPAND(_pw_passwd.pw_shell); 17136855Sbostic bcopy(p, (char *)&_pw_passwd.pw_expire, sizeof(time_t)); 17236855Sbostic p += sizeof(time_t); 17336215Sbostic return(1); 1742019Swnj } 175