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

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** config.c
  3. **
  4. ** This is the main file of the config module.
  5. **
  6. ** Copyright (c) 1995 Peter Eriksson <pen@signum.se>
  7. **
  8. ** This program is free software; you can redistribute it and/or modify
  9. ** it under the terms of the GNU General Public License as published by
  10. ** the Free Software Foundation; either version 2 of the License, or
  11. ** (at your option) any later version.
  12. **
  13. ** This program is distributed in the hope that it will be useful,
  14. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. ** GNU General Public License for more details.
  17. ** You should have received a copy of the GNU General Public License
  18. ** along with this program; if not, write to the Free Software
  19. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #include <stdio.h>
  22. #include <time.h>
  23. #include <string.h>
  24. #include <fcntl.h>
  25. #include <unistd.h>
  26. #include <errno.h>
  27. #include <thread.h>
  28. #include <sys/types.h>
  29. #include <sys/stat.h>
  30. #include <sys/mman.h>
  31. #include "phttpd.h"
  32. int pm_init(const char **argv)
  33. {
  34.     const char *name = argv[0];
  35.     
  36.     if (debug > 1)
  37. fprintf(stderr, "*** libconfig/pm_init("%s") called ***n", name);
  38.     return 0;
  39. }
  40. void pm_exit(void)
  41. {
  42.     if (debug > 1)
  43. fprintf(stderr, "*** libconfig/pm_exit() called ***n");
  44. }
  45. struct miscinfo
  46. {
  47.     int fd;
  48.     char *url;
  49. };
  50. static int print_connection(struct connectioninfo *cip, void *misc)
  51. {
  52.     char buf[256];
  53.     struct miscinfo *mp;
  54.     char *address;
  55.     int port;
  56.     
  57.     mp = (struct miscinfo *) misc;
  58.     fd_printf(mp->fd, "<tr><td align=right>%d</td>n", cip->request_no);
  59.     fd_printf(mp->fd, "<td align=right><A HREF="%s?descriptors#%d">%d</A></td>",
  60.       mp->url, (cip->fd < 0 ? -(cip->fd) : cip->fd), cip->fd);
  61.     dns_get(cip->client, NULL, NULL, &address, &port);
  62.     fd_printf(mp->fd, "<td align=right>%d</td> <td>%s:%d</td><td>%s</td>",
  63.       (int) cip->tid,
  64.       address,
  65.       port,
  66.       ctime_r(&cip->cn_time, buf, sizeof(buf)));
  67.     if (cip->hip && cip->hip->orig_url)
  68. fd_printf(mp->fd, "<td>%s%s%s</td></tr>n", cip->hip->orig_url,
  69.   cip->hip->request ? "?" : "",
  70.   cip->hip->request ? cip->hip->request : "");
  71.     
  72.     return 0;
  73. }
  74. static int print_module(struct modinfo *mp, void *misc)
  75. {
  76.     int fd;
  77.     char buf[256];
  78.     
  79.     
  80.     fd = * (int *) misc;
  81.     fd_printf(fd, "<tr><td>%s</td><td align=right>%d</td><td align=right>%s</td></tr>n",
  82.       mp->name,
  83.       mp->use,
  84.       ctime_r(&mp->mtime, buf, sizeof(buf)));
  85.     
  86.     return 0;
  87. }
  88. static int print_fd(int fd, struct fd_buffer *bp, void *misc)
  89. {
  90.     int out_fd;
  91.     out_fd = * (int *) misc;
  92.     if (debug > 5)
  93. fprintf(stderr, "CONFIG: print_fd(%d, %p, %p)n",
  94. fd, bp, misc);
  95.     
  96.     if (fd == out_fd)
  97. return 0;
  98.     fd_printf(out_fd, "<a name="%d">n", fd);
  99.     fd_puts("<tr>n", out_fd);
  100.     if (bp)
  101.     {
  102. fd_printf(out_fd, "<td align=right>%d</td>n", fd);
  103. fd_printf(out_fd, "<td align=right>%d</td>", bp->type);
  104.     
  105. fd_printf(out_fd, "<td align=right>%d</td>n",
  106.   bp->in.end - bp->in.start);
  107. fd_printf(out_fd, "<td align=right>%d</td>n",
  108.   bp->in.size);
  109. fd_printf(out_fd, "<td align=right>%d</td>n",
  110.   bp->in.state);
  111. fd_printf(out_fd, "<td align=right>%d</td>n",
  112.   bp->out.end - bp->out.start);
  113. fd_printf(out_fd, "<td align=right>%d</td>n",
  114.   bp->out.size);
  115. fd_printf(out_fd, "<td align=right>%d</td>n",
  116.   bp->out.state);
  117.     }
  118.     else
  119.     {
  120. fd_printf(out_fd, "<td align=right>%d</td>", fd);
  121. fd_puts("<td align=right>unknown</td> ", out_fd);
  122. fd_puts("<td align=right>unknown</td> ", out_fd);
  123. fd_puts("<td align=right>unknown</td> ", out_fd);
  124. fd_puts("<td align=right>unknown</td> ", out_fd);
  125. fd_puts("<td align=right>unknown</td> ", out_fd);
  126. fd_puts("<td align=right>unknown</td> ", out_fd);
  127. fd_puts("<td align=right>unknown</td> ", out_fd);
  128. fd_puts("<td align=right>unknown</td> ", out_fd);
  129.     }
  130.     fd_puts("</tr>n", out_fd);
  131.     fd_puts("</a>n", out_fd);
  132.     return 0;
  133. }
  134. static int print_table_pair(void *value, void *misc)
  135. {
  136.     char **pair = (char **) value;
  137.     int fd = * (int *) misc;
  138.     
  139.     fd_printf(fd, "<tr><td>%s</td> <td>%s</td></tr>n", pair[0], pair[1]);
  140.     return 0;
  141. }
  142. static void print_stats(int fd, cachestat_t *csp, char *label)
  143. {
  144.     fd_printf(fd, "<tr><td>%-8s<td align=right>%10lu<td align=right>%10lu<td align=right>%10lu<td align=right>%10lu</tr>n",
  145.       label,
  146.       csp->lookups,
  147.       csp->reloads,
  148.       csp->updates,
  149.       csp->hits);
  150. }
  151. static int http_get_head(struct connectioninfo *cip)
  152. {
  153.     int result, len, i;
  154.     int fd = cip->fd;
  155.     struct httpinfo *hip = cip->hip;
  156.     extern struct options global_cfg_table[];
  157.     result = 200;
  158.     
  159.     if (hip->mip != NULL)
  160.     {
  161. http_sendheaders(fd, cip, result, NULL);
  162. fd_puts("Pragma: No-Cachen", fd);
  163. http_sendlastmodified(fd, cip->cn_time);
  164. fd_puts("Content-Type: text/htmln", fd);
  165.     }
  166.     if (hip->mip != NULL)
  167. fd_putc('n', fd);
  168.     
  169.     if (strcasecmp(hip->method, "HEAD") == 0)
  170. return result;
  171.     len = fd_written(fd);
  172.     if (hip->request == NULL)
  173.     {
  174. html_sysheader(fd, "H2", "Phttpd Information Menu");
  175. fd_puts("<OL>n", fd);
  176. fd_printf(fd,
  177.   "<LI><A HREF="%s?statistics">Server Statistics</A>n",
  178.   hip->url);
  179. fd_printf(fd,
  180.   "<LI><A HREF="%s?variables">Configuration Variables</A>n",
  181.   hip->url);
  182. fd_printf(fd,
  183.   "<LI><A HREF="%s?url_handlers">URL Handlers</A>n",
  184.   hip->url);
  185. fd_printf(fd,
  186.   "<LI><A HREF="%s?url_redirects">URL Temporary Redirects</A>n",
  187.   hip->url);
  188. fd_printf(fd,
  189.   "<LI><A HREF="%s?url_predirects">URL Permanent Redirects</A>n",
  190.   hip->url);
  191. fd_printf(fd,
  192.   "<LI><A HREF="%s?url_rewrites">URL Rewrite Rules</A>n",
  193.   hip->url);
  194. fd_printf(fd,
  195.   "<LI><A HREF="%s?read_authenticate">URL Read Authenticate Rules</A>n",
  196.   hip->url);
  197. fd_printf(fd,
  198.   "<LI><A HREF="%s?write_authenticate">URL Write Authenticate Rules</A>n",
  199.   hip->url);
  200. fd_printf(fd,
  201.   "<LI><A HREF="%s?host_access">Url Host Access Table</A>n",
  202.   hip->url);
  203. fd_printf(fd,
  204.   "<LI><A HREF="%s?connections">Current Connections</A>n",
  205.   hip->url);
  206. fd_printf(fd,
  207.   "<LI><A HREF="%s?modules">Loaded Modules</A>n",
  208.   hip->url);
  209. fd_printf(fd,
  210.   "<LI><A HREF="%s?descriptors">Open Descriptors</A>n",
  211.   hip->url);
  212. if (cntfile_path)
  213. {
  214.     fd_printf(fd,
  215.       "<LI><A HREF="%s?requests">Request Summary</A>n",
  216.       hip->url);
  217. }
  218. fd_puts("</OL>n", fd);
  219.     }
  220.     
  221.     else if (strcmp(hip->request, "variables") == 0)
  222.     {
  223. html_sysheader(fd, "H2", "Phttpd Variables");
  224. fd_puts("<table width="80%">n", fd);
  225. fd_puts("<tr><th align=left width="30%">Name</th><th align=left>Value</th></tr>n", fd);
  226. fd_puts("<tr><td colspan=2><hr noshade size=0></td></tr>n", fd);
  227. for (i = 0; global_cfg_table[i].name; i++)
  228. {
  229.     switch (global_cfg_table[i].type)
  230.     {
  231.       case T_NUMBER:
  232. fd_puts("<tr>n", fd);
  233. fd_printf(fd, "<td>%s</td> <td>%d</td>n",
  234.   global_cfg_table[i].name,
  235.   * (int *) global_cfg_table[i].var);
  236. fd_puts("</tr>n", fd);
  237. fd_puts("</tr>n", fd);
  238. break;
  239.       case T_STRING:
  240. fd_puts("<tr>n", fd);
  241. fd_printf(fd, "<td>%s</td> <td>"%s"</td>n",
  242.   global_cfg_table[i].name,
  243.   * (char **) global_cfg_table[i].var ?
  244.   * (char **) global_cfg_table[i].var : "<null>");
  245. fd_puts("</tr>n", fd);
  246. break;
  247.       case T_BOOL:
  248. fd_puts("<tr>n", fd);
  249. fd_printf(fd, "<td>%s</td> <td>%s</td>n",
  250.   global_cfg_table[i].name,
  251.   (* (int *) global_cfg_table[i].var) ?
  252.   "True" : "False");
  253. fd_puts("</tr>n", fd);
  254. break;
  255.     }
  256. }
  257. fd_puts("</table>n", fd);
  258.     }
  259.     else if (strcmp(hip->request, "url_handlers") == 0)
  260.     {
  261. html_sysheader(fd, "H2", "Phttpd URL Handlers");
  262. fd_puts("<table width="80%">n", fd);
  263. fd_puts("<tr><th align=left width="30%">Url</th><th align=left>Module</th></tr>n",fd);
  264. fd_puts("<tr><td colspan=2><hr noshade size=0></td></tr>n", fd);
  265. if (url_handlers_table)
  266.     tbl_foreach(url_handlers_table, print_table_pair, &fd);
  267. fd_puts("</table>n", fd);
  268.     }
  269.     
  270.     else if (strcmp(hip->request, "url_redirects") == 0)
  271.     {
  272. html_sysheader(fd, "H2", "Phttpd URL Temporary Redirects");
  273. fd_puts("<table width="80%">n", fd);
  274. fd_puts("<tr><th align=left width="30%">From</th><th align=left>To</th></tr>n",fd);
  275. fd_puts("<tr><td colspan=2><hr noshade size=0></td></tr>n", fd);
  276. if (url_redirects_table)
  277.     tbl_foreach(url_redirects_table, print_table_pair, &fd);
  278. fd_puts("</table>n", fd);
  279.     }
  280.     else if (strcmp(hip->request, "url_predirects") == 0)
  281.     {
  282. html_sysheader(fd, "H2", "Phttpd URL Permanent Redirects");
  283. fd_puts("<table width="80%">n", fd);
  284. fd_puts("<tr><th align=left width="30%">From</th><th align=left>To</th></tr>n",fd);
  285. fd_puts("<tr><td colspan=2><hr noshade size=0></td></tr>n", fd);
  286. if (url_predirects_table)
  287.     tbl_foreach(url_predirects_table, print_table_pair, &fd);
  288. fd_puts("</table>n", fd);
  289.     }
  290.     else if (strcmp(hip->request, "url_rewrites") == 0)
  291.     {
  292. html_sysheader(fd, "H2", "Phttpd URL Rewrites");
  293. fd_puts("<table width="80%">n", fd);
  294. fd_puts("<tr><th align=left width="30%">From</th><th align=left>To</th></tr>n",fd);
  295. fd_puts("<tr><td colspan=2><hr noshade size=0></td></tr>n", fd);
  296.      if (url_rewrites_table)
  297.     tbl_foreach(url_rewrites_table, print_table_pair, &fd);
  298. fd_puts("</table>n", fd);
  299.     }
  300.     else if (strcmp(hip->request, "read_authenticate") == 0)
  301.     {
  302. html_sysheader(fd, "H2", "Phttpd URL Read Authentication Rules");
  303. fd_puts("<table width="80%">n", fd);
  304. fd_puts("<tr><th align=left width="30%">Url</th><th align=left>Domain</th></tr>n",fd);
  305. fd_puts("<tr><td colspan=2><hr noshade size=0></td></tr>n", fd);
  306.      if (read_authenticate_table)
  307.     tbl_foreach(read_authenticate_table, print_table_pair, &fd);
  308. fd_puts("</table>n", fd);
  309.     }
  310.     
  311.     else if (strcmp(hip->request, "write_authenticate") == 0)
  312.     {
  313. html_sysheader(fd, "H2", "Phttpd URL Write Authentication Rules");
  314. fd_puts("<table width="80%">n", fd);
  315. fd_puts("<tr><th align=left width="30%">Url</th><th align=left>Domain</th></tr>n",fd);
  316. fd_puts("<tr><td colspan=2><hr noshade size=0></td></tr>n", fd);
  317.      if (write_authenticate_table)
  318.     tbl_foreach(write_authenticate_table, print_table_pair, &fd);
  319. fd_puts("</table>n", fd);
  320.     }
  321.     else if (strcmp(hip->request, "host_access") == 0)
  322.     {
  323. html_sysheader(fd, "H2", "Phttpd URL Host Access Rules");
  324. fd_puts("<table width="80%">n", fd);
  325. fd_puts("<tr><th align=left width="30%">Url</th><th align=left>File</th></tr>n",fd);
  326. fd_puts("<tr><td colspan=2><hr noshade size=></td></tr>n", fd);
  327.      if (host_access_table)
  328.     tbl_foreach(host_access_table, print_table_pair, &fd);
  329. fd_puts("</table>n", fd);
  330.     }
  331.     
  332.     else if (strcmp(hip->request, "statistics") == 0)
  333.     {
  334. struct count_t count;
  335. char buf[256];
  336. int cs, dt;
  337. time_t time_now;
  338. time(&time_now);
  339. html_sysheader(fd, "H2", "Phttpd Statistics");
  340. fd_puts("<H3>General</H3>", fd);
  341. fd_puts("<table>", fd);
  342. fd_printf(fd, "<tr><td>Server started:</td><td>%s</td></tr>",
  343.   ctime_r(&start_time, buf, sizeof(buf)));
  344. fd_printf(fd, "<tr><td>Current time:</td><td>%s",
  345.   ctime_r(&time_now, buf, sizeof(buf)));
  346. fd_printf(fd, "<tr><td>Connections totally:</td><td>%d ",
  347.   cip->request_no);
  348. cs = cip->request_no / (time_now - start_time);
  349. if (cs == 0)
  350. {
  351.     dt = (time_now - start_time) / 60 + 1;
  352.     cs = cip->request_no / dt;
  353.     
  354.     if (cs == 0)
  355.     {
  356. dt = (time_now - start_time) / 3600 + 1;
  357. cs = cip->request_no / dt;
  358. fd_printf(fd, "(%d conns/hour)", cs);
  359.     }
  360.     else
  361. fd_printf(fd, "(%d conns/min)", cs);
  362. }
  363. else
  364.     fd_printf(fd, "(%d conns/sec)", cs);
  365. fd_printf(fd, "</td></tr><tr><td><A HREF="%s?connections">", hip->url);
  366. fd_printf(fd, "Connections currently</A>:</td><td>%d</td></tr>n",
  367.   cn_active());
  368. fd_puts("</table>", fd);
  369. fd_puts("<H3>Cache statistics</H3>n", fd);
  370. {
  371.     cachestat_t csb;
  372.     
  373.     fd_puts("<table><tr>", fd);
  374.     fd_printf(fd, "<th align=left>%-8s<th align=right>%10s<th align=right>%10s<th align=right>%10s<th align=right>%10s</tr>n",
  375.       "Cache",
  376.       "Lookups",
  377.       "Reloads",
  378.       "Updates",
  379.       "Hits");
  380.     fd_puts("<tr><td colspan=5><hr noshade size=0></td></tr>n", fd);
  381.     
  382.     urlcache_getstats(&csb);
  383.     print_stats(fd, &csb, "URL");
  384.     
  385.     fscache_getstats(&csb);
  386.     print_stats(fd, &csb, "Filesys");
  387.     
  388.     usercache_getstats(&csb);
  389.     print_stats(fd, &csb, "Username");
  390.     hostcache_getstats_byname(&csb);
  391.     print_stats(fd, &csb, "Hostname");
  392.     
  393.     hostcache_getstats_byaddr(&csb);
  394.     print_stats(fd, &csb, "Hostaddr");
  395.     
  396.     fd_puts("</table>n", fd);
  397. }
  398. #ifdef INCLUDE_ALLOC_STATS
  399. {
  400.     struct allocstats lasb;
  401.     
  402.     fd_puts("<H3>Memory allocation statistics</H3>n", fd);
  403.     mutex_lock(&alloc_stats.lock);
  404.     lasb = alloc_stats;
  405.     mutex_unlock(&alloc_stats.lock);
  406.     fd_puts("<table>", fd);
  407.     fd_printf(fd, "<tr><td>Calls to malloc</td><td align=right>%lu</td></tr>n",
  408.       lasb.malloc_calls);
  409.     
  410.     fd_printf(fd, "<tr><td>Calls to free</td><td align=right>%lu</td></tr>n",
  411.       lasb.free_calls);
  412.     
  413.     fd_printf(fd, "<tr><td>Calls to realloc</td><td align=right>%lu</td></tr>n",
  414.       lasb.realloc_calls);
  415.     
  416.     fd_printf(fd, "<tr><td>Bytes allocated</td><td align=right>%lu</td></tr>n",
  417.       lasb.bytes);
  418.     
  419.     fd_printf(fd, "<tr><td>Blocks allocated</td><td align=right>%lu</td></tr>n",
  420.       lasb.blocks);
  421.     
  422.     fd_puts("</table>", fd);
  423. }
  424. #endif
  425. if (cntfile_path)
  426. {
  427.     get_totals(&count);
  428.     
  429.     fd_printf(fd,
  430. "<H4>Totals for <A HREF="%s?requests">Summary</A> Period: %s",
  431.       hip->url,
  432.       ctime_r(&(count.starttime), buf, sizeof(buf)));
  433.     fd_printf(fd, " to %s</H4>n",
  434.       ctime_r(&time_now, buf, sizeof(buf)));
  435.     print_totals(fd);
  436. }
  437.     }
  438.     else if (cntfile_path && strcmp(hip->request, "requests") == 0)
  439.     {
  440. html_sysheader(fd, "H2", "Phttpd Requests Summary");
  441. print_counts(fd);
  442.     }
  443.     
  444.     else if (strcmp(hip->request, "connections") == 0)
  445.     {
  446. struct miscinfo mib;
  447. html_sysheader(fd, "H2", "Phttpd Current Connections");
  448. mib.fd = fd;
  449. mib.url = hip->url;
  450. fd_puts("<table>n", fd);
  451. fd_puts("<tr>n", fd);
  452. fd_puts("<th>Conn</th>n", fd);
  453. fd_puts("<th>File</th>n", fd);
  454. fd_puts("<th>Thread</th>n", fd);
  455. fd_puts("<th align=left>Client</th>n", fd);
  456. fd_puts("<th align=left>Started</th>n", fd);
  457. fd_puts("<th align=left>URL</th>n", fd);
  458. fd_puts("</tr><tr><td colspan=6><hr noshade size=0></td></tr>n", fd);
  459. cn_foreach(print_connection, (void *) &mib);
  460. fd_puts("</table>", fd);
  461.     }
  462.     
  463.     else if (strcmp(hip->request, "modules") == 0)
  464.     {
  465. html_sysheader(fd, "H2", "Phttpd Loaded Modules");
  466. fd_puts("<table width=80%>n<tr>n", fd);
  467. fd_puts("<th align=left>Module</th>n", fd);
  468. fd_puts("<th align=right>Use</th>n", fd);
  469. fd_puts("<th align=right>Modified</th>n", fd);
  470. fd_puts("<tr> <td colspan=3><hr noshade size=0>n", fd);
  471. md_foreach(print_module, (void *) &fd);
  472. fd_puts("</table>", fd);
  473.     }
  474.     
  475.     else if (strcmp(hip->request, "descriptors") == 0)
  476.     {
  477. html_sysheader(fd, "H2", "Phttpd Descriptors");
  478. fd_printf(fd, "(Excluding this connection, fd#%d)n", fd);
  479. fd_puts("<table width="90%">n", fd);
  480. fd_puts("<tr>n", fd);
  481. fd_puts("<th>fd</th>n", fd);
  482. fd_puts("<th>type</th>n", fd);
  483. fd_puts("<th>input len</th>n", fd);
  484. fd_puts("<th>input size</th>n", fd);
  485. fd_puts("<th>input state</th>n", fd);
  486. fd_puts("<th>output len</th>n", fd);
  487. fd_puts("<th>output size</th>n", fd);
  488. fd_puts("<th>output state</th>n", fd);
  489. fd_puts("</tr>n", fd);
  490. fd_puts("<tr>n<td colspan=8><hr noshade size=0></td>n</tr>n", fd);
  491. fd_foreach(print_fd, (void *) &fd);
  492. fd_puts("</table><p>n", fd);
  493. fd_puts("<b>Types:</b> 0=Socket, 1=File, 2=TTY, 3=Pipe, 4=String<br>n", fd);
  494. fd_puts("<b>States:</b> -1=EOF, 0=Free, 1=Openn", fd);
  495.     }
  496.     else
  497.     {
  498. html_sysheader(fd, "H2", "Unknown config request");
  499. fd_puts("<BLOCKQUOTE>", fd);
  500. fd_puts(hip->request, fd);
  501. fd_puts("</BLOCKQUOTE>", fd);
  502.     }
  503.     
  504.     html_sysfooter(fd);
  505. #if 0
  506.     hip->length = fd_written(fd) - len;
  507. #endif
  508.     return result;
  509. }
  510. int pm_request(struct connectioninfo *cip)
  511. {
  512.     struct httpinfo *hip = cip->hip;
  513.     
  514.     if (strcasecmp(hip->method, "GET") == 0 ||
  515. strcasecmp(hip->method, "HEAD") == 0)
  516. return http_get_head(cip);
  517.     else
  518. return -1;
  519. }