ack/lang/cem/libcc.ansi/misc/getgrent.c

135 lines
1.8 KiB
C
Raw Normal View History

1989-12-18 14:40:54 +00:00
/*
* getgrent - get entry form group file
*
* Author: Patrick van Kleef
*/
1994-06-24 14:02:31 +00:00
/* $Id$ */
1989-12-18 14:40:54 +00:00
2018-06-21 20:33:47 +00:00
#include <stdlib.h>
#include <string.h>
#include <grp.h>
1989-12-18 14:40:54 +00:00
2018-06-21 20:33:47 +00:00
#define O_RDONLY 0
1989-12-18 14:40:54 +00:00
2018-06-21 20:33:47 +00:00
int open(const char* path, int flags);
1989-12-18 14:40:54 +00:00
2018-06-21 20:33:47 +00:00
#if defined(__BSD4_2)
typedef int off_t; /* see lseek(2) */
1989-12-18 14:40:54 +00:00
#else
typedef long off_t;
#endif
off_t _lseek(int d, off_t offset, int whence);
2018-06-21 20:33:47 +00:00
int _read(int d, char* buf, int nbytes);
int _close(int d);
1989-12-18 14:40:54 +00:00
2018-06-21 20:33:47 +00:00
#define RBUFSIZE 1024
1989-12-18 14:40:54 +00:00
static char _gr_file[] = "/etc/group";
static char _grbuf[256];
static char _buffer[RBUFSIZE];
2018-06-21 20:33:47 +00:00
static char* _pnt;
static char* _buf;
static int _gfd = -1;
static int _bufcnt;
1989-12-18 14:40:54 +00:00
static struct group grp;
2018-06-21 20:33:47 +00:00
int setgrent(void)
1989-12-18 14:40:54 +00:00
{
2018-06-21 20:33:47 +00:00
if (_gfd >= 0)
_lseek(_gfd, 0L, 0);
else
_gfd = open(_gr_file, O_RDONLY);
1989-12-18 14:40:54 +00:00
2018-06-21 20:33:47 +00:00
_bufcnt = 0;
return _gfd;
1989-12-18 14:40:54 +00:00
}
2018-06-21 20:33:47 +00:00
void endgrent(void)
1989-12-18 14:40:54 +00:00
{
2018-06-21 20:33:47 +00:00
if (_gfd >= 0)
_close(_gfd);
1989-12-18 14:40:54 +00:00
2018-06-21 20:33:47 +00:00
_gfd = -1;
_bufcnt = 0;
1989-12-18 14:40:54 +00:00
}
static int
2018-06-21 20:33:47 +00:00
getline(void)
1989-12-18 14:40:54 +00:00
{
2018-06-21 20:33:47 +00:00
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;
1989-12-18 14:40:54 +00:00
}
2018-06-21 20:33:47 +00:00
*_buf++ = *_pnt++;
} while (*_pnt != '\n');
_pnt++;
_bufcnt--;
*_buf = 0;
_buf = _grbuf;
return 1;
1989-12-18 14:40:54 +00:00
}
static void
2018-06-21 20:33:47 +00:00
skip_period(void)
1989-12-18 14:40:54 +00:00
{
2018-06-21 20:33:47 +00:00
while (*_buf && *_buf != ':')
_buf++;
*_buf++ = '\0';
1989-12-18 14:40:54 +00:00
}
2018-06-21 20:33:47 +00:00
struct group*
getgrent(void)
1989-12-18 14:40:54 +00:00
{
2018-06-21 20:33:47 +00:00
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;
1989-12-18 14:40:54 +00:00
}
2018-06-21 20:33:47 +00:00
struct group*
getgrnam(const char* name)
1989-12-18 14:40:54 +00:00
{
2018-06-21 20:33:47 +00:00
struct group* g;
setgrent();
while ((g = getgrent()) != 0)
if (!strcmp(g->gr_name, name))
break;
endgrent();
if (g != 0)
return g;
else
return 0;
1989-12-18 14:40:54 +00:00
}
2018-06-21 20:33:47 +00:00
struct group*
1989-12-18 14:40:54 +00:00
getgrgid(int gid)
{
2018-06-21 20:33:47 +00:00
struct group* g;
setgrent();
while ((g = getgrent()) != 0)
if (g->gr_gid == gid)
break;
endgrent();
if (g != 0)
return g;
else
return 0;
1989-12-18 14:40:54 +00:00
}