struct group *_spsubsgrp(struct group *gr) { struct sgrp *sgr; if (gr) { sgr = getsgnam(gr->gr_name); if (sgr) gr->gr_passwd = sgr->sg_passwd; } return(gr); }
/* try to read password from gshadow */ static char *get_gshadow_pwd(const char *groupname) { #ifdef HAVE_GETSGNAM struct sgrp *sgrp; sgrp = getsgnam(groupname); return sgrp ? xstrdup(sgrp->sg_passwd) : NULL; #else char buf[BUFSIZ]; char *pwd = NULL; FILE *f; if (groupname == NULL || *groupname == '\0') return NULL; f = fopen(_PATH_GSHADOW, "r"); if (!f) return NULL; while (fgets(buf, sizeof buf, f)) { char *cp = strchr(buf, ':'); if (!cp) /* any junk in gshadow? */ continue; *cp = '\0'; if (strcmp(buf, groupname) == 0) { if (cp - buf >= BUFSIZ) /* only group name on line */ break; pwd = cp + 1; if ((cp = strchr(pwd, ':')) && pwd == cp + 1) /* empty password */ pwd = NULL; else if (cp) *cp = '\0'; break; } } fclose(f); return pwd ? xstrdup(pwd) : NULL; #endif /* HAVE_GETSGNAM */ }