116 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $Header$ */
 | 
						|
/*
 | 
						|
 * get entry from group file
 | 
						|
 * 
 | 
						|
 * By: Patrick van Kleef
 | 
						|
 */
 | 
						|
 | 
						|
#include <grp.h>
 | 
						|
 | 
						|
#define PRIVATE static
 | 
						|
 | 
						|
PRIVATE char _gr_file[] = "/etc/group";
 | 
						|
PRIVATE char _grbuf[256];
 | 
						|
PRIVATE char _buffer[1024];
 | 
						|
PRIVATE char *_pnt;
 | 
						|
PRIVATE char *_buf;
 | 
						|
PRIVATE int  _gfd = -1;
 | 
						|
PRIVATE int  _bufcnt;
 | 
						|
PRIVATE struct group grp;
 | 
						|
 | 
						|
setgrent ()
 | 
						|
{
 | 
						|
        if (_gfd >= 0)
 | 
						|
	        lseek (_gfd, 0L, 0);
 | 
						|
        else
 | 
						|
	        _gfd = open (_gr_file, 0);
 | 
						|
 | 
						|
        _bufcnt = 0;
 | 
						|
        return (_gfd);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
endgrent () 
 | 
						|
{
 | 
						|
        if (_gfd >= 0)
 | 
						|
	        close (_gfd);
 | 
						|
 | 
						|
        _gfd = -1;
 | 
						|
        _bufcnt = 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static getline () 
 | 
						|
{
 | 
						|
        if (_gfd < 0 && setgrent () < 0)
 | 
						|
	        return (0);
 | 
						|
 | 
						|
        _buf = _grbuf;
 | 
						|
        do {
 | 
						|
	        if (--_bufcnt <= 0){
 | 
						|
	                if ((_bufcnt = read (_gfd, _buffer, 1024)) <= 0)
 | 
						|
		                return (0);
 | 
						|
	                else
 | 
						|
		                _pnt = _buffer;
 | 
						|
		}
 | 
						|
	        *_buf++ = *_pnt++;
 | 
						|
        } while (*_pnt != '\n');
 | 
						|
        _pnt++;
 | 
						|
        _bufcnt--;
 | 
						|
        *_buf = 0;
 | 
						|
        _buf = _grbuf;
 | 
						|
        return (1);
 | 
						|
}
 | 
						|
 | 
						|
static skip_period () 
 | 
						|
{
 | 
						|
        while (*_buf && *_buf != ':')
 | 
						|
	        _buf++;
 | 
						|
        *_buf++ = '\0';
 | 
						|
}
 | 
						|
 | 
						|
struct group   *getgrent () 
 | 
						|
{
 | 
						|
        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 (name)
 | 
						|
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 (gid)
 | 
						|
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);
 | 
						|
}
 |