Rev | Line | |
---|
[9] | 1 | /*
|
---|
| 2 | setgroups.c
|
---|
| 3 | */
|
---|
| 4 |
|
---|
| 5 | #include <errno.h>
|
---|
| 6 | #include <unistd.h>
|
---|
| 7 | #include <string.h>
|
---|
| 8 | #include <grp.h>
|
---|
| 9 |
|
---|
| 10 | int setgroups(int ngroups, const gid_t *gidset)
|
---|
| 11 | {
|
---|
| 12 | if(ngroups > 1) {
|
---|
| 13 | /* Supplementary groups not implemented */
|
---|
| 14 | errno= EINVAL;
|
---|
| 15 | return -1;
|
---|
| 16 | }
|
---|
| 17 |
|
---|
| 18 | if(ngroups == 1)
|
---|
| 19 | return setgid(gidset[0]);
|
---|
| 20 |
|
---|
| 21 | return 0;
|
---|
| 22 | }
|
---|
| 23 |
|
---|
| 24 | int initgroups(const char *name, gid_t basegid)
|
---|
| 25 | {
|
---|
| 26 | struct group *gr;
|
---|
| 27 | int r, found = 0;
|
---|
| 28 | if((r = setgid(basegid)) < 0)
|
---|
| 29 | return r;
|
---|
| 30 |
|
---|
| 31 | setgrent();
|
---|
| 32 | while (!found && (gr = getgrent()) != NULL) {
|
---|
| 33 | char **mem;
|
---|
| 34 | for(mem = gr->gr_mem; mem && *mem; mem++) {
|
---|
| 35 | if(!strcmp(name, *mem)) {
|
---|
| 36 | found = 1;
|
---|
| 37 | break;
|
---|
| 38 | }
|
---|
| 39 | }
|
---|
| 40 | }
|
---|
| 41 | endgrent();
|
---|
| 42 |
|
---|
| 43 | /* Because supplemental groups aren't implemented, this call
|
---|
| 44 | * should fail if the user is in any supplemental groups.
|
---|
| 45 | */
|
---|
| 46 | if(found) {
|
---|
| 47 | errno = EINVAL;
|
---|
| 48 | return -1;
|
---|
| 49 | }
|
---|
| 50 |
|
---|
| 51 | return 0;
|
---|
| 52 | }
|
---|
| 53 |
|
---|
Note:
See
TracBrowser
for help on using the repository browser.