File:  [Research Unix] / researchv9 / libc / gen / setupgroups.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:22:00 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv9-SUN3_old, researchv9-SUN3, HEAD
researchv9-SUN3(old)

/*
**	Set up access groups.
*/

#include	<sys/types.h>
#include	<setjmp.h>
#include	<grp.h>

#define	SYSERROR	(-1)

static int	catchsys();
static jmp_buf	Sigsysbuf;

int
setupgroups(name, gid)
	char *			name;
	int			gid;
{
	register char **	cpp;
	register short *	gp;
	register struct group *	grp;
	register int		n;
	register int		(*oldsig)();
	int			on;
	short			groups[NGROUPS];

	oldsig = signal(SIGSYS, catchsys);

	if
	(
		setjmp(Sigsysbuf)
		||
		(on = getgroups(NGROUPS, groups)) == SYSERROR
	)
	{
		(void)signal(SIGSYS, oldsig);
		return 0;	/* Not installed */
	}

	(void)signal(SIGSYS, oldsig);

	(void)setgrent();

	gp = groups;

	while ( gp < &groups[NGROUPS] && (grp = getgrent()) != (struct group *)0 )
		for ( cpp = grp->gr_mem ; *cpp != (char *)0 ; cpp++ )
			if ( strcmp(*cpp, name) == 0 && grp->gr_gid != gid )
			{
				*gp++ = grp->gr_gid;
				break;
			}

	(void)endgrent();

	if ( (n = gp-groups) == 0 && on == 0 )
		return 0;

	return setgroups(n, groups);
}

static int
catchsys(sig)
{
	longjmp(Sigsysbuf, 1);
	abort();
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.