source: vendor/current/source3/lib/system_smbd.c@ 597

Last change on this file since 597 was 597, checked in by Herwig Bauernfeind, 14 years ago

Samba 3.5: Update vendor to version 3.5.9

File size: 5.8 KB
Line 
1/*
2 Unix SMB/CIFS implementation.
3 system call wrapper interface.
4 Copyright (C) Andrew Tridgell 2002
5 Copyright (C) Andrew Barteltt 2002
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
19*/
20
21/*
22 This file may assume linkage with smbd - for things like become_root()
23 etc.
24*/
25
26#include "includes.h"
27
28#ifndef HAVE_GETGROUPLIST
29
30#ifdef HAVE_GETGRSET
31static int getgrouplist_getgrset(const char *user, gid_t gid, gid_t *groups,
32 int *grpcnt)
33{
34 char *grplist;
35 char *grp;
36 gid_t temp_gid;
37 int num_gids = 1;
38 int ret = 0;
39 long l;
40
41 grplist = getgrset(user);
42
43 DEBUG(10, ("getgrset returned %s\n", grplist));
44
45 if (grplist == NULL) {
46 return -1;
47 }
48
49 if (*grpcnt > 0) {
50 groups[0] = gid;
51 }
52
53 while ((grp = strsep(&grplist, ",")) != NULL) {
54 l = strtol(grp, NULL, 10);
55 temp_gid = (gid_t) l;
56 if (temp_gid == gid) {
57 continue;
58 }
59
60 if (num_gids + 1 > *grpcnt) {
61 num_gids++;
62 continue;
63 }
64 groups[num_gids++] = temp_gid;
65 }
66 free(grplist);
67
68 if (num_gids > *grpcnt) {
69 ret = -1;
70 }
71 *grpcnt = num_gids;
72
73 DEBUG(10, ("Found %d groups for user %s\n", *grpcnt, user));
74
75 return ret;
76}
77
78#else /* HAVE_GETGRSET */
79
80/*
81 This is a *much* faster way of getting the list of groups for a user
82 without changing the current supplementary group list. The old
83 method used getgrent() which could take 20 minutes on a really big
84 network with hundeds of thousands of groups and users. The new method
85 takes a couple of seconds.
86
87 NOTE!! this function only works if it is called as root!
88 */
89
90static int getgrouplist_internals(const char *user, gid_t gid, gid_t *groups,
91 int *grpcnt)
92{
93 gid_t *gids_saved;