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 */
|
/* For compatibility with other Unix systems */
|
||||||
_PROTOTYPE( int getpagesize, (void) );
|
_PROTOTYPE( int getpagesize, (void) );
|
||||||
_PROTOTYPE( int setgroups, (int ngroups, const gid_t *gidset) );
|
_PROTOTYPE( int setgroups, (int ngroups, const gid_t *gidset) );
|
||||||
|
_PROTOTYPE( int initgroups, (const char *name, gid_t basegid) );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -4,12 +4,48 @@ setgroups.c
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <grp.h>
|
||||||
|
|
||||||
int setgroups(int ngroups, const gid_t *gidset)
|
int setgroups(int ngroups, const gid_t *gidset)
|
||||||
{
|
{
|
||||||
/* Not implemented */
|
if(!gidset || ngroups > 1) {
|
||||||
|
/* Supplementary groups not implemented */
|
||||||
|
errno= EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
errno= ENOSYS;
|
if(ngroups == 1)
|
||||||
return -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