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

Email客户端

开发平台:

Unix_Linux

  1. /*
  2. **  This program checks to see if your version of seteuid works.
  3. **  Compile it, make it setuid root, and run it as yourself (NOT as
  4. **  root).  If it won't compile or outputs any MAYDAY messages, don't
  5. **  define USESETEUID in conf.h.
  6. **
  7. ** NOTE:  It is not sufficient to have seteuid in your library.
  8. ** You must also have saved uids that function properly.
  9. **
  10. **  Compilation is trivial -- just "cc t_seteuid.c".  Make it setuid,
  11. **  root and then execute it as a non-root user.
  12. */
  13. #include <sys/types.h>
  14. #include <unistd.h>
  15. #include <stdio.h>
  16. #ifndef lint
  17. static char id[] = "@(#)$Id: t_seteuid.c,v 8.4 1999/08/28 00:25:28 gshapiro Exp $";
  18. #endif /* ! lint */
  19. #ifdef __hpux
  20. # define seteuid(e) setresuid(-1, e, -1)
  21. #endif /* __hpux */
  22. static void
  23. printuids(str, r, e)
  24. char *str;
  25. int r, e;
  26. {
  27. printf("%s (should be %d/%d): r/euid=%d/%dn", str, r, e,
  28. getuid(), geteuid());
  29. }
  30. int
  31. main(argc, argv)
  32. int argc;
  33. char **argv;
  34. {
  35. int fail = 0;
  36. uid_t realuid = getuid();
  37. printuids("initial uids", realuid, 0);
  38. if (geteuid() != 0)
  39. {
  40. printf("SETUP ERROR: re-run setuid rootn");
  41. exit(1);
  42. }
  43. if (getuid() == 0)
  44. {
  45. printf("SETUP ERROR: must be run by a non-root usern");
  46. exit(1);
  47. }
  48. if (seteuid(1) < 0)
  49. printf("seteuid(1) failuren");
  50. printuids("after seteuid(1)", realuid, 1);
  51. if (geteuid() != 1)
  52. {
  53. fail++;
  54. printf("MAYDAY!  Wrong effective uidn");
  55. }
  56. /* do activity here */
  57. if (seteuid(0) < 0)
  58. {
  59. fail++;
  60. printf("seteuid(0) failuren");
  61. }
  62. printuids("after seteuid(0)", realuid, 0);
  63. if (geteuid() != 0)
  64. {
  65. fail++;
  66. printf("MAYDAY!  Wrong effective uidn");
  67. }
  68. if (getuid() != realuid)
  69. {
  70. fail++;
  71. printf("MAYDAY!  Wrong real uidn");
  72. }
  73. printf("n");
  74. if (seteuid(2) < 0)
  75. {
  76. fail++;
  77. printf("seteuid(2) failuren");
  78. }
  79. printuids("after seteuid(2)", realuid, 2);
  80. if (geteuid() != 2)
  81. {
  82. fail++;
  83. printf("MAYDAY!  Wrong effective uidn");
  84. }
  85. /* do activity here */
  86. if (seteuid(0) < 0)
  87. {
  88. fail++;
  89. printf("seteuid(0) failuren");
  90. }
  91. printuids("after seteuid(0)", realuid, 0);
  92. if (geteuid() != 0)
  93. {
  94. fail++;
  95. printf("MAYDAY!  Wrong effective uidn");
  96. }
  97. if (getuid() != realuid)
  98. {
  99. fail++;
  100. printf("MAYDAY!  Wrong real uidn");
  101. }
  102. if (fail)
  103. {
  104. printf("nThis system cannot use seteuidn");
  105. exit(1);
  106. }
  107. printf("nIt is safe to define USESETEUID on this systemn");
  108. exit(0);
  109. }