/* * getgrent - get entry form group file * * Author: Patrick van Kleef */ /* $Id$ */ #include #include #include #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; }