diff options
Diffstat (limited to 'subversion/mod_dav_svn/status.c')
-rw-r--r-- | subversion/mod_dav_svn/status.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/subversion/mod_dav_svn/status.c b/subversion/mod_dav_svn/status.c new file mode 100644 index 0000000..6dc1c9e --- /dev/null +++ b/subversion/mod_dav_svn/status.c @@ -0,0 +1,115 @@ +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * ==================================================================== + */ + +#include <httpd.h> +#include <http_core.h> +#include <http_config.h> +#include <http_request.h> +#include <http_protocol.h> + +#include "dav_svn.h" +#include "private/svn_cache.h" +#include "private/svn_fs_private.h" + +#ifdef HAVE_UNISTD_H +#include <unistd.h> /* For getpid() */ +#endif + +/* The apache headers define these and they conflict with our definitions. */ +#ifdef PACKAGE_BUGREPORT +#undef PACKAGE_BUGREPORT +#endif +#ifdef PACKAGE_NAME +#undef PACKAGE_NAME +#endif +#ifdef PACKAGE_STRING +#undef PACKAGE_STRING +#endif +#ifdef PACKAGE_TARNAME +#undef PACKAGE_TARNAME +#endif +#ifdef PACKAGE_VERSION +#undef PACKAGE_VERSION +#endif +#include "svn_private_config.h" + +#ifndef DEFAULT_TIME_FORMAT +#define DEFAULT_TIME_FORMAT "%Y-%m-%d %H:%M:%S %Z" +#endif + +/* A bit like mod_status: add a location: + + <Location /svn-status> + SetHandler svn-status + </Location> + + and then point a browser at http://server/svn-status. +*/ +int dav_svn__status(request_rec *r) +{ + svn_cache__info_t *info; + svn_string_t *text_stats; + apr_array_header_t *lines; + int i; + + if (r->method_number != M_GET || strcmp(r->handler, "svn-status")) + return DECLINED; + + info = svn_cache__membuffer_get_global_info(r->pool); + text_stats = svn_cache__format_info(info, FALSE, r->pool); + lines = svn_cstring_split(text_stats->data, "\n", FALSE, r->pool); + + ap_set_content_type(r, "text/html; charset=ISO-8859-1"); + + ap_rvputs(r, + DOCTYPE_HTML_3_2 + "<html><head>\n" + "<title>Apache SVN Status</title>\n" + "</head><body>\n" + "<h1>Apache SVN Cache Status for ", + ap_escape_html(r->pool, ap_get_server_name(r)), + " (via ", + r->connection->local_ip, + ")</h1>\n<dl>\n<dt>Server Version: ", + ap_get_server_description(), + "</dt>\n<dt>Current Time: ", + ap_ht_time(r->pool, apr_time_now(), DEFAULT_TIME_FORMAT, 0), + "</dt>\n", SVN_VA_NULL); + +#if !defined(WIN32) && defined(HAVE_UNISTD_H) && defined(HAVE_GETPID) + /* On Unix the server is generally multiple processes and this + request only shows the status of the single process that handles + the request. Ideally we would iterate over all processes but that + would need some MPM support, so we settle for simply showing the + process ID. */ + ap_rprintf(r, "<dt>Server process id: %d</dt>\n", (int)getpid()); +#endif + + for (i = 0; i < lines->nelts; ++i) + { + const char *line = APR_ARRAY_IDX(lines, i, const char *); + ap_rvputs(r, "<dt>", line, "</dt>\n", SVN_VA_NULL); + } + + ap_rvputs(r, "</dl></body></html>\n", SVN_VA_NULL); + + return 0; +} |