⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getgraent.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#if !defined(lint) && defined(SCCSIDS)static  char sccsid[] = "@(#)getgraent.c 1.1 92/07/30 Copyr 1990 Sun Micro"; /* c2 secure */#endif#include <stdio.h>#include <grp.h>#include <grpadj.h>#include <rpcsvc/ypclnt.h>extern void rewind();extern long strtol();extern int strlen();extern int strcmp();extern int fclose();extern char *strcpy();extern char *calloc();extern char *malloc();void setgraent(), endgraent();#define MAXINT 0x7fffffff;#define	MAXGRP	200static struct gradata {	char	*domain;	FILE	*grfa;	char	*yp;	int	yplen;	char	*oldyp;	int	oldyplen;	struct list {		char *name;		struct list *nxt;	} *minuslist;			/* list of - items */	struct	group_adjunct interpgra;	char	interpline[BUFSIZ+1];	struct	group_adjunct *sv;} *gradata, *_gradata();static char *GROUPADJ = "/etc/security/group.adjunct";static	struct group_adjunct *interpret();static	struct group_adjunct *interpretwithsave();static	struct group_adjunct *save();static	struct group_adjunct *getnamefromyellow();static	struct group_adjunct *getgidfromyellow();static struct gradata *_gradata(){	register struct gradata *g = gradata;	if (g == 0) {		g = (struct gradata *)calloc(1, sizeof (struct gradata));		gradata = g;	}	return (g);}#ifdef	NOT_DEFINEDstruct group_adjunct *getgragid(gid)register gid;{	struct group *getgrgid();	struct group *gr;	if ((gr = getgrgid(gid)) == NULL)		return NULL;	return (getgranam(gr->gr_name));}#endif	NOT_DEFINEDstruct group_adjunct *getgranam(name)register char *name;{	register struct gradata *g = _gradata();	struct group_adjunct *gra;	char line[BUFSIZ+1];	setgraent();	if (g == 0)		return (0);	if (!g->grfa)		return NULL;	while (fgets(line, BUFSIZ, g->grfa) != NULL) {		if ((gra = interpret(line, strlen(line))) == NULL)			continue;		if (matchname(line, &gra, name)) {			endgraent();			return (gra);		}	}	endgraent();	return (NULL);}voidsetgraent(){	register struct gradata *g = _gradata();	if (g == NULL)		return;	if (g->domain == NULL)		(void) yp_get_default_domain(&g->domain);	if (!g->grfa)		g->grfa = fopen(GROUPADJ, "r");	else		rewind(g->grfa);	if (g->yp)		free(g->yp);	g->yp = NULL;	freeminuslist();}voidendgraent(){	register struct gradata *g = _gradata();	if (g == 0)		return;	if (g->grfa) {		(void) fclose(g->grfa);		g->grfa = NULL;	}	if (g->yp)		free(g->yp);	g->yp = NULL;	freeminuslist();}struct group_adjunct *fgetgraent(f)	FILE *f;{	char line1[BUFSIZ+1];	if(fgets(line1, BUFSIZ, f) == NULL)		return(NULL);	return (interpret(line1, strlen(line1)));}static char *grskip(p,c)	register char *p;	register c;{	while(*p && *p != c && *p != '\n') ++p;	if (*p == '\n')		*p = '\0';	else if (*p != '\0')		*p++ = '\0';	return(p);}struct group_adjunct *getgraent(){	register struct gradata *g = _gradata();	char line1[BUFSIZ+1];	static struct group_adjunct *savegra;	struct group_adjunct *gra;	if (g == 0)		return (0);	if (g->domain == NULL) {		(void) yp_get_default_domain(&g->domain);	}	if(!g->grfa && !(g->grfa = fopen(GROUPADJ, "r")))		return(NULL);  again:	if (g->yp) {		gra = interpretwithsave(g->yp, g->yplen, savegra);		free(g->yp);		if (gra == NULL)			return(NULL);		getnextfromyellow();		if (onminuslist(gra))			goto again;		else			return (gra);	}	else if (fgets(line1, BUFSIZ, g->grfa) == NULL)		return(NULL);	if ((gra = interpret(line1, strlen(line1))) == NULL)		return(NULL);	switch(line1[0]) {		case '+':			if (strcmp(gra->gra_name, "+") == 0) {				getfirstfromyellow();				savegra = save(gra);				goto again;			}			/* 			 * else look up this entry in NIS			 */			savegra = save(gra);			gra = getnamefromyellow(gra->gra_name+1, savegra);			if (gra == NULL)				goto again;			else if (onminuslist(gra))				goto again;			else				return (gra);			break;		case '-':			addtominuslist(gra->gra_name+1);			goto again;			break;		default:			if (onminuslist(gra))				goto again;			return (gra);			break;	}	return (NULL);}static struct group_adjunct *interpret(val, len)	char *val;{	register struct gradata *g = _gradata();	register char *p;	if (g == 0)		return (0);	strncpy(g->interpline, val, len);	p = g->interpline;	g->interpline[len] = '\n';	g->interpline[len+1] = 0;	g->interpgra.gra_name = p;	p = grskip(p,':');        if (strcmp(g->interpgra.gra_name, "+") == 0) {                /* we are going to the NIS - fix the                 * rest of the struct as much as is needed                 */                g->interpgra.gra_passwd = "";		return (&g->interpgra);        }	g->interpgra.gra_passwd = p;        while(*p && *p != '\n') p++;        *p = '\0';	return (&g->interpgra);}staticfreeminuslist() {	register struct gradata *g = _gradata();	struct list *ls;		if (g == 0)		return;	for (ls = g->minuslist; ls != NULL; ls = ls->nxt) {		free(ls->name);		free(ls);	}	g->minuslist = NULL;}static struct group_adjunct *interpretwithsave(val, len, savegra)	char *val;	struct group_adjunct *savegra;{	register struct gradata *g = _gradata();	struct group_adjunct *gra;		if (g == 0)		return (0);	if ((gra = interpret(val, len)) == NULL)		return (NULL);	if (savegra->gra_passwd && *savegra->gra_passwd)		gra->gra_passwd =  savegra->gra_passwd;	return (gra);}staticonminuslist(gra)	struct group_adjunct *gra;{	register struct gradata *g = _gradata();	struct list *ls;	register char *nm;		if (g == 0)		return 0;	nm = gra->gra_name;	for (ls = g->minuslist; ls != NULL; ls = ls->nxt)		if (strcmp(ls->name, nm) == 0)			return 1;	return 0;}staticgetnextfromyellow(){	register struct gradata *g = _gradata();	int reason;	char *key = NULL;	int keylen;		if (g == 0)		return;	if (reason = yp_next(g->domain, "group.adjunct.byname",	    g->oldyp, g->oldyplen, &key, &keylen,	    &g->yp, &g->yplen)) {#ifdef DEBUGfprintf(stderr, "reason yp_next failed is %d\n", reason);#endif		g->yp = NULL;	}	if (g->oldyp)		free(g->oldyp);	g->oldyp = key;	g->oldyplen = keylen;}staticgetfirstfromyellow(){	register struct gradata *g = _gradata();	int reason;	char *key = NULL;	int keylen;		if (g == 0)		return;	if (reason =  yp_first(g->domain, "group.adjunct.byname",	    &key, &keylen, &g->yp, &g->yplen)) {#ifdef DEBUGfprintf(stderr, "reason yp_first failed is %d\n", reason);#endif		g->yp = NULL;	}	if (g->oldyp)		free(g->oldyp);	g->oldyp = key;	g->oldyplen = keylen;}static struct group_adjunct *getnamefromyellow(name, savegra)	char *name;	struct group_adjunct *savegra;{	register struct gradata *g = _gradata();	struct group_adjunct *gra;	int reason;	char *val;	int vallen;		if (g == 0)		return (NULL);	if (reason = yp_match(g->domain, "group.adjunct.byname",	    name, strlen(name), &val, &vallen)) {#ifdef DEBUGfprintf(stderr, "reason yp_next failed is %d\n", reason);#endif		return NULL;	}	else {		gra = interpret(val, vallen);		free(val);		if (gra == NULL)			return NULL;		if (savegra->gra_passwd && *savegra->gra_passwd)			gra->gra_passwd =  savegra->gra_passwd;		return gra;	}}staticaddtominuslist(name)	char *name;{	register struct gradata *g = _gradata();	struct list *ls;	char *buf;		if (g == 0)		return;	ls = (struct list *)malloc(sizeof(struct list));	buf = (char *)malloc(strlen(name) + 1);	(void) strcpy(buf, name);	ls->name = buf;	ls->nxt = g->minuslist;	g->minuslist = ls;}/*  * save away psswd field, which is the only * one which can be specified in a local + entry to override the * value in the NIS */static struct group_adjunct *save(gra)	struct group_adjunct *gra;{	register struct gradata *g = _gradata();		if (g == 0)		return 0;	/* 	 * free up stuff from last time around	 */	if (g->sv) {		free(g->sv->gra_passwd);		free(g->sv);	}	g->sv = (struct group_adjunct *)calloc(1, sizeof(struct group_adjunct));	g->sv->gra_passwd = (char *)malloc(strlen(gra->gra_passwd) + 1);	(void) strcpy(g->sv->gra_passwd, gra->gra_passwd);	return g->sv;}staticmatchname(line1, grap, name)	char line1[];	struct group_adjunct **grap;	char *name;{	struct group_adjunct *savegra;	struct group_adjunct *gra = *grap;	switch(line1[0]) {		case '+':			if (strcmp(gra->gra_name, "+") == 0) {				savegra = save(gra);				gra = getnamefromyellow(name, savegra);				if (gra) {					*grap = gra;					return 1;				}				else					return 0;			}			if (strcmp(gra->gra_name+1, name) == 0) {				savegra = save(gra);				gra = getnamefromyellow(gra->gra_name+1, savegra);				if (gra) {					*grap = gra;					return 1;				}				else					return 0;			}			break;		case '-':			if (strcmp(gra->gra_name+1, name) == 0) {				*grap = NULL;				return 1;			}			break;		default:			if (strcmp(gra->gra_name, name) == 0)				return 1;	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -