diff --git a/data.c b/data.c
index 13cef84..b20dc9e 100644
--- a/data.c
+++ b/data.c
@@ -801,6 +801,31 @@ int actor_get(snac *snac, char *actor, d_char **data)
}
+d_char *_static_fn(snac *snac, char *id)
+/* gets the filename for a static file */
+{
+ return xs_fmt("%s/static/%s", snac->basedir, id);
+}
+
+
+int static_get(snac *snac, char *id, d_char **data, int *size)
+/* returns static content */
+{
+ xs *fn = _static_fn(snac, id);
+ FILE *f;
+ int status = 404;
+
+ *size = 0xfffffff;
+
+ if ((f = fopen(fn, "rb")) != NULL) {
+ *data = xs_read(f, size);
+ status = 200;
+ }
+
+ return status;
+}
+
+
void enqueue_input(snac *snac, char *msg, char *req)
/* enqueues an input message */
{
diff --git a/html.c b/html.c
index 7f8e990..89df82a 100644
--- a/html.c
+++ b/html.c
@@ -207,12 +207,52 @@ d_char *html_msg_icon(snac *snac, d_char *s, char *msg)
}
+d_char *html_user_header(snac *snac, d_char *s)
+/* creates the HTML header */
+{
+ char *p, *v;
+
+ s = xs_str_cat(s, "\n\n
\n");
+ s = xs_str_cat(s, "\n");
+ s = xs_str_cat(s, "\n");
+
+ /* add server CSS */
+ p = xs_dict_get(srv_config, "cssurls");
+ while (xs_list_iter(&p, &v)) {
+ xs *s1 = xs_fmt("\n", v);
+ s = xs_str_cat(s, s1);
+ }
+
+ /* add the user CSS */
+ {
+ xs *css = NULL;
+ int size;
+
+ if (valid_status(static_get(snac, "style.css", &css, &size))) {
+ xs *s1 = xs_fmt("\n", css);
+ s = xs_str_cat(s, s1);
+ }
+ }
+
+ {
+ xs *s1 = xs_fmt("%s\n", xs_dict_get(snac->config, "name"));
+ s = xs_str_cat(s, s1);
+ }
+
+ s = xs_str_cat(s, "\n\n");
+
+ return s;
+}
+
+
d_char *html_timeline(snac *snac, char *list, int local)
/* returns the HTML for the timeline */
{
d_char *s = xs_str_new(NULL);
- s = xs_str_cat(s, "\n\n");
+ s = html_user_header(snac, s);
s = xs_str_cat(s, "HI
\n");
diff --git a/snac.h b/snac.h
index b5a5a76..7cd46c7 100644
--- a/snac.h
+++ b/snac.h
@@ -78,6 +78,8 @@ int is_muted(snac *snac, char *actor);
int actor_add(snac *snac, char *actor, char *msg);
int actor_get(snac *snac, char *actor, d_char **data);
+int static_get(snac *snac, char *id, d_char **data, int *size);
+
void enqueue_input(snac *snac, char *msg, char *req);
void enqueue_output(snac *snac, char *msg, char *actor, int retries);
diff --git a/xs_httpd.h b/xs_httpd.h
index 0842e15..68f60c4 100644
--- a/xs_httpd.h
+++ b/xs_httpd.h
@@ -128,7 +128,7 @@ d_char *xs_httpd_request(FILE *f, d_char **payload, int *p_size)
if ((v = xs_dict_get(req, "content-length")) != NULL) {
/* if it has a payload, load it */
*p_size = atoi(v);
- *payload = xs_read(f, *p_size);
+ *payload = xs_read(f, p_size);
}
/* is the payload form urlencoded variables? */
diff --git a/xs_io.h b/xs_io.h
index 523d207..62af82c 100644
--- a/xs_io.h
+++ b/xs_io.h
@@ -6,7 +6,7 @@
d_char *xs_readall(FILE *f);
d_char *xs_readline(FILE *f);
-d_char *xs_read(FILE *f, int size);
+d_char *xs_read(FILE *f, int *size);
#ifdef XS_IMPLEMENTATION
@@ -56,16 +56,18 @@ d_char *xs_readline(FILE *f)
}
-d_char *xs_read(FILE *f, int size)
+d_char *xs_read(FILE *f, int *sz)
/* reads up to size bytes from f */
{
d_char *s;
+ int size = *sz;
+ int rdsz = 0;
errno = 0;
s = xs_str_new(NULL);
- while (size != 0 && !feof(f)) {
+ while (size > 0 && !feof(f)) {
char tmp[2048];
int n, r;
@@ -76,8 +78,11 @@ d_char *xs_read(FILE *f, int size)
s = xs_append_m(s, tmp, r);
size -= r;
+ rdsz += r;
}
+ *sz = rdsz;
+
return s;
}