1 /* 2 * Copyright (c) 1983 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #if defined(LIBC_SCCS) && !defined(lint) 8 static char sccsid[] = "@(#)getpwnamuid.c 5.3 (Berkeley) 12/21/87"; 9 #endif LIBC_SCCS and not lint 10 11 #include <stdio.h> 12 #include <pwd.h> 13 #include <ndbm.h> 14 15 #include <sys/file.h> 16 17 static char line[BUFSIZ+1]; 18 static struct passwd passwd; 19 20 /* 21 * The following are shared with getpwent.c 22 */ 23 extern char *_pw_file; 24 DBM *_pw_db; 25 int _pw_stayopen; 26 27 static struct passwd * 28 fetchpw(key) 29 datum key; 30 { 31 register char *cp, *tp; 32 33 if (key.dptr == 0) 34 return ((struct passwd *)NULL); 35 key = dbm_fetch(_pw_db, key); 36 if (key.dptr == 0) 37 return ((struct passwd *)NULL); 38 cp = key.dptr; 39 tp = line; 40 41 #define EXPAND(e) passwd.e = tp; while (*tp++ = *cp++); 42 EXPAND(pw_name); 43 EXPAND(pw_passwd); 44 bcopy(cp, (char *)&passwd.pw_uid, sizeof (int)); 45 cp += sizeof (int); 46 bcopy(cp, (char *)&passwd.pw_gid, sizeof (int)); 47 cp += sizeof (int); 48 bcopy(cp, (char *)&passwd.pw_quota, sizeof (int)); 49 cp += sizeof (int); 50 EXPAND(pw_comment); 51 EXPAND(pw_gecos); 52 EXPAND(pw_dir); 53 EXPAND(pw_shell); 54 return (&passwd); 55 } 56 57 struct passwd * 58 getpwnam(nam) 59 char *nam; 60 { 61 datum key; 62 register struct passwd *pw; 63 64 if (_pw_db == (DBM *)0 && 65 (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) { 66 oldcode: 67 setpwent(); 68 while ((pw = getpwent()) && strcmp(nam, pw->pw_name)) 69 ; 70 if (!_pw_stayopen) 71 endpwent(); 72 return (pw); 73 } 74 if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) { 75 dbm_close(_pw_db); 76 _pw_db = (DBM *)0; 77 goto oldcode; 78 } 79 key.dptr = nam; 80 key.dsize = strlen(nam); 81 pw = fetchpw(key); 82 (void) flock(dbm_dirfno(_pw_db), LOCK_UN); 83 if (!_pw_stayopen) { 84 dbm_close(_pw_db); 85 _pw_db = (DBM *)0; 86 } 87 return (pw); 88 } 89 90 struct passwd * 91 getpwuid(uid) 92 int uid; 93 { 94 datum key; 95 register struct passwd *pw; 96 97 if (_pw_db == (DBM *)0 && 98 (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) { 99 oldcode: 100 setpwent(); 101 while ((pw = getpwent()) && pw->pw_uid != uid) 102 ; 103 if (!_pw_stayopen) 104 endpwent(); 105 return (pw); 106 } 107 if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) { 108 dbm_close(_pw_db); 109 _pw_db = (DBM *)0; 110 goto oldcode; 111 } 112 key.dptr = (char *) &uid; 113 key.dsize = sizeof uid; 114 pw = fetchpw(key); 115 (void) flock(dbm_dirfno(_pw_db), LOCK_UN); 116 if (!_pw_stayopen) { 117 dbm_close(_pw_db); 118 _pw_db = (DBM *)0; 119 } 120 return (pw); 121 } 122