diff -r 24d804a2799f -r 34aa8001ea53 src/server/service.c --- a/src/server/service.c Fri Dec 30 15:19:16 2011 +0100 +++ b/src/server/service.c Fri Dec 30 17:50:05 2011 +0100 @@ -28,6 +28,8 @@ #include #include +#include +#include #include "service.h" #include "io.h" @@ -35,6 +37,7 @@ #include "protocol.h" #include +#include "strbuf.h" // TODO: system sendfile Abstraktionen in neue Datei auslagern /* @@ -144,3 +147,81 @@ net_write(sn->csd, "Hello World!\n", 13); return REQ_PROCEED; } + +int service_index(pblock *pb, Session *sn, Request *rq) { + printf("service_index\n"); + + char *ppath = pblock_findkeyval(pb_key_ppath, rq->vars); + char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb); + + sstr_t r_uri = sstr(uri); + + /* open the file */ + int fd = open(ppath, O_RDONLY); + if(fd < 0) { + perror("service_index: open"); + + int status = 500; + switch(errno) { + case EACCES: { + status = 403; + break; + } + case ENOENT: { + status = 404; + break; + } + } + protocol_status(sn, rq, status, NULL); + printf("REQ_ABORTED\n"); + return REQ_ABORTED; + } + + DIR *dir = fdopendir(fd); + if(dir == NULL) { + protocol_status(sn, rq, 500, NULL); + printf("DIR is null\n"); + return REQ_ABORTED; + } + + sbuf_t *out = sbuf_new(1024); /* output buffer */ + + /* write html header */ + sbuf_puts(out, "\n\nIndex of "); + sbuf_puts(out, uri); + sbuf_puts(out, "\n\n

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


\n\n"); + + struct dirent *f; + while((f = readdir(dir)) != NULL) { + if(strcmp(f->d_name, ".") == 0 || strcmp(f->d_name, "..") == 0) { + continue; + } + + sstr_t filename = sstr(f->d_name); + + sbuf_puts(out, ""); + sbuf_append(out, filename); + sbuf_puts(out, "
\n"); + } + + sbuf_puts(out, "\n\n\n"); + + /* send stuff to client */ + pblock_removekey(pb_key_content_type, rq->srvhdrs); + pblock_kvinsert(pb_key_content_type, "text/html", 9, rq->srvhdrs); + pblock_nninsert("content-length", out->length, rq->srvhdrs); + protocol_status(sn, rq, 200, NULL); + http_start_response(sn, rq); + + net_write(sn->csd, out->ptr, out->length); + + /* close */ + closedir(dir); + + return REQ_PROCEED; +}