5 #include <sys/socket.h>
19 #include "server-cgi.h"
21 #include "configuration.h"
32 #include "trackname.h"
46 static int compare_entry(const void *a, const void *b) {
47 const struct entry *ea = a, *eb = b;
49 return compare_tracks(ea->sort, eb->sort,
50 ea->display, eb->display,
54 static const char *front_url(void) {
58 /* preserve management interface visibility */
59 if((mgmt = cgi_get("mgmt")) && !strcmp(mgmt, "true")) {
60 byte_xasprintf(&url, "%s?mgmt=true", config->url);
66 static void redirect(struct sink *output) {
69 back = cgi_get("back");
70 cgi_header(output, "Location", back && *back ? back : front_url());
71 header_cookie(output);
75 static void expand_template(dcgi_state *ds, cgi_sink *output,
77 cgi_header(output->sink, "Content-Type", "text/html");
78 header_cookie(output->sink);
79 cgi_body(output->sink);
80 expand(output, action, ds);
83 /* expansions *****************************************************************/
85 struct trackinfo_state {
87 const struct queue_entry *q;
97 static int compare_result(const void *a, const void *b) {
98 const struct result *ra = a, *rb = b;
101 if(!(c = strcmp(ra->sort, rb->sort)))
102 c = strcmp(ra->track, rb->track);
106 static void exp_stats(int attribute((unused)) nargs,
107 char attribute((unused)) **args,
113 cgi_opentag(output->sink, "pre", "class", "stats", (char *)0);
114 if(!disorder_stats(ds->g->client, &v, 0)) {
116 cgi_output(output, "%s\n", *v++);
118 cgi_closetag(output->sink, "pre");
121 static char *expandarg(const char *arg, dcgi_state *ds) {
127 output.sink = sink_dynstr(&d);
128 expandstring(&output, arg, ds);
129 dynstr_terminate(&d);
133 static void exp_navigate(int attribute((unused)) nargs,
139 const char *path = expandarg(args[0], ds);
144 memset(&substate, 0, sizeof substate);
146 ptr = path + 1; /* skip root */
148 substate.nav_path = path;
151 while(*ptr && *ptr != '/')
153 substate.last = !*ptr;
154 substate.nav_len = ptr - path;
155 substate.nav_dirlen = dirlen;
156 expandstring(output, args[1], &substate);
157 dirlen = substate.nav_len;
164 static void exp_fullname(int attribute((unused)) nargs,
165 char attribute((unused)) **args,
169 cgi_output(output, "%.*s", ds->nav_len, ds->nav_path);