2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
13 * Afs_xsetgroups (syscall)
17 #include <afsconfig.h>
18 #include "afs/param.h"
19 #include "afs/sysincludes.h"
20 #include "afsincludes.h"
21 #include "afs/afs_stats.h" /* statistics */
23 /* We should be doing something better anyway */
24 #ifdef AFS_DARWIN80_ENV
26 setpag(proc
, cred
, pagvalue
, newpag
, change_parent
)
31 afs_uint32 change_parent
;
38 afs_getgroups(struct ucred
*cred
, int ngroups
, gid_t
* gidset
);
41 afs_setgroups(struct proc
*proc
, struct ucred
**cred
, int ngroups
,
42 gid_t
* gidset
, int change_parent
);
45 Afs_xsetgroups(p
, args
, retval
)
55 cr
= crdup(p
->p_cred
->pc_ucred
);
58 AFS_STATCNT(afs_xsetgroups
);
61 code
= afs_InitReq(&treq
, cr
);
65 return setgroups(p
, args
, retval
); /* afs has shut down */
67 code
= setgroups(p
, args
, retval
);
68 /* Note that if there is a pag already in the new groups we don't
69 * overwrite it with the old pag.
72 cr
= crdup(p
->p_cred
->pc_ucred
);
75 if (PagInCred(cr
) == NOPAG
) {
76 if (((treq
.uid
>> 24) & 0xff) == 'A') {
78 /* we've already done a setpag, so now we redo it */
79 AddPag(p
, treq
.uid
, &cr
);
88 setpag(proc
, cred
, pagvalue
, newpag
, change_parent
)
93 afs_uint32 change_parent
;
95 gid_t gidset
[NGROUPS
];
100 ngroups
= afs_getgroups(*cred
, NGROUPS
, gidset
);
101 if (afs_get_pag_from_groups(gidset
[1], gidset
[2]) == NOPAG
) {
102 /* We will have to shift grouplist to make room for pag */
103 if (ngroups
+ 2 > NGROUPS
) {
106 for (j
= ngroups
- 1; j
>= 1; j
--) {
107 gidset
[j
+ 2] = gidset
[j
];
111 *newpag
= (pagvalue
== -1 ? genpag() : pagvalue
);
112 afs_get_groups_from_pag(*newpag
, &gidset
[1], &gidset
[2]);
113 code
= afs_setgroups(proc
, cred
, ngroups
, gidset
, change_parent
);
119 afs_getgroups(struct ucred
*cred
, int ngroups
, gid_t
* gidset
)
121 int ngrps
, savengrps
;
124 AFS_STATCNT(afs_getgroups
);
125 savengrps
= ngrps
= MIN(ngroups
, cred
->cr_ngroups
);
126 gp
= cred
->cr_groups
;
135 afs_setgroups(struct proc
*proc
, struct ucred
**cred
, int ngroups
,
136 gid_t
* gidset
, int change_parent
)
141 struct ucred
*oldcr
, *cr
;
143 AFS_STATCNT(afs_setgroups
);
145 * The real setgroups() call does this, so maybe we should too.
148 if (ngroups
> NGROUPS
)
151 cr
->cr_ngroups
= ngroups
;
157 pcred_writelock(proc
->p_pptr
);
158 oldcr
= proc
->p_pptr
->p_cred
->pc_ucred
;
159 proc
->p_pptr
->p_cred
->pc_ucred
= cr
;
160 pcred_unlock(proc
->p_pptr
);
164 pcred_writelock(proc
);
165 oldcr
= proc
->p_cred
->pc_ucred
;
166 proc
->p_cred
->pc_ucred
= cr
;