about summary refs log tree commit diff stats
path: root/src/tools/fileutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/fileutils.c')
-rw-r--r--src/tools/fileutils.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/tools/fileutils.c b/src/tools/fileutils.c
index 327f798f..11dc6905 100644
--- a/src/tools/fileutils.c
+++ b/src/tools/fileutils.c
@@ -42,11 +42,19 @@ int FileExist(const char* filename, int flags)
     return 1;
 }
 
-char* ResolveFile(const char* filename, path_collection_t* paths)
-{
+static char* ResolvePathInner(const char* path, int resolve_symlink) {
+    if (resolve_symlink) {
+        return box_realpath(path, NULL);
+    } else {
+        return box_strdup(path);
+    }
+}
+
+static char* ResolveFileInner(const char* filename, path_collection_t* paths, int resolve_symlink) {
     char p[MAX_PATH];
-    if(filename[0]=='/')
-        return box_strdup(filename);
+    if(filename[0]=='/') {
+        return ResolvePathInner(filename, resolve_symlink);
+    }
     for (int i=0; i<paths->size; ++i) {
         if(paths->paths[i][0]!='/') {
             // not an absolute path...
@@ -57,11 +65,20 @@ char* ResolveFile(const char* filename, path_collection_t* paths)
         } else
             strcpy(p, paths->paths[i]);
         strcat(p, filename);
-        if(FileExist(p, IS_FILE))
-            return box_realpath(p, NULL);
+        if(FileExist(p, IS_FILE)) {
+            return ResolvePathInner(p, resolve_symlink);
+        }
     }
 
-    return box_strdup(filename); //NULL;
+    return ResolvePathInner(filename, resolve_symlink);
+}
+
+char* ResolveFile(const char* filename, path_collection_t* paths) {
+    return ResolveFileInner(filename, paths, 1);
+}
+
+char* ResolveFileSoft(const char* filename, path_collection_t* paths) {
+    return ResolveFileInner(filename, paths, 0);
 }
 
 int FileIsX64ELF(const char* filename)