html.c
上传用户:ladybrid91
上传日期:2007-01-04
资源大小:287k
文件大小:4k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** html.c
  3. **
  4. ** Copyright (c) 1994-1995 Peter Eriksson <pen@signum.se>
  5. **
  6. ** This program is free software; you can redistribute it and/or modify
  7. ** it under the terms of the GNU General Public License as published by
  8. ** the Free Software Foundation; either version 2 of the License, or
  9. ** (at your option) any later version.
  10. **
  11. ** This program is distributed in the hope that it will be useful,
  12. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ** GNU General Public License for more details.
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <stdarg.h>
  22. #include "phttpd.h"
  23. void html_href(int fd,
  24.        const char *href, const char *text)
  25. {
  26.     char buf[2048];
  27.     fd_printf(fd, "<A HREF="%s">",
  28.       html_strquote(href, buf, sizeof(buf)));
  29.     fd_printf(fd, "%s</A> ",
  30.       html_strquote(text, buf, sizeof(buf)));
  31. }
  32. void html_email(int fd,
  33. const char *address)
  34. {
  35.     char buf[2048];
  36.     html_strquote(address, buf, sizeof(buf));
  37.     if (strchr(address, '<') != NULL)
  38. fd_printf(fd, "<A HREF="mailto:%s">%s</A>n",
  39.   buf, buf);
  40.     else
  41. fd_printf(fd, "<A HREF="mailto:%s">&lt;%s&gt;</A>n",
  42.   buf, buf);
  43. }
  44. void html_sysheader(int fd,
  45.     const char *htype,
  46.     const char *format, ...)
  47. {
  48.     va_list ap;
  49.     fd_printf(fd, "<html>n<head>n<title>");
  50.     va_start(ap, format);
  51.     fd_vprintf(fd, format, ap);
  52.     va_end(ap);
  53.     
  54.     fd_printf(fd, "</title>n</head>n<body>n");
  55.     fd_printf(fd, "<%s ALIGN=CENTER>", htype);
  56.     va_start(ap, format);
  57.     fd_vprintf(fd, format, ap);
  58.     va_end(ap);
  59.     
  60.     fd_printf(fd, "</%s>n<hr noshade>n", htype);
  61. }
  62. void html_sysfooter(int fd)
  63. {
  64.     fd_puts("n<hr noshade>n<center><address>n", fd);
  65.     
  66.     fd_puts("This page was produced by the ", fd);
  67.     html_href(fd, "/phttpd/", "Phttpd");
  68.     fd_puts(" (version ", fd);
  69.     fd_puts(server_version, fd);
  70.     fd_puts(") server.n", fd);
  71.     
  72.     fd_puts("</address></center>n</body>n</html>n", fd);
  73. }
  74. void html_error(int fd,
  75. char *servername,
  76. const char *type,
  77. const char *format,
  78. va_list ap)
  79. {
  80.     char embuf[256];
  81.     html_sysheader(fd, "H2", "Error: %s", type);
  82.     fd_vprintf(fd, format, ap);
  83.     fd_putc('n', fd);
  84.     if (web_admin_email || (web_admin_name && web_admin_home))
  85.     {
  86. fd_puts("<P>Please contact the Webmaster for this servern", fd);
  87. fd_puts("if you have any questions about this error message.n", fd);
  88. fd_puts("<P>The Webmaster can be reached at: ", fd);
  89. if (web_admin_name)
  90. {
  91.    if (web_admin_home)
  92.          html_href(fd, web_admin_home, web_admin_name);
  93.    else
  94.        fd_puts(web_admin_name, fd);
  95.    if (web_admin_email)
  96.        fd_putc(' ', fd);
  97. }
  98. if (web_admin_email)
  99. {
  100. if ( servername && virtual_admin_email )
  101. {
  102. s_sprintf(embuf,256,"%s@%s",virtual_admin_email,servername );
  103. html_email(fd, embuf );
  104. }
  105. else
  106.      html_email(fd, web_admin_email);
  107. }
  108.     }
  109.     html_sysfooter(fd);
  110. }
  111. static int insert(char *buf,
  112.   int *pos,
  113.   int bufsize,
  114.   char *str)
  115. {
  116.     int len = strlen(str);
  117.     
  118.     if (*pos + len + 1 > bufsize)
  119.         return -1;
  120.     /* FIXME: Should add a check for buffer terminated overflow here */
  121.     if (s_strcpy(buf+*pos, bufsize-*pos, str) < 0)
  122. return -1;
  123.     
  124.     *pos += len;
  125.     
  126.     return *pos;
  127. }
  128. char *html_strquote(const char *str,
  129.     char *buf,
  130.     int size)
  131. {
  132.     int i;
  133.     for (i = 0; *str && i+1 < size; str++)
  134.     {
  135. switch (*str)
  136. {
  137.   case '"':
  138.     insert(buf, &i, size, "&quot;");
  139.     break;
  140.     
  141.   case '&':
  142.     insert(buf, &i, size, "&amp;");
  143.     break;
  144.   case '<':
  145.     insert(buf, &i, size, "&lt;");
  146.     break;
  147.   case '>':
  148.     insert(buf, &i, size, "&gt;");
  149.     break;
  150.   default:
  151.     buf[i++] = *str;
  152. }
  153.     }
  154.     buf[i] = '';
  155.     return buf;
  156. }
  157.