Fake setgroups() and initgroups() implementation.
This commit is contained in:
parent
db963438c6
commit
5911460ce5
|
@ -185,6 +185,7 @@ _PROTOTYPE( int devctl, (int ctl_req, int driver, int device, int style));
|
|||
/* For compatibility with other Unix systems */
|
||||
_PROTOTYPE( int getpagesize, (void) );
|
||||
_PROTOTYPE( int setgroups, (int ngroups, const gid_t *gidset) );
|
||||
_PROTOTYPE( int initgroups, (const char *name, gid_t basegid) );
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -4,12 +4,48 @@ setgroups.c
|
|||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <grp.h>
|
||||
|
||||
int setgroups(int ngroups, const gid_t *gidset)
|
||||
{
|
||||
/* Not implemented */
|
||||
if(!gidset || ngroups > 1) {
|
||||
/* Supplementary groups not implemented */
|
||||
errno= EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
errno= ENOSYS;
|
||||
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)
|
||||
return EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue