src/server/safs/nametrans.c

changeset 96
0185b13bf41f
parent 77
f1cff81e425a
child 97
09fbefc0e6a9
--- 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;
+}
+
+

mercurial