ack/lang/cem/libcc.ansi/misc/getgrent.c
2018-06-21 22:33:47 +02:00

135 lines
1.8 KiB
C

/*
* getgrent - get entry form group file
*
* Author: Patrick van Kleef
*/
/* $Id$ */
#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;
}
void 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 void
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* g;
setgrent();
while ((g = getgrent()) != 0)
if (!strcmp(g->gr_name, name))
break;
endgrent();
if (g != 0)
return g;
else
return 0;
}
struct group*
getgrgid(int gid)
{
struct group* g;
setgrent();
while ((g = getgrent()) != 0)
if (g->gr_gid == gid)
break;
endgrent();
if (g != 0)
return g;
else
return 0;
}