1 --- old/modules/mod_auth_unix.c Fri May 25 08:31:35 2012 |
|
2 +++ new/modules/mod_auth_unix.c Fri May 25 08:31:35 2012 |
|
3 @@ -896,6 +896,13 @@ |
|
4 |
|
5 return gr ? mod_create_data(cmd, (void *) &gr->gr_gid) : PR_DECLINED(cmd); |
|
6 } |
|
7 +#ifdef HAVE__GETGRPSBYMEMBER |
|
8 + extern int _getgroupsbymember |
|
9 + ( |
|
10 + const char* username, gid_t gid_array[], |
|
11 + int maxgids, int numgids |
|
12 + ); |
|
13 +#endif /* HAVE__GETGRPSBYMEMBER */ |
|
14 |
|
15 /* cmd->argv[0] = name |
|
16 * cmd->argv[1] = (array_header **) group_ids |
|
17 @@ -1065,7 +1072,40 @@ |
|
18 } |
|
19 |
|
20 free(ptr); |
|
21 -#else |
|
22 +#else /* !HAVE_GETGRSET */ |
|
23 +#ifdef HAVE__GETGRPSBYMEMBER |
|
24 + gid_t group_ids[NGROUPS_MAX]; |
|
25 + int ngroups = NGROUPS_MAX; |
|
26 + register unsigned int i; |
|
27 + |
|
28 + pr_trace_msg("auth", 4, |
|
29 + "using _getgroupsbymember() to look up group membership"); |
|
30 + |
|
31 + memset(group_ids, 0, sizeof(group_ids)); |
|
32 + |
|
33 + group_ids[0]=pw->pw_gid; |
|
34 + ngroups= |
|
35 + _getgroupsbymember(pw->pw_name, group_ids, NGROUPS_MAX, 1); |
|
36 + |
|
37 + if (ngroups < 0) { |
|
38 + pr_log_pri(PR_LOG_ERR, |
|
39 + "_getgroupsbymember error: %s", strerror(errno)); |
|
40 + return PR_DECLINED(cmd); |
|
41 + } |
|
42 + |
|
43 + for (i = 0; i < ngroups; i++) { |
|
44 + gr = my_getgrgid(group_ids[i]); |
|
45 + if (gr) { |
|
46 + if (gids && pw->pw_gid != gr->gr_gid) |
|
47 + *((gid_t *) push_array(gids)) = gr->gr_gid; |
|
48 + |
|
49 + if (groups && pw->pw_gid != gr->gr_gid) { |
|
50 + *((char **) push_array(groups)) = pstrdup(session.pool, |
|
51 + gr->gr_name); |
|
52 + } |
|
53 + } |
|
54 + } |
|
55 +#else /* !HAVE__GETGRPSBYMEMBER */ |
|
56 char **gr_member = NULL; |
|
57 |
|
58 /* This is where things get slow, expensive, and ugly. Loop through |
|
59 @@ -1091,6 +1131,7 @@ |
|
60 } |
|
61 } |
|
62 } |
|
63 +#endif /* !HAVE__GETGROUPSBYMEMBER */ |
|
64 #endif /* !HAVE_GETGRSET */ |
|
65 } |
|
66 |
|