Restricted Program Access

Peter da Silva peter at ficc.uu.net
Fri Jul 7 22:59:56 AEST 1989


In article <164 at nisca.ircc.ohio-state.edu>, frank at hpuxa.ircc.ohio-state.edu (Frank G. Fiamingo) writes:
> Apparently newgrp spawns a new shell so that the
> commands following it are never executed.  

Here's my solution... it's an equivalent of 'su' for groups (where newgrp
is an equivalent of login for groups). A quick hack, but very useful.
The games with errno were needed to keep spurious error messages here and
there from confusing our users. status==1 implies a system error, status==2
implies a user error.

/* grp group command...
 *
 * Execute "command" with gid=="group".
 */

#include <stdio.h>
#include <grp.h>
#include <pwd.h>
#include <errno.h>

main(ac, av)
int ac;
char **av;
{
	struct passwd *passwd, *getpwuid();
	struct group *group, *getgrnam();
	extern int errno;
	int i;

	if(ac < 3) {
		fprintf(stderr, "Usage: grp group command...\n");
		exit(2);
	}
	errno = 0;
	if((passwd = getpwuid(getuid())) == 0) {
		if(errno == 0 ||
		   errno == ENOTTY)	/* Yes, /etc/passwd is not a tty */
			fprintf(stderr, "/etc/passwd: No entry for uid\n");
		else
			perror("/etc/passwd");
		exit(1);
	}
	errno = 0;
	if((group = getgrnam(av[1])) == 0) {
		if(errno == 0 ||
		   errno == ENOTTY)	/* yes, etc/group is not a tty */
			fprintf(stderr, "%s: No such group\n", av[1]);
		else
			perror("/etc/group");
		exit(1);
	}
	for(i = 0; group->gr_mem[i]; i++)
		if(strcmp(group->gr_mem[i], passwd->pw_name) == 0)
			break;
	if(group->gr_mem[i] == 0) {
		fprintf(stderr, "%s: Not in group.\n", av[1]);
		exit(1);
	}
	setgid(group->gr_gid);
	setuid(getuid());
	errno = 0;
	execvp(av[2], &av[2]);
	perror("grp: exec");
}
-- 
Peter da Silva, Xenix Support, Ferranti International Controls Corporation.
Business: peter at ficc.uu.net, +1 713 274 5180. | "Arrrrggggh!
Personal: peter at sugar.hackercorp.com.   `-_-' |  Electronic mail sucks eggs."
Quote: Have you hugged your wolf today?  'U`  |     -- eugene miya



More information about the Comp.unix.questions mailing list