auth.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
- /*
- * linux/fs/nfsd/auth.c
- *
- * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
- */
- #include <linux/types.h>
- #include <linux/sched.h>
- #include <linux/sunrpc/svc.h>
- #include <linux/sunrpc/svcauth.h>
- #include <linux/nfsd/nfsd.h>
- #define CAP_NFSD_MASK (CAP_FS_MASK|CAP_TO_MASK(CAP_SYS_RESOURCE))
- void
- nfsd_setuser(struct svc_rqst *rqstp, struct svc_export *exp)
- {
- struct svc_cred *cred = &rqstp->rq_cred;
- int i;
- if (rqstp->rq_userset)
- return;
- if (exp->ex_flags & NFSEXP_ALLSQUASH) {
- cred->cr_uid = exp->ex_anon_uid;
- cred->cr_gid = exp->ex_anon_gid;
- cred->cr_groups[0] = NOGROUP;
- } else if (exp->ex_flags & NFSEXP_ROOTSQUASH) {
- if (!cred->cr_uid)
- cred->cr_uid = exp->ex_anon_uid;
- if (!cred->cr_gid)
- cred->cr_gid = exp->ex_anon_gid;
- for (i = 0; i < NGROUPS; i++)
- if (!cred->cr_groups[i])
- cred->cr_groups[i] = exp->ex_anon_gid;
- }
- if (cred->cr_uid != (uid_t) -1)
- current->fsuid = cred->cr_uid;
- else
- current->fsuid = exp->ex_anon_uid;
- if (cred->cr_gid != (gid_t) -1)
- current->fsgid = cred->cr_gid;
- else
- current->fsgid = exp->ex_anon_gid;
- for (i = 0; i < NGROUPS; i++) {
- gid_t group = cred->cr_groups[i];
- if (group == (gid_t) NOGROUP)
- break;
- current->groups[i] = group;
- }
- current->ngroups = i;
- if ((cred->cr_uid)) {
- cap_t(current->cap_effective) &= ~CAP_NFSD_MASK;
- } else {
- cap_t(current->cap_effective) |= (CAP_NFSD_MASK &
- current->cap_permitted);
- }
- rqstp->rq_userset = 1;
- }