ack/lang/cem/libcc.ansi/misc/getgrent.c
1989-12-18 14:40:54 +00:00

136 lines
2.3 KiB
C

/*
* getgrent - get entry form group file
*
* Author: Patrick van Kleef
*/
/* $Header$ */
#include <stdlib.h>
#include <string.h>
#include <grp.h>
#define O_RDONLY 0
int open(const char *path, int flags);
#if defined(__BSD4_2)
typedef int off_t; /* see lseek(2) */
#else
typedef long off_t;
#endif
off_t lseek(int d, off_t offset, int whence);
int read(int d, char *buf, int nbytes);
int close(int d);
#define RBUFSIZE 1024
static char _gr_file[] = "/etc/group";
static char _grbuf[256];
static char _buffer[RBUFSIZE];
static char *_pnt;
static char *_buf;
static int _gfd = -1;
static int _bufcnt;
static struct group grp;
int
setgrent(void)
{
if (_gfd >= 0)
lseek(_gfd, 0L, 0);
else
_gfd = open(_gr_file, O_RDONLY);
_bufcnt = 0;
return _gfd;
}
int
endgrent(void)
{
if (_gfd >= 0)
close(_gfd);
_gfd = -1;
_bufcnt = 0;
}
static int
getline(void)
{
if (_gfd < 0 && setgrent() < 0)
return 0;
_buf = _grbuf;
do {
if (--_bufcnt <= 0){
if ((_bufcnt = read(_gfd, _buffer, RBUFSIZE)) <= 0)
return 0;
else
_pnt = _buffer;
}
*_buf++ = *_pnt++;
} while (*_pnt != '\n');
_pnt++;
_bufcnt--;
*_buf = 0;
_buf = _grbuf;
return 1;
}
static int
skip_period(void)
{
while (*_buf && *_buf != ':')
_buf++;
*_buf++ = '\0';
}
struct group *
getgrent(void)
{
if (getline() == 0)
return 0;
grp.gr_name = _buf;
skip_period();
grp.gr_passwd = _buf;
skip_period();
grp.gr_gid = atoi(_buf);
skip_period();
return &grp;
}
struct group *
getgrnam(const char *name)
{
struct group *grp;
setgrent();
while ((grp = getgrent()) != 0)
if (!strcmp(grp -> gr_name, name))
break;
endgrent();
if (grp != 0)
return grp;
else
return 0;
}
struct group *
getgrgid(int gid)
{
struct group *grp;
setgrent();
while ((grp = getgrent()) != 0)
if (grp -> gr_gid == gid)
break;
endgrent();
if (grp != 0)
return grp;
else
return 0;
}