Bump version to 2.1.19. Added function yaz_filepath_resolve.
[yaz-moved-to-github.git] / src / tpath.c
index 38d66ef..5200380 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: tpath.c,v 1.6 2005-06-25 15:46:06 adam Exp $
+ * $Id: tpath.c,v 1.7 2006-04-26 09:40:43 adam Exp $
  */
 /**
  * \file tpath.c
 #include <ctype.h>
 #include <yaz/tpath.h>
 #include <yaz/log.h>
+#include <sys/types.h>
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 
 FILE *yaz_path_fopen(const char *path, const char *name, const char *mode)
 {
@@ -30,20 +37,18 @@ int yaz_fclose (FILE *f)
     return fclose (f);
 }
 
-FILE *yaz_fopen(const char *path, const char *name, const char *mode,
-                const char *base)
-{
-    char spath[1024];
 
+char *yaz_filepath_resolve(const char *fname, const char *path,
+                           const char *base, char *fullpath)
+{
     for(;;)
     {
-        FILE *f;
-
+        struct stat stat_buf;
         const char *path_sep = 0;
         size_t len = 0;
         size_t slen = 0;
         
-        *spath = '\0';
+        *fullpath = '\0';
         if (path)
         {
             /* somewhat dirty since we have to consider Windows
@@ -61,18 +66,19 @@ FILE *yaz_fopen(const char *path, const char *name, const char *mode,
                 len = strlen(path);
             if (!strchr ("/\\", *path) && base)
             {
-                strcpy (spath, base);
-                slen = strlen(spath);
-                spath[slen++] = '/';
+                strcpy (fullpath, base);
+                slen = strlen(fullpath);
+                fullpath[slen++] = '/';
             }
-            memcpy (spath+slen, path, len);
+            memcpy (fullpath+slen, path, len);
             slen += len;
-            if (!strchr("/\\", spath[slen-1]))
-                spath[slen++] = '/';
+            if (!strchr("/\\", fullpath[slen-1]))
+                fullpath[slen++] = '/';
         }
-        strcpy (spath+slen, name);
-        if ((f = fopen(spath, mode)))
-            return f;
+        strcpy (fullpath+slen, fname);
+
+        if (stat(fullpath, &stat_buf) == 0)
+            return fullpath;
         
         if (!path_sep)
             break;
@@ -81,6 +87,16 @@ FILE *yaz_fopen(const char *path, const char *name, const char *mode,
     return 0;
 }
 
+FILE *yaz_fopen(const char *path, const char *fname, const char *mode,
+                const char *base)
+{
+    char fullpath[1024];
+
+    if (!yaz_filepath_resolve(fname, path, base, fullpath))
+        return 0; /* failure */
+    return fopen(fullpath, mode);
+}
+
 int yaz_is_abspath (const char *p)
 {
     if (*p == '/')