123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /*
- * 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;
- }
|