diff -r 74a81d9e19d0 -r 0185b13bf41f src/server/safs/nametrans.c --- a/src/server/safs/nametrans.c Sun Nov 03 16:41:42 2013 +0100 +++ b/src/server/safs/nametrans.c Mon Nov 04 10:55:27 2013 +0100 @@ -30,16 +30,7 @@ #include "../daemon/log.h" #include "../util/pblock.h" - -int test_nametrans(pblock *pb, Session *sn, Request *rq) { - printf("test_nametrans...\n"); - - // set ppath - //char *ppath = "/export/home/olaf/Desktop/hello.txt"; - //pblock_kvinsert(pb_key_ppath, ppath, strlen(ppath), rq->vars); - - return REQ_NOACTION; -} +#include "../util/util.h" /* * assign_name @@ -80,3 +71,92 @@ return REQ_NOACTION; } + +/* + * document_root + * + * Specifies the document root directory. + * + * pblock parameter: + * root path to document root + */ +int document_root(pblock *pb, Session *sn, Request *rq) { + char *root = pblock_findkeyval(pb_key_root, pb); + if(!root) { + log_ereport(LOG_MISCONFIG, "document-root: missing rootparameter"); + protocol_status(sn, rq, 500, NULL); + return REQ_ABORTED; + } + + sstr_t root_str = sstr(root); + sstr_t uri_str = sstr(pblock_findkeyval(pb_key_uri, rq->reqpb)); + util_add_ppath(root_str, uri_str, rq->vars); + + return REQ_PROCEED; +} + +/* + * pfx2dir + * + * ... + * + * pblock parameter: + * from prefix + * dir file system directory + * name (optional) object name + * + */ +int pfx2dir(pblock *pb, Session *sn, Request *rq) { + char *from = pblock_findkeyval(pb_key_from, pb); + char *dir = pblock_findkeyval(pb_key_dir, pb); + char *name = pblock_findkeyval(pb_key_name, pb); + + if(!from || !dir) { + if(!from && dir) { + log_ereport(LOG_MISCONFIG, "pfx2dir: missing from parameter"); + } else if(!dir && from) { + log_ereport(LOG_MISCONFIG, "pfx2dir: missing dir parameter"); + } else { + log_ereport( + LOG_MISCONFIG, + "pfx2dir: missing from and dir parameter"); + } + protocol_status(sn, rq, 500, NULL); + return REQ_ABORTED; + } + + // check prefix + char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb); + char fc; + char uc; + int i = 0; + while((fc = from[i]) != 0) { + uc = uri[i]; + if(fc != uc) { + return REQ_NOACTION; + } + i++; + } + + // url has the specified prefix + + uri = uri + i; + if(uri[0] == '/') { + uri++; + } + sstr_t ppath = util_path_append(sn->pool, dir, uri); + pblock_kvinsert( + pb_key_ppath, + ppath.ptr, + ppath.length, + rq->vars); + + if(name) { + // add object to rq->vars + pblock_kvinsert(pb_key_name, name, strlen(name), rq->vars); + } + + return REQ_PROCEED; +} + +