1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-26 01:44:06 +03:00
Files
mariadb/mit-pthreads/gen/getpwnamuid.c
bk@work.mysql.com f4c589ff6c Import changeset
2000-07-31 21:29:14 +02:00

139 lines
2.9 KiB
C

/*
* Copyright (c) 1983 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getpwnamuid.c 5.3 (Berkeley) 12/21/87";
#endif
#include <stdio.h>
#include <pwd.h>
#include <sys/file.h>
#include "pwd_internal.h"
/*
* The following are shared with getpwent.c
*/
#ifdef DBM_PWD_SUPPORT
static struct passwd *
fetchpw(key)
datum key;
{
char *cp, *tp;
pwf_context_t *_data;
_data = _pw_get_data();
if (!_data)
return 0;
if (key.dptr == 0)
return ((struct passwd *)NULL);
key = dbm_fetch(_data->pw_db, key);
if (key.dptr == 0)
return ((struct passwd *)NULL);
cp = key.dptr;
tp = _data->line;
#define EXPAND(e) _data->passwd.e = tp; while (*tp++ = *cp++);
EXPAND(pw_name);
EXPAND(pw_passwd);
memcpy((char *)&_data->passwd.pw_uid, cp, sizeof (int));
cp += sizeof (int);
memcpy((char *)&_data->passwd.pw_gid, cp, sizeof (int));
cp += sizeof (int);
EXPAND(pw_gecos);
EXPAND(pw_dir);
EXPAND(pw_shell);
return (&_data->passwd);
}
#endif /* DBM_PWD_SUPPORT */
struct passwd *
getpwnam(nam)
const char *nam;
{
#ifdef DBM_PWD_SUPPORT
datum key;
#endif
struct passwd *pw, *getpwent();
pwf_context_t *_data;
_data = _pw_get_data();
if (!_data)
return 0;
#ifdef DBM_PWD_SUPPORT
if (_data->pw_db == (DBM *)0 &&
(_data->pw_db = dbm_open(_data->pw_file, O_RDONLY)) == (DBM *)0) {
oldcode:
#endif
setpwent();
while ((pw = getpwent()) && strcmp(nam, pw->pw_name))
;
if (!_data->pw_stayopen)
endpwent();
return (pw);
#ifdef DBM_PWD_SUPPORT
}
if (flock(dbm_dirfno(_data->pw_db), LOCK_SH) < 0) {
dbm_close(_data->pw_db);
_data->pw_db = (DBM *)0;
goto oldcode;
}
key.dptr = nam;
key.dsize = strlen(nam);
pw = fetchpw(key);
(void) flock(dbm_dirfno(_data->pw_db), LOCK_UN);
if (!_data->pw_stayopen) {
dbm_close(_data->pw_db);
_data->pw_db = (DBM *)0;
}
return (pw);
#endif
}
struct passwd *
getpwuid(uid)
uid_t uid;
{
#ifdef DBM_PWD_SUPPORT
datum key;
#endif
struct passwd *pw, *getpwent();
pwf_context_t *_data;
_data = _pw_get_data();
if (!_data)
return 0;
#ifdef DBM_PWD_SUPPORT
if (_data->pw_db == (DBM *)0 &&
(_data->pw_db = dbm_open(_data->pw_file, O_RDONLY)) == (DBM *)0) {
oldcode:
#endif
setpwent();
while ((pw = getpwent()) && pw->pw_uid != uid)
;
if (!_data->pw_stayopen)
endpwent();
return (pw);
#ifdef DBM_PWD_SUPPORT
}
if (flock(dbm_dirfno(_data->pw_db), LOCK_SH) < 0) {
dbm_close(_data->pw_db);
_data->pw_db = (DBM *)0;
goto oldcode;
}
key.dptr = (char *) &uid;
key.dsize = sizeof uid;
pw = fetchpw(key);
(void) flock(dbm_dirfno(_data->pw_db), LOCK_UN);
if (!_data->pw_stayopen) {
dbm_close(_data->pw_db);
_data->pw_db = (DBM *)0;
}
return (pw);
#endif
}