auth.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/fs/nfsd/auth.c
  3.  *
  4.  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
  5.  */
  6. #include <linux/types.h>
  7. #include <linux/sched.h>
  8. #include <linux/sunrpc/svc.h>
  9. #include <linux/sunrpc/svcauth.h>
  10. #include <linux/nfsd/nfsd.h>
  11. #define CAP_NFSD_MASK (CAP_FS_MASK|CAP_TO_MASK(CAP_SYS_RESOURCE))
  12. void
  13. nfsd_setuser(struct svc_rqst *rqstp, struct svc_export *exp)
  14. {
  15. struct svc_cred *cred = &rqstp->rq_cred;
  16. int i;
  17. if (rqstp->rq_userset)
  18. return;
  19. if (exp->ex_flags & NFSEXP_ALLSQUASH) {
  20. cred->cr_uid = exp->ex_anon_uid;
  21. cred->cr_gid = exp->ex_anon_gid;
  22. cred->cr_groups[0] = NOGROUP;
  23. } else if (exp->ex_flags & NFSEXP_ROOTSQUASH) {
  24. if (!cred->cr_uid)
  25. cred->cr_uid = exp->ex_anon_uid;
  26. if (!cred->cr_gid)
  27. cred->cr_gid = exp->ex_anon_gid;
  28. for (i = 0; i < NGROUPS; i++)
  29. if (!cred->cr_groups[i])
  30. cred->cr_groups[i] = exp->ex_anon_gid;
  31. }
  32. if (cred->cr_uid != (uid_t) -1)
  33. current->fsuid = cred->cr_uid;
  34. else
  35. current->fsuid = exp->ex_anon_uid;
  36. if (cred->cr_gid != (gid_t) -1)
  37. current->fsgid = cred->cr_gid;
  38. else
  39. current->fsgid = exp->ex_anon_gid;
  40. for (i = 0; i < NGROUPS; i++) {
  41. gid_t group = cred->cr_groups[i];
  42. if (group == (gid_t) NOGROUP)
  43. break;
  44. current->groups[i] = group;
  45. }
  46. current->ngroups = i;
  47. if ((cred->cr_uid)) {
  48. cap_t(current->cap_effective) &= ~CAP_NFSD_MASK;
  49. } else {
  50. cap_t(current->cap_effective) |= (CAP_NFSD_MASK &
  51.   current->cap_permitted);
  52. }
  53. rqstp->rq_userset = 1;
  54. }