local.c
上传用户:lampled
上传日期:2007-01-07
资源大小:94k
文件大小:2k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /* Copyright (C) 1995, 1996 by Sven Berkvens (sven@stack.nl) */
  2. #include "config.h"
  3. #include <pwd.h>
  4. #include <sys/stat.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <errno.h>
  8. #include "httpd.h"
  9. #include "local.h"
  10. #include "string.h"
  11. #ifndef NOFORWARDS
  12. static int transform_user_dir1 PROTO((char *, const struct passwd *,
  13. int));
  14. static int transform_user_dir2 PROTO((char *, const struct passwd *,
  15. int));
  16. static int transform_user_dir3 PROTO((char *, const struct passwd *,
  17. int));
  18. #endif /* NOFORWARDS */
  19. extern int
  20. transform_user_dir DECL3_C_(char *, base, struct passwd *, userinfo,
  21. int, errors)
  22. {
  23. switch(localmode)
  24. {
  25. case 1:
  26. return(transform_user_dir1(base, userinfo, errors));
  27. case 2:
  28. return(transform_user_dir2(base, userinfo, errors));
  29. case 3:
  30. return(transform_user_dir3(base, userinfo, errors));
  31. default:
  32. if (errors)
  33. error("500 Invalid localmode setting");
  34. return(1);
  35. }
  36. }
  37. static int
  38. transform_user_dir1 DECL3_C_(char *, base, struct passwd *, userinfo,
  39. int, errors)
  40. {
  41. sprintf(base, "%s/.html/", userinfo->pw_dir);
  42. return(0);
  43. }
  44. static int
  45. transform_user_dir2 DECL3_C_(char *, base, struct passwd *, userinfo,
  46. int, errors)
  47. {
  48. char linkbuffer[XS_PATH_MAX];
  49. sprintf(base, "/www/%s", userinfo->pw_name);
  50. if (readlink(base, linkbuffer, XS_PATH_MAX) < 0)
  51. {
  52. if (errors)
  53. server_error("403 This user does not have a WWW page",
  54. "LOCAL_NO_PAGE");
  55. return(1);
  56. }
  57. sprintf(base, "/www/%s/", userinfo->pw_name);
  58. if (!strncmp(linkbuffer, "/vwww", 5))
  59. {
  60. if (errors)
  61. {
  62. sprintf(linkbuffer, "http://www.stud.tue.nl/%%7E%s/",
  63. userinfo->pw_name);
  64. redirect(linkbuffer, 1);
  65. }
  66. return(1);
  67. }
  68. if (strncmp(linkbuffer, "/lwww", 5))
  69. {
  70. if (errors)
  71. server_error("403 Invalid link in /www",
  72. "LOCAL_INVALID_LINK");
  73. return(1);
  74. }
  75. return(0);
  76. }
  77. static int
  78. transform_user_dir3 DECL3_C_(char *, base, struct passwd *, userinfo,
  79. int, errors)
  80. {
  81. sprintf(base, "/www/%s/", userinfo->pw_name);
  82. return(0);
  83. }