- static init;
- struct group *getgrent();
-
- if (gid >= 0 && gid < NGID && groups[gid][0])
- return (&groups[gid][0]);
- if (gid >= 0 && gid == outrangegid)
- return (outrangegroup);
- if (init == 2) {
- if (gid < NGID)
- return (0);
- setgrent();
- while (gr = getgrent()) {
- if (gr->gr_gid != gid)
- continue;
- outrangegid = gr->gr_gid;
- strncpy(outrangegroup, gr->gr_name, NGID);
- endgrent();
- return (outrangegroup);
- }
- endgrent();
- return (0);
- }
- if (init == 0)
- setgrent(), init = 1;
- while (gr = getgrent()) {
- if (gr->gr_gid < 0 || gr->gr_gid >= NGID) {
- if (gr->gr_gid == gid) {
- outrangegid = gr->gr_gid;
- strncpy(outrangegroup, gr->gr_name, NGID);
- return (outrangegroup);
- }
- continue;
- }
- if (groups[gr->gr_gid][0])
- continue;
- strncpy(groups[gr->gr_gid], gr->gr_name, NMAX);
- if (gr->gr_gid == gid) {
- return (&groups[gid][0]);
- }
- }
- init = 2;
- endgrent();
- return (0);
+ register struct ncache *cp;
+
+ cp = c_gid + (gid & CAMASK);
+ if (cp->gid == gid && *cp->name)
+ return(cp->name);
+ if (!(gr = getgrgid(gid)))
+ return((char *)0);
+ cp->gid = gid;
+ SCPYN(cp->name, gr->gr_name);
+ return(cp->name);