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*46949Sbostic static char sccsid[] = "@(#)getpwent.c 5.19 (Berkeley) 03/03/91"; 1036215Sbostic #endif /* LIBC_SCCS and not lint */ 1122095Smckusick 1246376Sbostic #include <sys/param.h> 1346376Sbostic #include <fcntl.h> 14*46949Sbostic #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 */ 24*46949Sbostic 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 { 32*46949Sbostic 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)); 41*46949Sbostic key.data = (u_char *)bf; 42*46949Sbostic key.size = sizeof(_pw_keynum) + 1; 43*46949Sbostic return(__hashpw(&key) ? &_pw_passwd : (struct passwd *)NULL); 4436855Sbostic } 4536855Sbostic 4636855Sbostic struct passwd * 4746376Sbostic getpwnam(name) 4846615Sbostic const char *name; 4936855Sbostic { 50*46949Sbostic 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)); 60*46949Sbostic key.data = (u_char *)bf; 61*46949Sbostic key.size = len + 1; 62*46949Sbostic rval = __hashpw(&key); 6346376Sbostic 6446659Sbostic if (!_pw_stayopen) { 65*46949Sbostic (void)(_pw_db->close)(_pw_db); 66*46949Sbostic _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 { 79*46949Sbostic 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)); 89*46949Sbostic key.data = (u_char *)bf; 90*46949Sbostic key.size = sizeof(keyuid) + 1; 91*46949Sbostic rval = __hashpw(&key); 9236855Sbostic 9346659Sbostic if (!_pw_stayopen) { 94*46949Sbostic (void)(_pw_db->close)(_pw_db); 95*46949Sbostic _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) { 122*46949Sbostic (void)(_pw_db->close)(_pw_db); 123*46949Sbostic _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; 134*46949Sbostic _pw_db = hash_open(p, O_RDONLY, 0, NULL); 135*46949Sbostic if (_pw_db) 13636855Sbostic return(1); 13746376Sbostic if (!warned) { 13846615Sbostic (void)write(STDERR_FILENO, "getpwent: ", 10); 13946615Sbostic (void)write(STDERR_FILENO, p, strlen(p)); 14046615Sbostic (void)write(STDERR_FILENO, ": ", 2); 14146615Sbostic p = strerror(errno); 14246615Sbostic (void)write(STDERR_FILENO, p, strlen(p)); 14346615Sbostic (void)write(STDERR_FILENO, "\n", 1); 14446376Sbostic warned = 1; 14536215Sbostic } 14646376Sbostic return(0); 1472019Swnj } 1482019Swnj 14936215Sbostic static 15046376Sbostic __hashpw(key) 151*46949Sbostic DBT *key; 1522019Swnj { 15336855Sbostic register char *p, *t; 15446376Sbostic static u_int max; 15546376Sbostic static char *line; 156*46949Sbostic DBT data; 15736215Sbostic 158*46949Sbostic if ((_pw_db->get)(_pw_db, key, &data, 0)) 15936215Sbostic return(0); 160*46949Sbostic p = (char *)data.data; 161*46949Sbostic if (data.size > max && !(line = realloc(line, max += 1024))) 16236215Sbostic return(0); 16346376Sbostic 16436855Sbostic t = line; 16536855Sbostic #define EXPAND(e) e = t; while (*t++ = *p++); 16636855Sbostic EXPAND(_pw_passwd.pw_name); 16736855Sbostic EXPAND(_pw_passwd.pw_passwd); 16836855Sbostic bcopy(p, (char *)&_pw_passwd.pw_uid, sizeof(int)); 16936855Sbostic p += sizeof(int); 17036855Sbostic bcopy(p, (char *)&_pw_passwd.pw_gid, sizeof(int)); 17136855Sbostic p += sizeof(int); 17236855Sbostic bcopy(p, (char *)&_pw_passwd.pw_change, sizeof(time_t)); 17336855Sbostic p += sizeof(time_t); 17436855Sbostic EXPAND(_pw_passwd.pw_class); 17536855Sbostic EXPAND(_pw_passwd.pw_gecos); 17636855Sbostic EXPAND(_pw_passwd.pw_dir); 17736855Sbostic EXPAND(_pw_passwd.pw_shell); 17836855Sbostic bcopy(p, (char *)&_pw_passwd.pw_expire, sizeof(time_t)); 17936855Sbostic p += sizeof(time_t); 18036215Sbostic return(1); 1812019Swnj } 182