# HG changeset patch # User Olaf Wintermann # Date 1748615874 -7200 # Node ID 94c01980e3e51631f07de82500c99965f659a03a # Parent a5339182e67f6b0c651798757544a3c4559e14dd add navigation to directory listing and improve css diff -r a5339182e67f -r 94c01980e3e5 src/server/safs/service.c --- a/src/server/safs/service.c Fri May 30 15:00:05 2025 +0200 +++ b/src/server/safs/service.c Fri May 30 16:37:54 2025 +0200 @@ -826,7 +826,15 @@ const CxAllocator *a = pool_allocator(sn->pool); char *path = pblock_findkeyval(pb_key_path, rq->vars); - char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb); + cxstring uri = cx_str(pblock_findkeyval(pb_key_uri, rq->reqpb)); + if(uri.length == 0) { + return REQ_ABORTED; + } + if(uri.ptr[uri.length-1] != '/') { + cxmutstr newuri = cx_strcat_a(a, 2, uri, CX_STR("/")); + uri = cx_strcast(newuri); + } + // params char *useemojis = pblock_findval("use-emojis", pb); @@ -871,16 +879,35 @@ // write html header sbuf_puts(out, "\n\n\nIndex of "); - sbuf_puts(out, uri); + sbuf_append(out, uri); sbuf_puts(out, "\n"); sbuf_puts(out, "\n"); - sbuf_puts(out, "\n

Index of "); - sbuf_puts(out, uri); - sbuf_puts(out, "


\n\n"); + sbuf_puts(out, "

"); + + if(uri.length > 0) { + sbuf_puts(out, "/\n"); + size_t start = 1; + for(size_t i=1;i"); + sbuf_write(out, uri.ptr+start, i-start); + sbuf_puts(out, "\n"); + start = i+1; + } + } + } + + sbuf_puts(out, "


"); // read directory at store entries in the files list int ret = REQ_PROCEED; @@ -927,6 +954,7 @@ sbuf_puts(out, ""); sbuf_puts(out, "name); sbuf_puts(out, "\">"); sbuf_puts(out, entry->name); diff -r a5339182e67f -r 94c01980e3e5 src/server/util/strbuf.c --- a/src/server/util/strbuf.c Fri May 30 15:00:05 2025 +0200 +++ b/src/server/util/strbuf.c Fri May 30 16:37:54 2025 +0200 @@ -46,7 +46,7 @@ return buf; } -void sbuf_puts(sbuf_t *buf, char *str) { +void sbuf_puts(sbuf_t *buf, const char *str) { sbuf_append(buf, cx_str(str)); } @@ -54,6 +54,10 @@ sbuf_append(buf, (cxstring){&chr, 1}); } +void sbuf_write(sbuf_t *buf, const char *str, size_t length) { + sbuf_append(buf, cx_strn(str, length)); +} + void sbuf_append(sbuf_t *buf, cxstring str) { if (buf->length + str.length >= buf->size) { buf->size *= 2; diff -r a5339182e67f -r 94c01980e3e5 src/server/util/strbuf.h --- a/src/server/util/strbuf.h Fri May 30 15:00:05 2025 +0200 +++ b/src/server/util/strbuf.h Fri May 30 16:37:54 2025 +0200 @@ -44,7 +44,9 @@ sbuf_t* sbuf_new(size_t size); -void sbuf_puts(sbuf_t *buf, char *str); +void sbuf_puts(sbuf_t *buf, const char *str); + +void sbuf_write(sbuf_t *buf, const char *str, size_t length); void sbuf_put(sbuf_t *buf, char chr);