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

📄 getnetgrent.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic char *sccsid = "@(#)getnetgrent.c	4.3	ULTRIX	2/12/91";#endif lint/**************************************************************** *                                                              * *  Licensed to Digital Equipment Corporation, Maynard, MA      * *              Copyright 1985 Sun Microsystems, Inc.           * *                      All rights reserved.                    * *								* ****************************************************************/#include <stdio.h>#include <ctype.h>#include <rpcsvc/ypclnt.h>#if defined(lint) && !defined(DEBUG)#define DEBUG#endif#define MAXGROUPLEN 1024/*  * access members of a netgroup */static struct grouplist {		/* also used by pwlib */	char	*gl_machine;	char	*gl_name;	char	*gl_domain;	struct	grouplist *gl_nxt;} *grouplist, *grlist;extern char *malloc();extern char *strcpy(),*strncpy();extern char *strpbrk(), *index();static struct list {			/* list of names to check for loops */	char *name;	struct list *nxt;};static  void getgroup();static	void doit();static	char *fill();static	char *match();static	char domain[256];static	char *oldgrp;char	NETGROUP[] = "netgroup";setnetgrent(grp)	char *grp;{		if (oldgrp == NULL)		oldgrp = (char *)calloc(1,256);	if (strcmp(oldgrp, grp) == 0)		grlist = grouplist;	else {		if (grouplist != NULL)			endnetgrent();		getgroup(grp);		grlist = grouplist;		(void) strcpy(oldgrp, grp);	}}endnetgrent(){	register struct grouplist *gl;		for (gl = grouplist; gl != NULL; gl = gl->gl_nxt) {		if (gl->gl_name)			free(gl->gl_name);		if (gl->gl_domain)			free(gl->gl_domain);		if (gl->gl_machine)			free(gl->gl_machine);		free((char *) gl);	}	grouplist = NULL;	grlist = NULL;	if (oldgrp) {		free(oldgrp);		oldgrp = 0;	}}getnetgrent(machinep, namep, domainp)	char **machinep, **namep, **domainp;{	if (grlist == 0)		return (0);	*machinep = grlist->gl_machine;	*namep = grlist->gl_name;	*domainp = grlist->gl_domain;	grlist = grlist->gl_nxt;	return (1);}static voidgetgroup(grp)        char *grp;{        if (getdomainname(domain, sizeof(domain)) < 0) {               (void) fprintf(stderr,                    "getnetgrent: getdomainname system call missing\n");            exit(1);        }        doit(grp,(struct list *) NULL);}/* * recursive function to find the members of netgroup "group". "list" is * the path followed through the netgroups so far, to check for cycles. */static voiddoit(group,list)	char *group;	struct list *list;{	register char *p, *q;	register struct list *ls;	struct list this_group;	char *val;	struct grouplist *gpls; 	/*	 * check for non-existing groups	 */	if ((val = match(group)) == NULL)		return; 	/*	 * check for cycles	 */	for (ls = list; ls != NULL; ls = ls->nxt)		if (strcmp(ls->name, group) == 0) {			(void) fprintf(stderr,			    "Cycle detected in /etc/netgroup: %s.\n", group);			return;		} 	ls = &this_group;	ls->name = group;	ls->nxt = list;	list = ls;    	p = val;	while (p != NULL) {		while (*p == ' ' || *p == '\t')			p++;		if (*p == 0 || *p =='#')			break;		if (*p == '(') {			gpls = (struct grouplist *)			    malloc(sizeof(struct grouplist));			p++;			if (!(p = fill(p,&gpls->gl_machine,',')))				goto syntax_error;			if (!(p = fill(p,&gpls->gl_name,',')))				goto syntax_error;			if (!(p = fill(p,&gpls->gl_domain,')')))				goto syntax_error;			gpls->gl_nxt = grouplist;			grouplist = gpls;		} else {			q = strpbrk(p, " \t\n#");			if (q && *q == '#')				break;			*q = 0;			doit(p,list);			*q = ' ';		}		p = strpbrk(p, " \t");	}	return; syntax_error:	(void) fprintf(stderr,"syntax error in /etc/netgroup\n");	(void) fprintf(stderr,"--- %s\n",val);	return;}/* * Fill a buffer "target" selectively from buffer "start". * "termchar" terminates the information in start, and preceding * or trailing white space is ignored. The location just after the * terminating character is returned.   */static char *fill(start,target,termchar)	char *start, **target, termchar;{	register char *p, *q; 	char *r;	unsigned size; 	for (p = start; *p == ' ' || *p == '\t'; p++)		;	r = index(p, termchar);	if (r == NULL)		return (NULL);	if (p == r)		*target = NULL;		else {		for (q = r-1; *q == ' ' || *q == '\t'; q--)			;		size = q - p + 1;		*target = malloc(size+1);		(void) strncpy(*target,p,(int) size);		(*target)[size] = 0;	}	return (r+1);}static char *match(group)	char *group;{	char *val;	int vallen;	if (yp_match(domain, NETGROUP, group, strlen(group), &val, &vallen))		return (NULL);	return (val);}

⌨️ 快捷键说明

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