#include "util_script.h"
#include "ap_mpm.h"
#include "mpm_common.h"
+#include "ap_provider.h"
#include <stdio.h>
#include <stdlib.h>
return 0;
}
+static int cmp_provider_groups(const void *a_, const void *b_)
+{
+ const ap_list_provider_groups_t *a = a_, *b = b_;
+ int ret = strcmp(a->provider_group, b->provider_group);
+ if (!ret)
+ ret = strcmp(a->provider_version, b->provider_version);
+ return ret;
+}
+
+static int cmp_provider_names(const void *a_, const void *b_)
+{
+ const ap_list_provider_names_t *a = a_, *b = b_;
+ return strcmp(a->provider_name, b->provider_name);
+}
+
+static void show_providers(request_rec *r)
+{
+ apr_array_header_t *groups = ap_list_provider_groups(r->pool);
+ ap_list_provider_groups_t *group;
+ apr_array_header_t *names;
+ ap_list_provider_names_t *name;
+ int i,j;
+ const char *cur_group = NULL;
+
+ qsort(groups->elts, groups->nelts, sizeof(ap_list_provider_groups_t),
+ cmp_provider_groups);
+ ap_rputs("<h2><a name=\"providers\">Providers</a></h2>\n<dl>", r);
+
+ for (i = 0; i < groups->nelts; i++) {
+ group = &APR_ARRAY_IDX(groups, i, ap_list_provider_groups_t);
+ if (!cur_group || strcmp(cur_group, group->provider_group) != 0) {
+ if (cur_group)
+ ap_rputs("\n</dt>\n", r);
+ cur_group = group->provider_group;
+ ap_rprintf(r, "<dt><strong>%s</strong> (version <tt>%s</tt>):"
+ "\n <br />\n", cur_group, group->provider_version);
+ }
+ names = ap_list_provider_names(r->pool, group->provider_group,
+ group->provider_version);
+ qsort(names->elts, names->nelts, sizeof(ap_list_provider_names_t),
+ cmp_provider_names);
+ for (j = 0; j < names->nelts; j++) {
+ name = &APR_ARRAY_IDX(names, j, ap_list_provider_names_t);
+ ap_rprintf(r, "<tt> %s</tt><br/>", name->provider_name);
+ }
+ }
+ if (cur_group)
+ ap_rputs("\n</dt>\n", r);
+ ap_rputs("</dl>\n<hr />\n", r);
+}
+
static int cmp_module_name(const void *a_, const void *b_)
{
const module * const *a = a_;
ap_rputs("<dl><dt><tt>Subpages:<br />", r);
ap_rputs("<a href=\"?config\">Configuration Files</a>, "
"<a href=\"?server\">Server Settings</a>, "
- "<a href=\"?list\">Module List</a>, "
- "<a href=\"?hooks\">Active Hooks</a>", r);
+ "<a href=\"?list\">Module List</a>, "
+ "<a href=\"?hooks\">Active Hooks</a>, "
+ "<a href=\"?providers\">Available Providers</a>", r);
ap_rputs("</tt></dt></dl><hr />", r);
ap_rputs("<dl><dt><tt>Sections:<br />", r);
"<a href=\"#server\">Server Settings</a>, "
"<a href=\"#startup_hooks\">Startup Hooks</a>, "
"<a href=\"#request_hooks\">Request Hooks</a>, "
- "<a href=\"#other_hooks\">Other Hooks</a>", r);
+ "<a href=\"#other_hooks\">Other Hooks</a>, "
+ "<a href=\"#providers\">Providers</a>", r);
ap_rputs("</tt></dt></dl><hr />", r);
ap_rputs("<h2><a name=\"modules\">Loaded Modules</a></h2>"
show_active_hooks(r);
}
+ if (!r->args || !strcasecmp(r->args, "providers")) {
+ show_providers(r);
+ }
+
if (r->args && 0 == strcasecmp(r->args, "config")) {
ap_rputs("<dl><dt><strong>Configuration:</strong>\n", r);
mod_info_module_cmds(r, NULL, ap_conftree, 0, 0);