73 lines
1.0 KiB
C
73 lines
1.0 KiB
C
#include <stdio.h>
|
|
#include <grp.h>
|
|
|
|
#define CL ':'
|
|
#define CM ','
|
|
#define NL '\n'
|
|
#define MAXGRP 100
|
|
|
|
extern int atoi(), fclose();
|
|
extern char *fgets();
|
|
extern FILE *fopen();
|
|
extern void rewind();
|
|
|
|
static char GROUP[] = "/etc/group";
|
|
static FILE *grf = NULL;
|
|
static char line[BUFSIZ+1];
|
|
static struct group grp;
|
|
static char *gr_mem[MAXGRP];
|
|
|
|
void
|
|
setgrent()
|
|
{
|
|
if(!grf)
|
|
grf = fopen(GROUP, "r");
|
|
else
|
|
rewind(grf);
|
|
}
|
|
|
|
void
|
|
endgrent()
|
|
{
|
|
if(grf) {
|
|
(void) fclose(grf);
|
|
grf = NULL;
|
|
}
|
|
}
|
|
|
|
static char *
|
|
grskip(p,c)
|
|
register char *p;
|
|
register c;
|
|
{
|
|
while(*p && *p != c)
|
|
++p;
|
|
if(*p)
|
|
*p++ = 0;
|
|
return(p);
|
|
}
|
|
|
|
struct group *
|
|
getgrent()
|
|
{
|
|
register char *p, **q;
|
|
|
|
if(!grf && !(grf = fopen(GROUP, "r")))
|
|
return(NULL);
|
|
if(!(p = fgets(line, BUFSIZ, grf)))
|
|
return(NULL);
|
|
grp.gr_name = p;
|
|
grp.gr_passwd = p = grskip(p, CL);
|
|
grp.gr_gid = atoi(p = grskip(p, CL));
|
|
grp.gr_mem = gr_mem;
|
|
p = grskip(p, CL);
|
|
(void) grskip(p, NL);
|
|
q = gr_mem;
|
|
while(*p) {
|
|
*q++ = p;
|
|
p = grskip(p, CM);
|
|
}
|
|
*q = NULL;
|
|
return(&grp);
|
|
}
|