54 lines
		
	
	
		
			826 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			826 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| setgroups.c
 | |
| */
 | |
| 
 | |
| #include <errno.h>
 | |
| #include <unistd.h>
 | |
| #include <string.h>
 | |
| #include <grp.h>
 | |
| 
 | |
| int setgroups(int ngroups, const gid_t *gidset)
 | |
| {
 | |
| 	if(ngroups > 1) {
 | |
| 		/* Supplementary groups not implemented */
 | |
| 		errno= EINVAL;
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| 	if(ngroups == 1)
 | |
| 		return setgid(gidset[0]);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int initgroups(const char *name, gid_t basegid)
 | |
| {
 | |
| 	struct group *gr;
 | |
| 	int r, found = 0;
 | |
| 	if((r = setgid(basegid)) < 0)
 | |
| 		return r;
 | |
| 
 | |
| 	setgrent();
 | |
| 	while (!found && (gr = getgrent()) != NULL) {
 | |
| 		char **mem;
 | |
| 		for(mem = gr->gr_mem; mem && *mem; mem++) {
 | |
| 			if(!strcmp(name, *mem)) {
 | |
| 				found = 1;
 | |
| 				break;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	endgrent();
 | |
| 
 | |
| 	/* Because supplemental groups aren't implemented, this call
 | |
| 	 * should fail if the user is in any supplemental groups.
 | |
| 	 */
 | |
| 	if(found) {
 | |
| 		errno = EINVAL;
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | 
