Implement <file path="path"/>
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 24 Apr 2014 10:26:14 +0000 (12:26 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 24 Apr 2014 10:26:14 +0000 (12:26 +0200)
doc/pazpar2_conf.xml
src/pazpar2_config.c

index c6325f4..eea4f75 100644 (file)
     in main thread).
    </para>
   </refsect2>
+  <refsect2 id="config-file">
+   <title>file</title>
+   <para>
+    This configuration takes one attribute <literal>path</literal> which
+    specifies a path to search for local files, such as XSLTs  and settings.
+    The path is a colon separated list of directories. Its default value
+    is "<literal>.</literal>" which is equivalent to the location of the
+    main configuration file (where indeed the file element is given).
+   </para>
+  </refsect2>
   <refsect2 id="config-server">
    <title>server</title>
    <para>
index 0688b8e..785293e 100644 (file)
@@ -54,6 +54,7 @@ struct conf_config
 
     int no_threads;
     WRBUF confdir;
+    char *path;
     iochan_man_t iochan_man;
     database_hosts_t database_hosts;
 };
@@ -256,13 +257,20 @@ int conf_service_sortkey_field_id(struct conf_service *service,
 
 static void conf_dir_path(struct conf_config *config, WRBUF w, const char *src)
 {
-    if (config->confdir && wrbuf_len(config->confdir) > 0 &&
-        !yaz_is_abspath(src))
+    char full_path[1024];
+    if (yaz_filepath_resolve(src, config->path,
+                             wrbuf_len(config->confdir) > 0 ?
+                             wrbuf_cstr(config->confdir) : ".",
+                             full_path))
     {
-        wrbuf_printf(w, "%s/%s", wrbuf_cstr(config->confdir), src);
+        wrbuf_puts(w, full_path);
     }
     else
+    {
+        yaz_log(YLOG_WARN, "File not found: fname=%s path=%s base=%s", src,
+                config->path, wrbuf_cstr(config->confdir));
         wrbuf_puts(w, src);
+    }
 }
 
 void service_destroy(struct conf_service *service)
@@ -1244,6 +1252,15 @@ static int parse_config(struct conf_config *config, xmlNode *root)
                 xmlFree(number);
             }
         }
+        else if (!strcmp((const char *) n->name, "file"))
+        {
+            xmlChar *path = xmlGetProp(n, (xmlChar *) "path");
+            if (path)
+            {
+                config->path = nmem_strdup(config->nmem, (const char *) path);
+                xmlFree(path);
+            }
+        }
         else if (!strcmp((const char *) n->name, "targetprofiles"))
         {
             yaz_log(YLOG_FATAL, "targetprofiles unsupported here. Must be part of service");
@@ -1290,6 +1307,7 @@ struct conf_config *config_create(const char *fname, int verbose)
 
     config->nmem = nmem;
     config->servers = 0;
+    config->path = nmem_strdup(nmem, ".");
     config->no_threads = 0;
     config->iochan_man = 0;
     config->database_hosts = database_hosts_create();