1*21342Sdist /* 2*21342Sdist * Copyright (c) 1983 Regents of the University of California. 3*21342Sdist * All rights reserved. The Berkeley software License Agreement 4*21342Sdist * specifies the terms and conditions for redistribution. 5*21342Sdist */ 615645Sralph 7*21342Sdist #ifndef lint 8*21342Sdist static char sccsid[] = "@(#)getpwnamuid.c 5.1 (Berkeley) 05/30/85"; 9*21342Sdist #endif not lint 10*21342Sdist 1115645Sralph #include <stdio.h> 1215645Sralph #include <pwd.h> 1315645Sralph #include <ndbm.h> 1415645Sralph 1515645Sralph #include <sys/file.h> 1615645Sralph 1715645Sralph static char line[BUFSIZ+1]; 1815645Sralph static struct passwd passwd; 1915645Sralph 2017921Sserge /* 2117921Sserge * The following are shared with getpwent.c 2217921Sserge */ 2317921Sserge extern char *_pw_file; 2417921Sserge DBM *_pw_db; 2517921Sserge int _pw_stayopen; 2617921Sserge 2715645Sralph static struct passwd * 2815645Sralph fetchpw(key) 2915645Sralph datum key; 3015645Sralph { 3115911Sralph register char *cp, *tp; 3215645Sralph 3315911Sralph if (key.dptr == 0) 3415645Sralph return ((struct passwd *)NULL); 3517030Sralph key = dbm_fetch(_pw_db, key); 3615645Sralph if (key.dptr == 0) 3715645Sralph return ((struct passwd *)NULL); 3815645Sralph cp = key.dptr; 3915911Sralph tp = line; 4015645Sralph 4115911Sralph #define EXPAND(e) passwd.pw_/**/e = tp; while (*tp++ = *cp++); 4215645Sralph EXPAND(name); 4315645Sralph EXPAND(passwd); 4417689Sralph bcopy(cp, (char *)&passwd.pw_uid, sizeof (int)); 4517689Sralph cp += sizeof (int); 4617689Sralph bcopy(cp, (char *)&passwd.pw_gid, sizeof (int)); 4717689Sralph cp += sizeof (int); 4817689Sralph bcopy(cp, (char *)&passwd.pw_quota, sizeof (int)); 4917689Sralph cp += sizeof (int); 5015645Sralph EXPAND(comment); 5115645Sralph EXPAND(gecos); 5215645Sralph EXPAND(dir); 5315645Sralph EXPAND(shell); 5415645Sralph return (&passwd); 5515645Sralph } 5615645Sralph 5715645Sralph struct passwd * 5815645Sralph getpwnam(nam) 5915645Sralph char *nam; 6015645Sralph { 6115645Sralph datum key; 6215645Sralph register struct passwd *pw; 6315645Sralph 6416416Sralph if (_pw_db == (DBM *)0 && 6517921Sserge (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) { 6616416Sralph oldcode: 6716416Sralph setpwent(); 6817921Sserge while ((pw = getpwent()) && strcmp(nam, pw->pw_name)) 6917921Sserge ; 7017921Sserge if (!_pw_stayopen) 7117921Sserge endpwent(); 7216416Sralph return (pw); 7316416Sralph } 7417921Sserge if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) { 7517030Sralph dbm_close(_pw_db); 7616416Sralph _pw_db = (DBM *)0; 7716416Sralph goto oldcode; 7816416Sralph } 7915645Sralph key.dptr = nam; 8015645Sralph key.dsize = strlen(nam); 8115645Sralph pw = fetchpw(key); 8217921Sserge (void) flock(dbm_dirfno(_pw_db), LOCK_UN); 8316416Sralph if (!_pw_stayopen) { 8417030Sralph dbm_close(_pw_db); 8516416Sralph _pw_db = (DBM *)0; 8616416Sralph } 8715645Sralph return (pw); 8815645Sralph } 8915645Sralph 9015645Sralph struct passwd * 9115645Sralph getpwuid(uid) 9215645Sralph int uid; 9315645Sralph { 9415645Sralph datum key; 9515645Sralph register struct passwd *pw; 9615645Sralph 9716416Sralph if (_pw_db == (DBM *)0 && 9817921Sserge (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) { 9916416Sralph oldcode: 10016416Sralph setpwent(); 10117921Sserge while ((pw = getpwent()) && pw->pw_uid != uid) 10217921Sserge ; 10317921Sserge if (!_pw_stayopen) 10417921Sserge endpwent(); 10516416Sralph return (pw); 10616416Sralph } 10717921Sserge if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) { 10817030Sralph dbm_close(_pw_db); 10916416Sralph _pw_db = (DBM *)0; 11016416Sralph goto oldcode; 11116416Sralph } 11215645Sralph key.dptr = (char *) &uid; 11315645Sralph key.dsize = sizeof uid; 11415645Sralph pw = fetchpw(key); 11517921Sserge (void) flock(dbm_dirfno(_pw_db), LOCK_UN); 11616416Sralph if (!_pw_stayopen) { 11717030Sralph dbm_close(_pw_db); 11816416Sralph _pw_db = (DBM *)0; 11916416Sralph } 12015645Sralph return (pw); 12115645Sralph } 122