126 lines
1.7 KiB
C
126 lines
1.7 KiB
C
/*
|
|
* get entry from password file
|
|
*
|
|
* By Patrick van Kleef
|
|
*
|
|
*/
|
|
|
|
|
|
#include <pwd.h>
|
|
|
|
#define PRIVATE static
|
|
|
|
|
|
PRIVATE char _pw_file[] = "/etc/passwd";
|
|
PRIVATE char _pwbuf[256];
|
|
PRIVATE char _buffer[1024];
|
|
PRIVATE char *_pnt;
|
|
PRIVATE char *_buf;
|
|
PRIVATE int _pw = -1;
|
|
PRIVATE int _bufcnt;
|
|
PRIVATE struct passwd pwd;
|
|
|
|
setpwent()
|
|
{
|
|
if (_pw >= 0)
|
|
lseek (_pw, 0L, 0);
|
|
else
|
|
_pw = open (_pw_file, 0);
|
|
|
|
_bufcnt = 0;
|
|
return (_pw);
|
|
}
|
|
|
|
|
|
endpwent ()
|
|
{
|
|
if (_pw >= 0)
|
|
close (_pw);
|
|
|
|
_pw = -1;
|
|
_bufcnt = 0;
|
|
}
|
|
|
|
static getline ()
|
|
{
|
|
if (_pw < 0 && setpwent () < 0)
|
|
return (0);
|
|
_buf = _pwbuf;
|
|
do {
|
|
if (--_bufcnt <= 0){
|
|
if ((_bufcnt = read (_pw, _buffer, 1024)) <= 0)
|
|
return (0);
|
|
else
|
|
_pnt = _buffer;
|
|
}
|
|
*_buf++ = *_pnt++;
|
|
} while (*_pnt != '\n');
|
|
_pnt++;
|
|
_bufcnt--;
|
|
*_buf = 0;
|
|
_buf = _pwbuf;
|
|
return (1);
|
|
}
|
|
|
|
static skip_period ()
|
|
{
|
|
while (*_buf != ':')
|
|
_buf++;
|
|
|
|
*_buf++ = '\0';
|
|
}
|
|
|
|
struct passwd *getpwent ()
|
|
{
|
|
if (getline () == 0)
|
|
return (0);
|
|
|
|
pwd.pw_name = _buf;
|
|
skip_period ();
|
|
pwd.pw_passwd = _buf;
|
|
skip_period ();
|
|
pwd.pw_uid = atoi (_buf);
|
|
skip_period ();
|
|
pwd.pw_gid = atoi (_buf);
|
|
skip_period ();
|
|
pwd.pw_gecos = _buf;
|
|
skip_period ();
|
|
pwd.pw_dir = _buf;
|
|
skip_period ();
|
|
pwd.pw_shell = _buf;
|
|
|
|
return (&pwd);
|
|
}
|
|
|
|
struct passwd *getpwnam (name)
|
|
char *name;
|
|
{
|
|
struct passwd *pwd;
|
|
|
|
setpwent ();
|
|
while ((pwd = getpwent ()) != 0)
|
|
if (!strcmp (pwd -> pw_name, name))
|
|
break;
|
|
endpwent ();
|
|
if (pwd != 0)
|
|
return (pwd);
|
|
else
|
|
return (0);
|
|
}
|
|
|
|
struct passwd *getpwuid (uid)
|
|
int uid;
|
|
{
|
|
struct passwd *pwd;
|
|
|
|
setpwent ();
|
|
while ((pwd = getpwent ()) != 0)
|
|
if (pwd -> pw_uid == uid)
|
|
break;
|
|
endpwent ();
|
|
if (pwd != 0)
|
|
return (pwd);
|
|
else
|
|
return (0);
|
|
}
|