* Copyright (c) 1988 The Regents of the University of California.
* %sccs.include.redist.c%
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)getpwent.c 5.14 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
static struct passwd _pw_passwd
;
static int _pw_getfirstkey
, _pw_stayopen
;
static char _pw_flag
, *_pw_file
= _PATH_PASSWD
, _pw_master
;
#define MAXLINELENGTH 1024
static char line
[MAXLINELENGTH
];
if (!_pw_fp
&& !start_pw(1))
return((struct passwd
*)NULL
);
return((struct passwd
*)NULL
);
return((struct passwd
*)NULL
);
for (rval
= 0; scanpw();)
if (!strcmp(nam
, _pw_passwd
.pw_name
)) {
return(rval
? &_pw_passwd
: (struct passwd
*)NULL
);
return((struct passwd
*)NULL
);
for (rval
= 0; scanpw();)
if (_pw_passwd
.pw_uid
== uid
) {
return(rval
? &_pw_passwd
: (struct passwd
*)NULL
);
char want_fp
; /* open _pw_fp also */
if (!_pw_db
&& (_pw_db
= dbm_open(_pw_file
, O_RDONLY
, 0))) {
* special case; if it's the official password file, look in
* the master password file, otherwise, look in the file itself.
p
= strcmp(_pw_file
, _PATH_PASSWD
) ? _pw_file
: _PATH_MASTERPASSWD
;
if (_pw_fp
= fopen(p
, "r")) {
* If we really want to set up _pw_fp, then try again
if (want_fp
&& p
!= _pw_file
&& (_pw_fp
= fopen(_pw_file
, "r"))) {
char *fgets(), *strsep(), *index();
if (!(fgets(line
, sizeof(line
), _pw_fp
)))
/* skip lines that are too big */
if (!index(line
, '\n')) {
while ((ch
= getc(_pw_fp
)) != '\n' && ch
!= EOF
)
_pw_passwd
.pw_name
= strsep(&bp
, ":\n");
_pw_passwd
.pw_passwd
= strsep(&bp
, ":\n");
if (!(cp
= strsep(&bp
, ":\n")))
_pw_passwd
.pw_uid
= atoi(cp
);
if (!(cp
= strsep(&bp
, ":\n")))
_pw_passwd
.pw_gid
= atoi(cp
);
_pw_passwd
.pw_class
= strsep(&bp
, ":\n");
if (!(cp
= strsep(&bp
, ":\n")))
_pw_passwd
.pw_change
= atol(cp
);
if (!(cp
= strsep(&bp
, ":\n")))
_pw_passwd
.pw_expire
= atol(cp
);
_pw_passwd
.pw_gecos
= strsep(&bp
, ":\n");
_pw_passwd
.pw_dir
= strsep(&bp
, ":\n");
_pw_passwd
.pw_shell
= strsep(&bp
, ":\n");
if (!_pw_passwd
.pw_shell
)
* the .dir file is LOCK_EX locked by programs that are
* renaming the various password files.
if (flock(dbm_dirfno(_pw_db
), LOCK_SH
))
key
= dbm_firstkey(_pw_db
);
key
= dbm_nextkey(_pw_db
);
key
= dbm_fetch(_pw_db
, key
);
(void)flock(dbm_dirfno(_pw_db
), LOCK_UN
);
#define EXPAND(e) e = t; while (*t++ = *p++);
EXPAND(_pw_passwd
.pw_name
);
EXPAND(_pw_passwd
.pw_passwd
);
bcopy(p
, (char *)&_pw_passwd
.pw_uid
, sizeof(int));
bcopy(p
, (char *)&_pw_passwd
.pw_gid
, sizeof(int));
bcopy(p
, (char *)&_pw_passwd
.pw_change
, sizeof(time_t));
EXPAND(_pw_passwd
.pw_class
);
EXPAND(_pw_passwd
.pw_gecos
);
EXPAND(_pw_passwd
.pw_dir
);
EXPAND(_pw_passwd
.pw_shell
);
bcopy(p
, (char *)&_pw_passwd
.pw_expire
, sizeof(time_t));
#define _MAX_PASSWD_SIZE 50
static char pwbuf
[_MAX_PASSWD_SIZE
];
* special case; if it's the official password file, look in
* the master password file, otherwise, look in the file itself.
p
= strcmp(_pw_file
, _PATH_PASSWD
) ? _pw_file
: _PATH_MASTERPASSWD
;
if ((fd
= open(p
, O_RDONLY
, 0)) < 0)
pos
= atol(_pw_passwd
.pw_passwd
);
if (lseek(fd
, pos
, L_SET
) != pos
)
if ((n
= read(fd
, pwbuf
, sizeof(pwbuf
) - 1)) < 0)
_pw_passwd
.pw_passwd
= pwbuf
;