lib/system_smbd.c

ソースコードを見る。

関数

static int getgrouplist_internals (const char *user, gid_t gid, gid_t *groups, int *grpcnt)
static int sys_getgrouplist (const char *user, gid_t gid, gid_t *groups, int *grpcnt)
BOOL getgroups_unix_user (TALLOC_CTX *mem_ctx, const char *user, gid_t primary_gid, gid_t **ret_groups, size_t *p_ngroups)


関数

static int getgrouplist_internals ( const char *  user,
gid_t  gid,
gid_t *  groups,
int *  grpcnt 
) [static]

system_smbd.c41 行で定義されています。

参照先 errnonon_root_mode()restore_re_gid()save_re_gid()set_effective_gid()smb_panic()sys_setgroups().

参照元 sys_getgrouplist().

00043 {
00044         gid_t *gids_saved;
00045         int ret, ngrp_saved, num_gids;
00046 
00047         if (non_root_mode()) {
00048                 *grpcnt = 0;
00049                 return 0;
00050         }
00051 
00052         /* work out how many groups we need to save */
00053         ngrp_saved = getgroups(0, NULL);
00054         if (ngrp_saved == -1) {
00055                 /* this shouldn't happen */
00056                 return -1;
00057         }
00058 
00059         gids_saved = SMB_MALLOC_ARRAY(gid_t, ngrp_saved+1);
00060         if (!gids_saved) {
00061                 errno = ENOMEM;
00062                 return -1;
00063         }
00064 
00065         ngrp_saved = getgroups(ngrp_saved, gids_saved);
00066         if (ngrp_saved == -1) {
00067                 SAFE_FREE(gids_saved);
00068                 /* very strange! */
00069                 return -1;
00070         }
00071 
00072         if (initgroups(user, gid) != 0) {
00073                 DEBUG(0, ("getgrouplist_internals: initgroups() failed!\n"));
00074                 SAFE_FREE(gids_saved);
00075                 return -1;
00076         }
00077 
00078         /* this must be done to cope with systems that put the current egid in the
00079            return from getgroups() */
00080         save_re_gid();
00081         set_effective_gid(gid);
00082         setgid(gid);
00083 
00084         num_gids = getgroups(0, NULL);
00085         if (num_gids == -1) {
00086                 SAFE_FREE(gids_saved);
00087                 /* very strange! */
00088                 return -1;
00089         }
00090 
00091         if (num_gids + 1 > *grpcnt) {
00092                 *grpcnt = num_gids + 1;
00093                 ret = -1;
00094         } else {
00095                 ret = getgroups(*grpcnt - 1, &groups[1]);
00096                 if (ret < 0) {
00097                         SAFE_FREE(gids_saved);
00098                         /* very strange! */
00099                         return -1;
00100                 }
00101                 groups[0] = gid;
00102                 *grpcnt = ret + 1;
00103         }
00104 
00105         restore_re_gid();
00106 
00107         if (sys_setgroups(ngrp_saved, gids_saved) != 0) {
00108                 /* yikes! */
00109                 DEBUG(0,("ERROR: getgrouplist: failed to reset group list!\n"));
00110                 smb_panic("getgrouplist: failed to reset group list!\n");
00111                 free(gids_saved);
00112                 return -1;
00113         }
00114 
00115         free(gids_saved);
00116         return ret;
00117 }

static int sys_getgrouplist ( const char *  user,
gid_t  gid,
gid_t *  groups,
int *  grpcnt 
) [static]

system_smbd.c120 行で定義されています。

参照先 become_root()getgrouplist_internals()unbecome_root()winbind_env_set()winbind_off()winbind_on().

参照元 getgroups_unix_user().

00121 {
00122         int retval;
00123         BOOL winbind_env;
00124 
00125         DEBUG(10,("sys_getgrouplist: user [%s]\n", user));
00126 
00127         /* This is only ever called for Unix users, remote memberships are
00128          * always determined by the info3 coming back from auth3 or the
00129          * PAC. */
00130         winbind_env = winbind_env_set();
00131         winbind_off();
00132 
00133 #ifdef HAVE_GETGROUPLIST
00134         retval = getgrouplist(user, gid, groups, grpcnt);
00135 #else
00136         become_root();
00137         retval = getgrouplist_internals(user, gid, groups, grpcnt);
00138         unbecome_root();
00139 #endif
00140 
00141         /* allow winbindd lookups, but only if they were not already disabled */
00142         if (!winbind_env) {
00143                 winbind_on();
00144         }
00145 
00146         return retval;
00147 }

BOOL getgroups_unix_user ( TALLOC_CTX mem_ctx,
const char *  user,
gid_t  primary_gid,
gid_t **  ret_groups,
size_t *  p_ngroups 
)

system_smbd.c149 行で定義されています。

参照先 add_gid_to_array_unique()groups_max()sys_getgrouplist().

参照元 create_token_from_username()pdb_default_enum_group_memberships().

00152 {
00153         size_t ngrp;
00154         int max_grp;
00155         gid_t *temp_groups;
00156         gid_t *groups;
00157         int i;
00158 
00159         max_grp = groups_max();
00160         temp_groups = SMB_MALLOC_ARRAY(gid_t, max_grp);
00161         if (! temp_groups) {
00162                 return False;
00163         }
00164 
00165         if (sys_getgrouplist(user, primary_gid, temp_groups, &max_grp) == -1) {
00166                 temp_groups = SMB_REALLOC_ARRAY(temp_groups, gid_t, max_grp);
00167                 if (!temp_groups) {
00168                         return False;
00169                 }
00170                 
00171                 if (sys_getgrouplist(user, primary_gid,
00172                                      temp_groups, &max_grp) == -1) {
00173                         DEBUG(0, ("get_user_groups: failed to get the unix "
00174                                   "group list\n"));
00175                         SAFE_FREE(temp_groups);
00176                         return False;
00177                 }
00178         }
00179         
00180         ngrp = 0;
00181         groups = NULL;
00182 
00183         /* Add in primary group first */
00184         if (!add_gid_to_array_unique(mem_ctx, primary_gid, &groups, &ngrp)) {
00185                 SAFE_FREE(temp_groups);
00186                 return False;
00187         }
00188 
00189         for (i=0; i<max_grp; i++) {
00190                 if (!add_gid_to_array_unique(mem_ctx, temp_groups[i],
00191                                         &groups, &ngrp)) {
00192                         SAFE_FREE(temp_groups);
00193                         return False;
00194                 }
00195         }
00196 
00197         *p_ngroups = ngrp;
00198         *ret_groups = groups;
00199         SAFE_FREE(temp_groups);
00200         return True;
00201 }


Sambaに対してSat Aug 29 21:23:38 2009に生成されました。  doxygen 1.4.7