xref: /titanic_44/usr/src/lib/libbc/libc/gen/common/getgraent.c (revision 5d54f3d8999eac1762fe0a8c7177d20f1f201fae)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
57c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate  * with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate /*
237c478bd9Sstevel@tonic-gate  * Copyright 1990 Sun Microsystems, Inc.  All rights reserved.
247c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
27*5d54f3d8Smuffin #pragma ident	"%Z%%M%	%I%	%E% SMI"
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #include <stdio.h>
307c478bd9Sstevel@tonic-gate #include <grp.h>
317c478bd9Sstevel@tonic-gate #include <grpadj.h>
327c478bd9Sstevel@tonic-gate #include <rpcsvc/ypclnt.h>
33*5d54f3d8Smuffin #include <string.h>
34*5d54f3d8Smuffin #include <malloc.h>
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate extern void rewind();
377c478bd9Sstevel@tonic-gate extern long strtol();
387c478bd9Sstevel@tonic-gate extern int fclose();
397c478bd9Sstevel@tonic-gate 
40*5d54f3d8Smuffin void	setgraent(void);
41*5d54f3d8Smuffin void	endgraent(void);
427c478bd9Sstevel@tonic-gate 
437c478bd9Sstevel@tonic-gate static struct gradata {
447c478bd9Sstevel@tonic-gate 	char	*domain;
457c478bd9Sstevel@tonic-gate 	FILE	*grfa;
467c478bd9Sstevel@tonic-gate 	char	*yp;
477c478bd9Sstevel@tonic-gate 	int	yplen;
487c478bd9Sstevel@tonic-gate 	char	*oldyp;
497c478bd9Sstevel@tonic-gate 	int	oldyplen;
507c478bd9Sstevel@tonic-gate 	struct list {
517c478bd9Sstevel@tonic-gate 		char *name;
527c478bd9Sstevel@tonic-gate 		struct list *nxt;
537c478bd9Sstevel@tonic-gate 	} *minuslist;			/* list of - items */
547c478bd9Sstevel@tonic-gate 	struct	group_adjunct interpgra;
557c478bd9Sstevel@tonic-gate 	char	interpline[BUFSIZ+1];
567c478bd9Sstevel@tonic-gate 	struct	group_adjunct *sv;
57*5d54f3d8Smuffin } *gradata, *_gradata(void);
587c478bd9Sstevel@tonic-gate 
597c478bd9Sstevel@tonic-gate static char *GROUPADJ = "/etc/security/group.adjunct";
60*5d54f3d8Smuffin 
61*5d54f3d8Smuffin static struct group_adjunct	*interpret(char *, int);
62*5d54f3d8Smuffin static struct group_adjunct	*interpretwithsave(char *, int,
63*5d54f3d8Smuffin     struct group_adjunct *);
64*5d54f3d8Smuffin static struct group_adjunct	*save(struct group_adjunct *);
65*5d54f3d8Smuffin static struct group_adjunct	*getnamefromyellow(char *,
66*5d54f3d8Smuffin     struct group_adjunct *);
67*5d54f3d8Smuffin static int	onminuslist(struct group_adjunct *);
68*5d54f3d8Smuffin static int	matchname(char [], struct group_adjunct **, char *);
69*5d54f3d8Smuffin static void	freeminuslist(void);
70*5d54f3d8Smuffin static void	getnextfromyellow(void);
71*5d54f3d8Smuffin static void	getfirstfromyellow(void);
72*5d54f3d8Smuffin static void	addtominuslist(char *);
73*5d54f3d8Smuffin 
747c478bd9Sstevel@tonic-gate 
757c478bd9Sstevel@tonic-gate static struct gradata *
_gradata(void)76*5d54f3d8Smuffin _gradata(void)
777c478bd9Sstevel@tonic-gate {
78*5d54f3d8Smuffin 	struct gradata *g = gradata;
797c478bd9Sstevel@tonic-gate 
807c478bd9Sstevel@tonic-gate 	if (g == 0) {
817c478bd9Sstevel@tonic-gate 		g = (struct gradata *)calloc(1, sizeof (struct gradata));
827c478bd9Sstevel@tonic-gate 		gradata = g;
837c478bd9Sstevel@tonic-gate 	}
847c478bd9Sstevel@tonic-gate 	return (g);
857c478bd9Sstevel@tonic-gate }
867c478bd9Sstevel@tonic-gate 
877c478bd9Sstevel@tonic-gate struct group_adjunct *
getgranam(char * name)88*5d54f3d8Smuffin getgranam(char *name)
897c478bd9Sstevel@tonic-gate {
90*5d54f3d8Smuffin 	struct gradata *g = _gradata();
917c478bd9Sstevel@tonic-gate 	struct group_adjunct *gra;
927c478bd9Sstevel@tonic-gate 	char line[BUFSIZ+1];
937c478bd9Sstevel@tonic-gate 
947c478bd9Sstevel@tonic-gate 	setgraent();
957c478bd9Sstevel@tonic-gate 	if (g == 0)
967c478bd9Sstevel@tonic-gate 		return (0);
977c478bd9Sstevel@tonic-gate 	if (!g->grfa)
98*5d54f3d8Smuffin 		return (NULL);
997c478bd9Sstevel@tonic-gate 	while (fgets(line, BUFSIZ, g->grfa) != NULL) {
1007c478bd9Sstevel@tonic-gate 		if ((gra = interpret(line, strlen(line))) == NULL)
1017c478bd9Sstevel@tonic-gate 			continue;
1027c478bd9Sstevel@tonic-gate 		if (matchname(line, &gra, name)) {
1037c478bd9Sstevel@tonic-gate 			endgraent();
1047c478bd9Sstevel@tonic-gate 			return (gra);
1057c478bd9Sstevel@tonic-gate 		}
1067c478bd9Sstevel@tonic-gate 	}
1077c478bd9Sstevel@tonic-gate 	endgraent();
1087c478bd9Sstevel@tonic-gate 	return (NULL);
1097c478bd9Sstevel@tonic-gate }
1107c478bd9Sstevel@tonic-gate 
1117c478bd9Sstevel@tonic-gate void
setgraent(void)112*5d54f3d8Smuffin setgraent(void)
1137c478bd9Sstevel@tonic-gate {
114*5d54f3d8Smuffin 	struct gradata *g = _gradata();
1157c478bd9Sstevel@tonic-gate 
1167c478bd9Sstevel@tonic-gate 	if (g == NULL)
1177c478bd9Sstevel@tonic-gate 		return;
1187c478bd9Sstevel@tonic-gate 	if (g->domain == NULL)
1197c478bd9Sstevel@tonic-gate 		(void) yp_get_default_domain(&g->domain);
1207c478bd9Sstevel@tonic-gate 	if (!g->grfa)
1217c478bd9Sstevel@tonic-gate 		g->grfa = fopen(GROUPADJ, "r");
1227c478bd9Sstevel@tonic-gate 	else
1237c478bd9Sstevel@tonic-gate 		rewind(g->grfa);
1247c478bd9Sstevel@tonic-gate 	if (g->yp)
1257c478bd9Sstevel@tonic-gate 		free(g->yp);
1267c478bd9Sstevel@tonic-gate 	g->yp = NULL;
1277c478bd9Sstevel@tonic-gate 	freeminuslist();
1287c478bd9Sstevel@tonic-gate }
1297c478bd9Sstevel@tonic-gate 
1307c478bd9Sstevel@tonic-gate void
endgraent(void)131*5d54f3d8Smuffin endgraent(void)
1327c478bd9Sstevel@tonic-gate {
133*5d54f3d8Smuffin 	struct gradata *g = _gradata();
1347c478bd9Sstevel@tonic-gate 
1357c478bd9Sstevel@tonic-gate 	if (g == 0)
1367c478bd9Sstevel@tonic-gate 		return;
1377c478bd9Sstevel@tonic-gate 	if (g->grfa) {
1387c478bd9Sstevel@tonic-gate 		(void) fclose(g->grfa);
1397c478bd9Sstevel@tonic-gate 		g->grfa = NULL;
1407c478bd9Sstevel@tonic-gate 	}
1417c478bd9Sstevel@tonic-gate 	if (g->yp)
1427c478bd9Sstevel@tonic-gate 		free(g->yp);
1437c478bd9Sstevel@tonic-gate 	g->yp = NULL;
1447c478bd9Sstevel@tonic-gate 	freeminuslist();
1457c478bd9Sstevel@tonic-gate }
1467c478bd9Sstevel@tonic-gate 
1477c478bd9Sstevel@tonic-gate struct group_adjunct *
fgetgraent(FILE * f)148*5d54f3d8Smuffin fgetgraent(FILE *f)
1497c478bd9Sstevel@tonic-gate {
1507c478bd9Sstevel@tonic-gate 	char line1[BUFSIZ+1];
1517c478bd9Sstevel@tonic-gate 
1527c478bd9Sstevel@tonic-gate 	if(fgets(line1, BUFSIZ, f) == NULL)
1537c478bd9Sstevel@tonic-gate 		return (NULL);
1547c478bd9Sstevel@tonic-gate 	return (interpret(line1, strlen(line1)));
1557c478bd9Sstevel@tonic-gate }
1567c478bd9Sstevel@tonic-gate 
1577c478bd9Sstevel@tonic-gate static char *
grskip(char * p,int c)158*5d54f3d8Smuffin grskip(char *p, int c)
1597c478bd9Sstevel@tonic-gate {
1607c478bd9Sstevel@tonic-gate 	while(*p && *p != c && *p != '\n') ++p;
1617c478bd9Sstevel@tonic-gate 	if (*p == '\n')
1627c478bd9Sstevel@tonic-gate 		*p = '\0';
1637c478bd9Sstevel@tonic-gate 	else if (*p != '\0')
1647c478bd9Sstevel@tonic-gate 		*p++ = '\0';
1657c478bd9Sstevel@tonic-gate 	return (p);
1667c478bd9Sstevel@tonic-gate }
1677c478bd9Sstevel@tonic-gate 
1687c478bd9Sstevel@tonic-gate struct group_adjunct *
getgraent(void)169*5d54f3d8Smuffin getgraent(void)
1707c478bd9Sstevel@tonic-gate {
171*5d54f3d8Smuffin 	struct gradata *g = _gradata();
1727c478bd9Sstevel@tonic-gate 	char line1[BUFSIZ+1];
1737c478bd9Sstevel@tonic-gate 	static struct group_adjunct *savegra;
1747c478bd9Sstevel@tonic-gate 	struct group_adjunct *gra;
1757c478bd9Sstevel@tonic-gate 
1767c478bd9Sstevel@tonic-gate 	if (g == 0)
1777c478bd9Sstevel@tonic-gate 		return (0);
1787c478bd9Sstevel@tonic-gate 	if (g->domain == NULL) {
1797c478bd9Sstevel@tonic-gate 		(void) yp_get_default_domain(&g->domain);
1807c478bd9Sstevel@tonic-gate 	}
1817c478bd9Sstevel@tonic-gate 	if(!g->grfa && !(g->grfa = fopen(GROUPADJ, "r")))
1827c478bd9Sstevel@tonic-gate 		return (NULL);
1837c478bd9Sstevel@tonic-gate   again:
1847c478bd9Sstevel@tonic-gate 	if (g->yp) {
1857c478bd9Sstevel@tonic-gate 		gra = interpretwithsave(g->yp, g->yplen, savegra);
1867c478bd9Sstevel@tonic-gate 		free(g->yp);
1877c478bd9Sstevel@tonic-gate 		if (gra == NULL)
1887c478bd9Sstevel@tonic-gate 			return (NULL);
1897c478bd9Sstevel@tonic-gate 		getnextfromyellow();
1907c478bd9Sstevel@tonic-gate 		if (onminuslist(gra))
1917c478bd9Sstevel@tonic-gate 			goto again;
1927c478bd9Sstevel@tonic-gate 		else
1937c478bd9Sstevel@tonic-gate 			return (gra);
1947c478bd9Sstevel@tonic-gate 	}
1957c478bd9Sstevel@tonic-gate 	else if (fgets(line1, BUFSIZ, g->grfa) == NULL)
1967c478bd9Sstevel@tonic-gate 		return (NULL);
1977c478bd9Sstevel@tonic-gate 	if ((gra = interpret(line1, strlen(line1))) == NULL)
1987c478bd9Sstevel@tonic-gate 		return (NULL);
1997c478bd9Sstevel@tonic-gate 	switch(line1[0]) {
2007c478bd9Sstevel@tonic-gate 		case '+':
2017c478bd9Sstevel@tonic-gate 			if (strcmp(gra->gra_name, "+") == 0) {
2027c478bd9Sstevel@tonic-gate 				getfirstfromyellow();
2037c478bd9Sstevel@tonic-gate 				savegra = save(gra);
2047c478bd9Sstevel@tonic-gate 				goto again;
2057c478bd9Sstevel@tonic-gate 			}
2067c478bd9Sstevel@tonic-gate 			/*
2077c478bd9Sstevel@tonic-gate 			 * else look up this entry in NIS
2087c478bd9Sstevel@tonic-gate 			 */
2097c478bd9Sstevel@tonic-gate 			savegra = save(gra);
2107c478bd9Sstevel@tonic-gate 			gra = getnamefromyellow(gra->gra_name+1, savegra);
2117c478bd9Sstevel@tonic-gate 			if (gra == NULL)
2127c478bd9Sstevel@tonic-gate 				goto again;
2137c478bd9Sstevel@tonic-gate 			else if (onminuslist(gra))
2147c478bd9Sstevel@tonic-gate 				goto again;
2157c478bd9Sstevel@tonic-gate 			else
2167c478bd9Sstevel@tonic-gate 				return (gra);
2177c478bd9Sstevel@tonic-gate 			break;
2187c478bd9Sstevel@tonic-gate 		case '-':
2197c478bd9Sstevel@tonic-gate 			addtominuslist(gra->gra_name+1);
2207c478bd9Sstevel@tonic-gate 			goto again;
2217c478bd9Sstevel@tonic-gate 			break;
2227c478bd9Sstevel@tonic-gate 		default:
2237c478bd9Sstevel@tonic-gate 			if (onminuslist(gra))
2247c478bd9Sstevel@tonic-gate 				goto again;
2257c478bd9Sstevel@tonic-gate 			return (gra);
2267c478bd9Sstevel@tonic-gate 			break;
2277c478bd9Sstevel@tonic-gate 	}
2287c478bd9Sstevel@tonic-gate 	/* NOTREACHED */
2297c478bd9Sstevel@tonic-gate }
2307c478bd9Sstevel@tonic-gate 
2317c478bd9Sstevel@tonic-gate static struct group_adjunct *
interpret(char * val,int len)232*5d54f3d8Smuffin interpret(char *val, int len)
2337c478bd9Sstevel@tonic-gate {
234*5d54f3d8Smuffin 	struct gradata *g = _gradata();
235*5d54f3d8Smuffin 	char *p;
2367c478bd9Sstevel@tonic-gate 
2377c478bd9Sstevel@tonic-gate 	if (g == 0)
2387c478bd9Sstevel@tonic-gate 		return (0);
2397c478bd9Sstevel@tonic-gate 	strncpy(g->interpline, val, len);
2407c478bd9Sstevel@tonic-gate 	p = g->interpline;
2417c478bd9Sstevel@tonic-gate 	g->interpline[len] = '\n';
2427c478bd9Sstevel@tonic-gate 	g->interpline[len+1] = 0;
2437c478bd9Sstevel@tonic-gate 	g->interpgra.gra_name = p;
2447c478bd9Sstevel@tonic-gate 	p = grskip(p,':');
2457c478bd9Sstevel@tonic-gate         if (strcmp(g->interpgra.gra_name, "+") == 0) {
2467c478bd9Sstevel@tonic-gate                 /* we are going to the NIS - fix the
2477c478bd9Sstevel@tonic-gate                  * rest of the struct as much as is needed
2487c478bd9Sstevel@tonic-gate                  */
2497c478bd9Sstevel@tonic-gate                 g->interpgra.gra_passwd = "";
2507c478bd9Sstevel@tonic-gate 		return (&g->interpgra);
2517c478bd9Sstevel@tonic-gate         }
2527c478bd9Sstevel@tonic-gate 	g->interpgra.gra_passwd = p;
2537c478bd9Sstevel@tonic-gate         while(*p && *p != '\n') p++;
2547c478bd9Sstevel@tonic-gate         *p = '\0';
2557c478bd9Sstevel@tonic-gate 	return (&g->interpgra);
2567c478bd9Sstevel@tonic-gate }
2577c478bd9Sstevel@tonic-gate 
258*5d54f3d8Smuffin static void
freeminuslist(void)259*5d54f3d8Smuffin freeminuslist(void)
260*5d54f3d8Smuffin {
261*5d54f3d8Smuffin 	struct gradata *g = _gradata();
2627c478bd9Sstevel@tonic-gate 	struct list *ls;
2637c478bd9Sstevel@tonic-gate 
2647c478bd9Sstevel@tonic-gate 	if (g == 0)
2657c478bd9Sstevel@tonic-gate 		return;
2667c478bd9Sstevel@tonic-gate 	for (ls = g->minuslist; ls != NULL; ls = ls->nxt) {
2677c478bd9Sstevel@tonic-gate 		free(ls->name);
2687c478bd9Sstevel@tonic-gate 		free(ls);
2697c478bd9Sstevel@tonic-gate 	}
2707c478bd9Sstevel@tonic-gate 	g->minuslist = NULL;
2717c478bd9Sstevel@tonic-gate }
2727c478bd9Sstevel@tonic-gate 
2737c478bd9Sstevel@tonic-gate static struct group_adjunct *
interpretwithsave(char * val,int len,struct group_adjunct * savegra)274*5d54f3d8Smuffin interpretwithsave(char *val, int len, struct group_adjunct *savegra)
2757c478bd9Sstevel@tonic-gate {
276*5d54f3d8Smuffin 	struct gradata *g = _gradata();
2777c478bd9Sstevel@tonic-gate 	struct group_adjunct *gra;
2787c478bd9Sstevel@tonic-gate 
2797c478bd9Sstevel@tonic-gate 	if (g == 0)
2807c478bd9Sstevel@tonic-gate 		return (0);
2817c478bd9Sstevel@tonic-gate 	if ((gra = interpret(val, len)) == NULL)
2827c478bd9Sstevel@tonic-gate 		return (NULL);
2837c478bd9Sstevel@tonic-gate 	if (savegra->gra_passwd && *savegra->gra_passwd)
2847c478bd9Sstevel@tonic-gate 		gra->gra_passwd =  savegra->gra_passwd;
2857c478bd9Sstevel@tonic-gate 	return (gra);
2867c478bd9Sstevel@tonic-gate }
2877c478bd9Sstevel@tonic-gate 
288*5d54f3d8Smuffin static int
onminuslist(struct group_adjunct * gra)289*5d54f3d8Smuffin onminuslist(struct group_adjunct *gra)
2907c478bd9Sstevel@tonic-gate {
291*5d54f3d8Smuffin 	struct gradata *g = _gradata();
2927c478bd9Sstevel@tonic-gate 	struct list *ls;
293*5d54f3d8Smuffin 	char *nm;
2947c478bd9Sstevel@tonic-gate 
2957c478bd9Sstevel@tonic-gate 	if (g == 0)
296*5d54f3d8Smuffin 		return (0);
2977c478bd9Sstevel@tonic-gate 	nm = gra->gra_name;
2987c478bd9Sstevel@tonic-gate 	for (ls = g->minuslist; ls != NULL; ls = ls->nxt)
2997c478bd9Sstevel@tonic-gate 		if (strcmp(ls->name, nm) == 0)
300*5d54f3d8Smuffin 			return (1);
301*5d54f3d8Smuffin 	return (0);
3027c478bd9Sstevel@tonic-gate }
3037c478bd9Sstevel@tonic-gate 
304*5d54f3d8Smuffin static void
getnextfromyellow(void)305*5d54f3d8Smuffin getnextfromyellow(void)
3067c478bd9Sstevel@tonic-gate {
307*5d54f3d8Smuffin 	struct gradata *g = _gradata();
3087c478bd9Sstevel@tonic-gate 	int reason;
3097c478bd9Sstevel@tonic-gate 	char *key = NULL;
3107c478bd9Sstevel@tonic-gate 	int keylen;
3117c478bd9Sstevel@tonic-gate 
3127c478bd9Sstevel@tonic-gate 	if (g == 0)
3137c478bd9Sstevel@tonic-gate 		return;
3147c478bd9Sstevel@tonic-gate 	if (reason = yp_next(g->domain, "group.adjunct.byname",
3157c478bd9Sstevel@tonic-gate 	    g->oldyp, g->oldyplen, &key, &keylen,
3167c478bd9Sstevel@tonic-gate 	    &g->yp, &g->yplen)) {
3177c478bd9Sstevel@tonic-gate #ifdef DEBUG
3187c478bd9Sstevel@tonic-gate fprintf(stderr, "reason yp_next failed is %d\n", reason);
3197c478bd9Sstevel@tonic-gate #endif
3207c478bd9Sstevel@tonic-gate 		g->yp = NULL;
3217c478bd9Sstevel@tonic-gate 	}
3227c478bd9Sstevel@tonic-gate 	if (g->oldyp)
3237c478bd9Sstevel@tonic-gate 		free(g->oldyp);
3247c478bd9Sstevel@tonic-gate 	g->oldyp = key;
3257c478bd9Sstevel@tonic-gate 	g->oldyplen = keylen;
3267c478bd9Sstevel@tonic-gate }
3277c478bd9Sstevel@tonic-gate 
328*5d54f3d8Smuffin static void
getfirstfromyellow(void)329*5d54f3d8Smuffin getfirstfromyellow(void)
3307c478bd9Sstevel@tonic-gate {
331*5d54f3d8Smuffin 	struct gradata *g = _gradata();
3327c478bd9Sstevel@tonic-gate 	int reason;
3337c478bd9Sstevel@tonic-gate 	char *key = NULL;
3347c478bd9Sstevel@tonic-gate 	int keylen;
3357c478bd9Sstevel@tonic-gate 
3367c478bd9Sstevel@tonic-gate 	if (g == 0)
3377c478bd9Sstevel@tonic-gate 		return;
3387c478bd9Sstevel@tonic-gate 	if (reason =  yp_first(g->domain, "group.adjunct.byname",
3397c478bd9Sstevel@tonic-gate 	    &key, &keylen, &g->yp, &g->yplen)) {
3407c478bd9Sstevel@tonic-gate #ifdef DEBUG
3417c478bd9Sstevel@tonic-gate fprintf(stderr, "reason yp_first failed is %d\n", reason);
3427c478bd9Sstevel@tonic-gate #endif
3437c478bd9Sstevel@tonic-gate 		g->yp = NULL;
3447c478bd9Sstevel@tonic-gate 	}
3457c478bd9Sstevel@tonic-gate 	if (g->oldyp)
3467c478bd9Sstevel@tonic-gate 		free(g->oldyp);
3477c478bd9Sstevel@tonic-gate 	g->oldyp = key;
3487c478bd9Sstevel@tonic-gate 	g->oldyplen = keylen;
3497c478bd9Sstevel@tonic-gate }
3507c478bd9Sstevel@tonic-gate 
3517c478bd9Sstevel@tonic-gate static struct group_adjunct *
getnamefromyellow(char * name,struct group_adjunct * savegra)352*5d54f3d8Smuffin getnamefromyellow(char *name, struct group_adjunct *savegra)
3537c478bd9Sstevel@tonic-gate {
354*5d54f3d8Smuffin 	struct gradata *g = _gradata();
3557c478bd9Sstevel@tonic-gate 	struct group_adjunct *gra;
3567c478bd9Sstevel@tonic-gate 	int reason;
3577c478bd9Sstevel@tonic-gate 	char *val;
3587c478bd9Sstevel@tonic-gate 	int vallen;
3597c478bd9Sstevel@tonic-gate 
3607c478bd9Sstevel@tonic-gate 	if (g == 0)
3617c478bd9Sstevel@tonic-gate 		return (NULL);
3627c478bd9Sstevel@tonic-gate 	if (reason = yp_match(g->domain, "group.adjunct.byname",
3637c478bd9Sstevel@tonic-gate 	    name, strlen(name), &val, &vallen)) {
3647c478bd9Sstevel@tonic-gate #ifdef DEBUG
3657c478bd9Sstevel@tonic-gate fprintf(stderr, "reason yp_next failed is %d\n", reason);
3667c478bd9Sstevel@tonic-gate #endif
367*5d54f3d8Smuffin 		return (NULL);
3687c478bd9Sstevel@tonic-gate 	}
3697c478bd9Sstevel@tonic-gate 	else {
3707c478bd9Sstevel@tonic-gate 		gra = interpret(val, vallen);
3717c478bd9Sstevel@tonic-gate 		free(val);
3727c478bd9Sstevel@tonic-gate 		if (gra == NULL)
373*5d54f3d8Smuffin 			return (NULL);
3747c478bd9Sstevel@tonic-gate 		if (savegra->gra_passwd && *savegra->gra_passwd)
3757c478bd9Sstevel@tonic-gate 			gra->gra_passwd =  savegra->gra_passwd;
376*5d54f3d8Smuffin 		return (gra);
3777c478bd9Sstevel@tonic-gate 	}
3787c478bd9Sstevel@tonic-gate }
3797c478bd9Sstevel@tonic-gate 
380*5d54f3d8Smuffin static void
addtominuslist(char * name)381*5d54f3d8Smuffin addtominuslist(char *name)
3827c478bd9Sstevel@tonic-gate {
383*5d54f3d8Smuffin 	struct gradata *g = _gradata();
3847c478bd9Sstevel@tonic-gate 	struct list *ls;
3857c478bd9Sstevel@tonic-gate 	char *buf;
3867c478bd9Sstevel@tonic-gate 
3877c478bd9Sstevel@tonic-gate 	if (g == 0)
3887c478bd9Sstevel@tonic-gate 		return;
3897c478bd9Sstevel@tonic-gate 	ls = (struct list *)malloc(sizeof(struct list));
3907c478bd9Sstevel@tonic-gate 	buf = (char *)malloc(strlen(name) + 1);
3917c478bd9Sstevel@tonic-gate 	(void) strcpy(buf, name);
3927c478bd9Sstevel@tonic-gate 	ls->name = buf;
3937c478bd9Sstevel@tonic-gate 	ls->nxt = g->minuslist;
3947c478bd9Sstevel@tonic-gate 	g->minuslist = ls;
3957c478bd9Sstevel@tonic-gate }
3967c478bd9Sstevel@tonic-gate 
3977c478bd9Sstevel@tonic-gate /*
3987c478bd9Sstevel@tonic-gate  * save away psswd field, which is the only
3997c478bd9Sstevel@tonic-gate  * one which can be specified in a local + entry to override the
4007c478bd9Sstevel@tonic-gate  * value in the NIS
4017c478bd9Sstevel@tonic-gate  */
4027c478bd9Sstevel@tonic-gate static struct group_adjunct *
save(struct group_adjunct * gra)403*5d54f3d8Smuffin save(struct group_adjunct *gra)
4047c478bd9Sstevel@tonic-gate {
405*5d54f3d8Smuffin 	struct gradata *g = _gradata();
4067c478bd9Sstevel@tonic-gate 
4077c478bd9Sstevel@tonic-gate 	if (g == 0)
408*5d54f3d8Smuffin 		return (0);
4097c478bd9Sstevel@tonic-gate 	/*
4107c478bd9Sstevel@tonic-gate 	 * free up stuff from last time around
4117c478bd9Sstevel@tonic-gate 	 */
4127c478bd9Sstevel@tonic-gate 	if (g->sv) {
4137c478bd9Sstevel@tonic-gate 		free(g->sv->gra_passwd);
4147c478bd9Sstevel@tonic-gate 		free(g->sv);
4157c478bd9Sstevel@tonic-gate 	}
4167c478bd9Sstevel@tonic-gate 	g->sv = (struct group_adjunct *)calloc(1, sizeof(struct group_adjunct));
4177c478bd9Sstevel@tonic-gate 	g->sv->gra_passwd = (char *)malloc(strlen(gra->gra_passwd) + 1);
4187c478bd9Sstevel@tonic-gate 	(void) strcpy(g->sv->gra_passwd, gra->gra_passwd);
419*5d54f3d8Smuffin 	return (g->sv);
4207c478bd9Sstevel@tonic-gate }
4217c478bd9Sstevel@tonic-gate 
422*5d54f3d8Smuffin static int
matchname(char line1[],struct group_adjunct ** grap,char * name)423*5d54f3d8Smuffin matchname(char line1[], struct group_adjunct **grap, char *name)
4247c478bd9Sstevel@tonic-gate {
4257c478bd9Sstevel@tonic-gate 	struct group_adjunct *savegra;
4267c478bd9Sstevel@tonic-gate 	struct group_adjunct *gra = *grap;
4277c478bd9Sstevel@tonic-gate 
4287c478bd9Sstevel@tonic-gate 	switch (line1[0]) {
4297c478bd9Sstevel@tonic-gate 		case '+':
4307c478bd9Sstevel@tonic-gate 			if (strcmp(gra->gra_name, "+") == 0) {
4317c478bd9Sstevel@tonic-gate 				savegra = save(gra);
4327c478bd9Sstevel@tonic-gate 				gra = getnamefromyellow(name, savegra);
4337c478bd9Sstevel@tonic-gate 				if (gra) {
4347c478bd9Sstevel@tonic-gate 					*grap = gra;
435*5d54f3d8Smuffin 					return (1);
4367c478bd9Sstevel@tonic-gate 				}
4377c478bd9Sstevel@tonic-gate 				else
438*5d54f3d8Smuffin 					return (0);
4397c478bd9Sstevel@tonic-gate 			}
4407c478bd9Sstevel@tonic-gate 			if (strcmp(gra->gra_name+1, name) == 0) {
4417c478bd9Sstevel@tonic-gate 				savegra = save(gra);
4427c478bd9Sstevel@tonic-gate 				gra = getnamefromyellow(gra->gra_name+1, savegra);
4437c478bd9Sstevel@tonic-gate 				if (gra) {
4447c478bd9Sstevel@tonic-gate 					*grap = gra;
445*5d54f3d8Smuffin 					return (1);
4467c478bd9Sstevel@tonic-gate 				}
4477c478bd9Sstevel@tonic-gate 				else
448*5d54f3d8Smuffin 					return (0);
4497c478bd9Sstevel@tonic-gate 			}
4507c478bd9Sstevel@tonic-gate 			break;
4517c478bd9Sstevel@tonic-gate 		case '-':
4527c478bd9Sstevel@tonic-gate 			if (strcmp(gra->gra_name+1, name) == 0) {
4537c478bd9Sstevel@tonic-gate 				*grap = NULL;
454*5d54f3d8Smuffin 				return (1);
4557c478bd9Sstevel@tonic-gate 			}
4567c478bd9Sstevel@tonic-gate 			break;
4577c478bd9Sstevel@tonic-gate 		default:
4587c478bd9Sstevel@tonic-gate 			if (strcmp(gra->gra_name, name) == 0)
459*5d54f3d8Smuffin 				return (1);
4607c478bd9Sstevel@tonic-gate 	}
461*5d54f3d8Smuffin 	return (0);
4627c478bd9Sstevel@tonic-gate }
463