Transform the database_dir/database_root arg into an absolute path.
[adu.git] / string.c
index 946faab..1355555 100644 (file)
--- a/string.c
+++ b/string.c
@@ -373,3 +373,35 @@ err:
        free(argv);
        return ret;
 }
+
+char *absolute_path(const char *path)
+{
+       char *cwd, *ap;
+       long int path_max;
+
+       if (!path || !path[0])
+               return NULL;
+       if (path[0] == '/')
+               return adu_strdup(path);
+
+#ifdef PATH_MAX
+       path_max = PATH_MAX;
+#else
+       /*
+        * The result of pathconf(3) may be huge and unsuitable for mallocing
+        * memory. OTOH pathconf(3) may return -1 to signify that PATH_MAX is
+        * not bounded.
+        */
+       path_max = pathconf(name, _PC_PATH_MAX);
+       if (path_max <= 0 || path_max >= 4096)
+               path_max = 4096;
+#endif
+       cwd = adu_malloc(path_max);
+       if (!getcwd(cwd, path_max)) {
+               free(cwd);
+               return NULL;
+       }
+       ap = make_message("%s/%s", cwd, path);
+       free(cwd);
+       return ap;
+}