changeuidgid.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:2k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 2000 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #if HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #include <sys/types.h>
  9. #if HAVE_UNISTD_H
  10. #include <unistd.h>
  11. #endif
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <grp.h>
  16. #include <pwd.h>
  17. #include <errno.h>
  18. #include "auth.h"
  19. static const char rcsid[]="$Id: changeuidgid.c,v 1.5 2000/05/27 04:59:26 mrsam Exp $";
  20. void authchangegroup(gid_t gid)
  21. {
  22. if ( setgid(gid))
  23. {
  24. perror("setgid");
  25. authexit(1);
  26. }
  27. #if HAVE_SETGROUPS
  28. if ( getuid() == 0 && setgroups(1, &gid) )
  29. {
  30. perror("setgroups");
  31. authexit(1);
  32. }
  33. #endif
  34. }
  35. void authchangeuidgid(uid_t uid, gid_t gid)
  36. {
  37. authchangegroup(gid);
  38. if ( setuid(uid))
  39. {
  40. perror("setuid");
  41. authexit(1);
  42. }
  43. }
  44. void authchangeusername(const char *uname, const gid_t *forcegrp)
  45. {
  46. struct passwd *pw;
  47. uid_t changeuid;
  48. gid_t changegid;
  49. /* uname might be a pointer returned from a previous called to getpw(),
  50. ** and libc has a problem getting it back.
  51. */
  52. char *p=malloc(strlen(uname)+1);
  53. if (!p)
  54. {
  55. perror("malloc");
  56. authexit(1);
  57. }
  58. strcpy(p, uname);
  59. errno=ENOENT;
  60. if ((pw=getpwnam(p)) == 0)
  61. {
  62. free(p);
  63. perror("getpwnam");
  64. authexit(1);
  65. }
  66. free(p);
  67. changeuid=pw->pw_uid;
  68. if ( !forcegrp ) forcegrp= &pw->pw_gid;
  69. changegid= *forcegrp;
  70. if ( setgid( changegid ))
  71. {
  72. perror("setgid");
  73. authexit(1);
  74. }
  75. #if HAVE_INITGROUPS
  76. if ( getuid() == 0 && initgroups(pw->pw_name, changegid) )
  77. {
  78. perror("initgroups");
  79. authexit(1);
  80. }
  81. #else
  82. #if HAVE_SETGROUPS
  83. if ( getuid() == 0 && setgroups(1, &changegid) )
  84. {
  85. perror("setgroups");
  86. authexit(1);
  87. }
  88. #endif
  89. #endif
  90. if (setuid(changeuid))
  91. {
  92. perror("setuid");
  93. authexit(1);
  94. }
  95. }