|
Lines 1-7
Link Here
|
| 1 |
/* |
1 |
/* |
| 2 |
* |
2 |
* |
| 3 |
* Copyright (c) 2001 Gert Doering. All rights reserved. |
3 |
* Copyright (c) 2001 Gert Doering. All rights reserved. |
| 4 |
* Copyright (c) 2003,2004,2005 Darren Tucker. All rights reserved. |
4 |
* Copyright (c) 2003,2004,2005,2006 Darren Tucker. All rights reserved. |
| 5 |
* |
5 |
* |
| 6 |
* Redistribution and use in source and binary forms, with or without |
6 |
* Redistribution and use in source and binary forms, with or without |
| 7 |
* modification, are permitted provided that the following conditions |
7 |
* modification, are permitted provided that the following conditions |
|
Lines 394-397
Link Here
|
| 394 |
} |
394 |
} |
| 395 |
# endif /* AIX_GETNAMEINFO_HACK */ |
395 |
# endif /* AIX_GETNAMEINFO_HACK */ |
| 396 |
|
396 |
|
|
|
397 |
# if defined(USE_GETGRSET) |
| 398 |
# include <stdlib.h> |
| 399 |
int |
| 400 |
getgrouplist(const char *user, gid_t pgid, gid_t *groups, int *grpcnt) |
| 401 |
{ |
| 402 |
char *cp, *grplist, *grp; |
| 403 |
gid_t gid; |
| 404 |
int ret = 0, ngroups = 0, maxgroups; |
| 405 |
long l; |
| 406 |
|
| 407 |
maxgroups = *grpcnt; |
| 408 |
|
| 409 |
if ((cp = grplist = getgrset(user)) == NULL) |
| 410 |
return -1; |
| 411 |
|
| 412 |
/* handle zero-length case */ |
| 413 |
if (maxgroups <= 0) { |
| 414 |
*grpcnt = 0; |
| 415 |
return -1; |
| 416 |
} |
| 417 |
|
| 418 |
/* copy primary group */ |
| 419 |
groups[ngroups++] = pgid; |
| 420 |
|
| 421 |
/* copy each entry from getgrset into group list */ |
| 422 |
while ((grp = strsep(&grplist, ",")) != NULL) { |
| 423 |
l = strtol(grp, NULL, 10); |
| 424 |
if (ngroups >= maxgroups || l == LONG_MIN || l == LONG_MAX) { |
| 425 |
ret = -1; |
| 426 |
goto out; |
| 427 |
} |
| 428 |
gid = (gid_t)l; |
| 429 |
if (gid == pgid) |
| 430 |
continue; /* we have already added primary gid */ |
| 431 |
groups[ngroups++] = gid; |
| 432 |
} |
| 433 |
out: |
| 434 |
free(cp); |
| 435 |
*grpcnt = ngroups; |
| 436 |
return ret; |
| 437 |
} |
| 438 |
|
| 439 |
int |
| 440 |
ssh_initgroups(const char *user, gid_t group) |
| 441 |
{ |
| 442 |
gid_t grps[NGROUPS_MAX]; |
| 443 |
int grpcnt = NGROUPS_MAX; |
| 444 |
|
| 445 |
if (getgrouplist(user, group, grps, &grpcnt) == -1) |
| 446 |
return -1; |
| 447 |
return setgroups(grpcnt, grps); |
| 448 |
} |
| 449 |
# endif /* USE_GETGRSET */ |
| 450 |
|
| 397 |
#endif /* _AIX */ |
451 |
#endif /* _AIX */ |