4 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
7 #include <linux/types.h>
8 #include <linux/sched.h>
9 #include <linux/sunrpc/svc.h>
10 #include <linux/sunrpc/svcauth.h>
11 #include <linux/nfsd/nfsd.h>
13 #define CAP_NFSD_MASK (CAP_FS_MASK|CAP_TO_MASK(CAP_SYS_RESOURCE))
15 int nfsd_setuser(struct svc_rqst
*rqstp
, struct svc_export
*exp
)
17 struct svc_cred
*cred
= &rqstp
->rq_cred
;
21 if (exp
->ex_flags
& NFSEXP_ALLSQUASH
) {
22 cred
->cr_uid
= exp
->ex_anon_uid
;
23 cred
->cr_gid
= exp
->ex_anon_gid
;
24 put_group_info(cred
->cr_group_info
);
25 cred
->cr_group_info
= groups_alloc(0);
26 } else if (exp
->ex_flags
& NFSEXP_ROOTSQUASH
) {
27 struct group_info
*gi
;
29 cred
->cr_uid
= exp
->ex_anon_uid
;
31 cred
->cr_gid
= exp
->ex_anon_gid
;
32 gi
= groups_alloc(cred
->cr_group_info
->ngroups
);
34 for (i
= 0; i
< cred
->cr_group_info
->ngroups
; i
++) {
35 if (!GROUP_AT(cred
->cr_group_info
, i
))
36 GROUP_AT(gi
, i
) = exp
->ex_anon_gid
;
38 GROUP_AT(gi
, i
) = GROUP_AT(cred
->cr_group_info
, i
);
40 put_group_info(cred
->cr_group_info
);
41 cred
->cr_group_info
= gi
;
44 if (cred
->cr_uid
!= (uid_t
) -1)
45 current
->fsuid
= cred
->cr_uid
;
47 current
->fsuid
= exp
->ex_anon_uid
;
48 if (cred
->cr_gid
!= (gid_t
) -1)
49 current
->fsgid
= cred
->cr_gid
;
51 current
->fsgid
= exp
->ex_anon_gid
;
53 if (!cred
->cr_group_info
)
55 ret
= set_current_groups(cred
->cr_group_info
);
57 cap_t(current
->cap_effective
) &= ~CAP_NFSD_MASK
;
59 cap_t(current
->cap_effective
) |= (CAP_NFSD_MASK
&
60 current
->cap_permitted
);