summaryrefslogtreecommitdiffstats
path: root/polyp
diff options
context:
space:
mode:
Diffstat (limited to 'polyp')
-rw-r--r--polyp/cli-text.c44
-rw-r--r--polyp/cli-text.h2
-rw-r--r--polyp/main.c45
-rw-r--r--polyp/protocol-http.c41
4 files changed, 83 insertions, 49 deletions
diff --git a/polyp/cli-text.c b/polyp/cli-text.c
index dd40add2..d4c46dc0 100644
--- a/polyp/cli-text.c
+++ b/polyp/cli-text.c
@@ -37,6 +37,7 @@
#include "sample-util.h"
#include "scache.h"
#include "autoload.h"
+#include "xmalloc.h"
char *pa_module_list_to_string(struct pa_core *c) {
struct pa_strbuf *s;
@@ -306,3 +307,46 @@ char *pa_autoload_list_to_string(struct pa_core *c) {
return pa_strbuf_tostring_free(s);
}
+
+char *pa_full_status_string(struct pa_core *c) {
+ struct pa_strbuf *s;
+ int i;
+
+ s = pa_strbuf_new();
+
+ for (i = 0; i < 8; i++) {
+ char *t = NULL;
+
+ switch (i) {
+ case 0:
+ t = pa_sink_list_to_string(c);
+ break;
+ case 1:
+ t = pa_source_list_to_string(c);
+ break;
+ case 2:
+ t = pa_sink_input_list_to_string(c);
+ break;
+ case 3:
+ t = pa_source_output_list_to_string(c);
+ break;
+ case 4:
+ t = pa_client_list_to_string(c);
+ break;
+ case 5:
+ t = pa_module_list_to_string(c);
+ break;
+ case 6:
+ t = pa_scache_list_to_string(c);
+ break;
+ case 7:
+ t = pa_autoload_list_to_string(c);
+ break;
+ }
+
+ pa_strbuf_puts(s, t);
+ pa_xfree(t);
+ }
+
+ return pa_strbuf_tostring_free(s);
+}
diff --git a/polyp/cli-text.h b/polyp/cli-text.h
index 65607e94..d19dd48c 100644
--- a/polyp/cli-text.h
+++ b/polyp/cli-text.h
@@ -36,5 +36,7 @@ char *pa_module_list_to_string(struct pa_core *c);
char *pa_scache_list_to_string(struct pa_core *c);
char *pa_autoload_list_to_string(struct pa_core *c);
+char *pa_full_status_string(struct pa_core *c);
+
#endif
diff --git a/polyp/main.c b/polyp/main.c
index 51c41439..d6c25b4b 100644
--- a/polyp/main.c
+++ b/polyp/main.c
@@ -71,49 +71,16 @@ static void signal_callback(struct pa_mainloop_api*m, struct pa_signal_event *e,
switch (sig) {
case SIGUSR1:
pa_module_load(userdata, "module-cli", NULL);
- return;
+ break;
case SIGUSR2:
pa_module_load(userdata, "module-cli-protocol-unix", NULL);
- return;
+ break;
case SIGHUP: {
- int i;
-
- for (i = 0;; i++) {
- char *c;
- switch (i) {
- case 0:
- c = pa_sink_list_to_string(userdata);
- break;
- case 1:
- c = pa_source_list_to_string(userdata);
- break;
- case 2:
- c = pa_sink_input_list_to_string(userdata);
- break;
- case 3:
- c = pa_source_output_list_to_string(userdata);
- break;
- case 4:
- c = pa_client_list_to_string(userdata);
- break;
- case 5:
- c = pa_module_list_to_string(userdata);
- break;
- case 6:
- c = pa_scache_list_to_string(userdata);
- break;
- case 7:
- c = pa_autoload_list_to_string(userdata);
- break;
- default:
- return;
- }
- pa_log_notice(c);
- pa_xfree(c);
- }
-
+ char *c = pa_full_status_string(userdata);
+ pa_log_notice(c);
+ pa_xfree(c);
return;
}
@@ -122,7 +89,7 @@ static void signal_callback(struct pa_mainloop_api*m, struct pa_signal_event *e,
default:
pa_log_info(__FILE__": Exiting.\n");
m->quit(m, 1);
- return;
+ break;
}
}
diff --git a/polyp/protocol-http.c b/polyp/protocol-http.c
index 768b7588..64e6dadf 100644
--- a/polyp/protocol-http.c
+++ b/polyp/protocol-http.c
@@ -33,6 +33,7 @@
#include "xmalloc.h"
#include "log.h"
#include "namereg.h"
+#include "cli-text.h"
/* Don't allow more than this many concurrent connections */
#define MAX_CONNECTIONS 10
@@ -40,7 +41,8 @@
#define internal_server_error(c) http_message((c), 500, "Internal Server Error", NULL)
#define URL_ROOT "/"
-#define URL_CSS "/style.css"
+#define URL_CSS "/style"
+#define URL_STATUS "/status"
struct connection {
struct pa_protocol_http *protocol;
@@ -66,6 +68,9 @@ static void http_response(struct connection *c, int code, const char *msg, const
"HTTP/1.0 %i %s\n"
"Connection: close\n"
"Content-Type: %s\n"
+ "Cache-Control: no-cache\n"
+ "Expires: 0\n"
+ "Server: "PACKAGE_NAME"/"PACKAGE_VERSION"\n"
"\n", code, msg, mime);
pa_ioline_puts(c->line, s);
@@ -80,8 +85,10 @@ static void http_message(struct connection *c, int code, const char *msg, const
if (!text)
text = msg;
- snprintf(s, sizeof(s),
- "<html><head><title>%s</title></head>\n"
+ snprintf(s, sizeof(s),
+ "<?xml version=\"1.0\"?>\n"
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>%s</title></head>\n"
"<body>%s</body></html>\n",
text, text);
@@ -120,7 +127,7 @@ static void line_callback(struct pa_ioline *line, const char *s, void *userdata)
s +=4;
- c->url = pa_xstrndup(s, strcspn(s, " \r\n\t"));
+ c->url = pa_xstrndup(s, strcspn(s, " \r\n\t?"));
c->state = MIME_HEADER;
break;
@@ -135,19 +142,20 @@ static void line_callback(struct pa_ioline *line, const char *s, void *userdata)
/* We're done */
c->state = DATA;
- pa_log("req for %s\n", c->url);
+ pa_log_info(__FILE__": request for %s\n", c->url);
if (!strcmp(c->url, URL_ROOT)) {
char txt[256];
http_response(c, 200, "OK", "text/html");
pa_ioline_puts(c->line,
- "<html><head><title>"PACKAGE_NAME" "PACKAGE_VERSION"</title>\n"
- "<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\"/></head><body>\n");
+ "<?xml version=\"1.0\"?>\n"
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\"><title>"PACKAGE_NAME" "PACKAGE_VERSION"</title>\n"
+ "<link rel=\"stylesheet\" type=\"text/css\" href=\"style\"/></head><body>\n");
pa_ioline_puts(c->line,
"<h1>"PACKAGE_NAME" "PACKAGE_VERSION"</h1>\n"
- "<h2>Server Information</h2>\n"
"<table>");
#define PRINTF_FIELD(a,b) pa_ioline_printf(c->line, "<tr><td><b>%s</b></td><td>%s</td></tr>\n",(a),(b))
@@ -157,7 +165,11 @@ static void line_callback(struct pa_ioline *line, const char *s, void *userdata)
PRINTF_FIELD("Default Sample Specification:", pa_sample_spec_snprint(txt, sizeof(txt), &c->protocol->core->default_sample_spec));
PRINTF_FIELD("Default Sink:", pa_namereg_get_default_sink_name(c->protocol->core));
PRINTF_FIELD("Default Source:", pa_namereg_get_default_source_name(c->protocol->core));
+
pa_ioline_puts(c->line, "</table>");
+
+ pa_ioline_puts(c->line, "<p><a href=\"/status\">Click here</a> for an extensive server status report.</p>");
+
pa_ioline_puts(c->line, "</body></html>\n");
pa_ioline_defer_close(c->line);
@@ -177,7 +189,16 @@ static void line_callback(struct pa_ioline *line, const char *s, void *userdata)
"table { margin-left: 1cm; border:1px solid lightgrey; padding: 0.2cm; }\n"
"td { padding-left:10px; padding-right:10px; }\n");
- pa_ioline_defer_close(c->line);
+ pa_ioline_defer_close(c->line);
+ } else if (!strcmp(c->url, URL_STATUS)) {
+ char *s;
+
+ http_response(c, 200, "OK", "text/plain");
+ s = pa_full_status_string(c->protocol->core);
+ pa_ioline_puts(c->line, s);
+ pa_xfree(s);
+
+ pa_ioline_defer_close(c->line);
} else
http_message(c, 404, "Not Found", NULL);
@@ -200,7 +221,7 @@ static void on_connection(struct pa_socket_server*s, struct pa_iochannel *io, vo
assert(s && io && p);
if (pa_idxset_ncontents(p->connections)+1 > MAX_CONNECTIONS) {
- pa_log(__FILE__": Warning! Too many connections (%u), dropping incoming connection.\n", MAX_CONNECTIONS);
+ pa_log_warn(__FILE__": Warning! Too many connections (%u), dropping incoming connection.\n", MAX_CONNECTIONS);
pa_iochannel_free(io);
return;
}