#ifdef SWILL

#include "totd.h"

static char stats_start[] = "<HTML>\n<BODY>\n";
static char stats_end[] = "</BODY></HTML>\n";

void print_stats(FILE *f) {
        char astr[MAX_DNAME];
	G_List *gl;
	int i;

        fprintf(f,"%s\n",stats_start);
        fprintf(f,"<h1>Totd DNS-proxy Status</h1>\n<p></p>\n");

        fprintf(f,"<p></p>\n<h2>Forwarders:</h2>\n");
	fprintf (f, "<ul>\n");
        for (gl = T.Fwd_list->next; gl->list_data; gl = gl->next) {
                Fwd *fwd = (Fwd *) (gl->list_data);
		if (gl == T.current_fwd)
			fprintf (f, "<li><b>hostname: %s port: %d</b> (active)</li>\n", 
                		 sprint_inet(fwd->sa, astr), fwd->port);
		else
			fprintf (f, "<li>hostname: %s port: %d</li>\n", 
                		 sprint_inet(fwd->sa, astr), fwd->port);
	}
	fprintf (f, "</ul>\n");

        fprintf(f,"<p></p>\n<h2>Configured Prefixes:</h2>\n");
	fprintf (f, "<ul>\n");
	for (i = 0; i < T.prefixnum; i++) {
		if (i == T.current_prefix)
			fprintf (f, "<li><b>%s</b> (active)</li>\n",
				 inet_ntop(AF_INET6, &T.prefix[i], astr, 
				 	   sizeof (struct sockaddr_in6)));
		else
			fprintf (f, "<li>%s</li>\n",
				 inet_ntop(AF_INET6, &T.prefix[i], astr, 
					   sizeof (struct sockaddr_in6)));
	}
	fprintf (f, "</ul>\n");

        fprintf(f,"%s\n",stats_end);
        return;
}

void add_prefix(FILE *f) {
	const int cmpsiz = sizeof(struct in6_addr) - sizeof(struct in_addr);
	char prefix[TOTPREFIXLEN + 1];
	char *pref;
	int i;

        fprintf(f,"<HTML>\n<BODY>\n");
  	if (!swill_getargs("s(prefix)",&pref)) {
		fprintf(f, "<h1>No prefix</h1>\n");
        	fprintf(f,"</BODY>\n</HTML>");
		return;
	}

        if (inet_pton (AF_INET6, pref, (void *)&prefix) != 1) {
                syslog (LOG_DEBUG, "Not a valid prefix: %s", pref);
		fprintf(f, "<h1>No valid prefix</h1>\n");
        	fprintf(f,"</BODY>\n</HTML>");
		return;
	}
        for (i = 0; i < T.prefixnum; i++) {
                if (!memcmp(prefix, &T.prefix[i], cmpsiz)) {
                	syslog (LOG_DEBUG, "Duplicate prefix: %s", pref);
			fprintf(f, "<h1>Duplicate prefix, not added</h1>\n");
        		fprintf(f,"</BODY>\n</HTML>");
			return;
		}
	}

	if (conv_trick_conf(pref)) {
		fprintf(f, "<h1>Can not add prefix: %s</h1>\n", pref);
		syslog (LOG_INFO, "can not add prefix %d: %s", T.prefixnum, pref);

	} else {
		fprintf(f, "<h1>Added prefix %d: %s</h1>\n", T.prefixnum, pref);
		syslog (LOG_INFO, "prefix %d added: %s", T.prefixnum, pref);
	}
        fprintf(f,"</BODY>\n</HTML>");
	return;
}

void del_prefix(FILE *f) {
	const int cmpsiz = sizeof(struct in6_addr) - sizeof(struct in_addr);
	char prefix[TOTPREFIXLEN + 1];
        char *pref;
	int i;

        fprintf(f,"<HTML>\n<BODY>\n");
        if (!swill_getargs("s(prefix)",&pref)) {
		fprintf(f, "<h1>No prefix</h1>\n");
        	fprintf(f,"</BODY>\n</HTML>");
		return;
	}

        if (inet_pton (AF_INET6, pref, (void *)&prefix) != 1) {
                syslog (LOG_DEBUG, "Not a valid prefix: %s", pref);
		fprintf(f, "<h1>No valid prefix</h1>\n");
        	fprintf(f,"</BODY>\n</HTML>");
		return;
	}

        for (i = 0; i < T.prefixnum; i++) {
                if (!memcmp(prefix, &T.prefix[i], cmpsiz)) {
			int j;

			for (j=i+1; j < MAXPREFIXES; j++) {
				memcpy(&T.prefix[j-1], &T.prefix[j], TOTPREFIXLEN);
			}

			fprintf(f, "<h1>Deleted prefix %d: %s</h1>\n", T.prefixnum, pref);
			syslog (LOG_INFO, "prefix %d deleted: %s", T.prefixnum, pref);
		}
        }
	if (i == T.prefixnum) {
		fprintf(f, "<h1>No such prefix: %s</h1>\n", pref);
		syslog (LOG_INFO, "No such prefix to delete: %s", pref);
	}
	else T.prefixnum--;

        fprintf(f,"</BODY>\n</HTML>");
	return;
}

#endif


syntax highlighted by Code2HTML, v. 0.9.1